diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f0de6bfcd81f02792a9521b220cd7a30a5695ac2..290f211737b44a302e5f2a2c703c7c26da2375ac 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,7 +24,7 @@ before_script:
   # Provision efficiently the local LFS cache before checkout
   - git lfs fetch origin $CI_COMMIT_SHA
   # Checkout the expected branch
-  - git checkout $CI_COMMIT_REF_NAME
+  - git checkout -f -q $CI_COMMIT_SHA
 
 after_script:
   - python3 CI/cdash_handler.py $CI_COMMIT_SHA $CI_PROJECT_ID $CI_PROJECT_DIR $K8S_SECRET_CDASH
diff --git a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py
index 8cd9ab8ed70e204d915e32c25ebb4944f52b4a9b..77d197f07a7f759cdd194eedd8713a9e884e1c67 100755
--- a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py
+++ b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py
@@ -356,10 +356,17 @@ def make_links(text, allapps):
     rep = {appname: ":ref:`{}`".format(appname) for appname in allapps}
     return multireplace(text, rep)
 
+def render_deprecation_string(app):
+    if app.IsDeprecated():
+        return "This application is deprecated and will be removed in a future release."
+    else:
+        return ""
+
 def render_application(appname, allapps):
     "Render app to rst"
 
-    app = otbApplication.Registry.CreateApplication(appname)
+    # Create the application without logger to avoid the deprecation warning log
+    app = otbApplication.Registry.CreateApplicationWithoutLogger(appname)
 
     # TODO: remove this when bug 440 is fixed
     app.Init()
@@ -368,6 +375,7 @@ def render_application(appname, allapps):
 
     output = template_application.format(
         label=appname,
+        deprecation_string=render_deprecation_string(app),
         heading=rst_section(app.GetName(), '='),
         description=app.GetDescription(),
         longdescription=make_links(app.GetDocLongDescription(), allapps),
@@ -381,8 +389,9 @@ def render_application(appname, allapps):
     return output
 
 def GetApplicationTags(appname):
-     app = otbApplication.Registry.CreateApplication(appname)
-     return app.GetDocTags()
+    # Create the application without logger to avoid the deprecation warning log
+    app = otbApplication.Registry.CreateApplicationWithoutLogger(appname)
+    return app.GetDocTags()
 
 def GenerateRstForApplications(rst_dir):
     "Generate .rst files for all applications"
@@ -404,9 +413,12 @@ def GenerateRstForApplications(rst_dir):
     for appName in appNames:
 
         # Get application first tag
-        tags = GetApplicationTags(appName)
+        tags = list(GetApplicationTags(appName))
+        if "Deprecated" in tags:
+            tags.remove("Deprecated")
         if not tags or len(tags) == 0:
             raise RuntimeError("No tags for application: " + appName)
+
         tag = tags[0]
         tag_ = tag.replace(" ", "_")
 
diff --git a/Documentation/Cookbook/rst/templates/application.rst b/Documentation/Cookbook/rst/templates/application.rst
index 68db4a8b3cc9c224fcdc107d8c4e3f9f21f97329..bbe15bceff737e5f165a2bdea7d4ea17771fcaab 100644
--- a/Documentation/Cookbook/rst/templates/application.rst
+++ b/Documentation/Cookbook/rst/templates/application.rst
@@ -1,6 +1,9 @@
 .. _{label}:
 
 {heading}
+
+{deprecation_string}
+
 {description}
 
 Description
diff --git a/Modules/Applications/AppImageUtils/app/otbRescale.cxx b/Modules/Applications/AppImageUtils/app/otbRescale.cxx
index 703215872f1ad4ba111438a819108497b338fba3..0a50d18e46ceffab913d0e97a0930c0d3a1ed6b4 100644
--- a/Modules/Applications/AppImageUtils/app/otbRescale.cxx
+++ b/Modules/Applications/AppImageUtils/app/otbRescale.cxx
@@ -59,7 +59,7 @@ private:
                                   "Input minimum and maximum values is automatically computed for all image bands.");
     SetDocLimitations("None");
     SetDocAuthors("OTB-Team");
