diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a3822e6e380d06a3f12e997d5c1023598385515e..25c72acc11ed237b4b04cfe55956b2a6e3354117 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -141,7 +141,7 @@ debian-build:
   image: $BUILD_IMAGE_REGISTRY/otb-debian-native:testing
   allow_failure: true
   script:
-    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=debian-testing-gcc
+    - QT_QPA_PLATFORM=offscreen ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=debian-testing-gcc
   after_script:
     - export CI_ALLOW_FAILURE=ON
     - python3 -u CI/cdash_handler.py
@@ -159,11 +159,12 @@ ubuntu-xdk-build-doc:
   extends: .common-build
   image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-superbuild-base:18.04
   script:
-    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm-xdk
+    - export QT_QPA_PLATFORM=offscreen
+    - ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm-xdk
     - mv build/CookBook-*-html.tar.gz . || true
     - mv build/Documentation/Cookbook/latex/CookBook-*.pdf . || true
     - mv build/Documentation/Doxygen/OTB-Doxygen-*.tar.bz2 . || true
-    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_packages.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm-xdk -DNAME_SUFFIX:string=-glibc-2.27
+    - ctest -V -S CI/main_packages.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm-xdk -DNAME_SUFFIX:string=-glibc-2.27
     - mv build_packages/OTB-*.run . || true
   needs:
     - job: ubuntu-xdk-prepare
@@ -180,8 +181,9 @@ centos-xdk-build:
   extends: .common-build
   image: $BUILD_IMAGE_REGISTRY/otb-centos-superbuild-base:6.6
   script:
-    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=centos-6.6-gcc
-    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_packages.cmake -DIMAGE_NAME:string=centos-6.6-gcc
+    - export QT_QPA_PLATFORM=offscreen
+    - ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=centos-6.6-gcc
+    - ctest -V -S CI/main_packages.cmake -DIMAGE_NAME:string=centos-6.6-gcc
     - mv build_packages/OTB-*.run . || true
   needs:
     - job: centos-xdk-prepare
@@ -286,8 +288,7 @@ ubuntu-xdk-qa-code-coverage:
       - $SONAR_OTB_TOKEN
   image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-superbuild-qa:18.04
   script:
-    - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96"
-               ctest -V -S CI/main_qa.cmake
+    - QT_QPA_PLATFORM=offscreen ctest -V -S CI/main_qa.cmake
                      -DIMAGE_NAME:string=ubuntu-18.04-llvm-qa
                      -DQA:BOOL=ON
     - ./CI/otb_coverage.sh
