diff --git a/.github/workflows/musicardio-macos.yml b/.github/workflows/musicardio-macos.yml
new file mode 100644
index 0000000000..66e838c31a
--- /dev/null
+++ b/.github/workflows/musicardio-macos.yml
@@ -0,0 +1,134 @@
+# This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage.
+# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml
+name: MUSICardio on macOS
+
+on:
+  push:
+    branches: [ "4.1" ]
+  pull_request:
+    branches: [ "4.1" ]
+  workflow_dispatch:
+    inputs:
+      EXPIRATION_TIME:
+        description: 'Expiration time in month'
+        required: true
+        default: '12'
+        type: string
+  #schedule:
+  #  - cron: '0 0 * * 1'  # Each monday at 0h00, MIN HOUR DAY_IN_MONTH MONTH WEEK_DAY
+
+env:
+  BUILD_TYPE: Release
+  QT5_DIR: "/usr/local/opt/qt@5/lib/cmake/Qt5"
+  MSC_SSH_PLUGINS: ${{ secrets.MSC_SSH_PLUGINS }}
+  MSC_TOKEN: ${{ secrets.MSC_TOKEN }}
+
+jobs:
+  build:
+    # https://docs.github.com/en/actions/using-jobs/choosing-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories
+    runs-on: macos-13
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v4
+      with:
+          ref: 4.1
+
+    - name: Set up SSH
+      run: |
+        mkdir -p ~/.ssh
+        echo "$MSC_SSH_PLUGINS" > ~/.ssh/id_rsa
+        chmod 600 ~/.ssh/id_rsa
+        ssh-keyscan github.com >> ~/.ssh/known_hosts
+
+    - name: Install dependencies
+      run: |
+        brew install qt@5
+        brew install boost
+        brew install swig
+        brew install libomp
+        echo "OpenMP_ROOT=$(brew --prefix libomp)" >> $GITHUB_ENV
+        pip3 install dmgbuild
+        # brew info cmake
+
+    - name: Set default EXPIRATION_TIME if not provided (with non manual workflow)
+      run: echo "EXPIRATION_TIME=${{ inputs.EXPIRATION_TIME || '12' }}" >> $GITHUB_ENV
+
+    - name: Configure CMake
+      run: |
+        cmake -B ${{github.workspace}}/build \
+          -DUSE_GITHUB_SSH:BOOL=TRUE \
+          -DmedInria_BUILD_TYPE:STRING=$BUILD_TYPE \
+          -Dmusic-plugins_BUILD_TYPE:STRING=$BUILD_TYPE \
+          -DEP_CHECKBOX_CUSTOM_DIRS:BOOL=ON \
+          -DEP_CHECKBOX_ON_TOP_LEVEL:BOOL=OFF \
+          -DEP_CHECKBOX_SIDE_BY_SIDE:BOOL=OFF \
+          -DQt5_DIR=$QT5_DIR \
+          -DOpenMP_ROOT=$OpenMP_ROOT \
+          -DUSE_FFmpeg=ON \
+          -DEXPIRATION_TIME:STRING=$EXPIRATION_TIME \
+          -DUSE_RealTimeWorkspace=OFF
+          
+    - name: Build
+      run: | 
+        CORES_TO_USE=$(($(sysctl -n hw.ncpu) - 1)) # Limit the number of used core otherwise the compilation crashes sometimes
+        echo "Using $CORES_TO_USE cores for the build"
+        cmake --build ${{github.workspace}}/build --config $BUILD_TYPE --parallel $CORES_TO_USE
+
+    - name: Package
+      run: |
+        cd ${{github.workspace}}/build
+        cpack -C $BUILD_TYPE
+
+    - name: Prepare DMG and update design
+      run: |
+        cd ${{github.workspace}}/build
+        dmg=$(ls *.dmg)
+        echo "The current package to adapt: $dmg"
+
+        if [ -n "$dmg" ]; then
+          # Attach to read-write format and retrieve mount path
+          path=$(hdiutil attach -owners on $dmg -shadow | grep -i 'Volumes' | cut -f 3)
+          echo "The current path: $path"
+
+          # Navigate to correct directory
+          cd "$path/MUSICardio.app/Contents/"
+
+          pathPluginsLegacy="${{github.workspace}}/build/medInria-build/bin/plugins_legacy"
+
+          # Change library paths for plugins
+          for f in PlugIns/*.dylib; do
+            install_name_tool -change $pathPluginsLegacy/libAAMeshInteractorPlugin.dylib  @executable_path/../PlugIns/libAAMeshInteractorPlugin.dylib $f
+            install_name_tool -change $pathPluginsLegacy/libAAAMeshUtilityPlugin.dylib    @executable_path/../PlugIns/libAAAMeshUtilityPlugin.dylib $f
+            install_name_tool -change $pathPluginsLegacy/libAAAmedPipelinePlugin.dylib    @executable_path/../PlugIns/libAAAmedPipelinePlugin.dylib $f
+            install_name_tool -change $pathPluginsLegacy/libmscPipelinesPlugin.dylib      @executable_path/../PlugIns/libmscPipelinesPlugin.dylib $f
+            install_name_tool -change $pathPluginsLegacy/libAAAEPMapPlugin.dylib          @executable_path/../PlugIns/libAAAEPMapPlugin.dylib $f
+            install_name_tool -change $pathPluginsLegacy/libAAMFSSimulationPlugin.dylib   @executable_path/../PlugIns/libAAMFSSimulationPlugin.dylib $f
+            install_name_tool -change $pathPluginsLegacy/libFEMForwardProblemPlugin.dylib @executable_path/../PlugIns/libFEMForwardProblemPlugin.dylib $f
+          done
+
+          # Go back to original path
+          cd "${{github.workspace}}/build"
+
+          # Update dmg design
+          echo "### Now we are going to update the dmg design"
+          volumeName=$(basename "$path")
+          dmgbuild -s ../packaging/apple/settings.json "$volumeName" MUSICardio.dmg
+
+          echo "End of the processes"
+        else
+          echo "A problem happened in MSC compilation, no dmg is built"
+        fi
+      
+    - name: Upload binaries to release
+      uses: svenstaro/upload-release-action@v2
+      with:
+        repo_name: Inria-Asclepios/msc_binaries
+        # A personal access token for the GitHub repository in which the release will be created and edited.
+        # It is recommended to create the access token with the following scopes: `repo, user, admin:repo_hook`.
+        repo_token: ${{ secrets.MSC_TOKEN }}
+        file: ${{github.workspace}}/build/MUSICardio.dmg
+        asset_name: MUSICardio.dmg
+        tag: latest
+        overwrite: true
+        body: "MUSICardio binaries"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 32025e72f3..e861d4e0c3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,7 @@ endif()
 cmake_policy(SET CMP0074 NEW)
 
 if(NOT DEFINED ${MEDINRIA_SUPERBUILD_VERSION})
-    set(MEDINRIA_SUPERBUILD_VERSION 4.0.2)
+    set(MEDINRIA_SUPERBUILD_VERSION 4.0.7)
 endif()
 
 SET(CMAKE_CXX_STANDARD 17)
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 7325be46ac..1441272690 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,3 +1,33 @@
+MUSICardio 4.0.7:
+- PolygonROI:
+    * fix drawing a contour with shift-click to be able to change zoom/contrast with click.
+    * fix removing a last contour/node which reset the label tool and allow to draw again.
+- Registration step in pipelines allows to use Mouse Interaction Toolbox.
+- VOICutterToolBox fix a crash with metadata in pipelines sometimes if a cut has been made.
+
+MUSICardio 4.0.6:
+- Debug import of Carto .zip archives and .mesh files.
+- PolygonROI: remove shift-click to draw, fix contrast after deactivation of repulsor and hide deactivated widgets.
+- Pipelines: 
+    * put back the possibility of closing layers at result steps,
+    * fix VOICutter if no segmentation is done,
+    * fix Histogram Analysis non manual algorithms.
+    * fix pipeline crash when saving data.
+
+MUSICardio 4.0.5:
+- Allow to use data with different size or spacing in LCCLogDemons and DiffeomorphicDemons.
+- Manual Registration: enhance landmark numbers for better user understanding.
+- Fix Histogram Analysis width problem displaying multi-results.
+
+MUSICardio 4.0.4:
+- Fix some plugins wrongly loaded on Windows.
+
+MUSICardio 4.0.3:
+- Switch to Ubuntu 22.
+- PolygonROI: update icons, fix a glitch when users change ROI label, hide label panel in pipelines.
+- Histogram Analysis: enhance memory management and remove useless computation.
+- Pipelines: correct arithmetic filters computation. 
+
 MUSICardio 4.0.2:
 - Fix drawing problem in pipelines with custom step of PolygonROI.
 
diff --git a/packaging/apple/settings.json b/packaging/apple/settings.json
index 15f0d3c863..4d5203c3a8 100644
--- a/packaging/apple/settings.json
+++ b/packaging/apple/settings.json
@@ -7,7 +7,7 @@
     "window": { "position": { "x": 100, "y": 100 },
                 "size": { "width": 640, "height": 300 } },
     "contents": [
-        { "x": 140, "y": 165, "type": "file", "path": "/Volumes/MUSICardio 4.0.2/MUSICardio.app" },
+        { "x": 140, "y": 165, "type": "file", "path": "/Volumes/MUSICardio 4.0.7/MUSICardio.app" },
         { "x": 480, "y": 165, "type": "link", "path": "/Applications" }
     ]
 }
diff --git a/packaging/windows/WindowsPackaging.cmake b/packaging/windows/WindowsPackaging.cmake
index fba1809b0a..9989550ca1 100644
--- a/packaging/windows/WindowsPackaging.cmake
+++ b/packaging/windows/WindowsPackaging.cmake
@@ -104,7 +104,7 @@ list(APPEND
   ${DCMTK_ROOT}/bin/Release
   ${VTK_ROOT}/bin/Release
   ${QtDCM_ROOT}/bin/Release
-  ${TTK_ROOT}/bin/Release
+  ${TTK_ROOT}/bin
   ${dtk_ROOT}/bin/Release
   ${RPI_ROOT}/bin/Release
   ${ZLIB_ROOT}/Release
@@ -121,12 +121,14 @@ file(GLOB_RECURSE itk_files LIST_DIRECTORIES true \"${ITK_ROOT}/bin/*.dll\")
 file(GLOB_RECURSE vtk_files LIST_DIRECTORIES true \"${VTK_ROOT}/bin/*.dll\")
 file(GLOB_RECURSE dtk_files LIST_DIRECTORIES true \"${dtk_ROOT}/bin/*.dll\")
 file(GLOB_RECURSE dcm_files LIST_DIRECTORIES true \"${QtDCM_ROOT}/bin/*.dll\")
+file(GLOB_RECURSE ttk_files LIST_DIRECTORIES true \"${TTK_DIR}/bin/*.dll\")
 file(GLOB_RECURSE qt5_files LIST_DIRECTORIES true \"${QT_BINARY_DIR}/*.dll\")
 file(GLOB_RECURSE zlib_files LIST_DIRECTORIES true \"${ZLIB_ROOT}/*.dll\")
 list(APPEND files \${itk_files})
 list(APPEND files \${vtk_files})
 list(APPEND files \${dtk_files})
 list(APPEND files \${dcm_files})
+list(APPEND files \${ttk_files})
 list(APPEND files \${qt5_files})
 list(APPEND files \${zlib_files})
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 41f5a93f67..a7da209862 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -16,7 +16,7 @@
 cmake_minimum_required(VERSION 3.19)
 
 if(NOT DEFINED ${medInria_VERSION})
-    set(medInria_VERSION 4.0.2)
+    set(medInria_VERSION 4.0.7)
 endif()
 
 project(medInria VERSION ${medInria_VERSION})
diff --git a/src/app/medInria/resources/medInria.qrc b/src/app/medInria/resources/medInria.qrc
index 3c959b2647..98ebfc770c 100644
--- a/src/app/medInria/resources/medInria.qrc
+++ b/src/app/medInria/resources/medInria.qrc
@@ -146,8 +146,10 @@
         <file>pixmaps/radio-disabled.png</file>
         <file>pixmaps/radio-checked-disabled.png</file>
         <file>pixmaps/plus-button.png</file>
-        <file>pixmaps/plus.png</file>
-        <file>pixmaps/minus.png</file>
+        <file>pixmaps/plus_white.png</file>
+        <file>pixmaps/minus_white.png</file>
+        <file>pixmaps/plus_black.png</file>
+        <file>pixmaps/minus_black.png</file>
         <file>pixmaps/checkbox-disabled.png</file>
         <file>pixmaps/checkbox-checked-disabled.png</file>
         <file>pixmaps/arrow-top-disabled.png</file>
diff --git a/src/app/medInria/resources/pixmaps/minus.png b/src/app/medInria/resources/pixmaps/minus_black.png
similarity index 100%
rename from src/app/medInria/resources/pixmaps/minus.png
rename to src/app/medInria/resources/pixmaps/minus_black.png
diff --git a/src/app/medInria/resources/pixmaps/minus_white.png b/src/app/medInria/resources/pixmaps/minus_white.png
new file mode 100644
index 0000000000..e36cdc667b
Binary files /dev/null and b/src/app/medInria/resources/pixmaps/minus_white.png differ
diff --git a/src/app/medInria/resources/pixmaps/plus.png b/src/app/medInria/resources/pixmaps/plus_black.png
similarity index 100%
rename from src/app/medInria/resources/pixmaps/plus.png
rename to src/app/medInria/resources/pixmaps/plus_black.png
diff --git a/src/app/medInria/resources/pixmaps/plus_white.png b/src/app/medInria/resources/pixmaps/plus_white.png
new file mode 100644
index 0000000000..c3de70501e
Binary files /dev/null and b/src/app/medInria/resources/pixmaps/plus_white.png differ
diff --git a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp
index 6712c9e2cf..61828b0a10 100644
--- a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp
+++ b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.cpp
@@ -514,6 +514,7 @@ void medAbstractDatabaseImporter::importData()
 
     // Now, populate the database
     medDataIndex index = this->populateDatabaseAndGenerateThumbnails (  d->data, thumb_dir );
+    d->index = index;
 
     if (d->data->hasMetaData(medMetaDataKeys::Toolbox.key()) &&
     d->data->metadata(medMetaDataKeys::Toolbox.key())=="PolygonROI" &&
diff --git a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h
index 2e62e7cd4a..e8ee9f87f8 100644
--- a/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h
+++ b/src/layers/legacy/medCoreLegacy/database/medAbstractDatabaseImporter.h
@@ -48,6 +48,8 @@ class MEDCORELEGACY_EXPORT medAbstractDatabaseImporter : public medJobItemL
                                 const QUuid &uuid);
     ~medAbstractDatabaseImporter() override;
 
+    medDataIndex index(void) const;
+
 signals:
     /**
      * This signal is emitted after a successful import/index.
@@ -74,7 +76,6 @@ public slots:
     bool indexWithoutImporting ( void );
     QMap<int, QString> volumeIdToImageFile ( void );
     QString callerUuid ( void );
-    medDataIndex index(void) const;
 
     void populateMissingMetadata ( medAbstractData* medData, const QString seriesDescription );
     void addAdditionalMetaData ( medAbstractData* imData, QString aggregatedFileName, QStringList aggregatedFilesPaths );
diff --git a/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp b/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp
index 45772ed64f..30577712c2 100644
--- a/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp
+++ b/src/layers/legacy/medCoreLegacy/database/medDatabasePersistentController.cpp
@@ -80,6 +80,8 @@ void medDatabasePersistentControllerPrivate::buildMetaDataLookup()
     metaDataLookup.insert(medMetaDataKeys::StudyDate.key(),
                           TableEntryList() << TableEntry(T_study, "date"));
     // Series Data
+    metaDataLookup.insert(medMetaDataKeys::FilePaths.key(),
+                          TableEntryList() << TableEntry(T_series, "path"));
     metaDataLookup.insert(medMetaDataKeys::Size.key(),
                           TableEntryList() << TableEntry(T_series, "size"));
     metaDataLookup.insert(medMetaDataKeys::SeriesDescription.key(),
diff --git a/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp b/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp
index 39f970efa8..3903c5cea4 100644
--- a/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp
+++ b/src/layers/legacy/medCoreLegacy/database/medDatabaseReader.cpp
@@ -203,6 +203,7 @@ medAbstractData* medDatabaseReader::run()
     QFileInfo fullThumbnailPathInfo(fullThumbnailPath);
     medMetaDataKeys::SeriesThumbnail.add (medData, fullThumbnailPath);
 
+    medMetaDataKeys::FilePaths.set ( medData, seriesPath );
     medMetaDataKeys::PatientID.set ( medData, patientId );
     medMetaDataKeys::PatientName.set ( medData, patientName );
     medMetaDataKeys::BirthDate.set ( medData, birthdate );
diff --git a/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp b/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp
index d19b2a48d0..a0dbaf35bc 100644
--- a/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp
+++ b/src/layers/legacy/medImageIO/itkDCMTKImageIO.cpp
@@ -54,8 +54,8 @@ DCMTKImageIO::DCMTKImageIO()
 {
     this->SetNumberOfDimensions(3);
     this->SetNumberOfComponents(1);
-    this->SetPixelType(SCALAR);
-    this->SetComponentType(CHAR);
+    this->SetPixelType(IOPixelEnum::SCALAR);
+    this->SetComponentType(itk::IOComponentEnum::CHAR);
 
     DcmRLEDecoderRegistration::registerCodecs();
     DJDecoderRegistration::registerCodecs();
@@ -356,11 +356,11 @@ void DCMTKImageIO::DetermineNumberOfPixelComponents()
 
     if( samplesPerPixel==1 )
     {
-        this->SetPixelType ( SCALAR );
+        this->SetPixelType (itk::IOPixelEnum::SCALAR );
     }
     else
     {
-        this->SetPixelType ( RGB );
+        this->SetPixelType ( itk::IOPixelEnum::RGB );
     }
 }
 
@@ -373,7 +373,7 @@ void DCMTKImageIO::DeterminePixelType()
     
     if (condition.bad())
     {
-        this->SetComponentType(UNKNOWNCOMPONENTTYPE);
+        this->SetComponentType(itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE);
         return;
     }
 
@@ -387,36 +387,36 @@ void DCMTKImageIO::DeterminePixelType()
             switch( dmp->getRepresentation() )
             {
                 case EPR_Uint8:
-                    this->SetComponentType ( UCHAR );
+                    this->SetComponentType (itk::IOComponentEnum::UCHAR );
                     break;
 
                 case EPR_Sint8:
-                    this->SetComponentType ( CHAR );
+                    this->SetComponentType (itk::IOComponentEnum::CHAR );
                     break;
 
                 case EPR_Uint16:
-                    this->SetComponentType ( USHORT );
+                    this->SetComponentType (itk::IOComponentEnum::USHORT );
                     break;
 
                 case EPR_Sint16:
-                    this->SetComponentType ( SHORT );
+                    this->SetComponentType (itk::IOComponentEnum::SHORT );
                     break;
 
                 case EPR_Uint32:
-                    this->SetComponentType ( UINT );
+                    this->SetComponentType (itk::IOComponentEnum::UINT );
                     break;
 
                 case EPR_Sint32:
-                    this->SetComponentType ( INT );
+                    this->SetComponentType (itk::IOComponentEnum::INT );
                     break;
 
                 default:
-                    this->SetComponentType (UNKNOWNCOMPONENTTYPE);
+                    this->SetComponentType (itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE);
             }
         }
         else
         {
-            this->SetComponentType (UNKNOWNCOMPONENTTYPE);
+            this->SetComponentType (itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE);
         }
     }
 }
@@ -770,31 +770,31 @@ void DCMTKImageIO::InternalRead (void* buffer, int slice, unsigned long pixelCou
     size_t length = pixelCount * GetNumberOfComponents();
     switch( this->GetComponentType() )
     {
-        case CHAR:
+        case itk::IOComponentEnum::CHAR:
             length *= sizeof(char);
             break;
 
-        case UCHAR:
+        case itk::IOComponentEnum::UCHAR:
             length *= sizeof(Uint8);
             break;
 
-        case SHORT:
+        case itk::IOComponentEnum::SHORT:
             length *= sizeof(Sint16);
             break;
 
-        case USHORT:
+        case itk::IOComponentEnum::USHORT:
             length *= sizeof(Uint16);
             break;
 
-        case INT:
+        case itk::IOComponentEnum::INT:
             length *= sizeof(Sint32);
             break;
 
-        case UINT:
+        case itk::IOComponentEnum::UINT:
             length *= sizeof(Uint32);
             break;
 
-        case DOUBLE:
+        case itk::IOComponentEnum::DOUBLE:
             length *= sizeof(Float64);
             break;
 
diff --git a/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp b/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp
index 132415e8d2..cc977605a0 100644
--- a/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp
+++ b/src/layers/legacy/medImageIO/itkDataImageReaderBase.cpp
@@ -71,7 +71,7 @@ bool itkDataImageReaderBase::canRead (const QString& path)
            return false;
         }
 
-        if (this->io->GetPixelType() == itk::ImageIOBase::VECTOR)
+        if (this->io->GetPixelType() == itk::IOPixelEnum::VECTOR)
         {
             return this->io->GetNumberOfComponents() <= 4 ;
         }
@@ -106,7 +106,7 @@ bool itkDataImageReaderBase::readInformation (const QString& path)
     }
 
     medAbstractData *medData = nullptr;
-    if (this->io->GetPixelType()==itk::ImageIOBase::SCALAR )
+    if (this->io->GetPixelType()==itk::IOPixelEnum::SCALAR )
     {
         const int  dim  = this->io->GetNumberOfDimensions();
         if (!(dim>0 && dim<=4))
@@ -119,43 +119,43 @@ bool itkDataImageReaderBase::readInformation (const QString& path)
         switch (this->io->GetComponentType())
         {
 
-            case itk::ImageIOBase::UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 medData = medAbstractDataFactory::instance()->create(QString("itkDataImageUChar").append(cdim));
                 break;
 
-            case itk::ImageIOBase::CHAR:
+            case itk::IOComponentEnum::CHAR:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageChar").append(cdim));
                 break;
 
-            case itk::ImageIOBase::USHORT:
+            case itk::IOComponentEnum::USHORT:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageUShort").append(cdim));
                 break;
 
-            case itk::ImageIOBase::SHORT:
+            case itk::IOComponentEnum::SHORT:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageShort").append(cdim));
                 break;
 
-            case itk::ImageIOBase::UINT:
+            case itk::IOComponentEnum::UINT:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageUInt").append(cdim));
                 break;
 
-            case itk::ImageIOBase::INT:
+            case itk::IOComponentEnum::INT:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageInt").append(cdim));
                 break;
 
-            case itk::ImageIOBase::ULONG:
+            case itk::IOComponentEnum::ULONG:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageULong").append(cdim));
                 break;
 
-            case itk::ImageIOBase::LONG:
+            case itk::IOComponentEnum::LONG:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageLong").append(cdim));
                 break;
 
-            case itk::ImageIOBase::FLOAT:
+            case itk::IOComponentEnum::FLOAT:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageDouble").append(cdim));  // Bug ???
                 break;
 
-            case itk::ImageIOBase::DOUBLE:
+            case itk::IOComponentEnum::DOUBLE:
                 medData = medAbstractDataFactory::instance()->create (QString("itkDataImageDouble").append(cdim));  // Bug (added 4 which was not existing) ??
                 break;
 
@@ -164,13 +164,13 @@ bool itkDataImageReaderBase::readInformation (const QString& path)
                 return false;
         }
     }
-    else if (this->io->GetPixelType()==itk::ImageIOBase::RGB)
+    else if (this->io->GetPixelType()==itk::IOPixelEnum::RGB)
     {
 
         switch (this->io->GetComponentType())
         {
 
-            case itk::ImageIOBase::UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 medData = medAbstractDataFactory::instance()->create ("itkDataImageRGB3");
                 break;
 
@@ -179,18 +179,18 @@ bool itkDataImageReaderBase::readInformation (const QString& path)
                 return false;
         }
     }
-    else if (this->io->GetPixelType()==itk::ImageIOBase::VECTOR)
+    else if (this->io->GetPixelType()==itk::IOPixelEnum::VECTOR)
     { //   Added by Theo.
         switch (this->io->GetComponentType())
         {
 
-            case itk::ImageIOBase::UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 medData = medAbstractDataFactory::instance()->create ("itkDataImageVectorUChar3");
                 break;
-            case itk::ImageIOBase::FLOAT:
+            case itk::IOComponentEnum::FLOAT:
                 medData = medAbstractDataFactory::instance()->create ("itkDataImageVectorFloat3");
                 break;
-            case itk::ImageIOBase::DOUBLE:
+            case itk::IOComponentEnum::DOUBLE:
                 medData = medAbstractDataFactory::instance()->create ("itkDataImageVectorDouble3");
                 break;
             default:
@@ -198,13 +198,13 @@ bool itkDataImageReaderBase::readInformation (const QString& path)
                 return false;
         }
     }
-    else if ( this->io->GetPixelType()==itk::ImageIOBase::RGBA )
+    else if ( this->io->GetPixelType()==itk::IOPixelEnum::RGBA )
     {
 
         switch (this->io->GetComponentType())
         {
 
-        case itk::ImageIOBase::UCHAR:
+        case itk::IOComponentEnum::UCHAR:
             medData = medAbstractDataFactory::instance()->create ("itkDataImageRGBA3");
             break;
 
@@ -240,10 +240,6 @@ bool itkDataImageReaderBase::readInformation (const QString& path)
         {
             medData->setMetaData(metaDataKey, QString(value.c_str()));
         }
-        else
-        {
-            qDebug() << metaObject()->className() << ":: found unknown key:" << QString::fromStdString(key);
-        }
     }
     // [END OF HACK]
 
@@ -326,10 +322,6 @@ void itkDataImageReaderBase::extractMetaData()
         {
             data()->setMetaData(metaDataKey, QString(value.c_str()));
         }
-        else
-        {
-            qDebug() << metaObject()->className() << ":: found unknown key:" << QString::fromStdString(key);
-        }
     }
 }
 
diff --git a/src/layers/legacy/medImageIO/itkGISImageIO.cpp b/src/layers/legacy/medImageIO/itkGISImageIO.cpp
index 38c46badb2..c33fe306a4 100644
--- a/src/layers/legacy/medImageIO/itkGISImageIO.cpp
+++ b/src/layers/legacy/medImageIO/itkGISImageIO.cpp
@@ -29,16 +29,16 @@ namespace itk
   {
     m_IsBinary = true;
     this->SetNumberOfDimensions(3);
-    m_PixelType         = SCALAR;
-    m_ComponentType     = UCHAR;
+    m_PixelType         = itk::IOPixelEnum::SCALAR;
+    m_ComponentType     = itk::IOComponentEnum::UCHAR;
     
     if (ByteSwapper<int>::SystemIsBigEndian())
     {
-      m_ByteOrder = BigEndian;
+        m_ByteOrder = itk::IOByteOrderEnum::BigEndian;
     }
     else
     {
-      m_ByteOrder = LittleEndian;
+      m_ByteOrder = itk::IOByteOrderEnum::LittleEndian;
     }
   }
   
@@ -137,13 +137,13 @@ namespace itk
 	//this->SetNumberOfComponents( dims[3] );
 	this->SetNumberOfComponents( 1 );
 	//this->SetPixelType (VECTOR);
-	this->SetPixelType (SCALAR);
+	this->SetPixelType (itk::IOPixelEnum::SCALAR);
       }
       else
       {
 	this->SetNumberOfDimensions(3);
 	this->SetNumberOfComponents(1);
-	this->SetPixelType (SCALAR);
+	this->SetPixelType (itk::IOPixelEnum::SCALAR);
       }
 
       ifs >> junk;
@@ -154,7 +154,7 @@ namespace itk
       dims[3] = 1;
       this->SetNumberOfDimensions(3);
       this->SetNumberOfComponents(1);
-      this->SetPixelType (SCALAR);
+      this->SetPixelType (itk::IOPixelEnum::SCALAR);
     }
 
     for( unsigned int i=0; i<this->GetNumberOfDimensions(); i++ )
@@ -174,35 +174,35 @@ namespace itk
     // parse the type
     if( s_type== "S8" )
     {
-      m_ComponentType = CHAR;
+      m_ComponentType = itk::IOComponentEnum::CHAR;
     }
     else if( s_type== "U8" )
     {
-      m_ComponentType = UCHAR;
+      m_ComponentType = itk::IOComponentEnum::UCHAR;
     }
     else if( s_type== "S16" )
     {
-      m_ComponentType = SHORT;
+      m_ComponentType = itk::IOComponentEnum::SHORT;
     }
     else if( s_type== "U16" )
     {
-      m_ComponentType = USHORT;
+      m_ComponentType = itk::IOComponentEnum::USHORT;
     }
     else if( s_type== "S32" )
     {
-      m_ComponentType = INT;
+      m_ComponentType = itk::IOComponentEnum::INT;
     }
     else if( s_type== "U32" )
     {
-      m_ComponentType = UINT;
+      m_ComponentType = itk::IOComponentEnum::UINT;
     }
     else if( s_type== "F32" || s_type=="FLOAT")
     {
-      m_ComponentType = FLOAT;
+      m_ComponentType = itk::IOComponentEnum::FLOAT;
     }
     else if( s_type== "F64" || s_type=="DOUBLE")
     {
-      m_ComponentType = DOUBLE;
+      m_ComponentType = itk::IOComponentEnum::DOUBLE;
     }
     else
     {
@@ -261,7 +261,7 @@ namespace itk
     {
       // assuming it's LittleEndian
       //throw itk::ExceptionObject(__FILE__,__LINE__,"Error: Cannot find keyword \"-bo\".");
-      m_ByteOrder = LittleEndian;
+      m_ByteOrder = itk::IOByteOrderEnum::LittleEndian;
     }
     else
     {
@@ -269,11 +269,11 @@ namespace itk
       ifs >> s_byteorder;
       if( s_byteorder == "DCBA" )
       {
-	m_ByteOrder = LittleEndian;
+	m_ByteOrder = itk::IOByteOrderEnum::LittleEndian;
       }
       else
       {
-	m_ByteOrder = BigEndian;
+	m_ByteOrder = itk::IOByteOrderEnum::BigEndian;
       }
       ifs >> junk;
     }
@@ -412,7 +412,7 @@ namespace itk
     }
     
 
-    if( this->GetNumberOfDimensions()==3 && this->GetPixelType()==SCALAR)
+    if( this->GetNumberOfDimensions()==3 && this->GetPixelType()== itk::IOPixelEnum::SCALAR)
     {
       for( int i=0; i<3; i++ )
       {
@@ -420,7 +420,7 @@ namespace itk
       }
       ofs << "1\n";
     }
-    else if (this->GetNumberOfDimensions()==3 && this->GetPixelType()==VECTOR )
+    else if (this->GetNumberOfDimensions()==3 && this->GetPixelType()== itk::IOPixelEnum::VECTOR )
     {
       for( int i=0; i<3; i++ )
       {
@@ -447,28 +447,28 @@ namespace itk
     ofs << "-type ";
     switch (m_ComponentType )
     {
-	case CHAR:
+	case itk::IOComponentEnum::CHAR:
 	  ofs << "S8\n";
 	  break;
-	case UCHAR:
+	case itk::IOComponentEnum::UCHAR:
 	  ofs << "U8\n";
 	  break;
-	case SHORT:
+	case itk::IOComponentEnum::SHORT:
 	  ofs << "S16\n";
 	  break;
-	case USHORT:
+	case itk::IOComponentEnum::USHORT:
 	  ofs << "U16\n";
 	  break;
-	case INT:
+	case itk::IOComponentEnum::INT:
 	  ofs << "S32\n";
 	  break;
-	case UINT:
+	case itk::IOComponentEnum::UINT:
 	  ofs << "U32\n";
 	  break;
-	case FLOAT:
+	case itk::IOComponentEnum::FLOAT:
 	  ofs << "FLOAT\n";
 	  break;
-	case DOUBLE:
+	case itk::IOComponentEnum::DOUBLE:
 	  ofs << "DOUBLE\n";
 	  break;
 	default:
@@ -492,7 +492,7 @@ namespace itk
     
     
     // byte order
-    if( m_ByteOrder == LittleEndian )
+    if( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
     {
       ofs << "-bo DCBA\n";
     }
@@ -519,19 +519,19 @@ namespace itk
     }
 
 
-    if ( m_PixelType != SCALAR && m_PixelType != VECTOR)
+    if ( m_PixelType != itk::IOPixelEnum::SCALAR && m_PixelType != itk::IOPixelEnum::VECTOR)
     {
       throw ExceptionObject (__FILE__,__LINE__,"Error: GIS only supports SCALAR and VECTOR images.");
     }
 
-    if (m_ComponentType != CHAR &&
-	m_ComponentType != UCHAR &&
-	m_ComponentType != SHORT &&
-	m_ComponentType != USHORT &&
-	m_ComponentType != INT &&
-	m_ComponentType != UINT &&
-	m_ComponentType != FLOAT &&
-	m_ComponentType != DOUBLE)
+    if (m_ComponentType != itk::IOComponentEnum::CHAR &&
+	m_ComponentType != itk::IOComponentEnum::UCHAR &&
+	m_ComponentType != itk::IOComponentEnum::SHORT &&
+	m_ComponentType != itk::IOComponentEnum::USHORT &&
+	m_ComponentType != itk::IOComponentEnum::INT &&
+	m_ComponentType != itk::IOComponentEnum::UINT &&
+	m_ComponentType != itk::IOComponentEnum::FLOAT &&
+	m_ComponentType != itk::IOComponentEnum::DOUBLE)
     {
       throw ExceptionObject (__FILE__,__LINE__,"Error: Pixel type is not supported by GIS format yet.");
     }
@@ -565,7 +565,7 @@ namespace itk
     const unsigned long numberOfComponents = static_cast<unsigned long>( this->GetImageSizeInComponents() );
 
     // Swap bytes if necessary
-    if ( m_ByteOrder == LittleEndian )
+    if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
     {
       char * tempBuffer = new char[ numberOfBytes ];
       memcpy( tempBuffer, buffer , numberOfBytes );
@@ -593,82 +593,82 @@ namespace itk
   {
     switch(m_ComponentType)
       {
-      case CHAR:
+      case itk::IOComponentEnum::CHAR:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<char>::SwapRangeFromSystemToLittleEndian((char*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<char>::SwapRangeFromSystemToBigEndian((char *)buffer, numberOfPixels );
 	    }
 	  break;
 	}
-      case UCHAR:
+      case itk::IOComponentEnum::UCHAR:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<unsigned char>::SwapRangeFromSystemToLittleEndian(
 									    (unsigned char*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian(
 									 (unsigned char *)buffer, numberOfPixels );
 	    }
 	  break;
 	}
-      case SHORT:
+      case itk::IOComponentEnum::SHORT:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<short>::SwapRangeFromSystemToLittleEndian(
 								    (short*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<short>::SwapRangeFromSystemToBigEndian(
 								 (short *)buffer, numberOfPixels );
 	    }
 	  break;
 	}
-      case USHORT:
+      case itk::IOComponentEnum::USHORT:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<unsigned short>::SwapRangeFromSystemToLittleEndian(
 									     (unsigned short*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian(
 									  (unsigned short *)buffer, numberOfPixels );
 	    }
 	  break; 
 	}
-      case INT:
+      case itk::IOComponentEnum::INT:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<int>::SwapRangeFromSystemToLittleEndian(
 								  (int*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<int>::SwapRangeFromSystemToBigEndian(
 							       (int*)buffer, numberOfPixels );
 	    }
 	  break;
 	}
-      case UINT:
+      case itk::IOComponentEnum::UINT:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<unsigned int>::SwapRangeFromSystemToLittleEndian(
 									   (unsigned int*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian(
 									(unsigned int *)buffer, numberOfPixels );
@@ -676,28 +676,28 @@ namespace itk
 	  break; 
 	}
 	
-      case FLOAT:
+      case itk::IOComponentEnum::FLOAT:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<float>::SwapRangeFromSystemToLittleEndian(
 								    (float*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<float>::SwapRangeFromSystemToBigEndian(
 								 (float *)buffer, numberOfPixels );
 	    }
 	  break; 
 	}
-      case DOUBLE:
+      case itk::IOComponentEnum::DOUBLE:
 	{
-	  if ( m_ByteOrder == LittleEndian )
+	  if ( m_ByteOrder == itk::IOByteOrderEnum::LittleEndian )
 	    {
 	      ByteSwapper<double>::SwapRangeFromSystemToLittleEndian(
 								     (double*)buffer, numberOfPixels );
 	    }
-	  else if ( m_ByteOrder == BigEndian )
+	  else if ( m_ByteOrder == itk::IOByteOrderEnum::BigEndian )
 	    {
 	      ByteSwapper<double>::SwapRangeFromSystemToBigEndian(
 								  (double *)buffer, numberOfPixels );
diff --git a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp
index 37e278c109..7fb5735011 100644
--- a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp
+++ b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.cpp
@@ -18,7 +18,8 @@
 
 namespace itk
 {
-
+  itkEventMacroDefinition(SliceReadEvent, itk::AnyEvent);
+  
   MultiThreadedImageIOBase::MultiThreadedImageIOBase() :
     m_NumberOfThreads(0)
   {
diff --git a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h
index 2b67e700b6..c2be7ffb9e 100644
--- a/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h
+++ b/src/layers/legacy/medImageIO/itkMultiThreadedImageIOBase.h
@@ -78,5 +78,5 @@ namespace itk
     
   };
   
-  itkEventMacro (SliceReadEvent, AnyEvent)
+  itkEventMacroDeclaration(SliceReadEvent, itk::AnyEvent);
 } // end of namespace
diff --git a/src/layers/legacy/medImageIO/medInrimageImageIO.cpp b/src/layers/legacy/medImageIO/medInrimageImageIO.cpp
index ad332e19f9..e8f433d8d4 100644
--- a/src/layers/legacy/medImageIO/medInrimageImageIO.cpp
+++ b/src/layers/legacy/medImageIO/medInrimageImageIO.cpp
@@ -13,7 +13,7 @@
 =========================================================================*/
 
 #include "medInrimageImageIO.h"
