diff --git a/Modules/IO/TestKernel/src/otbTestHelper.cxx b/Modules/IO/TestKernel/src/otbTestHelper.cxx
index b6875c0156223a40c13a26b0c7fadfc85f3fd32d..8bd7eb58f3d0579684f3885a0bd531549dc5ccab 100644
--- a/Modules/IO/TestKernel/src/otbTestHelper.cxx
+++ b/Modules/IO/TestKernel/src/otbTestHelper.cxx
@@ -1420,13 +1420,27 @@ int TestHelper::RegressionTestImage(int cpt, const char* testImageFilename, cons
 
 namespace
 {
-
-template <class InputIt1, class InputIt2, class BinaryPredicate >
-int CompareMetadataDict( InputIt1 first1, InputIt1 last1,
-                          InputIt2 first2, InputIt2 last2,
+/** \fn CompareMetadataDict
+  \brief Compare two metadata dictionaries key by key. Dictionaries are assumed to be associative containers (e.g. std::map)
+  \param[in] baselineMap : reference metadata dictionary
+  \param[in] testMap : metadata dictionary to be compared
+  \param[in] reportErrors : print difference between dictionaries into srd::cerr
+  \param[in] untestedKeys : list of keys that should be ignored during comparison
+  \param[in] p bianry predicate used to compare elements (mapped type) of the two input maps
+  \return number of different elements.
+*/
+template <class MapType, class BinaryPredicate >
+int CompareMetadataDict( const MapType & baselineMap, 
+                         const MapType & testMap,
                           bool reportErrors,
+                          std::vector< typename MapType::key_type> untestedKeys,
                           const BinaryPredicate & p)
 {
+  auto first1 = testMap.begin();
+  auto last1 = testMap.end();
+  auto first2 = baselineMap.begin();
+  auto last2 = baselineMap.end();
+
   if (std::distance(first1, last1) != std::distance(first2, last2))
   {
     if (reportErrors)
@@ -1441,34 +1455,38 @@ int CompareMetadataDict( InputIt1 first1, InputIt1 last1,
 
   while (first1 != last1)
   {
-    if (first1->first != first2->first)
+    if (std::find(untestedKeys.begin(), untestedKeys.end(), first1->first) == untestedKeys.end())
+    //if (first1->first != untestedKeys)
     {
-      errorCount++;
-      if (reportErrors)
+      if (first1->first != first2->first)
       {
-        std::cerr << "Metadata key " << otb::MetaData::EnumToString(first1->first) 
-                    << " does not match between test and baseline images: "
-                    << std::endl;
+        errorCount++;
+        if (reportErrors)
+        {
+          std::cerr << "Metadata key " << otb::MetaData::EnumToString(first1->first) 
+                      << " does not match between test and baseline images: "
+                      << std::endl;
+        }
+        return errorCount;
       }
-      return errorCount;
-    }
 
 
-    if (!p(first1->second, first2->second))
-    {
-      errorCount++;
-      if (reportErrors)
-        std::cerr << "Metadata " << otb::MetaData::EnumToString(first1->first) 
-                  << " does not match between test and baseline images: "
-                  << std::endl
-                  << "Baseline image: " 
-                  << first1->second
-                  << std::endl
-                  << "Test image: " 
-                  << first2->second 
-                  << std::endl;
+      if (!p(first1->second, first2->second))
+      {
+        errorCount++;
+        if (reportErrors)
+          std::cerr << "Metadata " << otb::MetaData::EnumToString(first1->first) 
+                    << " does not match between test and baseline images: "
+                    << std::endl
+                    << "Baseline image: " 
+                    << first1->second
+                    << std::endl
+                    << "Test image: " 
+                    << first2->second 
+                    << std::endl;
+      }
     }
-
+    
     ++first1;
     ++first2;
   }
@@ -1477,16 +1495,19 @@ int CompareMetadataDict( InputIt1 first1, InputIt1 last1,
 }
 
 
-template <class InputIt1, class InputIt2 >
-int CompareMetadataDict( InputIt1 first1, InputIt1 last1,
-                          InputIt2 first2, InputIt2 last2,
-                          bool reportErrors)
+
+template <class MapType>
+int CompareMetadataDict( const MapType & baselineMap, 
+                         const MapType & testMap,
+                          bool reportErrors,
+                          std::vector< typename MapType::key_type> untestedKeys)
 {
-  auto p = []( const decltype(first1->second) & rhs, 
-               const decltype(first2->second) & lhs) 
+  auto p = []( const typename MapType::mapped_type & rhs, 
+               const typename MapType::mapped_type & lhs) 
           {return rhs == lhs;};
-  return CompareMetadataDict(first1, last1, first2, last2, reportErrors, p);
+  return CompareMetadataDict(baselineMap, testMap, reportErrors, untestedKeys, p);
 }
+
 }
 
 int TestHelper::RegressionTestMetaData(const char* testImageFilename, const char* baselineImageFilename, const double tolerance) const
@@ -1660,52 +1681,48 @@ int TestHelper::RegressionTestMetaData(const char* testImageFilename, const char
   const auto & testImageMetadata = testImPtr->GetImageMetadata();
 
   // Compare string keys (strict equality)
-  errcount += CompareMetadataDict(baselineImageMetadata.StringKeys.begin(),
-                                    baselineImageMetadata.StringKeys.end(), 
-                                    testImageMetadata.StringKeys.begin(),
-                                    testImageMetadata.StringKeys.end(),
-                                    m_ReportErrors);
+  errcount += CompareMetadataDict(baselineImageMetadata.StringKeys,
+                                    testImageMetadata.StringKeys,
+                                    m_ReportErrors,
+                                    {});
 
   // Compare numeric keys
   auto compareDouble = [tolerance](double lhs, double rhs)
         {return fabs(lhs - rhs) 
                 <= ( (fabs(lhs) < fabs(rhs) ? fabs(rhs) : fabs(lhs)) * tolerance);};
 
-  errcount += CompareMetadataDict(baselineImageMetadata.NumericKeys.begin(),
-                                    baselineImageMetadata.NumericKeys.end(), 
-                                    testImageMetadata.NumericKeys.begin(),
-                                    testImageMetadata.NumericKeys.end(),
+  // Don't test TileHints and datatype, as these metadata are written by gdal drivers, not otb.
+  std::vector<MDNum> untestedMDNum  = {MDNum::TileHintX, MDNum::TileHintY, MDNum::DataType};
+  errcount += CompareMetadataDict(baselineImageMetadata.NumericKeys,
+                                    testImageMetadata.NumericKeys,
                                     m_ReportErrors,
+                                    untestedMDNum,
                                     compareDouble);
 
   // Compare time keys (strict equality)
-  errcount += CompareMetadataDict(baselineImageMetadata.TimeKeys.begin(),
-                                    baselineImageMetadata.TimeKeys.end(), 
-                                    testImageMetadata.TimeKeys.begin(),
-                                    testImageMetadata.TimeKeys.end(),
-                                    m_ReportErrors);
+  errcount += CompareMetadataDict(baselineImageMetadata.TimeKeys, 
+                                    testImageMetadata.TimeKeys,
+                                    m_ReportErrors,
+                                    {});
 
 
   // Compare LUTs (strict equality)
-  errcount += CompareMetadataDict(baselineImageMetadata.LUT1DKeys.begin(),
-                                    baselineImageMetadata.LUT1DKeys.end(), 
-                                    testImageMetadata.LUT1DKeys.begin(),
-                                    testImageMetadata.LUT1DKeys.end(),
-                                    m_ReportErrors);
+  errcount += CompareMetadataDict(baselineImageMetadata.LUT1DKeys, 
+                                    testImageMetadata.LUT1DKeys,
+                                    m_ReportErrors,
+                                    {});
 
-  errcount += CompareMetadataDict(baselineImageMetadata.LUT2DKeys.begin(),
-                                    baselineImageMetadata.LUT2DKeys.end(), 
-                                    testImageMetadata.LUT2DKeys.begin(),
-                                    testImageMetadata.LUT2DKeys.end(),
-                                    m_ReportErrors);
+  errcount += CompareMetadataDict(baselineImageMetadata.LUT2DKeys, 
+                                    testImageMetadata.LUT2DKeys,
+                                    m_ReportErrors,
+                                    {});
 
 
   // Compare extra keys (strict equality)
-  errcount += CompareMetadataDict(baselineImageMetadata.ExtraKeys.begin(),
-                                    baselineImageMetadata.ExtraKeys.end(), 
-                                    testImageMetadata.ExtraKeys.begin(),
-                                    testImageMetadata.ExtraKeys.end(),
-                                    m_ReportErrors);
+  errcount += CompareMetadataDict(baselineImageMetadata.ExtraKeys, 
+                                    testImageMetadata.ExtraKeys,
+                                    m_ReportErrors,
+                                    {});
 
 
   if (baselineImageMetadata.Has(MDGeom::RPC))