-    SetDocSeeAlso(" ");
+    SetDocSeeAlso("DynamicConvert");
 
     AddDocTag(Tags::Deprecated);
     AddDocTag(Tags::Manip);
diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx
index 29c8d8c6aed5d2d92c36a44344da5f4b3a970dd0..6f8f839953e039d408f676a8f7c70231db5ec3ba 100644
--- a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx
+++ b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx
@@ -96,12 +96,14 @@ private:
                       " application is not compatible with in-memory connection since it does"
                       " its own internal streaming.");
     SetDocAuthors("David Youssefi");
-    SetDocSeeAlso( "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable"
-                   " mean-shift algorithm and its application to the segmentation of"
-                   " arbitrarily large remote sensing images. IEEE Transactions on"
-                   " Geoscience and Remote Sensing, 53(2), 952-964.\n"
-                   "[2] LSMSegmentation\n"
-                   "[3] LSMSVectorization");
+    SetDocSeeAlso(
+        "Alternative: SmallRegionsMerging\n"
+        "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable"
+        " mean-shift algorithm and its application to the segmentation of"
+        " arbitrarily large remote sensing images. IEEE Transactions on"
+        " Geoscience and Remote Sensing, 53(2), 952-964.\n"
+        "[2] LSMSSegmentation\n"
+        "[3] LSMSVectorization");
     AddDocTag(Tags::Segmentation);
     AddDocTag(Tags::Deprecated);
     AddDocTag("LSMS");
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
index 3e087664964ec72fda368b33c054875825afd4c8..4da58cf694656ef7fa65856fc0af418f8da2ff3d 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
@@ -669,6 +669,9 @@ public:
 
   void AddDocTag(const std::string&);
 
+  /** return wether the application has the "deprecated tag or not */
+  bool IsDeprecated();
+
   DocExampleStructure::Pointer GetDocExample();
   unsigned int GetNumberOfExamples();
   std::string GetExampleComment(unsigned int id);
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
index 3657c6a54a6d9fb0450623ab54b432ccbc597fc2..085ae8c098cdb74b0130e5659091c75960921b42 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx
@@ -256,6 +256,11 @@ void Application::AddDocTag(const std::string & tag)
     }
 }
 
+bool Application::IsDeprecated()
+{
+  return std::find(m_DocTags.begin(), m_DocTags.end(), Tags::Deprecated) != m_DocTags.end();
+}
+
 DocExampleStructure::Pointer Application::GetDocExample()
 {
   if (!IsInitialized())
diff --git a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h
index 9e097a67cfafd11f96efc38867ea37e4b643d62b..e6a26418b2af0f7664a3eb338cd1fa45744c1da9 100644
--- a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h
+++ b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h
@@ -112,9 +112,6 @@ public:
   /** Create and display the help of the application */
   void DisplayHelp(bool longHelp=false);
 
-   /** Create and display the long help of the application */
-  void DisplayLongHelp();
-
   /** Performs specific action for testing environment */
   void LoadTestEnv();
 
diff --git a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
index 4cdb8ee984d82b12abc715c8beadfa4e22d9f3bb..2e31ce8356f15ab9db6a59cd87038f937165cbe9 100644
--- a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
+++ b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx
@@ -282,7 +282,12 @@ bool CommandLineLauncher::BeforeExecute()
     return false;
     }
 
-  return true;
+    if (m_Application->IsDeprecated())
+    {
+      m_Application->GetLogger()->Warning("This application is deprecated and will be removed in a future OTB release.\n");
+    }
+
+    return true;
 }
 
 bool CommandLineLauncher::LoadPath()
@@ -584,6 +589,12 @@ void CommandLineLauncher::DisplayHelp(bool longHelp)
   std::cerr<<std::endl;
   std::cerr << "This is the " << m_Application->GetName() << " application, version " << OTB_VERSION_STRING << std::endl << std::endl;
 