-#include <itkExceptionObject.h>
+#include <itkMacro.h>
 #include <itkByteSwapper.h>
 #include <itkImageIOBase.h>
 
@@ -136,13 +136,13 @@ InrimageImageIO::InrimageImageIO()
 
     // pixel type is UCHAR
     // m_PixelType is a protected member of ImageIOBase (IODataType itk::ImageIOBase::m_PixelType)
-    this->SetPixelType(SCALAR);
+    this->SetPixelType(itk::IOPixelEnum::SCALAR);
     this->SetNumberOfComponents(1);
-    this->SetComponentType(DOUBLE);
+    this->SetComponentType(itk::IOComponentEnum::DOUBLE);
 
 
     // Byte order
-    this->SetByteOrder((itk::ByteSwapper<int>::SystemIsBigEndian() == true) ? BigEndian : LittleEndian);
+    this->SetByteOrder((itk::ByteSwapper<int>::SystemIsBigEndian() == true) ? itk::IOByteOrderEnum::BigEndian : itk::IOByteOrderEnum::LittleEndian);
 
     // additionnal information
     // (inrimage only)
@@ -171,30 +171,30 @@ void InrimageImageIO::PrintSelf(std::ostream& os, itk::Indent indent) const
     os << indent << "PixelType " << m_PixelType << std::endl;
 }
 
