diff --git a/Modules/Core/Common/include/otbStringToHTML.h b/Modules/Core/Common/include/otbStringToHTML.h
new file mode 100644
index 0000000000000000000000000000000000000000..3eab95fd21c4210ab3f6317deb8eaa45bf97f100
--- /dev/null
+++ b/Modules/Core/Common/include/otbStringToHTML.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
+ *
+ * This file is part of Orfeo Toolbox
+ *
+ *     https://www.orfeo-toolbox.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef otbStringToHTML_h
+#define otbStringToHTML_h
+
+#include <string>
+#include <iostream>
+
+#include "OTBCommonExport.h"
+
+namespace otb
+{
+
+/**
+ * \class StringToHTML
+ *
+ * Prepare a plain string for HTML encapsulation (protection of special
+ * characters)
+ */
+class OTBCommon_EXPORT StringToHTML
+{
+public:
+  StringToHTML(const std::string & str);
+
+  void Print(std::ostream& os) const;
+
+protected:
+
+private:
+  const std::string & m_Str;
+};
+
+extern OTBCommon_EXPORT std::ostream & operator<< (std::ostream& os, const otb::StringToHTML& str);
+
+} // end of namespace otb
+
+#endif
diff --git a/Modules/Core/Common/src/CMakeLists.txt b/Modules/Core/Common/src/CMakeLists.txt
index fdfd2e9f5cae6c4362a05d721c923074d966a2ab..02ff6250e794704244acbe370fc7c562a13524c3 100644
--- a/Modules/Core/Common/src/CMakeLists.txt
+++ b/Modules/Core/Common/src/CMakeLists.txt
@@ -28,6 +28,7 @@ set(OTBCommon_SRC
   otbStandardOneLineFilterWatcher.cxx
   otbWriterWatcherBase.cxx
   otbStopwatch.cxx
+  otbStringToHTML.cxx
   )
 
 add_library(OTBCommon ${OTBCommon_SRC})
diff --git a/Modules/Core/Common/src/otbStringToHTML.cxx b/Modules/Core/Common/src/otbStringToHTML.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..064ec850c2b4f4767064c9e6f2ae01f7a1927771
--- /dev/null
+++ b/Modules/Core/Common/src/otbStringToHTML.cxx
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
+ *
+ * This file is part of Orfeo Toolbox
+ *
+ *     https://www.orfeo-toolbox.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "otbStringToHTML.h"
+
+namespace otb
+{
+
+StringToHTML::StringToHTML(const std::string & str)
+  : m_Str(str)
+{
+}
+
+void
+StringToHTML::Print(std::ostream& os) const
+{
+  // TODO : add a Tex to HTML translator (maybe try TtH)
+  bool formulaMode=false;
+  for(auto&& c : m_Str)
+    {
+    if (c=='`')
+      {
+      formulaMode = !formulaMode;
+      }
+    switch (c)
+      {
+      case '<':
+        os.write("&lt;",4);
+        break;
+      case '>':
+        os.write("&gt;",4);
+        break;
+      case '&':
+        os.write("&amp;",5);
+        break;
+      case '\n':
+        os.write("<br/>",5);
+        break;
+      default:
+        os.put(c);
+      }
+    }
+}
+
+std::ostream & operator<< (std::ostream& os, const StringToHTML& str)
+{
+  str.Print(os);
+  return os;
+}
+
+} // end of namespace otb