+  if (m_Application->IsDeprecated())
+  {
+    std::cerr << "WARNING: This application is deprecated, it will be removed in a future OTB release." << std::endl;
+    std::cerr << std::endl;
+  }
+
   std::cerr << m_Application->GetDescription() << std::endl;
 
   if(longHelp)
diff --git a/Modules/Wrappers/QtWidget/src/appmainwindow.ui b/Modules/Wrappers/QtWidget/src/appmainwindow.ui
index c376f1984f3cec0518739bf1dd22fe3b6fb4f4be..88eb9a25bdf45af1a55696859d6a5f87c1177356 100644
--- a/Modules/Wrappers/QtWidget/src/appmainwindow.ui
+++ b/Modules/Wrappers/QtWidget/src/appmainwindow.ui
@@ -117,6 +117,13 @@
       </widget>
      </widget>
     </item>
+    <item alignment="Qt::AlignHCenter|Qt::AlignVCenter">
+     <widget class="QLabel" name="deprecation">
+      <property name="text">
+       <string>Deprecation status</string>
+      </property>
+     </widget>
+    </item>
     <item>
      <widget class="QLabel" name="message">
       <property name="text">
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx
index 93c3f459e2e43b49d43e879a84e3f83ccfa30345..282c710ec25cc52408d97e2808a0726f5cb9c14d 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx
@@ -70,6 +70,18 @@ QtMainWindow::QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget*
   // Setup the progress bar to observe the model
   ui->progressBar->SetModel(gui->GetModel());
 
+  // Fill and display the deprecation status label if needed, or hide it.
+  if (app->IsDeprecated())
+  {
+    ui->deprecation->setVisible(true);
+    ui->deprecation->setText("<font color='#E65100'>This application is deprecated and will be removed in a future release.</font>");
+  }
+  else
+  {
+    ui->deprecation->setVisible(false);
+    ui->deprecation->setText("");
+  }
+
   // Connect application progress text to the QLabel
   connect(ui->progressBar, &QtWidgetSimpleProgressReport::SetText, ui->message, &QLabel::setText);
 
diff --git a/Modules/Wrappers/SWIG/src/otbApplication.i b/Modules/Wrappers/SWIG/src/otbApplication.i
index a3b9590f34b84880213124c43438a4728612bed0..d03ad7b1e9551e17289aaa586f797fa5f51917ea 100644
--- a/Modules/Wrappers/SWIG/src/otbApplication.i
+++ b/Modules/Wrappers/SWIG/src/otbApplication.i
@@ -225,6 +225,7 @@ public:
   unsigned long itk::Object::AddObserver(const EventObject & event, 
                                           Command * command);
 
+  bool IsDeprecated();
 
 #if SWIGPYTHON
   %extend 
@@ -901,6 +902,8 @@ public:
         application = _otbApplication.Registry_CreateApplicationWithoutLogger(name)
         if application is not None:
             application.SetupLogger()
+            if application.IsDeprecated():
+                application.GetLogger().Warning("This application is deprecated and will be removed in a future OTB release")
         return application
   }
   #else
diff --git a/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i b/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i
index 4bd7852b2ee7540e8cacb172ecbca7ba2d376ffa..748c8bfef4820b6bd9a04c6d19d8c57f61ca7a84 100644
--- a/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i
+++ b/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i
@@ -72,6 +72,15 @@ public:
   virtual void AddLogOutput(itkLogOutput *output);
   static Logger * Instance();
   void ResetOutputs();
+
+  // Wrap message methods so we can print stuff from Python
+  void Debug(std::string const & message);
+  void Info(std::string const & message);
+  void Warning(std::string const & message);
+  void Critical(std::string const & message);
+  void Error(std::string const & message);
+  void Fatal(std::string const & message);
+
 protected:
   Logger();
   virtual ~Logger();