-const std::type_info& InrimageImageIO::ConvertToTypeInfo(IOPixelType t) const
+const std::type_info& InrimageImageIO::ConvertToTypeInfo(itk::IOComponentEnum t) const
 {
 
     switch (t)
     {
-        case UCHAR:
+        case itk::IOComponentEnum::UCHAR:
             return typeid(unsigned char);
-        case CHAR:
+        case itk::IOComponentEnum::CHAR:
             return typeid(char);
-        case USHORT:
+        case itk::IOComponentEnum::USHORT:
             return typeid(unsigned short);
-        case SHORT:
+        case itk::IOComponentEnum::SHORT:
             return typeid(short);
-        case UINT:
+        case itk::IOComponentEnum::UINT:
             return typeid(unsigned int);
-        case INT:
+        case itk::IOComponentEnum::INT:
             return typeid(int);
-        case ULONG:
+        case itk::IOComponentEnum::ULONG:
             return typeid(unsigned long);
-        case LONG:
+        case itk::IOComponentEnum::LONG:
             return typeid(long);
-        case FLOAT:
+        case itk::IOComponentEnum::FLOAT:
             return typeid(float);
-        case DOUBLE:
+        case itk::IOComponentEnum::DOUBLE:
             return typeid(double);
             /*case RGB:
               return typeid(RGBPixel<unsigned char>);
@@ -204,7 +204,7 @@ const std::type_info& InrimageImageIO::ConvertToTypeInfo(IOPixelType t) const
         default:
             itkExceptionMacro("Invalid type: " << m_PixelType);
     }
-    return typeid(ImageIOBase::UNKNOWNPIXELTYPE);
+    return typeid(itk::IOComponentEnum::UNKNOWNCOMPONENTTYPE);
 
 }
 
@@ -653,10 +653,10 @@ void InrimageImageIO::ReadImageInformation()
     }
 
     if (std::string(type, 0, strlen("unsigned")).compare("unsigned") == 0) {
-        if (pixsize == 8) this->SetComponentType(UCHAR);
-        else if (pixsize == 16) this->SetComponentType(USHORT);
-        else if (pixsize == 32) this->SetComponentType(UINT);
-        else if (pixsize == 64) this->SetComponentType(ULONG);
+        if (pixsize == 8) this->SetComponentType(itk::IOComponentEnum::UCHAR);
+        else if (pixsize == 16) this->SetComponentType(itk::IOComponentEnum::USHORT);
+        else if (pixsize == 32) this->SetComponentType(itk::IOComponentEnum::UINT);
+        else if (pixsize == 64) this->SetComponentType(itk::IOComponentEnum::ULONG);
         else {
             itk::ExceptionObject exception(__FILE__, __LINE__);
             exception.SetDescription("Pixel Size Not Recognized");
@@ -664,10 +664,10 @@ void InrimageImageIO::ReadImageInformation()
         }
     }
     else if (std::string(type, 0, strlen("signed")).compare("signed") == 0) {
-        if (pixsize == 8) this->SetComponentType(CHAR);
-        else if (pixsize == 16) this->SetComponentType(SHORT);
-        else if (pixsize == 32) this->SetComponentType(INT);
-        else if (pixsize == 64) this->SetComponentType(LONG);
+        if (pixsize == 8) this->SetComponentType(itk::IOComponentEnum::CHAR);
+        else if (pixsize == 16) this->SetComponentType(itk::IOComponentEnum::SHORT);
+        else if (pixsize == 32) this->SetComponentType(itk::IOComponentEnum::INT);
+        else if (pixsize == 64) this->SetComponentType(itk::IOComponentEnum::LONG);
         else {
             itk::ExceptionObject exception(__FILE__, __LINE__);
             exception.SetDescription("Pixel Size Not Recognized");
@@ -675,8 +675,8 @@ void InrimageImageIO::ReadImageInformation()
         }
     }
     else if (std::string(type, 0, strlen("float")).compare("float") == 0) {
-        if (pixsize == 32) this->SetComponentType(FLOAT);
-        else if (pixsize == 64) this->SetComponentType(DOUBLE);
+        if (pixsize == 32) this->SetComponentType(itk::IOComponentEnum::FLOAT);
+        else if (pixsize == 64) this->SetComponentType(itk::IOComponentEnum::DOUBLE);
         else {
             itk::ExceptionObject exception(__FILE__, __LINE__);
             exception.SetDescription("Pixel Size Not Recognized");
@@ -684,7 +684,7 @@ void InrimageImageIO::ReadImageInformation()
         }
     }
 
-    this->SetPixelType(SCALAR);
+    this->SetPixelType(itk::IOPixelEnum::SCALAR);
 
     if (0) {
         std::cout << "type " << type << std::endl;
@@ -712,8 +712,8 @@ void InrimageImageIO::ReadImageInformation()
             switch (this->GetComponentType()) {
                 default:
                     break;
-                case UCHAR:
-                    this->SetPixelType(RGB);
+                case itk::IOComponentEnum::UCHAR:
+                    this->SetPixelType(itk::IOPixelEnum::RGB);
                     this->SetNumberOfComponents(1);
                     break;
             }
@@ -722,8 +722,8 @@ void InrimageImageIO::ReadImageInformation()
             switch (this->GetComponentType()) {
                 default:
                     break;
-                case UCHAR:
-                    this->SetPixelType(RGBA);
+                case itk::IOComponentEnum::UCHAR:
+                    this->SetPixelType(itk::IOPixelEnum::RGBA);
                     this->SetNumberOfComponents(1);
                     break;
             }
@@ -839,24 +839,24 @@ ::Write(const void* buffer)
     char scale[20];
     switch (this->GetComponentType())
     {
-        case UCHAR:
-        case USHORT:
-        case UINT:
-        case ULONG:
+        case itk::IOComponentEnum::UCHAR:
+        case itk::IOComponentEnum::USHORT:
+        case itk::IOComponentEnum::UINT:
+        case itk::IOComponentEnum::ULONG:
             type = "unsigned fixed";
             sprintf(scale, "SCALE=2**0\n");
             break;
 
-        case CHAR:
-        case SHORT:
-        case INT:
-        case LONG:
+        case itk::IOComponentEnum::CHAR:
+        case itk::IOComponentEnum::SHORT:
+        case itk::IOComponentEnum::INT:
+        case itk::IOComponentEnum::LONG:
             type = "signed fixed";
             sprintf(scale, "SCALE=2**0\n");
             break;
 
-        case FLOAT:
-        case DOUBLE:
+        case itk::IOComponentEnum::FLOAT:
+        case itk::IOComponentEnum::DOUBLE:
             type = "float";
             scale[0] = '\0';
             break;
@@ -869,25 +869,25 @@ ::Write(const void* buffer)
     int pixsize = 8;
     switch (this->GetComponentType())
     {
-        case UCHAR:
-        case CHAR:
+        case itk::IOComponentEnum::UCHAR:
+        case itk::IOComponentEnum::CHAR:
             pixsize = 8;
             break;
 
-        case USHORT:
-        case SHORT:
+        case itk::IOComponentEnum::USHORT:
+        case itk::IOComponentEnum::SHORT:
             pixsize = 16;
             break;
 
-        case UINT:
-        case INT:
-        case FLOAT:
+        case itk::IOComponentEnum::UINT:
+        case itk::IOComponentEnum::INT:
+        case itk::IOComponentEnum::FLOAT:
             pixsize = 32;
             break;
 
-        case ULONG:
-        case LONG:
-        case DOUBLE:
+        case itk::IOComponentEnum::ULONG:
+        case itk::IOComponentEnum::LONG:
+        case itk::IOComponentEnum::DOUBLE:
             pixsize = 64;
             break;
 
@@ -897,7 +897,7 @@ ::Write(const void* buffer)
     }
 
     std::string endianness;
-    if (this->GetByteOrder() == LittleEndian)
+    if (this->GetByteOrder() == itk::IOByteOrderEnum::LittleEndian)
         endianness = "decm";
     else
         endianness = "sun";
@@ -1043,47 +1043,47 @@ ::Write(const void* buffer)
 
 void InrimageImageIO::SwapBytesIfNecessary(void* buffer, unsigned long numberOfPixels)
 {
-    if (ImageIOBase::GetByteOrder() == LittleEndian)
+    if (ImageIOBase::GetByteOrder() == itk::IOByteOrderEnum::LittleEndian)
     {
-        switch (m_PixelType)
+        switch (m_ComponentType)
         {
-            case CHAR:
+            case itk::IOComponentEnum::CHAR:
                 itk::ByteSwapper<char>::SwapRangeFromSystemToLittleEndian((char*)buffer,
                                                                      numberOfPixels);
                 break;
-            case UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 itk::ByteSwapper<unsigned char>::SwapRangeFromSystemToLittleEndian
                         ((unsigned char*)buffer, numberOfPixels);
                 break;
-            case SHORT:
+            case itk::IOComponentEnum::SHORT:
                 itk::ByteSwapper<short>::SwapRangeFromSystemToLittleEndian
                         ((short*)buffer, numberOfPixels);
                 break;
-            case USHORT:
+            case itk::IOComponentEnum::USHORT:
                 itk::ByteSwapper<unsigned short>::SwapRangeFromSystemToLittleEndian
                         ((unsigned short*)buffer, numberOfPixels);
                 break;
-            case INT:
+            case itk::IOComponentEnum::INT:
                 itk::ByteSwapper<int>::SwapRangeFromSystemToLittleEndian
                         ((int*)buffer, numberOfPixels);
                 break;
-            case UINT:
+            case itk::IOComponentEnum::UINT:
                 itk::ByteSwapper<unsigned int>::SwapRangeFromSystemToLittleEndian
                         ((unsigned int*)buffer, numberOfPixels);
                 break;
-            case LONG:
+            case itk::IOComponentEnum::LONG:
                 itk::ByteSwapper<long>::SwapRangeFromSystemToLittleEndian
                         ((long*)buffer, numberOfPixels);
                 break;
-            case ULONG:
+            case itk::IOComponentEnum::ULONG:
                 itk::ByteSwapper<unsigned long>::SwapRangeFromSystemToLittleEndian
                         ((unsigned long*)buffer, numberOfPixels);
                 break;
-            case FLOAT:
+            case itk::IOComponentEnum::FLOAT:
                 itk::ByteSwapper<float>::SwapRangeFromSystemToLittleEndian((float*)buffer,
                                                                       numberOfPixels);
                 break;
-            case DOUBLE:
+            case itk::IOComponentEnum::DOUBLE:
                 itk::ByteSwapper<double>::SwapRangeFromSystemToLittleEndian
                         ((double*)buffer, numberOfPixels);
                 break;
@@ -1095,45 +1095,45 @@ void InrimageImageIO::SwapBytesIfNecessary(void* buffer, unsigned long numberOfP
     }
     else
     {
-        switch (m_PixelType)
+        switch (m_ComponentType)
         {
-            case CHAR:
+            case itk::IOComponentEnum::CHAR:
                 itk::ByteSwapper<char>::SwapRangeFromSystemToBigEndian((char *)buffer,
                                                                   numberOfPixels);
                 break;
-            case UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 itk::ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian
                         ((unsigned char *)buffer, numberOfPixels);
                 break;
-            case SHORT:
+            case itk::IOComponentEnum::SHORT:
                 itk::ByteSwapper<short>::SwapRangeFromSystemToBigEndian
                         ((short *)buffer, numberOfPixels);
                 break;
-            case USHORT:
+            case itk::IOComponentEnum::USHORT:
                 itk::ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian
                         ((unsigned short *)buffer, numberOfPixels);
                 break;
-            case INT:
+            case itk::IOComponentEnum::INT:
                 itk::ByteSwapper<int>::SwapRangeFromSystemToBigEndian
                         ((int *)buffer, numberOfPixels);
                 break;
-            case UINT:
+            case itk::IOComponentEnum::UINT:
                 itk::ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian
                         ((unsigned int *)buffer, numberOfPixels);
                 break;
-            case LONG:
+            case itk::IOComponentEnum::LONG:
                 itk::ByteSwapper<long>::SwapRangeFromSystemToBigEndian
                         ((long *)buffer, numberOfPixels);
                 break;
-            case ULONG:
+            case itk::IOComponentEnum::ULONG:
                 itk::ByteSwapper<unsigned long>::SwapRangeFromSystemToBigEndian
                         ((unsigned long *)buffer, numberOfPixels);
                 break;
-            case FLOAT:
+            case itk::IOComponentEnum::FLOAT:
                 itk::ByteSwapper<float>::SwapRangeFromSystemToBigEndian
                         ((float *)buffer, numberOfPixels);
                 break;
-            case DOUBLE:
+            case itk::IOComponentEnum::DOUBLE:
                 itk::ByteSwapper<double>::SwapRangeFromSystemToBigEndian
                         ((double *)buffer, numberOfPixels);
                 break;
diff --git a/src/layers/legacy/medImageIO/medInrimageImageIO.h b/src/layers/legacy/medImageIO/medInrimageImageIO.h
index 58eddcc08c..f6d3e2965a 100644
--- a/src/layers/legacy/medImageIO/medInrimageImageIO.h
+++ b/src/layers/legacy/medImageIO/medInrimageImageIO.h
@@ -71,7 +71,7 @@ class MEDIMAGEIO_EXPORT InrimageImageIO : public itk::ImageIOBase
     virtual void ReadImageInformation();
 
     /** Convert to type_info */
-    const std::type_info& ConvertToTypeInfo(IOPixelType) const;
+    const std::type_info& ConvertToTypeInfo(itk::IOComponentEnum) const;
 
     /** Reads the data from disk into the memory buffer provided. */
     virtual void Read(void* buffer);
diff --git a/src/layers/legacy/medUtilities/CMakeLists.txt b/src/layers/legacy/medUtilities/CMakeLists.txt
index 854243aad9..61d4ee6bb7 100644
--- a/src/layers/legacy/medUtilities/CMakeLists.txt
+++ b/src/layers/legacy/medUtilities/CMakeLists.txt
@@ -25,7 +25,7 @@ include_directories(${dtk_INCLUDE_DIRS})
 find_package(VTK REQUIRED COMPONENTS vtkInteractionWidgets )
 include(${VTK_USE_FILE})
 
-find_package(ITK REQUIRED COMPONENTS ITKCommon ITKIOGDCM ITKThresholding)
+find_package(ITK REQUIRED COMPONENTS ITKCommon ITKGDCM ITKIOGDCM ITKThresholding)
 include(${ITK_USE_FILE})
 
 if (ITK_USE_SYSTEM_GDCM)
diff --git a/src/plugins/legacy/LCCLogDemons/CMakeLists.txt b/src/plugins/legacy/LCCLogDemons/CMakeLists.txt
index f9fda1b3ea..59c8a0373d 100644
--- a/src/plugins/legacy/LCCLogDemons/CMakeLists.txt
+++ b/src/plugins/legacy/LCCLogDemons/CMakeLists.txt
@@ -98,6 +98,7 @@ SET(ITKIO_LIBRARIES
 
 target_link_libraries(${TARGET_NAME}
   ${ITKIO_LIBRARIES}
+  ITKPDEDeformableRegistration
   Qt5::Core
   dtkLog
   dtkCoreSupport
diff --git a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp
index cf065add03..713e642cc9 100644
--- a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp
+++ b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.cpp
@@ -19,7 +19,6 @@
 // /////////////////////////////////////////////////////////////////
 
 #include <itkImageRegistrationMethod.h>
-
 #include <itkImage.h>
 #include <itkResampleImageFilter.h>
 #include <itkCastImageFilter.h>
@@ -167,17 +166,24 @@ QString LCCLogDemons::description() const
 template <typename PixelType>
 int LCCLogDemonsPrivate::update()
 {
-    int testResult = proc->testInputs();
-    if (testResult != medAbstractProcessLegacy::SUCCESS)
-    {
-        return testResult;
-    }
-
+    RegImageType *inputFixed  = static_cast<RegImageType*>(proc->fixedImage().GetPointer());
+    RegImageType *inputMoving = static_cast<RegImageType*>(proc->movingImages()[0].GetPointer());
+
+    // Cast spacing, origin, direction and size from the moving data to the fixed one
+    typedef itk::ResampleImageFilter<RegImageType, RegImageType> ResampleFilterType;
+    typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New();
+    resampleFilter->SetOutputSpacing(inputFixed->GetSpacing());
+    resampleFilter->SetOutputOrigin(inputFixed->GetOrigin());
+    resampleFilter->SetOutputDirection(inputFixed->GetDirection());
+    resampleFilter->SetSize(inputFixed->GetLargestPossibleRegion().GetSize());
+    resampleFilter->SetInput(inputMoving);
+    resampleFilter->Update();
+    inputMoving = resampleFilter->GetOutput();
+
+    // Register the fixed and moving data
     registrationMethod = new rpi::LCClogDemons<RegImageType,RegImageType,double> ();
-
-    registrationMethod->SetFixedImage((const RegImageType*) proc->fixedImage().GetPointer());
-    registrationMethod->SetMovingImage((const RegImageType*) proc->movingImages()[0].GetPointer());
-
+    registrationMethod->SetFixedImage(inputFixed);
+    registrationMethod->SetMovingImage(inputMoving);
     registrationMethod->SetUpdateRule(updateRule);
     registrationMethod->SetVerbosity(verbose);
 
@@ -219,12 +225,8 @@ int LCCLogDemonsPrivate::update()
     typedef itk::ResampleImageFilter< RegImageType,RegImageType, double> ResampleFilterType;
     typename ResampleFilterType::Pointer resampler = ResampleFilterType::New();
     resampler->SetTransform(registrationMethod->GetDisplacementFieldTransformation());
-    resampler->SetInput((const RegImageType*)proc->movingImages()[0].GetPointer());
-    resampler->SetSize( proc->fixedImage()->GetLargestPossibleRegion().GetSize() );
-    resampler->SetOutputOrigin( proc->fixedImage()->GetOrigin() );
-    resampler->SetOutputSpacing( proc->fixedImage()->GetSpacing() );
-    resampler->SetOutputDirection( proc->fixedImage()->GetDirection() );
-    resampler->SetDefaultPixelValue( 0 );
+    resampler->SetInput(inputMoving);
+    resampler->SetDefaultPixelValue(0);
     
     // Set the image interpolator
     switch(interpolatorType)
@@ -266,31 +268,11 @@ int LCCLogDemonsPrivate::update()
         qDebug() << "ExceptionObject caught (resampler): " << err.GetDescription();
         return medAbstractProcessLegacy::FAILURE;
     }
-    
-    itk::ImageBase<3>::Pointer result = resampler->GetOutput();
-    result->DisconnectPipeline();
-    
-    if (proc->output())
-    {
-        proc->output()->setData (result);
-    }
-    return medAbstractProcessLegacy::SUCCESS;
-}
 
-medAbstractProcessLegacy::DataError LCCLogDemons::testInputs()
-{
-    if (d->proc->fixedImage()->GetLargestPossibleRegion().GetSize()
-            != d->proc->movingImages()[0]->GetLargestPossibleRegion().GetSize())
-    {
-        return medAbstractProcessLegacy::MISMATCHED_DATA_SIZE;
-    }
-
-    if (d->proc->fixedImage()->GetSpacing()
-            != d->proc->movingImages()[0]->GetSpacing())
+    if (proc->output())
     {
-        return medAbstractProcessLegacy::MISMATCHED_DATA_SPACING;
+        proc->output()->setData(resampler->GetOutput());
     }
-
     return medAbstractProcessLegacy::SUCCESS;
 }
 
diff --git a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h
index 67314feae1..e608a34504 100644
--- a/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h
+++ b/src/plugins/legacy/LCCLogDemons/LCCLogDemons.h
@@ -69,11 +69,6 @@ class LCCLogDemonsPLUGIN_EXPORT LCCLogDemons : public itkProcessRegistration
     */
     virtual QString getTitleAndParameters();
 
-    /**
-     * @brief testInputs() tests origin, dimension and spacing of the input
-     * @return medAbstractProcess::DataError according to the test result
-    */
-    medAbstractProcessLegacy::DataError testInputs();
 protected :
     /**
      * @brief
diff --git a/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp b/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp
index d0494cbff1..882178bc04 100644
--- a/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp
+++ b/src/plugins/legacy/LCCLogDemons/LCCLogDemonsToolBox.cpp
@@ -53,15 +53,8 @@ class LCCLogDemonsToolBoxPrivate
 LCCLogDemonsToolBox::LCCLogDemonsToolBox(QWidget *parent) : medAbstractSelectableToolBox(parent), d(new LCCLogDemonsToolBoxPrivate)
 {
     QWidget *widget = new QWidget(this);
-
     QVBoxLayout * layout = new QVBoxLayout();
 
-    QLabel *explanation = new QLabel("Drop 2 datasets with same size and spacing.\n");
-    explanation->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred);
-    explanation->setWordWrap(true);
-    explanation->setStyleSheet("font: italic");
-    layout->addWidget(explanation);
-
     // Standard parameters
     d->iterationsLine = new QLineEdit();
     d->iterationsLine->setText("15x10x5");
diff --git a/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt b/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt
index cb9ca6a237..698e4c4598 100644
--- a/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt
+++ b/src/plugins/legacy/diffeomorphicDemons/CMakeLists.txt
@@ -88,6 +88,7 @@ target_link_libraries(${TARGET_NAME}
   dtkCore
   dtkLog
   ITKCommon
+  ITKPDEDeformableRegistration
   medCore
   medRegistration
   )
diff --git a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp
index 953315b849..756df42df1 100644
--- a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp
+++ b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.cpp
@@ -15,7 +15,7 @@
 
 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
 #include <DiffeomorphicDemons/rpiDiffeomorphicDemons.hxx>
-#include <itkChangeInformationImageFilter.h>
+#include <itkResampleImageFilter.h>
 #include <rpiCommonTools.hxx>
 
 // /////////////////////////////////////////////////////////////////
@@ -93,33 +93,29 @@ int diffeomorphicDemonsPrivate::update()
 {
     typedef itk::Image< PixelType, 3 >  FixedImageType;
     typedef itk::Image< PixelType, 3 >  MovingImageType;
-
     typedef itk::Image< float, 3 > RegImageType;
     typedef double TransformScalarType;
 
-    int testResult = proc->testInputs();
-    if (testResult != medAbstractProcessLegacy::SUCCESS)
-    {
-        return testResult;
-    }
-
-    FixedImageType  *inputFixed  = (FixedImageType*)  proc->fixedImage().GetPointer();
-    MovingImageType *inputMoving = (MovingImageType*) proc->movingImages()[0].GetPointer();
-
-    // The output volume is going to located at the origin/direction of the fixed input. Needed for rpi::DiffeomorphicDemons
-    typedef itk::ChangeInformationImageFilter< FixedImageType > FilterType;
-    typename FilterType::Pointer filter = FilterType::New();
-    filter->SetOutputOrigin(inputFixed->GetOrigin());
-    filter->ChangeOriginOn();
-    filter->SetOutputDirection(inputFixed->GetDirection());
-    filter->ChangeDirectionOn();
-    filter->SetInput(inputMoving);
-
+    FixedImageType  *inputFixed  = static_cast<FixedImageType*>(proc->fixedImage().GetPointer());
+    MovingImageType *inputMoving = static_cast<MovingImageType*>(proc->movingImages()[0].GetPointer());
+
+    // Cast spacing, origin, direction and size from the moving data to the fixed one
+    typedef itk::ResampleImageFilter<MovingImageType, MovingImageType> ResampleFilterType;
+    typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New();
+    resampleFilter->SetOutputSpacing(inputFixed->GetSpacing());
+    resampleFilter->SetOutputOrigin(inputFixed->GetOrigin());
+    resampleFilter->SetOutputDirection(inputFixed->GetDirection());
+    resampleFilter->SetSize(inputFixed->GetLargestPossibleRegion().GetSize());
+    resampleFilter->SetInput(inputMoving);
+    resampleFilter->Update();
+    inputMoving = resampleFilter->GetOutput();
+
+    // Register the fixed and moving data
     typedef rpi::DiffeomorphicDemons< RegImageType, RegImageType, TransformScalarType > RegistrationType;
     RegistrationType *registration = new RegistrationType;
     registrationMethod = registration;
     registration->SetFixedImage(inputFixed);
-    registration->SetMovingImage(filter->GetOutput());
+    registration->SetMovingImage(inputMoving);
     registration->SetNumberOfIterations(iterations);
     registration->SetMaximumUpdateStepLength(maximumUpdateStepLength);
     registration->SetUpdateFieldStandardDeviation(updateFieldStandardDeviation);
@@ -160,7 +156,6 @@ int diffeomorphicDemonsPrivate::update()
 
     // Print method parameters
     QString methodParameters = proc->getTitleAndParameters();
-
     qDebug() << "METHOD PARAMETERS";
     qDebug() << methodParameters;
 
@@ -181,19 +176,15 @@ int diffeomorphicDemonsPrivate::update()
 
     emit proc->progressed(80);
 
-    typedef itk::ResampleImageFilter< MovingImageType,MovingImageType,TransformScalarType >    ResampleFilterType;
-    typename ResampleFilterType::Pointer resampler = ResampleFilterType::New();
-    resampler->SetTransform(registration->GetTransformation());
-    resampler->SetInput((const MovingImageType*) inputMoving);
-    resampler->SetSize( proc->fixedImage()->GetLargestPossibleRegion().GetSize() );
-    resampler->SetOutputOrigin( proc->fixedImage()->GetOrigin() );
-    resampler->SetOutputSpacing( proc->fixedImage()->GetSpacing() );
-    resampler->SetOutputDirection( proc->fixedImage()->GetDirection() );
-    resampler->SetDefaultPixelValue( 0 );
-
+    // Cast new transformation
+    typedef itk::ResampleImageFilter< MovingImageType,MovingImageType,TransformScalarType > ResampleTransformation;
+    typename ResampleTransformation::Pointer resampleTransformation = ResampleTransformation::New();
+    resampleTransformation->SetTransform(registration->GetTransformation());
+    resampleTransformation->SetInput(inputMoving);
+    resampleTransformation->SetDefaultPixelValue(0);
     try
     {
-        resampler->Update();
+        resampleTransformation->Update();
     }
     catch (itk::ExceptionObject & err)
     {
@@ -201,33 +192,13 @@ int diffeomorphicDemonsPrivate::update()
         return medAbstractProcessLegacy::FAILURE;
     }
 
-    itk::ImageBase<3>::Pointer result = resampler->GetOutput();
-    result->DisconnectPipeline();
-
     if (proc->output())
     {
-        proc->output()->setData (result);
+        proc->output()->setData(resampleTransformation->GetOutput());
     }
     return medAbstractProcessLegacy::SUCCESS;
 }
 
-medAbstractProcessLegacy::DataError diffeomorphicDemons::testInputs()
-{
-    if (d->proc->fixedImage()->GetLargestPossibleRegion().GetSize()
-            != d->proc->movingImages()[0]->GetLargestPossibleRegion().GetSize())
-    {
-        return medAbstractProcessLegacy::MISMATCHED_DATA_SIZE;
-    }
-
-    if (d->proc->fixedImage()->GetSpacing()
-            != d->proc->movingImages()[0]->GetSpacing())
-    {
-        return medAbstractProcessLegacy::MISMATCHED_DATA_SPACING;
-    }
-
-    return medAbstractProcessLegacy::SUCCESS;
-}
-
 int diffeomorphicDemons::update(itkProcessRegistration::ImageType imgType)
 {
     // Cast has been done in itkProcessRegistration
diff --git a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h
index 14da0f132f..79f44ae1f6 100644
--- a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h
+++ b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemons.h
@@ -138,12 +138,6 @@ class DIFFEOMORPHICDEMONSPLUGIN_EXPORT diffeomorphicDemons : public itkProcessRe
     */
     virtual QString getTitleAndParameters();
 
-    /**
-         * @brief testInputs() tests origin, dimension and spacing of the input
-         * @return medAbstractProcess::DataError according to the test result
-         */
-    medAbstractProcessLegacy::DataError testInputs();
-
 protected :
     /**
      * @brief Writes the transformation, in this case the displacement field,
diff --git a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp
index 041bfeaa41..4739021f18 100644
--- a/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp
+++ b/src/plugins/legacy/diffeomorphicDemons/diffeomorphicDemonsToolBox.cpp
@@ -42,15 +42,8 @@ diffeomorphicDemonsToolBox::diffeomorphicDemonsToolBox(QWidget *parent)
     : medAbstractSelectableToolBox(parent), d(new diffeomorphicDemonsToolBoxPrivate)
 {
     QWidget *widget = new QWidget(this);
-
     QVBoxLayout *layout = new QVBoxLayout();
 
-    QLabel *explanation = new QLabel("Drop 2 datasets with same size and spacing.\n");
-    explanation->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred);
-    explanation->setWordWrap(true);
-    explanation->setStyleSheet("font: italic");
-    layout->addWidget(explanation);
-
     d->iterationsBox = new QLineEdit();
     d->iterationsBox->setText("15x10x5");
     d->iterationsBox->setToolTip(tr("Each number of iteration per level must be separated by \"x\". From coarser to finest levels"));
diff --git a/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt b/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt
index 6ce7e70c57..c68bc0fcaf 100644
--- a/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt
+++ b/src/plugins/legacy/itkDataDiffusionGradientList/CMakeLists.txt
@@ -35,9 +35,7 @@ include_directories(${dtk_INCLUDE_DIRS})
 find_package(ITK REQUIRED COMPONENTS ITKCommon)
 include(${ITK_USE_FILE})
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
-
+find_package(TTK REQUIRED COMPONENTS ITKTensor)
 
 ## #############################################################################
 ## List Sources
@@ -91,7 +89,7 @@ target_link_libraries(${TARGET_NAME}
   ${QT_LIBRARIES}
   dtkLog
   dtkCore
-  ITKTensor
+  TTK::ITKTensor
   medCore
   medLog
   )
diff --git a/src/plugins/legacy/itkDataImage/CMakeLists.txt b/src/plugins/legacy/itkDataImage/CMakeLists.txt
index d40884c0a0..b89ba131a9 100644
--- a/src/plugins/legacy/itkDataImage/CMakeLists.txt
+++ b/src/plugins/legacy/itkDataImage/CMakeLists.txt
@@ -50,7 +50,7 @@ set(ITK_IMAGES_DEPENDENCIES
     ITKIOPhilipsREC
 )
 
-find_package(ITK REQUIRED COMPONENTS ITKIOImageBase ITKIOGDCM ITKIOVTK ITKVtkGlue ${ITK_IMAGES_DEPENDENCIES})
+find_package(ITK REQUIRED COMPONENTS ITKIOImageBase ITKGDCM ITKIOGDCM ITKIOVTK ITKVtkGlue ${ITK_IMAGES_DEPENDENCIES})
 include(${ITK_USE_FILE})
 
 # itkLogForwarder used through medLog
@@ -137,7 +137,8 @@ target_link_libraries(${TARGET_NAME}
   Qt5::Widgets
   dtkCore
   dtkLog
-  ITKStatistics
+  gdcmCommon
+  ${ITK_LIBRARIES}
   medCore
   medImageIO
   medLog
diff --git a/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp b/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp
index f68f5b4143..2f7cf197e0 100644
--- a/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp
+++ b/src/plugins/legacy/itkDataImage/readers/itkDCMTKDataImageReader.cpp
@@ -19,6 +19,8 @@
 
 #include <itkDCMTKImageIO.h>
 
+#include <itkCommonEnums.h>
+#include <itkImageIOBase.h>
 #include <itkImageFileReader.h>
 #include <itkRGBPixel.h>
 #include <itkMetaDataDictionary.h>
@@ -301,42 +303,42 @@ bool itkDCMTKDataImageReader::readInformation(const QStringList& paths)
         std::ostringstream imagetypestring;
         imagetypestring << "itkDataImage";
 
-        if (d->io->GetPixelType() == itk::ImageIOBase::SCALAR)
+        if (d->io->GetPixelType() == itk::IOPixelEnum::SCALAR)
         {
             switch (d->io->GetComponentType())
             {
-            case itk::ImageIOBase::UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 imagetypestring << "UChar";
                 break;
-            case itk::ImageIOBase::CHAR:
+            case itk::IOComponentEnum::CHAR:
                 imagetypestring << "Char";
                 break;
-            case itk::ImageIOBase::USHORT:
+            case itk::IOComponentEnum::USHORT:
                 imagetypestring << "UShort";
                 break;
-            case itk::ImageIOBase::SHORT:
+            case itk::IOComponentEnum::SHORT:
                 imagetypestring << "Short";
                 break;
-            case itk::ImageIOBase::UINT:
+            case itk::IOComponentEnum::UINT:
                 imagetypestring << "UInt";
                 break;
-            case itk::ImageIOBase::INT:
+            case itk::IOComponentEnum::INT:
                 imagetypestring << "Int";
                 break;
-            case itk::ImageIOBase::ULONG:
+            case itk::IOComponentEnum::ULONG:
                 imagetypestring << "ULong";
                 break;
-            case itk::ImageIOBase::LONG:
+            case itk::IOComponentEnum::LONG:
                 imagetypestring << "Long";
                 break;
-            case itk::ImageIOBase::FLOAT:
+            case itk::IOComponentEnum::FLOAT:
                 imagetypestring << "Float";
                 break;
-            case itk::ImageIOBase::DOUBLE:
+            case itk::IOComponentEnum::DOUBLE:
                 imagetypestring << "Double";
                 break;
             default:
-                qDebug() << "Unrecognized component type: " << d->io->GetComponentType();
+                qDebug() << "Unrecognized component type: " << static_cast<int>(d->io->GetComponentType());
                 return false;
             }
 
@@ -345,12 +347,12 @@ bool itkDCMTKDataImageReader::readInformation(const QStringList& paths)
             if (medData)
                 this->setData(medData);
         }
-        else if (d->io->GetPixelType() == itk::ImageIOBase::RGB)
+        else if (d->io->GetPixelType() == itk::IOPixelEnum::RGB)
         {
 
             switch (d->io->GetComponentType())
             {
-            case itk::ImageIOBase::UCHAR:
+            case itk::IOComponentEnum::UCHAR:
                 medData = medAbstractDataFactory::instance()->create("itkDataImageRGB3");
 
                 if (medData)
diff --git a/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp b/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp
index f3231825e9..984be7b43d 100644
--- a/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp
+++ b/src/plugins/legacy/itkDataImage/readers/itkGDCMDataImageReader.cpp
@@ -31,6 +31,8 @@
 
 #include <medMetaDataKeys.h>
 
+#include <QDebug>
+
 #include <map>
 
 const char itkGDCMDataImageReader::ID[] = "itkGDCMDataImageReader";
@@ -279,7 +281,7 @@ bool itkGDCMDataImageReader::readInformation(const QStringList &paths)
         std::ostringstream imagetypestring;
         imagetypestring << "itkDataImage";
 
-        if (d->io->GetPixelType() != itk::ImageIOBase::SCALAR)
+        if (d->io->GetPixelType() != itk::IOPixelEnum::SCALAR)
         {
             dtkDebug() << "Unsupported pixel type";
             return false;
@@ -287,34 +289,34 @@ bool itkGDCMDataImageReader::readInformation(const QStringList &paths)
 
         switch (d->io->GetComponentType())
         {
-        case itk::ImageIOBase::UCHAR:
+        case itk::IOComponentEnum::UCHAR:
             imagetypestring << "UChar";
             break;
-        case itk::ImageIOBase::CHAR:
+        case itk::IOComponentEnum::CHAR:
             imagetypestring << "Char";
             break;
-        case itk::ImageIOBase::USHORT:
+        case itk::IOComponentEnum::USHORT:
             imagetypestring << "UShort";
             break;
-        case itk::ImageIOBase::SHORT:
+        case itk::IOComponentEnum::SHORT:
             imagetypestring << "Short";
             break;
-        case itk::ImageIOBase::UINT:
+        case itk::IOComponentEnum::UINT:
             imagetypestring << "UInt";
             break;
-        case itk::ImageIOBase::INT:
+        case itk::IOComponentEnum::INT:
             imagetypestring << "Int";
             break;
-        case itk::ImageIOBase::ULONG:
+        case itk::IOComponentEnum::ULONG:
             imagetypestring << "ULong";
             break;
-        case itk::ImageIOBase::LONG:
+        case itk::IOComponentEnum::LONG:
             imagetypestring << "Long";
             break;
-        case itk::ImageIOBase::FLOAT:
+        case itk::IOComponentEnum::FLOAT:
             imagetypestring << "Float";
             break;
-        case itk::ImageIOBase::DOUBLE:
+        case itk::IOComponentEnum::DOUBLE:
             /**
       @todo Handle properly double pixel values.
       For the moment it is only handled in 3D, not in 4D, and it is very
@@ -328,14 +330,14 @@ bool itkGDCMDataImageReader::readInformation(const QStringList &paths)
                 imagetypestring << "Double";
             break;
         default:
-            dtkDebug() << "Unrecognized component type:\t " << d->io->GetComponentType();
+            qDebug() << "Unrecognized component type:\t " << static_cast<int>(d->io->GetComponentType());
             return false;
         }
 
         imagetypestring << imagedimension;
         if (imagedimension == 4)
         {
-            dtkDebug() << "image type given :\t" << imagetypestring.str().c_str();
+            qDebug() << "image type given :\t" << imagetypestring.str().c_str();
         }
 
         medData = medAbstractDataFactory::instance()->createSmartPointer(imagetypestring.str().c_str());
diff --git a/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp b/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp
index e37fd99789..c47c08cecf 100644
--- a/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp
+++ b/src/plugins/legacy/itkDataSHImage/readers/itkDataSHImageReader.cpp
@@ -70,8 +70,7 @@ bool itkDataSHImageReader::canRead (const QStringList &paths)
 
 bool itkDataSHImageReader::canRead (const QString &path)
 {
-    itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toUtf8().constData(),
-                                                                           itk::ImageIOFactory::ReadMode);
+    itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toLatin1().constData(), itk::IOFileModeEnum::ReadMode);
 
     if (!imageIO.IsNull())
     {
@@ -114,8 +113,7 @@ bool itkDataSHImageReader::readInformation (const QStringList &paths)
 
 bool itkDataSHImageReader::readInformation (const QString &path)
 {
-    itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toUtf8().constData(),
-                                                                           itk::ImageIOFactory::ReadMode);
+    itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(path.toLatin1().constData(), itk::IOFileModeEnum::ReadMode);
     
     imageIO->SetFileName ( path.toUtf8().constData() );
     try
@@ -133,13 +131,13 @@ bool itkDataSHImageReader::readInformation (const QString &path)
     if (!medData) {
 
         switch (imageIO->GetComponentType()) {
-        case itk::ImageIOBase::FLOAT:
+        case itk::IOComponentEnum::FLOAT:
             medData = medAbstractDataFactory::instance()->create ("itkDataSHImageFloat3");
             if (medData)
                 this->setData ( medData );
             break;
 
-	    case itk::ImageIOBase::DOUBLE:
+	    case itk::IOComponentEnum::DOUBLE:
             medData = medAbstractDataFactory::instance()->create ("itkDataSHImageDouble3");
             if (medData)
                 this->setData ( medData );
diff --git a/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt b/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt
index 19e6f0e6e0..33ae107785 100644
--- a/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt
+++ b/src/plugins/legacy/itkDataTensorImage/CMakeLists.txt
@@ -38,9 +38,7 @@ include(${ITK_USE_FILE})
 find_package(VTK REQUIRED  COMPONENTS vtkCommonCore vtkCommonExecutionModel vtkRenderingCore vtkImagingCore vtkInteractionStyle vtkInteractionWidgets)
 include(${VTK_USE_FILE})
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
-
+find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms)
 
 ## #############################################################################
 ## List Sources
@@ -118,7 +116,8 @@ target_link_libraries(${TARGET_NAME}
   ITKIOPNG
   ITKIOStimulate
   ITKIOVTK
-  ITKTensor
+  TTK::ITKTensor
+  TTK::ttkAlgorithms
   medCore
   medLog
   medVtkInria
diff --git a/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp b/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp
index d7f60cded2..b5e74d0c2b 100644
--- a/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp
+++ b/src/plugins/legacy/itkDataTensorImage/readers/itkDataTensorImageReaderBase.cpp
@@ -109,13 +109,13 @@ bool itkDataTensorImageReaderBase::readInformation (const QString &path)
 
         switch (this->io->GetComponentType()) {
 
-            case itk::ImageIOBase::FLOAT:
+            case itk::IOComponentEnum::FLOAT:
                 medData = medAbstractDataFactory::instance()->create ("itkDataTensorImageFloat3");
                 if (medData)
                     this->setData ( medData );
                 break;
 
-            case itk::ImageIOBase::DOUBLE:
+            case itk::IOComponentEnum::DOUBLE:
                 medData = medAbstractDataFactory::instance()->create ("itkDataTensorImageDouble3");
                 if (medData)
                     this->setData ( medData );
diff --git a/src/plugins/legacy/itkFilters/CMakeLists.txt b/src/plugins/legacy/itkFilters/CMakeLists.txt
index e6f29f527f..63503dbda8 100644
--- a/src/plugins/legacy/itkFilters/CMakeLists.txt
+++ b/src/plugins/legacy/itkFilters/CMakeLists.txt
@@ -34,7 +34,7 @@ find_package(dtk REQUIRED)
 include_directories(${dtk_INCLUDE_DIRS})
 
 find_package(ITK REQUIRED COMPONENTS ITKCommon ITKThresholding ITKConnectedComponents
-                                     ITKSmoothing ITKBinaryMathematicalMorphology)
+                                     ITKSmoothing ITKBinaryMathematicalMorphology ITKMathematicalMorphology)
 include(${ITK_USE_FILE})
 
 ## #############################################################################
@@ -75,6 +75,8 @@ target_link_libraries(${TARGET_NAME}
   dtkCore
   dtkLog
   ITKCommon
+  ITKSmoothing
+  ITKMathematicalMorphology
   medCore
   medUtilities
   )
diff --git a/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt b/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt
index 82546fbdcf..399c1daa17 100644
--- a/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt
+++ b/src/plugins/legacy/itkProcessRegistrationOptimus/CMakeLists.txt
@@ -98,6 +98,7 @@ target_link_libraries(${TARGET_NAME}
   medCoreLegacy
   ${ITKIO_LIBRARIES}
   ITKOptimizers
+  ITKSmoothing
   medRegistration
 )
 
diff --git a/src/plugins/legacy/manualRegistration/manualRegistration.cpp b/src/plugins/legacy/manualRegistration/manualRegistration.cpp
index 04ba54193e..01fd43c7ad 100644
--- a/src/plugins/legacy/manualRegistration/manualRegistration.cpp
+++ b/src/plugins/legacy/manualRegistration/manualRegistration.cpp
@@ -160,12 +160,12 @@ template <typename PixelType, typename TransformType> int manualRegistrationPriv
     typedef itk::ResampleImageFilter< MovingImageType,MovingImageType,TransformScalarType >    ResampleFilterType;
     typename ResampleFilterType::Pointer resampler = ResampleFilterType::New();
     resampler->SetTransform(transform);
-    resampler->SetInput((const MovingImageType*)proc->movingImages()[0].GetPointer());
-    resampler->SetSize( proc->fixedImage()->GetLargestPossibleRegion().GetSize() );
+    resampler->SetInput(static_cast<const MovingImageType*>(proc->movingImages()[0].GetPointer()));
+    resampler->SetSize(proc->fixedImage()->GetLargestPossibleRegion().GetSize());
     resampler->SetOutputOrigin( proc->fixedImage()->GetOrigin() );
     resampler->SetOutputSpacing( proc->fixedImage()->GetSpacing() );
     resampler->SetOutputDirection( proc->fixedImage()->GetDirection() );
-    resampler->SetDefaultPixelValue( 0 );
+    resampler->SetDefaultPixelValue(0);
 
     try
     {
diff --git a/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp b/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp
index db9a4614b5..b5b1013f74 100644
--- a/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp
+++ b/src/plugins/legacy/manualRegistration/manualRegistrationToolBox.cpp
@@ -70,9 +70,10 @@ manualRegistrationToolBox::manualRegistrationToolBox(QWidget *parent)
     d->b_startManualRegistration->setObjectName("startManualRegistrationButton");
 
     d->explanation = new QLabel("To add a landmark: \n\tShift + left mouse button\nTo remove a pair of landmarks: \n\tBackspace + left mouse button", widget);
+    d->explanation->setStyleSheet("font: italic");
 
-    d->numberOfLdInLeftContainer = new QLabel("Number of landmarks in left container: 0", widget);
-    d->numberOfLdInRightContainer = new QLabel("Number of landmarks in right container: 0", widget);
+    d->numberOfLdInLeftContainer = new QLabel("Number of landmarks in left container: <b>0</b>", widget);
+    d->numberOfLdInRightContainer = new QLabel("Number of landmarks in right container: <b>0</b>", widget);
 
     // Choice between transformations
     QHBoxLayout* transformationLayout = new QHBoxLayout;
@@ -564,8 +565,8 @@ void manualRegistrationToolBox::displayButtons(bool show)
 
 void manualRegistrationToolBox::updateGUI(int left, int right)
 {
-    d->numberOfLdInLeftContainer->setText( "Number of landmarks in left container: " + QString::number(left));
-    d->numberOfLdInRightContainer->setText("Number of landmarks in right container: " + QString::number(right));
+    d->numberOfLdInLeftContainer->setText(QString("Number of landmarks in left container: <b>%1</b>").arg(left));
+    d->numberOfLdInRightContainer->setText(QString("Number of landmarks in right container: <b>%1</b>").arg(right));
 
     if (left == right)
     {
diff --git a/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt b/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt
index 62865cfb72..2628424008 100644
--- a/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt
+++ b/src/plugins/legacy/medAlgorithmPaint/CMakeLists.txt
@@ -72,6 +72,7 @@ add_library(${TARGET_NAME} SHARED
 target_link_libraries(${TARGET_NAME}
   ${QT_LIBRARIES}
   ITKCommon
+  ITKRegionGrowing
   medCore
   medUtilities
   )
diff --git a/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp b/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp
index 9fbfd66239..f57c765cbc 100644
--- a/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp
+++ b/src/plugins/legacy/medAlgorithmPaint/medAlgorithmPaintToolBox.cpp
@@ -15,7 +15,7 @@
 
 #include <itkConnectedThresholdImageFilter.h>
 #include <itkDanielssonDistanceMapImageFilter.h>
-#include <itkExceptionObject.h>
+#include <itkMacro.h>
 #include <itkExtractImageFilter.h>
 #include <itkImageLinearIteratorWithIndex.h>
 #include <itkImageSliceIteratorWithIndex.h>
@@ -519,8 +519,6 @@ medAbstractData* AlgorithmPaintToolBox::processOutput()
     // Check if painted data on the volume
     if (!m_undoStacks->empty() && !m_undoStacks->value(currentView)->isEmpty())
     {
-        updateMaskWithMasterLabel();
-        copyMetaData(m_maskData, m_imageData);
         return m_maskData; // return output data
     }
     else
@@ -928,6 +926,7 @@ void AlgorithmPaintToolBox::setData( medAbstractData *medData )
         else
         {
             m_maskData = medAbstractDataFactory::instance()->createSmartPointer( "itkDataImageUChar3" );
+            medUtilities::setDerivedMetaData(m_maskData, m_imageData, "");
 
             if ( !m_maskData )
             {
diff --git a/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt b/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt
index 50e950063e..97705b5018 100644
--- a/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt
+++ b/src/plugins/legacy/medCompositeDataSets/CMakeLists.txt
@@ -35,8 +35,7 @@ find_package(dtk REQUIRED)
 include(${dtk_USE_FILE})
 include(dtkPlugin)
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
+find_package(TTK REQUIRED COMPONENTS ITKTensor)
 
 ## #################################################################
 ## Input
@@ -71,7 +70,7 @@ target_link_libraries(${PROJECT_NAME}
   dtkCore 
   dtkLog
   dtkZip
-  ITKTensor
+  TTK::ITKTensor
   ITKCommon  
   medCore
   medGui
diff --git a/src/plugins/legacy/medSegmentation/CMakeLists.txt b/src/plugins/legacy/medSegmentation/CMakeLists.txt
index 6b82ec3cad..61759885c4 100644
--- a/src/plugins/legacy/medSegmentation/CMakeLists.txt
+++ b/src/plugins/legacy/medSegmentation/CMakeLists.txt
@@ -92,8 +92,8 @@ add_library(${TARGET_NAME} SHARED
 target_link_libraries(${TARGET_NAME}
   ${QT_LIBRARIES}
   dtkCore
-  dtkLog
-  ITKCommon
+  dtkLog  
+  ${ITK_LIBRARIES}
   medCore
   medVtkInria
   medImageIO
diff --git a/src/plugins/legacy/medVtkFibersData/CMakeLists.txt b/src/plugins/legacy/medVtkFibersData/CMakeLists.txt
index a826a7f5af..216b17baf7 100644
--- a/src/plugins/legacy/medVtkFibersData/CMakeLists.txt
+++ b/src/plugins/legacy/medVtkFibersData/CMakeLists.txt
@@ -38,8 +38,7 @@ include(${VTK_USE_FILE})
 find_package(ITK REQUIRED COMPONENTS ITKCommon ITKVtkGlue)
 include(${ITK_USE_FILE})
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
+find_package(TTK REQUIRED COMPONENTS ttkAlgorithms ITKTensor)
 
 ## #############################################################################
 ## List Sources
@@ -106,7 +105,8 @@ target_link_libraries(${TARGET_NAME}
   medCore
   medLog
   medVtkInria
-  ttkAlgorithms
+  TTK::ttkAlgorithms
+  TTK::ITKTensor
   ITKCommon
   ITKVtkGlue
   )
diff --git a/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp b/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp
index 2875f91def..20f98cbc69 100644
--- a/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp
+++ b/src/plugins/legacy/polygonRoi/toolboxes/defaultLabelToolBox.cpp
@@ -1,6 +1,7 @@
 #include "defaultLabelToolBox.h"
 
 #include <medDataManager.h>
+#include <medSettingsManager.h>
 #include <medTabbedViewContainers.h>
 #include <medToolBoxFactory.h>
 #include <medUtilities.h>
@@ -23,6 +24,7 @@ defaultLabelToolBox::defaultLabelToolBox(QWidget *parent):
 
     auto widget = new QWidget();
     auto layout = new QVBoxLayout;
+    layout->setContentsMargins(0, 0, 0, 0);
     widget->setLayout(layout);
 
     dataName = new QLabel("No Data");
@@ -34,11 +36,36 @@ defaultLabelToolBox::defaultLabelToolBox(QWidget *parent):
     labels->setContentsMargins(0,0,0,0);
     labels->setObjectName("labels");
 
-    plusButton = new QPushButton(QIcon(":/pixmaps/plus.png"), "");
+    // Themes
+    QVariant themeChosen = medSettingsManager::instance().value("startup","theme");
+    int themeIndex = themeChosen.toInt();
+    QIcon labelIconPlus;
+    QIcon labelIconMinus;
+    switch (themeIndex)
+    {
+        case 0:
+        case 1:
+        case 2:
+        case 4:
+        default:
+        {
+            labelIconPlus  = QIcon(":/pixmaps/plus_white.png");
+            labelIconMinus = QIcon(":/pixmaps/minus_white.png");
+            break;
+        }
+        case 3:
+        {
+            labelIconPlus  = QIcon(":/pixmaps/plus_black.png");
+            labelIconMinus = QIcon(":/pixmaps/minus_black.png");
+            break;
+        }
+    }
+
+    plusButton = new QPushButton(labelIconPlus, "");
     plusButton->setMaximumSize(QSize(20,20));
     plusButton->setObjectName("plusBttn");
 
-    minusButton = new QPushButton(QIcon(":/pixmaps/minus.png"), "");
+    minusButton = new QPushButton(labelIconMinus, "");
     minusButton->setMaximumSize(QSize(20,20));
     minusButton->setObjectName("minBttn");
 
diff --git a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp
index df94bf46c7..dccbed3fe4 100644
--- a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp
+++ b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.cpp
@@ -55,13 +55,28 @@ polygonRoiToolBox::polygonRoiToolBox(QWidget *parent ) :
     explanation->setStyleSheet("font: italic");
     layout->addWidget(explanation );
 
+    // Activation button
     activateTBButton = new QPushButton(tr("Activate Toolbox"));
     activateTBButton->setToolTip(tr("Activate closed polygon mode. You should only have one view."));
     activateTBButton->setCheckable(true);
     activateTBButton->setObjectName("closedPolygonButton");
     connect(activateTBButton,SIGNAL(toggled(bool)),this,SLOT(clickClosePolygon(bool)));
     connect(activateTBButton, &QAbstractButton::toggled, [=] (bool state) { explanation->setVisible(!state); });
+    auto activateTBLayout = new QHBoxLayout();
+    layout->addLayout(activateTBLayout);
+    activateTBLayout->addWidget(activateTBButton);
 
+    // Add label management tool
+    QString identifier = speciality.toLower() + QString("LabelToolBox");
+    pMedToolBox = medToolBoxFactory::instance()->createToolBox(identifier);
+    pMedToolBox->header()->hide();
+    pMedToolBox->hide();
+    pMedToolBox->setObjectName("labelTool");
+    layout->addWidget(pMedToolBox);
+    connect(activateTBButton, SIGNAL(toggled(bool)), pMedToolBox, SLOT(setEnabled(bool)), Qt::UniqueConnection);
+    connect(activateTBButton, SIGNAL(toggled(bool)), pMedToolBox, SLOT(setVisible(bool)), Qt::UniqueConnection);
+
+    // Actions on contours
     interpolate = new QCheckBox(tr("Interpolate between contours"));
     interpolate->setToolTip("Interpolate between master ROIs");
     interpolate->setObjectName("interpolateButton");
@@ -69,7 +84,7 @@ polygonRoiToolBox::polygonRoiToolBox(QWidget *parent ) :
     connect(interpolate,SIGNAL(clicked(bool)) ,this,SLOT(interpolateCurve(bool)));
 
     auto repulsorLayout = new QHBoxLayout();
-    repulsorLabel = new QLabel("Correct contours");
+    repulsorLabel = new QLabel("Correct contours:");
     repulsorLayout->addWidget(repulsorLabel);
 
     repulsorTool = new QPushButton(tr("Repulsor"));
@@ -79,23 +94,12 @@ polygonRoiToolBox::polygonRoiToolBox(QWidget *parent ) :
     connect(repulsorTool,SIGNAL(clicked(bool)),this,SLOT(activateRepulsor(bool)));
     repulsorLayout->addWidget(repulsorTool);
 
-    auto activateTBLayout = new QHBoxLayout();
-    layout->addLayout(activateTBLayout );
-    activateTBLayout->addWidget(activateTBButton);
-
-    // Add Contour Management Toolbox
-    QString identifier = speciality.toLower() + QString("LabelToolBox");
-    pMedToolBox = medToolBoxFactory::instance()->createToolBox(identifier);
-    pMedToolBox->header()->hide();
-    pMedToolBox->hide();
-    layout->addWidget(pMedToolBox);
-    connect(activateTBButton, SIGNAL(toggled(bool)), pMedToolBox, SLOT(setEnabled(bool)), Qt::UniqueConnection);
-
     auto contoursActionLayout = new QVBoxLayout();
     layout->addLayout(contoursActionLayout );
     contoursActionLayout->addWidget(interpolate);
     contoursActionLayout->addLayout(repulsorLayout);
 
+    // Export widgets
     saveLabel = new QLabel("Save segmentations as:");
     saveLabel->setObjectName("saveLabel");
     auto saveButtonsLayout = new QHBoxLayout();
@@ -393,6 +397,7 @@ void polygonRoiToolBox::clickClosePolygon(bool state)
     }
     else
     {
+        activateTBButton->setText("Deactivate Toolbox");
         pMedToolBox->show();
         for (baseViewEvent *event : viewEventHash.values())
         {
@@ -410,12 +415,8 @@ void polygonRoiToolBox::clickClosePolygon(bool state)
         {
             viewEventHash.values().first()->getCurrentView()->selectedRequest(true);
         }
-        saveBinaryMaskButton->setEnabled(state);
-        saveContourButton->setEnabled(state);
-        saveLabel->setEnabled(state);
-        interpolate->setEnabled(state);
-        repulsorTool->setEnabled(state);
-        repulsorLabel->setEnabled(state);
+
+        enableInnerWidgets(state);
     }
 }
 
@@ -448,14 +449,27 @@ void polygonRoiToolBox::disableButtons()
 {
     activateTBButton->setEnabled(false);
     activateTBButton->setChecked(false);
-    repulsorTool->setEnabled(false);
-    repulsorTool->setChecked(false);
-    repulsorLabel->setEnabled(false);
-    saveBinaryMaskButton->setEnabled(false);
-    saveContourButton->setEnabled(false);
-    saveLabel->setEnabled(false);
-    interpolate->setEnabled(false);
+
+    enableInnerWidgets(false);
     interpolate->setChecked(true);
+    repulsorTool->setChecked(false);
+}
+
+void polygonRoiToolBox::enableInnerWidgets(bool state)
+{
+    repulsorTool->setEnabled(state);
+    repulsorTool->setVisible(state);
+    repulsorLabel->setEnabled(state);
+    repulsorLabel->setVisible(state);
+    saveBinaryMaskButton->setEnabled(state);
+    saveBinaryMaskButton->setVisible(state);
+    saveContourButton->setEnabled(state);
+    saveContourButton->setVisible(state);
+    saveLabel->setEnabled(state);
+    saveLabel->setVisible(state);
+    interpolate->setEnabled(state);
+    interpolate->setVisible(state);
+    helpButton->setVisible(state);
 }
 
 void polygonRoiToolBox::saveContours()
@@ -597,8 +611,8 @@ void polygonRoiToolBox::showHelp() const
         + QString("<li><b>Draw a contour</b>: shift+click on the data to create a contour</li>")
         + QString("<li><b>Add a new label</b>: click on '+' button in the label list</li>")
         + QString("<li><b>Remove a label</b>: click on '-' button in the label list</li>")
-        + QString("<li><b>Use a new label</b>: select a label in the list, then shift+click on the data</li>")
-        + QString("<li><b>Alt+click</b>: draw a landmark at that position in all views</li>")
+        + QString("<li><b>Use a new label</b>: select a label in the list, then click on the data</li>")
+        + QString("<li><b>Alt+click</b>: draw a landmark at that position in all slices</li>")
         + QString("</ul>");
 
     QString shortcut = QString("<h3>Shortcuts</h3>")
diff --git a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h
index 3e6caebb08..e79f547157 100644
--- a/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h
+++ b/src/plugins/legacy/polygonRoi/toolboxes/polygonRoiToolBox.h
@@ -71,6 +71,7 @@ public slots:
 private slots:
 
     void disableButtons();
+    void enableInnerWidgets(bool state);
     void saveContours();
     void saveBinaryImage();
 
diff --git a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp
index e45a6e55d2..9df003938d 100644
--- a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp
+++ b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.cpp
@@ -392,6 +392,9 @@ QMenu *baseViewEvent::changeLabelActions(polygonLabel* closestLabel)
                 roiToAdd->pasteContour(nodes);
                 setLabelActivationState();
                 deleteContour(closestLabel);
+                // Re-render the ROI
+                roiToAdd->Off();
+                roiToAdd->On();
             });
             changeMenu->addAction(action);
         }
@@ -407,7 +410,6 @@ void baseViewEvent::setLabelActivationState()
     }
 }
 
-
 bool baseViewEvent::rightButtonBehaviour(medAbstractView *view, QMouseEvent *mouseEvent)
 {
     if (!view)
@@ -703,7 +705,6 @@ void baseViewEvent::activateRepulsor(bool state)
         cursorState = CURSORSTATE::CS_DEFAULT;
         vtkInteractorStyleImageView2D *interactorStyle2D = vtkInteractorStyleImageView2D::New();
         globalVtkLeftButtonBehaviour = view2d->GetLeftButtonInteractionStyle();
-        interactorStyle2D->SetLeftButtonInteraction(vtkInteractorStyleImageView2D::InteractionTypeNull);
         view2d->SetInteractorStyle(interactorStyle2D);
         view2d->SetupInteractor(originalInteractor);
         interactorStyle2D->Delete();
diff --git a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h
index df75fff95b..f35a9ed0bb 100644
--- a/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h
+++ b/src/plugins/legacy/polygonRoi/viewevent/baseViewEvent.h
@@ -19,6 +19,7 @@
 #include <QLineEdit>
 #include <QListWidget>
 #include <QWidgetAction>
+
 #include <medLabelProperty.h>
 #include <medDisplayPosContours.h>
 #include <medTagContours.h>
@@ -120,7 +121,7 @@ private slots:
     QList<medDisplayPosContours> copyNodesList;
     double savedMousePosition[2];
     dtkSmartPointer<medAbstractData> contourOutput;
-    vtkRenderWindowInteractor* originalInteractor;
+    vtkRenderWindowInteractor *originalInteractor;
 
     void leftButtonBehaviour(medAbstractView *view);
     bool rightButtonBehaviour(medAbstractView *view, QMouseEvent *mouseEvent);
diff --git a/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp b/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp
index 9d72485260..c3601433cc 100644
--- a/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp
+++ b/src/plugins/legacy/polygonRoi/viewevent/defaultViewEvent.cpp
@@ -62,7 +62,9 @@ void defaultViewEvent::deleteLabel(polygonLabel *manager)
     int position = deleteLabelBase(manager);
     if (position==-1)
     {
-        dLabelToolBox->unselectAll();
+        // The last contour/node of the data has been removed, we need to reset
+        dLabelToolBox->selectRow(0);
+        dLabelToolBox->forceItemSelection();
     }
     else
     {
diff --git a/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp b/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp
index 36710a3643..42712511df 100644
--- a/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp
+++ b/src/plugins/legacy/voiCutter/voiCutterToolBox.cpp
@@ -280,13 +280,21 @@ dtkPlugin* voiCutterToolBox::plugin()
     return medPluginManager::instance().plugin("VOI Cutter");
 }
 
+/**
+ * @brief Return cropped data if VOI Cutter has been used or initial data, or nullptr if no data is found.
+ * 
+ * @return medAbstractData* 
+ */
 medAbstractData *voiCutterToolBox::processOutput()
 {
     if (d->resultData)
     {
-        fillOutputMetaData();
         return d->resultData;
     }
+    else if (d->currentView)
+    {
+        return d->currentView->layerData(d->currentView->currentLayer());
+    }
     return nullptr;
 }
 
diff --git a/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt b/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt
index a72fae01da..0ae2ae70dd 100644
--- a/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt
+++ b/src/plugins/process/itkDWIBrainMaskCalculatorProcess/CMakeLists.txt
@@ -19,8 +19,7 @@ set(TARGET_NAME itkDWIBrainMaskCalculatorProcessPlugin)
 ## Resolve dependencies
 ## #############################################################################
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
+find_package(TTK REQUIRED COMPONENTS Registration ttkAlgorithms)
 
 find_package(ITK REQUIRED COMPONENTS ITKCommon ITKImageStatistics ITKImageIntensity ITKSmoothing ITKThresholding ITKMathematicalMorphology ITKBinaryMathematicalMorphology ITKLabelVoting)
 include(${ITK_USE_FILE})
@@ -62,6 +61,9 @@ target_include_directories(${TARGET_NAME}
 target_link_libraries(${TARGET_NAME}
   ITKCommon
   ITKStatistics
+  ITKSmoothing
+  TTK::Registration
+  TTK::ttkAlgorithms
   Qt5::Core
   dtkCore
   dtkCoreSupport
diff --git a/src/plugins/process/morphomath_operation/CMakeLists.txt b/src/plugins/process/morphomath_operation/CMakeLists.txt
index 144ee92abd..1defd700fa 100644
--- a/src/plugins/process/morphomath_operation/CMakeLists.txt
+++ b/src/plugins/process/morphomath_operation/CMakeLists.txt
@@ -61,6 +61,7 @@ target_include_directories(${TARGET_NAME}
 
 target_link_libraries(${TARGET_NAME}
   ITKCommon
+  ITKMathematicalMorphology
   Qt5::Core
   dtkCore
   dtkLog
diff --git a/src/plugins/process/single_filter/CMakeLists.txt b/src/plugins/process/single_filter/CMakeLists.txt
index 051bb41707..9ef60d576f 100644
--- a/src/plugins/process/single_filter/CMakeLists.txt
+++ b/src/plugins/process/single_filter/CMakeLists.txt
@@ -61,6 +61,7 @@ target_include_directories(${TARGET_NAME}
 
 target_link_libraries(${TARGET_NAME}
   ITKCommon
+  ITKSmoothing
   Qt5::Core
   dtkCore
   dtkLog
diff --git a/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt b/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt
index abaaae627f..118f3386e9 100644
--- a/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt
+++ b/src/plugins/process/ttkTensorEstimationProcess/CMakeLists.txt
@@ -7,8 +7,7 @@ set(TARGET_NAME ttkTensorEstimationProcessPlugin)
 find_package(ITK REQUIRED COMPONENTS ITKCommon ITKFiniteDifference)
 include(${ITK_USE_FILE})
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
+find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms)
 
 ## #############################################################################
 ## List Sources
@@ -50,7 +49,8 @@ target_link_libraries(${TARGET_NAME}
   dtkCore
   dtkCoreSupport
   dtkLog
-  ITKTensor
+  TTK::ITKTensor
+  TTK::ttkAlgorithms
   medCoreLegacy
   medCore
   medWidgets
diff --git a/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt b/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt
index 9da93b1afd..35ace7785b 100644
--- a/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt
+++ b/src/plugins/process/ttkTensorScalarMapsProcess/CMakeLists.txt
@@ -4,8 +4,7 @@ set(TARGET_NAME ttkTensorScalarMapsProcessPlugin)
 ## Resolve dependencies
 ## #############################################################################
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
+find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms)
 
 find_package(VTK REQUIRED COMPONENTS vtkRenderingCore)
 include(${VTK_USE_FILE})
@@ -53,7 +52,8 @@ target_link_libraries(${TARGET_NAME}
   dtkCore
   dtkCoreSupport
   dtkLog
-  ITKTensor
+  TTK::ITKTensor
+  TTK::ttkAlgorithms
   medCore
   medCoreLegacy
   medVtkInria
diff --git a/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt b/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt
index ee5f444e11..13314d64e2 100644
--- a/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt
+++ b/src/plugins/process/ttkTensorTractographyProcess/CMakeLists.txt
@@ -32,8 +32,7 @@ include(${VTK_USE_FILE})
 find_package(ITK REQUIRED ITKCommon ITKTransform ITKImageFunction)
 include(${ITK_USE_FILE})
 
-find_package(TTK REQUIRED)
-include(${TTK_USE_FILE})
+find_package(TTK REQUIRED COMPONENTS ITKTensor ttkAlgorithms)
 ## #############################################################################
 ## List Sources
 ## #############################################################################
@@ -74,7 +73,8 @@ target_link_libraries(${TARGET_NAME}
   dtkCore
   dtkCoreSupport
   dtkLog
-  ITKTensor
+  TTK::ITKTensor
+  TTK::ttkAlgorithms
   ITKIOTransformBase
   medCore
   medCoreLegacy
diff --git a/superbuild/projects_modules/ITK.cmake b/superbuild/projects_modules/ITK.cmake
index dfacc24435..9cf28d26e0 100644
--- a/superbuild/projects_modules/ITK.cmake
+++ b/superbuild/projects_modules/ITK.cmake
@@ -40,7 +40,7 @@ if (NOT USE_SYSTEM_${ep})
 
 
 set(git_url ${GITHUB_PREFIX}InsightSoftwareConsortium/ITK.git)
-set(git_tag v5.0.0)
+set(git_tag v5.2.1)
 
 
 ## #############################################################################
diff --git a/superbuild/projects_modules/LogDemons.cmake b/superbuild/projects_modules/LogDemons.cmake
index 8670dfd4d2..e65ecc9301 100644
--- a/superbuild/projects_modules/LogDemons.cmake
+++ b/superbuild/projects_modules/LogDemons.cmake
@@ -39,8 +39,8 @@ if (NOT USE_SYSTEM_${ep})
 ## Set up versioning control
 ## #############################################################################
 
-  set(git_url ${GITHUB_PREFIX}Inria-Asclepios/LCC-LogDemons.git)
-  set(git_tag master)
+set(git_url ${GITHUB_PREFIX}Inria-Asclepios/LCC-LogDemons.git)
+set(git_tag ITK5.1.1)
 
 ## #############################################################################
 ## Add specific cmake arguments for configuration step of the project
diff --git a/superbuild/projects_modules/RPI.cmake b/superbuild/projects_modules/RPI.cmake
index 2d95479073..25833c8221 100644
--- a/superbuild/projects_modules/RPI.cmake
+++ b/superbuild/projects_modules/RPI.cmake
@@ -40,8 +40,8 @@ if (NOT USE_SYSTEM_${ep})
 ## Set up versioning control
 ## #############################################################################
 
-set(git_url ${GITHUB_PREFIX}Inria-Asclepios/RPI.git)
-set(git_tag ITK5.0)
+set(git_url ${GITHUB_PREFIX}medInria/RPI.git)
+set(git_tag ITK5.1.1)
 
 ## #############################################################################
 ## Add specific cmake arguments for configuration step of the project
diff --git a/superbuild/projects_modules/TTK.cmake b/superbuild/projects_modules/TTK.cmake
index f35768b003..9b46d4aaae 100644
--- a/superbuild/projects_modules/TTK.cmake
+++ b/superbuild/projects_modules/TTK.cmake
@@ -40,8 +40,8 @@ if (NOT USE_SYSTEM_${ep})
 ## Set up versioning control
 ## #############################################################################
 
-set(git_url ${GITHUB_PREFIX}Inria-Asclepios/TTK-Public.git)
-set(git_tag master)
+set(git_url ${GITHUB_PREFIX}medInria/TTK.git)
+set(git_tag ITK5.2.1)
 
 ## #############################################################################
 ## Add specific cmake arguments for configuration step of the project
diff --git a/superbuild/projects_modules/VTK.cmake b/superbuild/projects_modules/VTK.cmake
index 26eda47885..72d34cd3cd 100644
--- a/superbuild/projects_modules/VTK.cmake
+++ b/superbuild/projects_modules/VTK.cmake
@@ -132,6 +132,8 @@ if(USE_Python)
     endif()
     list(APPEND cmake_args
         -DVTK_WRAP_PYTHON:BOOL=ON
+        -DModule_vtkPython:BOOL=ON
+        -DModule_vtkWrappingTools:BOOL=ON
         -DVTK_PYTHON_VERSION:STRING=${python_version}
         -DPYTHON_EXECUTABLE:PATH=${python_executable}
         -DPYTHON_INCLUDE_DIR:PATH=${python_include}
diff --git a/superbuild/projects_modules/medInria.cmake b/superbuild/projects_modules/medInria.cmake
index 00b49f51c7..9c2c1d64ad 100644
--- a/superbuild/projects_modules/medInria.cmake
+++ b/superbuild/projects_modules/medInria.cmake
@@ -141,8 +141,10 @@ ExternalProject_Add(${ep}
 ## #############################################################################
 
 if (WIN32)
+  file(REAL_PATH ${TTK_DIR}/../../../ _TTK_DIR)
   file(TO_NATIVE_PATH ${ITK_ROOT}                ITK_BIN_BASE)
   file(TO_NATIVE_PATH ${VTK_ROOT}                VTK_BIN_BASE)
+  file(TO_NATIVE_PATH ${_TTK_DIR}                TTK_BIN_BASE)
   file(TO_NATIVE_PATH ${dtk_ROOT}                DTK_BIN_BASE)
   file(TO_NATIVE_PATH ${QtDCM_ROOT}              DCM_BIN_BASE)
   file(TO_NATIVE_PATH ${_qt5Core_install_prefix} QT5_BIN_BASE)
@@ -159,7 +161,8 @@ if (WIN32)
         COMMAND for %%I in ( ${VTK_BIN_BASE}\\bin\\${CONFIG_MODE}\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) 
         COMMAND for %%I in ( ${DTK_BIN_BASE}\\bin\\${CONFIG_MODE}\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI)
         COMMAND for %%I in ( ${DCM_BIN_BASE}\\bin\\${CONFIG_MODE}\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI)
-        COMMAND for %%I in ( ${QT5_BIN_BASE}\\bin\\*.dll                 ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) 
+        COMMAND for %%I in ( ${TTK_BIN_BASE}\\bin\\*.dll )                 do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI)
+        COMMAND for %%I in ( ${QT5_BIN_BASE}\\bin\\*.dll )                 do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) 
         COMMAND for %%I in ( ${PYNCPP_BIN_BASE}\\bin\\*.dll ) do (if EXIST ${MED_BIN_BASE}\\%%~nxI (del /S ${MED_BIN_BASE}\\%%~nxI & mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI) else mklink /H ${MED_BIN_BASE}\\%%~nxI %%~fI)
 )
 endif()