diff --git a/CI/debian-unstable-gcc.cmake b/CI/debian-testing-gcc.cmake
similarity index 95%
rename from CI/debian-unstable-gcc.cmake
rename to CI/debian-testing-gcc.cmake
index e1579da20d663c771b67d065ba49562c03a70969..9d94b441ee8d77d81ede3b21cee6400b4215f0cd 100644
--- a/CI/debian-unstable-gcc.cmake
+++ b/CI/debian-testing-gcc.cmake
@@ -21,7 +21,7 @@
 # Configuration options for debian-unstable-gcc
 
 set(site_option
-"opencv_INCLUDE_DIR:PATH=/usr/include
+"OpenCV_DIR:PATH=/usr
 OTB_USE_MPI:BOOL=OFF
 OTB_USE_SHARK:BOOL=OFF
 ")
diff --git a/CMake/FindOpenCV.cmake b/CMake/FindOpenCV.cmake
index 68090148872048fbfdf64ace8ad3d8ffb9843523..b7b99b4402bd6a7e2ea9c6935407486502ceabd5 100644
--- a/CMake/FindOpenCV.cmake
+++ b/CMake/FindOpenCV.cmake
@@ -21,9 +21,9 @@
 set(OPENCV_SEARCH_PATH)
 
 if(OpenCV_DIR)
-  get_filename_component(OPENCV_SEARCH_PATH "${OpenCV_DIR}" PATH)
+  get_filename_component(OPENCV_SEARCH_PATH "${OpenCV_DIR}" REALPATH)
   if(OPENCV_SEARCH_PATH)
-    get_filename_component(OPENCV_SEARCH_PATH "${OPENCV_SEARCH_PATH}" PATH)
+    get_filename_component(OPENCV_SEARCH_PATH "${OPENCV_SEARCH_PATH}" REALPATH)
   endif()
   if(OPENCV_SEARCH_PATH)
     find_path(
diff --git a/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector.sqlite b/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector.sqlite
index c5c023b1884b4f36bcbb46f4c63cc7c370184c57..2865221a195f3c760b3333371ae5256bc6d8f5fb 100644
--- a/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector.sqlite
+++ b/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector.sqlite
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:464a254bff3c9cfdecd177667cc3d342d8517d86dd29cf00db08807d438ca63e
-size 49152
+oid sha256:81771c5421c48a85b70ab9f32fe8cdea5187c1e055313e0f247268666832368f
+size 45056
diff --git a/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector_ULU.sqlite b/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector_ULU.sqlite
index f53bf26b285b44601fc75b23a1da5956748991ac..de4a2d1054aa8a2d81122fd266901e8e4ab90749 100644
--- a/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector_ULU.sqlite
+++ b/Data/Baseline/OTB/Files/apTvSeSegmentationCCVector_ULU.sqlite
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:3ccbe0830b5b07af689934eaadfa044fec32a86287ccf6e8e63c88f86dd99f00
-size 65536
+oid sha256:1f0a0bb551d4ca950e0d0f97a3e417f450b8d401e5d7786dfca37cff221646e8
+size 61440
diff --git a/Data/Baseline/OTB/Files/ioTvMultiResolutionReadingInfoOut.3.txt b/Data/Baseline/OTB/Files/ioTvMultiResolutionReadingInfoOut.3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d5c02b767356466844275089eead7cfb4e823d8f
--- /dev/null
+++ b/Data/Baseline/OTB/Files/ioTvMultiResolutionReadingInfoOut.3.txt
@@ -0,0 +1,6 @@
+RESOLUTION: 0; DESC: Resolution: 0 (Image [w x h]: 2592x1944)
+RESOLUTION: 1; DESC: Resolution: 1 (Image [w x h]: 1296x972)
+RESOLUTION: 2; DESC: Resolution: 2 (Image [w x h]: 648x486)
+RESOLUTION: 3; DESC: Resolution: 3 (Image [w x h]: 324x243)
+RESOLUTION: 4; DESC: Resolution: 4 (Image [w x h]: 162x122)
+RESOLUTION: 5; DESC: Resolution: 5 (Image [w x h]: 81x61)
diff --git a/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.dbf b/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.dbf
index 3d18b01366faf3f6fb07daf46d6b532822fd8d9d..968c3ba85cb0a079e32ebd93408a1624cfe76dbe 100644
--- a/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.dbf
+++ b/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.dbf
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:47b644e0641ff7eaec67e019420361945c54d3c4fb7fe2f6bb2c6ca18156fc6e
-size 11989
+oid sha256:2a39ce861bb3af7908d145879ca3bf6bb461081ad5631b88b1c78e2eb5f323f8
+size 12100
diff --git a/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shp b/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shp
index 9099ed1408acc16ce48057e5f72f0614ba0ff6d5..69cd8032bd9f906d373c2b9a117a681074152b7a 100644
--- a/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shp
+++ b/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shp
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:ce50b6ff7c9a5f899487dccbd2c425348355de1b6b086407a6e0dda73bebddae
-size 919584
+oid sha256:7a846e192be1fa015f851bd67b709ea0def0e40cba7cd59876691a8ea2f43904
+size 922160
diff --git a/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shx b/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shx
index 62171cea873b930c8dee1d2d64b34bd2d37481d4..51e12ff1e534bf1065ef58239b3940c13e63afa1 100644
--- a/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shx
+++ b/Data/Baseline/OTB/Files/obTvFusionOGRTile.1.shx
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:1004fb99e63665e173bb3c5cc1df3a07e08e58f7a2daacca2ca0b8350c68742b
-size 8772
+oid sha256:681e07c6c2c48c702d461270d7798e675a48d1aba427da2820a414bcf357e594
+size 8852
diff --git a/Data/Baseline/OTB/Files/obTvFusionOGRTile.dbf b/Data/Baseline/OTB/Files/obTvFusionOGRTile.dbf
index f963f0f29ed9ac71ad16f280e44dd23946930d00..200c6d00d1d43c3a1412e033fd560558e56926a5 100644
--- a/Data/Baseline/OTB/Files/obTvFusionOGRTile.dbf
+++ b/Data/Baseline/OTB/Files/obTvFusionOGRTile.dbf
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:52d3c20f176b6fcdaf475de9669489d965571e2804863fa6db4bb8381ead8406
-size 12011
+oid sha256:2890d9b7db13d00d83ad8e724dc056d1d3faa82dce3a8ef65c15405d5c57e345
+size 12111
diff --git a/Data/Baseline/OTB/Files/obTvFusionOGRTile.shp b/Data/Baseline/OTB/Files/obTvFusionOGRTile.shp
index f1e674a7cfe622542579369dafe378bb1a70c73f..34597aaca34100ed709d1d3a0eec58057060c896 100644
--- a/Data/Baseline/OTB/Files/obTvFusionOGRTile.shp
+++ b/Data/Baseline/OTB/Files/obTvFusionOGRTile.shp
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:8c012c7278611ee7f7910ad5fe98e1eb7563950468f62181d949dbfa482d77ce
-size 917544
+oid sha256:8696e937927e4db707cac137a2fc9fb1ece8ad6350089158131978c61f6c7acf
+size 922180
diff --git a/Data/Baseline/OTB/Files/obTvFusionOGRTile.shx b/Data/Baseline/OTB/Files/obTvFusionOGRTile.shx
index b6fe73c0d7034d66cfb309bca55ef15b400c5c80..33d6e4d38b580dbe8853c80d956adcc577ef8db9 100644
--- a/Data/Baseline/OTB/Files/obTvFusionOGRTile.shx
+++ b/Data/Baseline/OTB/Files/obTvFusionOGRTile.shx
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:30b836d94e351bae53dcaf2196b32172f96c3aa22262b0296337ea51e6c756dd
-size 8788
+oid sha256:b196f1a1c1903eb94eb505040b69c56a5d0a684a9869721c18bc1c7a2c4363db
+size 8860
diff --git a/Data/Baseline/OTB/Images/bfTvPCAImageFilter5.tif b/Data/Baseline/OTB/Images/bfTvPCAImageFilter5.tif
new file mode 100644
index 0000000000000000000000000000000000000000..dbac3617aa6642ed47d0cf50ca450fd363ebb4aa
--- /dev/null
+++ b/Data/Baseline/OTB/Images/bfTvPCAImageFilter5.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28049cb575b39a672cb0fafdae59bdbfcb8d736cba7bb7b693103804c12850ba
+size 440678
diff --git a/Data/Baseline/OTB/Images/bfTvPCAImageFilter5Inv.tif b/Data/Baseline/OTB/Images/bfTvPCAImageFilter5Inv.tif
new file mode 100644
index 0000000000000000000000000000000000000000..fb178583f16528601a5c0e16216e9709056ad135
--- /dev/null
+++ b/Data/Baseline/OTB/Images/bfTvPCAImageFilter5Inv.tif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:237f54de08ee2ec78c71d69f6f7bacd06c1a50b1f5f2830f30915e69d173205c
+size 159682
diff --git a/Documentation/Cookbook/rst/QGISInterface.rst b/Documentation/Cookbook/rst/QGISInterface.rst
index 61c3765b9978ce0b6cf58101f2dcae3a56754844..380a7fde88f25cc17e8baaefb2df713f1318d81a 100644
--- a/Documentation/Cookbook/rst/QGISInterface.rst
+++ b/Documentation/Cookbook/rst/QGISInterface.rst
@@ -8,7 +8,7 @@ With QGIS < 3.8 you will need to manually install the plugin.
 You can follow the instruction here: https://gitlab.orfeo-toolbox.org/orfeotoolbox/qgis-otb-plugin#otb-provider-for-qgis-processing
 
 
-With QGIS > 3.8, the plugin is in the QGIS core. So you just need install OTB and set the plugin up.
+With QGIS > 3.8, the plugin is already in the QGIS core. So you just need to install OTB and activate the plugin: https://www.orfeo-toolbox.org/CookBook/QGISInterface.html#open-processing-settings
 
 Download and Install OTB
 ^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx
index c04129a897806de43aa1ed5604eaf35aa678cda3..a95b9f07e130636eb1d51a4c6797e906fc7dee08 100644
--- a/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx
+++ b/Modules/Filtering/DimensionalityReduction/include/otbPCAImageFilter.hxx
@@ -325,36 +325,30 @@ void PCAImageFilter<TInputImage, TOutputImage, TDirectionOfTransformation>::Gene
   vnl_vector<double> vectValP;
   vnl_symmetric_eigensystem_compute(m_CovarianceMatrix.GetVnlMatrix(), transf, vectValP);
 
-  InternalMatrixType valP(vectValP.size(), vectValP.size(), vnl_matrix_null);
-  for (unsigned int i = 0; i < vectValP.size(); ++i)
-    valP(i, i) = vectValP[i];
 
   m_EigenValues.SetSize(m_NumberOfPrincipalComponentsRequired);
   for (unsigned int i                                            = 0; i < m_NumberOfPrincipalComponentsRequired; ++i)
     m_EigenValues[m_NumberOfPrincipalComponentsRequired - 1 - i] = static_cast<RealType>(vectValP[i]);
 
-  /* We used normalized PCA */
-  for (unsigned int i = 0; i < valP.rows(); ++i)
+  if (m_Whitening)
   {
-    if (valP(i, i) > 0.)
-    {
-      if (m_Whitening)
-        valP(i, i) = 1. / std::sqrt(valP(i, i));
-    }
-    else if (valP(i, i) < 0.)
+    InternalMatrixType valP(vectValP.size(), vectValP.size(), vnl_matrix_null);
+    for (unsigned int i = 0; i < vectValP.size(); ++i)
+    valP(i, i) = vectValP[i];
+
+    for (unsigned int i = 0; i < valP.rows(); ++i)
     {
-      otbMsgDebugMacro(<< "ValP(" << i << ") neg : " << valP(i, i) << " taking abs value");
-      if (m_Whitening)
-        valP(i, i) = 1. / std::sqrt(std::abs(valP(i, i)));
+      if (valP(i,i) != 0.0)
+        valP(i,i) = 1.0 / std::sqrt(std::abs(valP(i,i)));
       else
-        valP(i, i) = std::abs(valP(i, i));
-    }
-    else
-    {
-      throw itk::ExceptionObject(__FILE__, __LINE__, "Null Eigen value !!", ITK_LOCATION);
+        throw itk::ExceptionObject(__FILE__, __LINE__, "Null Eigen value !!", ITK_LOCATION);
     }
+    transf = valP * transf.transpose();
   }
-  transf = valP * transf.transpose();
+  else {
+      transf = transf.transpose();
+  }
+
   transf.flipud();
 
   if (m_NumberOfPrincipalComponentsRequired != this->GetInput()->GetNumberOfComponentsPerPixel())
diff --git a/Modules/Filtering/DimensionalityReduction/test/CMakeLists.txt b/Modules/Filtering/DimensionalityReduction/test/CMakeLists.txt
index 22ff085ec8d32d01cb7256ce1ef369341a47e088..3dc9d283e9e87695226caaf31e086b842e15aede 100644
--- a/Modules/Filtering/DimensionalityReduction/test/CMakeLists.txt
+++ b/Modules/Filtering/DimensionalityReduction/test/CMakeLists.txt
@@ -301,7 +301,8 @@ otb_add_test(NAME bfTvPCAImageFilter2 COMMAND otbDimensionalityReductionTestDriv
   ${TEMP}/bfTvPCAImageFilter2.tif
   ${TEMP}/bfTvPCAImageFilter2Inv.tif
   true
-  0)
+  0
+  true)
 
 otb_add_test(NAME bfTvPCAImageFilter4 COMMAND otbDimensionalityReductionTestDriver
   --compare-n-images ${EPSILON_7} 2
@@ -314,7 +315,8 @@ otb_add_test(NAME bfTvPCAImageFilter4 COMMAND otbDimensionalityReductionTestDriv
   ${TEMP}/bfTvPCAImageFilter4.tif
   ${TEMP}/bfTvPCAImageFilter4Inv.tif
   false
-  4)
+  4
+  true)
 
 otb_add_test(NAME bfTvPCAImageFilter4Norm COMMAND otbDimensionalityReductionTestDriver
   --compare-n-images ${EPSILON_7} 2
@@ -327,7 +329,8 @@ otb_add_test(NAME bfTvPCAImageFilter4Norm COMMAND otbDimensionalityReductionTest
   ${TEMP}/bfTvPCAImageFilter4Norm.tif
   ${TEMP}/bfTvPCAImageFilter4InvNorm.tif
   true
-  4)
+  4
+  true)
 
 otb_add_test(NAME bfTvPCAImageFilter3 COMMAND otbDimensionalityReductionTestDriver
   --compare-n-images ${EPSILON_7} 2
@@ -340,7 +343,22 @@ otb_add_test(NAME bfTvPCAImageFilter3 COMMAND otbDimensionalityReductionTestDriv
   ${TEMP}/bfTvPCAImageFilter3.tif
   ${TEMP}/bfTvPCAImageFilter3Inv.tif
   false
-  0)
+  0
+  true)
+
+otb_add_test(NAME bfTvPCAImageFilter5 COMMAND otbDimensionalityReductionTestDriver
+  --compare-n-images ${EPSILON_7} 2
+  ${BASELINE}/bfTvPCAImageFilter5.tif
+  ${TEMP}/bfTvPCAImageFilter5.tif
+  ${BASELINE}/bfTvPCAImageFilter5Inv.tif
+  ${TEMP}/bfTvPCAImageFilter5Inv.tif
+  otbPCAImageFilterTest
+  ${INPUTDATA}/cupriteSubHsi.tif
+  ${TEMP}/bfTvPCAImageFilter5.tif
+  ${TEMP}/bfTvPCAImageFilter5Inv.tif
+  false
+  0
+  false)
 
 otb_add_test(NAME bfTvPCAImageFilter1 COMMAND otbDimensionalityReductionTestDriver
   --compare-image ${EPSILON_7}
@@ -351,7 +369,8 @@ otb_add_test(NAME bfTvPCAImageFilter1 COMMAND otbDimensionalityReductionTestDriv
   ${TEMP}/bfTvPCAImageFilter1.tif
   ${TEMP}/bfTvPCAImageFilter1Inv.tif
   false
-  0)
+  0
+  true)
 
 
 otb_add_test(NAME bfTvPCAImageFilter3Norm COMMAND otbDimensionalityReductionTestDriver
@@ -365,7 +384,8 @@ otb_add_test(NAME bfTvPCAImageFilter3Norm COMMAND otbDimensionalityReductionTest
   ${TEMP}/bfTvPCAImageFilter3Norm.tif
   ${TEMP}/bfTvPCAImageFilter3InvNorm.tif
   true
-  0)
+  0
+  true)
 
 otb_add_test(NAME bfTvNAPCAImageFilter1 COMMAND otbDimensionalityReductionTestDriver
   --compare-image ${EPSILON_7}
diff --git a/Modules/Filtering/DimensionalityReduction/test/otbPCAImageFilter.cxx b/Modules/Filtering/DimensionalityReduction/test/otbPCAImageFilter.cxx
index bf3e94978a05e63ba842419aebe37a7ff5105cc3..4adf85db9a96b6c7c53d6905b6680889f7a03e2a 100644
--- a/Modules/Filtering/DimensionalityReduction/test/otbPCAImageFilter.cxx
+++ b/Modules/Filtering/DimensionalityReduction/test/otbPCAImageFilter.cxx
@@ -33,6 +33,10 @@ int otbPCAImageFilterTest(int, char* argv[])
   bool normalization = false;
   if (std::string(argv[4]).compare("true") == 0)
     normalization = true;
+  
+  bool whitening = false;
+  if (std::string(argv[6]).compare("true") == 0)
+    whitening = true;
 
   // Main type definition
   const unsigned int Dimension = 2;
@@ -50,6 +54,7 @@ int otbPCAImageFilterTest(int, char* argv[])
   filter->SetInput(reader->GetOutput());
   filter->SetNumberOfPrincipalComponentsRequired(nbComponents);
   filter->SetUseNormalization(normalization);
+  filter->SetWhitening(whitening);
 
   typedef otb::CommandProgressUpdate<FilterType> CommandType;
   CommandType::Pointer                           observer = CommandType::New();
diff --git a/Modules/Segmentation/OGRProcessing/include/otbOGRLayerStreamStitchingFilter.hxx b/Modules/Segmentation/OGRProcessing/include/otbOGRLayerStreamStitchingFilter.hxx
index e78e71331981647b8fe8d35bce50d36997de44ed..8bcf87e402f2a468603a0f143d797f18e624445f 100644
--- a/Modules/Segmentation/OGRProcessing/include/otbOGRLayerStreamStitchingFilter.hxx
+++ b/Modules/Segmentation/OGRProcessing/include/otbOGRLayerStreamStitchingFilter.hxx
@@ -245,7 +245,7 @@ void OGRLayerStreamStitchingFilter<TInputImage>::ProcessStreamingLine(bool line,
         {
           FeatureStruct upper = upperStreamFeatureList[u];
           FeatureStruct lower = lowerStreamFeatureList[l];
-          if (!(upper.feat == lower.feat))
+          if (!(upper.feat == lower.feat) && upper.feat.GetGeometry()->IsValid() && lower.feat.GetGeometry()->IsValid())
           {
             if (ogr::Intersects(*upper.feat.GetGeometry(), *lower.feat.GetGeometry()))
             {
diff --git a/Modules/ThirdParty/OpenCV/CMakeLists.txt b/Modules/ThirdParty/OpenCV/CMakeLists.txt
index 423cafe4715af2fb2038630793b130ed1079069d..514f0f45b4145f3f8a76fd30538a60e4c4507f5c 100644
--- a/Modules/ThirdParty/OpenCV/CMakeLists.txt
+++ b/Modules/ThirdParty/OpenCV/CMakeLists.txt
@@ -29,3 +29,8 @@ set(OTBOpenCV_INCLUDE_DIRS
   )
 
 otb_module_impl()
+
+install(FILES ${OTBOpenCV_BINARY_DIR}/src/otb_opencv_api.h
+  DESTINATION ${OTBOpenCV_INSTALL_INCLUDE_DIR}
+  COMPONENT Development
+  )
diff --git a/SuperBuild/patches/ITK/itk-3-gcc9-all.diff b/SuperBuild/patches/ITK/itk-3-gcc9-all.diff
new file mode 100644
index 0000000000000000000000000000000000000000..100fac60e22f388dc84d478dc5a145031b2f27b9
--- /dev/null
+++ b/SuperBuild/patches/ITK/itk-3-gcc9-all.diff
@@ -0,0 +1,26 @@
+diff --git a/SuperBuild/patches/ITK/itk-3-gcc9-all.diff b/SuperBuild/patches/ITK/itk-3-gcc9-all.diff
+new file mode 100644
+index 0000000000..7ff9131d9d
+--- /dev/null
++++ b/SuperBuild/patches/ITK/itk-3-gcc9-all.diff
+@@ -0,0 +1,20 @@
++--- InsightToolkit-4.13.1.orig/Modules/ThirdParty/VNL/src/vxl/vcl/vcl_compiler.h	2018-08-09 00:55:23.000000000 +0200
+++++ InsightToolkit-4.13.1/Modules/ThirdParty/VNL/src/vxl/vcl/vcl_compiler.h	2019-11-12 15:49:33.893603688 +0100
++@@ -97,6 +97,17 @@
++ #  else
++ #   define VCL_GCC_80
++ #  endif
+++# elif (__GNUC__==9)
+++#  define VCL_GCC_9
+++#  if (__GNUC_MINOR__ > 2 )
+++#   define VCL_GCC_92
+++#  elif (__GNUC_MINOR__ > 1 )
+++#   define VCL_GCC_92
+++#  elif (__GNUC_MINOR__ > 0 )
+++#   define VCL_GCC_91
+++#  else
+++#   define VCL_GCC_90
+++#  endif
++ # else
++ #  error "Dunno about this gcc"
++ # endif