diff --git a/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h b/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
index eb3ea8861723c8b6018bd81d238ebddbfd90c68e..dbd27a850983deb779425664b6b22c0ab2dd5778 100644
--- a/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
+++ b/Modules/Adapters/GdalAdapters/include/otbOGRVersionProxy.h
@@ -19,6 +19,7 @@
 #define __otbOGRVersionProxy_h
 
 #include <string>
+#include <vector>
 #include "otbConfigure.h"
 
 #ifdef OTB_USE_GDAL_20
@@ -31,6 +32,22 @@ class OGRSFDriver;
 
 namespace otb
 {
+/** 
+ * \brief This class serves as a proxy hiding interface changes in gdal 2.0 
+ *
+ * This static class serves as a proxy hiding interface changes in OGR
+ * dataset between gdal 1.x (x>10) and gdal 2.x. It defines a common
+ * interface that should be used in place of calling directly the
+ * wrapped gdal methods.
+ * 
+ * Whenever GDALDataset and GDALDriver have to be used to open a
+ * vector dataset (or OGRDataSource an OGRSFDriver for gdal 1.x), one
+ * should use OGRVersionProxy type members GDALDatasetType and
+ * GDALDriverType.
+ * 
+ * See static method documentation for details.
+ */
+
 class OGRVersionProxy
 {
 public:
@@ -41,29 +58,145 @@ public:
   typedef OGRDataSource GDALDatasetType;
   typedef OGRSFDriver   GDALDriverType;
 #endif
-  
+
+  /** 
+   * This method opens a file, possibly in read-only mode, and returns
+   * a dataset.
+   *
+   * Calls OGRSFDriverRegistrar::Open for gdal 1.x implementation and GDALopenEx for
+   * gdal 2.x implementation.
+
+   * \param filename Filename of the file to open
+   * \param readOnly: If true, dataset is open in read-only mode.
+   * \return NULL if file could not be open.
+   */ 
   static GDALDatasetType * Open(const char * filename, bool readOnly = true);
-  
+
+  /**
+   * This method closes a dataset.
+   *
+   * Calls OGRDataSource::DestroyDataSource for gdal 1.x
+   * implementation and GDALClose for gdal 2.x implementation.
+   *
+   * \param dataset Pointer to the dataset to close. Will not be
+   * checked for null pointer.
+   */
   static void Close(GDALDatasetType * dataset);
-  
+
+  /**
+   * This method creates a new dataset.
+   *
+   * Calls OGRSFDriver::CreateDataSource for gdal 1.x implementation
+   * and GDALDriver::Create with (0,0) raster size for gdal 2.x
+   * implementation
+   * 
+   * \param driver Pointer to the driver used for creation. Will not
+   * be checked for null pointer.
+   *
+   * \param name Name of the dataset to create.
+   * 
+   * \return NULL if dataset could not be created.
+   */
   static GDALDatasetType * Create(GDALDriverType * driver, const char * name);
 
+
+  /**
+   * This method physically deletes an existing dataset.
+   * 
+   * Calls OGRDataSource::DeleteDataSource for gdal 1.x implementation
+   * and GDALDriver::Delete for gdal 2.x implementation.
+   *
+   * \param driver Pointer to the driver used for creation. Will not
+   * be checked for null pointer.
+   *
+   * \param name Name of the dataset to destroy.
+   */ 
   static bool Delete(GDALDriverType * driver, const char * name);
 
+  /**
+   * This method returns a pointer to the driver from its name.
+   * 
+   * Calls OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName() for
+   * gdal 1.x implementation and
+   * GetGDALDriverManager()->GetDriverByName() for gdal 2.x
+   * implementation.
+   * 
+   * \param name Name of the driver to retrieve
+   * 
+   * \return NULL if no driver could be retrieved.
+   */
   static GDALDriverType *  GetDriverByName(const char * name);
 
+  /**
+   * Test driver and dataset for a given capability.
+   *
+   * Calls OGRSFDriver::TestCapability for gdal 1.x implementation and
+   * GDALDataset::TestCapability for gdal 2.x implementation.
+   *
+   * \param driver Pointer to the driver to test. Will not
+   * be checked for null pointer.
+   *
+   * \param dataset Pointer to the dataset to test. Will not be
+   * checked for null pointer.
+   *
+   * \param capability Name of the capability to test.
+   *
+   * \return True if the capability is supported.
+   */
   static bool TestCapability(const GDALDriverType * driver, const GDALDatasetType * dataset, const char * capability);
 
+  /**
+   * Sync dataset to disk.
+   *
+   * Calls OGRDataSource::SyncToDisk() for gdal 1.x implementation and
+   * GDALDataset::FlushCache() for gdal 2.x  implementation.
+   *
+   * \param dataset Pointer to the dataset to sync. Will not be
+   * checked for null pointer.
+   *
+   * \return True if sync went on without any error.
+   */
   static bool SyncToDisk(GDALDatasetType * dataset);
 
+  /**
+   * \return The name of the dataset class behind the implementation
+   * (OGRDataSource for gdal 1.x and GdalDataset for gdal 2.x)
+   */
   static std::string GetDatasetClassName();
 
+  /**
+   * \return The name of the driver class behind the implementation
+   * (OGRSFDriver for gdal 1.x and GDALDriver for gdal 2.x)
+   */
   static std::string GetDriverClassName();
 
-  static std::string GetDatasetDescription(GDALDatasetType * dataset);
+  /**
+   * Return the list of files composing the dataset.
+   * 
+   * Calls OGRDataSource::GetName() and wrap in string vector for gdal
+   * 1.x implementation, and GDALDataset::GetFileList and wrap in
+   * string vector for gdal 2.x implementation.
+   *  
+   * \param dataset Pointer to the dataset to get the file list from. Will not be
+   * checked for null pointer.
+   * 
+   * \return A vector of string containing the list of files.
+   */
+  static std::vector<std::string> GetFileListAsStringVector(GDALDatasetType * dataset);
+
+  /** 
+   * Return the list of available drivers.
+   *
+   * Calls OGRSFDriverRegistrar::GetRegistrar() for gdal 1.x
+   * implementation and GetGDALDriverManager() for gdal 2.x
+   * implementation.
+   *
+   * \return A vector of string containing the list of available drivers.
+   */  
+  static std::vector<std::string> GetAvailableDriversAsStringVector();
 
 private:
-  OGRVersionProxy(); // purposely not implemeted
+  OGRVersionProxy(); // purposely not implemented
   OGRVersionProxy(const OGRVersionProxy&); // purposely not implemented
   void operator=(const OGRVersionProxy&); // purposely not implemented
 };
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx
index 192d9e5d6571777fc84f24e3c7bd6a59438748f7..b05ffbd8bac57fddbf7c992b6e11e0bb3e282bba 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy1x.cxx
@@ -17,7 +17,14 @@
 =========================================================================*/
 #include "otbOGRVersionProxy.h"
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
 #include "ogrsf_frmts.h"
+#pragma GCC diagnostic pop
+#else
+#include "ogrsf_frmts.h"
+#endif
 
 namespace otb
 {
@@ -66,9 +73,13 @@ std::string OGRVersionProxy::GetDriverClassName()
   return std::string("OGRSFDriver");
 }
 
-std::string OGRVersionProxy::GetDatasetDescription(GDALDatasetType * dataset)
+std::vector<std::string> OGRVersionProxy::GetFileListAsStringVector(GDALDatasetType * dataset)
 {
-  return std::string(dataset->GetName());
+  std::vector<std::string> ret;
+
+  ret.push_back(std::string(dataset->GetName()));
+  
+  return ret;
 }
 
 bool OGRVersionProxy::SyncToDisk(GDALDatasetType * dataset)
@@ -78,4 +89,18 @@ bool OGRVersionProxy::SyncToDisk(GDALDatasetType * dataset)
   return (res == OGRERR_NONE);
 }
 