diff --git a/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h b/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h
index 8b93c1857f71c818a393ae4e5d407abe2b6e460f..93fea6748740ccbe637a343ee56aa80b9f56b66c 100644
--- a/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h
+++ b/Modules/Visualization/MonteverdiCore/include/mvdAlgorithm.h
@@ -494,11 +494,10 @@ inline QString ToQString<float>(const float& val)
 {
   assert(!std::isnan(val));
 
-  QString valf;
-
   // See IEEE-754
   // Ref. http://en.wikipedia.org/wiki/Single-precision_floating-point_format
-  valf.sprintf("%.9g", val);
+  
+  QString valf = QString("%1").arg(val, 0, 'g', 9);
 
 #if 0
   std::cout
@@ -522,11 +521,11 @@ inline QString ToQString<double>(const double& val)
 {
   assert(!std::isnan(val));
 
-  QString vald;
-
   // See IEEE-754
   // Ref. http://en.wikipedia.org/wiki/Double_precision
-  vald.sprintf("%.17g", val);
+
+  QString vald = QString("%1").arg(val, 0, 'g', 17);
+
 
 #if 0
   std::cout
diff --git a/Packaging/PackageGlobals.cmake b/Packaging/PackageGlobals.cmake
index 22202d0ddcdec4fc751fbbe7be0e8a7348e68013..8f1fd7be41bf49d5a0a689cd54cac51a27642a25 100644
--- a/Packaging/PackageGlobals.cmake
+++ b/Packaging/PackageGlobals.cmake
@@ -43,23 +43,25 @@ elseif(APPLE)
 endif()
 
 set(WINDOWS_SYSTEM_DLLS
+  WTSAPI32.dll
   advapi32.dll
   comdlg32.dll
   crypt32.dll
+  d2d1.dll
+  d3d11.dll
+  d3d9.dll
   dnsapi.dll
   dwmapi.dll
   dwrite.dll
-  d2d1.dll
-  d3d9.dll
-  d3d11.dll
+  dxgi.dll
   gdi32.dll
   glu32.dll
   imm32.dll
   iphlpapi.dll
   kernel32.dll
+  mpr.dll
   netapi32.dll
   normaliz.dll
-  mpr.dll
   odbc32.dll
   ole32.dll
   oleaut32.dll
@@ -142,6 +144,7 @@ set(APPLE_SYSTEM_DLLS
   libgcc_s.*dylib
   libcups.*dylib
   libomp.dylib
+  libqcocoa.dylib
   )
 
 if(WIN32)
diff --git a/SuperBuild/CMake/External_itk.cmake b/SuperBuild/CMake/External_itk.cmake
index 5f26f8ffcb56269ea079b169d61a5a6dded8ed75..7cd21d5a4229cb2f3ff0f682312c1692528b8497 100644
--- a/SuperBuild/CMake/External_itk.cmake
+++ b/SuperBuild/CMake/External_itk.cmake
@@ -146,8 +146,8 @@ set(_SB_ITK_DIR ${SB_INSTALL_PREFIX}/lib/cmake/ITK-${SB_ITK_VERSION_MAJOR}.${SB_
 
 ExternalProject_Add(ITK
   PREFIX ITK
-  URL "https://sourceforge.net/projects/itk/files/itk/4.13/InsightToolkit-4.13.1.tar.gz"
-  URL_MD5 c7e229802c4ee64e1b2a6d48b1df67e9
+  URL "https://sourceforge.net/projects/itk/files/itk/4.13/InsightToolkit-4.13.2.tar.gz"
+  URL_MD5 1b6ae17dbd605d6c36564cc3d2cc1ee8
   SOURCE_DIR ${ITK_SB_SRC}
   BINARY_DIR ${ITK_SB_BUILD_DIR}
   INSTALL_DIR ${SB_INSTALL_PREFIX}
diff --git a/SuperBuild/CMake/External_pcre.cmake b/SuperBuild/CMake/External_pcre.cmake
index 702edd15df68b25de89e57a6b3c855e746b6d2f2..92c38e2880a8596e362cef00c1ea0b7668555e76 100644
--- a/SuperBuild/CMake/External_pcre.cmake
+++ b/SuperBuild/CMake/External_pcre.cmake
@@ -25,8 +25,8 @@ if(MSVC)
 else()
   ExternalProject_Add(PCRE
     PREFIX PCRE
-    URL "http://downloads.sourceforge.net/project/pcre/pcre/8.36/pcre-8.36.tar.gz"
-    URL_MD5 ff7b4bb14e355f04885cf18ff4125c98
+    URL "https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz"
+    URL_MD5 3bcd2441024d00009a5fee43f058987c
     BINARY_DIR ${PCRE_SB_BUILD_DIR}
     INSTALL_DIR ${SB_INSTALL_PREFIX}
     DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
diff --git a/SuperBuild/CMake/External_qt5.cmake b/SuperBuild/CMake/External_qt5.cmake
index 87db40d8be0ca6b479e6625cd1b9cfa0bbc264c4..65281c88b723e5c290752e56d53bde4e9443abff 100644
--- a/SuperBuild/CMake/External_qt5.cmake
+++ b/SuperBuild/CMake/External_qt5.cmake
@@ -130,8 +130,8 @@ configure_file( ${QT5_CONFIGURE_COMMAND_IN} ${QT5_CONFIGURE_COMMAND} @ONLY )
 
 ExternalProject_Add(QT5
   PREFIX QT5
-  URL "https://download.qt.io/archive/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz"
-  URL_MD5 7e167b9617e7bd64012daaacb85477af
+  URL "https://download.qt.io/archive/qt/5.14/5.14.1/single/qt-everywhere-src-5.14.1.tar.xz"
+  URL_MD5 781c3179410aff7ef84607214e1e91b4
   BINARY_DIR ${QT5_SB_BUILD_DIR}
   INSTALL_DIR ${SB_INSTALL_PREFIX}
   DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
diff --git a/SuperBuild/patches/QT5/qt5-1-jpeg-detection-win.diff b/SuperBuild/patches/QT5/qt5-1-jpeg-detection-win.diff
deleted file mode 100644
index df7bc1e769ac02d3e80c83a45844b7e294a817d5..0000000000000000000000000000000000000000
--- a/SuperBuild/patches/QT5/qt5-1-jpeg-detection-win.diff
+++ /dev/null
@@ -1,12 +0,0 @@
---- qt-everywhere-src-5.10.1/qtbase/src/gui/configure.json	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/qtbase/src/gui/configure.json	2018-04-10 11:50:15.631526687 +0200
-@@ -278,8 +278,7 @@
-                 "main": "jpeg_create_compress(cinfo);"
-             },
-             "sources": [
--                { "libs": "-llibjpeg", "condition": "config.msvc" },
--                { "libs": "-ljpeg", "condition": "!config.msvc" }
-+                { "libs": "-ljpeg" }
-             ]
-         },
-         "libpng": {
diff --git a/SuperBuild/patches/QT5/qt5-1-opengl_include_dir-macx.diff b/SuperBuild/patches/QT5/qt5-1-opengl_include_dir-macx.diff
new file mode 100644
index 0000000000000000000000000000000000000000..e0b254426e19773650580af1b485a3fcf3733e15
--- /dev/null
+++ b/SuperBuild/patches/QT5/qt5-1-opengl_include_dir-macx.diff
@@ -0,0 +1,27 @@
+diff -burN qt-everywhere-src-5.14.1_orig/qtbase/src/gui/gui.pro  qt-everywhere-src-5.14.1/qtbase/src/gui/gui.pro  
+--- qt-everywhere-src-5.14.1_orig/qtbase/src/gui/gui.pro	2020-01-23 13:37:32.000000000 +0100
++++ qt-everywhere-src-5.14.1/qtbase/src/gui/gui.pro	2020-04-16 19:12:38.828564743 +0200
+@@ -53,6 +53,11 @@
+ 
+ QMAKE_LIBS += $$QMAKE_LIBS_GUI
+ 
++# load(qt_module) removes the sdk prefix on QMAKE_INCDIR_OPENGL 
++# (by including build//qtbase/src/gui/qtgui-config.pri)
++# We want to write the path with the sdk prefix in the cmake config file, 
++# to be able to find openGL headers in cmake.
++QMAKE_INCDIR_OPENGL_TMP = $${QMAKE_INCDIR_OPENGL}
+ load(qt_module)
+ load(cmake_functions)
+ 
+@@ -84,8 +89,8 @@
+         CMAKE_GL_HEADER_NAME = GLES2/gl2.h
+         CMAKE_QT_OPENGL_IMPLEMENTATION = GLESv2
+     } else: qtConfig(opengl) {
+-        !isEmpty(QMAKE_INCDIR_OPENGL): CMAKE_GL_INCDIRS = $$cmakeTargetPaths($$QMAKE_INCDIR_OPENGL)
+-        CMAKE_OPENGL_INCDIRS = $$cmakePortablePaths($$QMAKE_INCDIR_OPENGL)
++        !isEmpty(QMAKE_INCDIR_OPENGL_TMP): CMAKE_GL_INCDIRS = $$cmakeTargetPaths($$QMAKE_INCDIR_OPENGL_TMP)
++        CMAKE_OPENGL_INCDIRS = $$cmakePortablePaths($$QMAKE_INCDIR_OPENGL_TMP)
+         !qtConfig(dynamicgl): CMAKE_OPENGL_LIBS = $$cmakeProcessLibs($$QMAKE_LIBS_OPENGL)
+         !isEmpty(QMAKE_LIBDIR_OPENGL): CMAKE_OPENGL_LIBDIR = $$cmakePortablePaths($$QMAKE_LIBDIR_OPENGL)
+         CMAKE_GL_HEADER_NAME = GL/gl.h
+
diff --git a/SuperBuild/patches/QT5/qt5-2-undefVar-macx.diff b/SuperBuild/patches/QT5/qt5-2-undefVar-macx.diff
deleted file mode 100644
index 7fcdd42a699fa80a83b5fb8de33e0d5a5ddeace2..0000000000000000000000000000000000000000
--- a/SuperBuild/patches/QT5/qt5-2-undefVar-macx.diff
+++ /dev/null
@@ -1,70 +0,0 @@
---- qt-everywhere-src-5.10.1/qtbase/src/corelib/kernel/qcore_mac_p.h	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/qtbase/src/corelib/kernel/qcore_mac_p.h	2018-04-11 15:26:28.118640978 +0200
-@@ -86,7 +86,7 @@
-     QAppleRefCounted(const QAppleRefCounted &other) : value(other.value) { if (value) RetainFunction(value); }
-     ~QAppleRefCounted() { if (value) ReleaseFunction(value); }
-     operator T() { return value; }
--    void swap(QAppleRefCounted &other) Q_DECL_NOEXCEPT_EXPR(noexcept(qSwap(value, other.value)))
-+    void swap(QAppleRefCounted &other) Q_DECL_NOEXCEPT_EXPR(noexcept(qSwap(this->value, other.value)))
-     { qSwap(value, other.value); }
-     QAppleRefCounted &operator=(const QAppleRefCounted &other)
-     { QAppleRefCounted copy(other); swap(copy); return *this; }
---- qt-everywhere-src-5.10.1/qtbase/src/corelib/kernel/qcore_foundation.mm	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/qtbase/src/corelib/kernel/qcore_foundation.mm	2018-04-11 17:03:51.018596589 +0200
-@@ -488,7 +488,7 @@
- */
- NSTimeZone *QTimeZone::toNSTimeZone() const
- {
--    return [static_cast<NSTimeZone *>(toCFTimeZone()) autorelease];
-+    return [((NSTimeZone *) toCFTimeZone()) autorelease];
- }
- #endif
- 
---- qt-everywhere-src-5.10.1/qtbase/src/platformsupport/clipboard/qmacmime.mm	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/qtbase/src/platformsupport/clipboard/qmacmime.mm	2018-04-11 17:13:54.799982725 +0200
-@@ -853,11 +853,11 @@
- 
-     QImage img = qvariant_cast<QImage>(variant);
-     NSDictionary *props = @{
--        static_cast<NSString *>(kCGImagePropertyPixelWidth) : [NSNumber numberWithInt:img.width()],
--        static_cast<NSString *>(kCGImagePropertyPixelHeight) : [NSNumber numberWithInt:img.height()]
-+        ((NSString *) kCGImagePropertyPixelWidth) : [NSNumber numberWithInt:img.width()],
-+        ((NSString *) kCGImagePropertyPixelHeight) : [NSNumber numberWithInt:img.height()]
-     };
- 
--    CGImageDestinationAddImage(imageDestination, qt_mac_toCGImage(img), static_cast<CFDictionaryRef>(props));
-+    CGImageDestinationAddImage(imageDestination, qt_mac_toCGImage(img), (CFDictionaryRef) props);
-     CGImageDestinationFinalize(imageDestination);
- 
-     return QList<QByteArray>() << QByteArray::fromCFData(data);
---- qt-everywhere-src-5.10.1/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm	2018-04-11 17:36:09.563188504 +0200
-@@ -1684,7 +1684,7 @@
- 
-     if (!m_drawContentBorderGradient) {
-         window.styleMask = window.styleMask & ~NSTexturedBackgroundWindowMask;
--        [window.contentView.superview setNeedsDisplay:YES];
-+        [[[window contentView] superview] setNeedsDisplay:YES];
-         window.titlebarAppearsTransparent = NO;
-         return;
-     }
---- qt-everywhere-src-5.10.1/qtbase/src/plugins/platforms/cocoa/qnswindow.mm	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/qtbase/src/plugins/platforms/cocoa/qnswindow.mm	2018-04-11 18:27:43.952730012 +0200
-@@ -231,7 +231,7 @@
-     if (pw->frameStrutEventsEnabled() && isMouseEvent(theEvent)) {
-         NSPoint loc = [theEvent locationInWindow];
-         NSRect windowFrame = [self convertRectFromScreen:self.frame];
--        NSRect contentFrame = self.contentView.frame;
-+        NSRect contentFrame = [[self contentView] frame];
-         if (NSMouseInRect(loc, windowFrame, NO) && !NSMouseInRect(loc, contentFrame, NO))
-             [qnsview_cast(pw->view()) handleFrameStrutMouseEvent:theEvent];
-     }
-@@ -260,7 +260,7 @@
- + (void)applicationActivationChanged:(NSNotification*)notification
- {
-     const id sender = self;
--    NSEnumerator<NSWindow*> *windowEnumerator = nullptr;
-+    NSEnumerator *windowEnumerator = nullptr;
-     NSApplication *application = [NSApplication sharedApplication];
- 
- #if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_12)
diff --git a/SuperBuild/patches/QT5/qt5-3-png-freetype-detection-all.diff b/SuperBuild/patches/QT5/qt5-3-png-freetype-detection-all.diff
deleted file mode 100644
index 1a46b0acd8f10380f052d6c197c51f8ea95f45d4..0000000000000000000000000000000000000000
--- a/SuperBuild/patches/QT5/qt5-3-png-freetype-detection-all.diff
+++ /dev/null
@@ -1,25 +0,0 @@
---- qt-everywhere-src-5.10.1/qtbase/src/gui/configure.json	2018-02-08 19:24:48.000000000 +0100
-+++ QT5/src/QT5/qtbase/src/gui/configure.json	2018-04-10 14:34:05.529668610 +0200
-@@ -158,8 +158,8 @@
-                 ]
-             },
-             "sources": [
--                { "type": "pkgConfig", "args": "freetype2" },
--                { "type": "freetype", "libs": "-lfreetype" }
-+                { "type": "freetype", "libs": "-lfreetype" },
-+                { "type": "pkgConfig", "args": "freetype2" }
-             ]
-         },
-         "fontconfig": {
-@@ -289,9 +289,9 @@
-                 "main": "(void) png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);"
-             },
-             "sources": [
--                { "type": "pkgConfig", "args": "libpng" },
-+                { "libs": "-lpng", "condition": "!config.msvc" },
-                 { "libs": "-llibpng", "condition": "config.msvc" },
--                { "libs": "-lpng", "condition": "!config.msvc" }
-+                { "type": "pkgConfig", "args": "libpng" }
-             ],
-             "use": [
-                 { "lib": "zlib", "condition": "features.system-zlib" }
diff --git a/SuperBuild/patches/QT5/qt5-4-fix-qfixed-macx.diff b/SuperBuild/patches/QT5/qt5-4-fix-qfixed-macx.diff
deleted file mode 100644
index 1d874cc94a13b8f1095f6488a70d96a1a86e4ca2..0000000000000000000000000000000000000000
--- a/SuperBuild/patches/QT5/qt5-4-fix-qfixed-macx.diff
+++ /dev/null
@@ -1,9 +0,0 @@
---- a/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
-+++ b/qtbase/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
-@@ -824,7 +824,7 @@ void QCoreTextFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, gl
- 
- QFixed QCoreTextFontEngine::emSquareSize() const
- {
--    return QFixed::QFixed(int(CTFontGetUnitsPerEm(ctfont)));
-+    return QFixed(int(CTFontGetUnitsPerEm(ctfont)));
- }