+std::vector<std::string> OGRVersionProxy::GetAvailableDriversAsStringVector()
+{
+  std::vector<std::string> ret;
+  
+  int nbDrivers = OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount();
+  
+  for(int i = 0; i < nbDrivers;++i)
+    {
+    ret.push_back(OGRSFDriverRegistrar::GetRegistrar()->GetDriver(i)->GetName());
+    }
+
+  return ret;
+}
+
 } // end namespace
diff --git a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
index 7f47f0450904d2e9a53d4a63775062166f5307d8..0d5ff9407cc0dea10ec1ebba8c3caded51261ce3 100644
--- a/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
+++ b/Modules/Adapters/GdalAdapters/src/otbOGRVersionProxy2x.cxx
@@ -17,7 +17,14 @@
 =========================================================================*/
 #include "otbOGRVersionProxy.h"
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
 #include "gdal_priv.h"
+#pragma GCC diagnostic pop
+#else
+#include "gdal_priv.h"
+#endif
 
 namespace otb
 {
@@ -66,8 +73,10 @@ std::string OGRVersionProxy::GetDriverClassName()
   return std::string("GDALDriver");
 }
 
-std::string OGRVersionProxy::GetDatasetDescription(GDALDatasetType * dataset)
+std::vector<std::string> OGRVersionProxy::GetFileListAsStringVector(GDALDatasetType * dataset)
 {
+  std::vector<std::string> ret;
+  
   char ** files = dataset->GetFileList();
 
   std::string files_str="";
@@ -77,12 +86,13 @@ std::string OGRVersionProxy::GetDatasetDescription(GDALDatasetType * dataset)
     unsigned int i = 0;
     while(files[i]!=NULL)
       {
-      files_str+=std::string(files[i])+" ";
+      ret.push_back(std::string(files[i]));
       ++i;
       }
     CSLDestroy(files);
     }
-  return files_str;
+
+  return ret;
 }
 
 bool OGRVersionProxy::SyncToDisk(GDALDatasetType * dataset)
@@ -92,4 +102,18 @@ bool OGRVersionProxy::SyncToDisk(GDALDatasetType * dataset)
   return true;
 }
 
+std::vector<std::string> OGRVersionProxy::GetAvailableDriversAsStringVector()
+{
+  std::vector<std::string> ret;
+  
+  int nbDrivers = GetGDALDriverManager()->GetDriverCount();
+  
+  for(int i = 0; i < nbDrivers;++i)
+    {
+    ret.push_back(GDALGetDriverShortName(GetGDALDriverManager()->GetDriver(i)));
+    }
+
+  return ret;
+}
+
 } // end namespace