diff --git a/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h b/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h
index 8340cedac73674309f124cc4c8b24499dc3c34b3..2a685790333b2959489715b8cf4450ceee3ba58c 100644
--- a/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h
+++ b/Modules/Core/Metadata/include/otbImageMetadataInterfaceBase.h
@@ -53,6 +53,8 @@ public:
   typedef MetaDataKey::VariableLengthVectorType VariableLengthVectorType;
   typedef ImageKeywordlist                      ImageKeywordlistType;
   typedef unsigned int                          UnsignedIntType;
+  typedef std::vector<std::string>              StringVectorType;
+  typedef std::vector<unsigned int>             UIntVectorType;
 
 
   /** Set the image used to get the metadata */
@@ -80,7 +82,7 @@ public:
   std::string GetGCPProjection() const;
 //  otbMetadataGetMacro(GCPProjection, std::string);
 
-  unsigned int GetGCPCount() const;
+  UnsignedIntType GetGCPCount() const;
 //  otbMetadataGetMacro(GCPCount, unsigned int);
 
   OTB_GCP& GetGCPs(unsigned int GCPnum);
@@ -107,7 +109,7 @@ public:
   double GetGCPZ(unsigned int GCPnum) const;
 //  otbMetadataGetGCPnumMacro(GCPZ, double, GCPnum, unsigned int);
 
-  /** 
+  /**
    * Get The no data flags if existing
    * return False otherwise
    */
@@ -141,11 +143,11 @@ public:
   //otbMetadataGetMacro(SensorID, std::string);
 
   /** Get the number of bands from the ossim metadata */
-  unsigned int GetNumberOfBands() const;
+  UnsignedIntType GetNumberOfBands() const;
   //otbMetadataGetMacro(NumberOfBands, unsigned int);
 
   /** Get the band name from the ossim metadata */
-  std::vector<std::string> GetBandName() const;
+  StringVectorType GetBandName() const;
   //otbMetadataGetMacro(BandName, std::vector<std::string>);
 
   /** Get the x pixel spacing*/
@@ -156,7 +158,6 @@ public:
   double GetYPixelSpacing() const;
   //otbMetadataGetMacro(YPixelSpacing, double);
 
-
   /** Get the imaging acquisition day from the ossim metadata */
   virtual int GetDay() const = 0;
 //  otbMetadataGetMacro(Day, int);
@@ -190,11 +191,11 @@ public:
   //otbMetadataGetMacro(ProductionYear, int);
 
   /** Convert the band names provided by ossim to the official band names  */
-  virtual std::vector<std::string> GetEnhancedBandNames () const = 0;
+  virtual StringVectorType GetEnhancedBandNames () const = 0;
 
   /** Get the 3 spectral band numbers corresponding to the default display for visualization,
    *  in the order R, G, B */
-  virtual std::vector<unsigned int> GetDefaultDisplay() const = 0;
+  virtual UIntVectorType GetDefaultDisplay() const = 0;
 
   virtual bool CanRead() const = 0;
 
diff --git a/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h b/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h
new file mode 100644
index 0000000000000000000000000000000000000000..ef95f2b687f54ac5b3f4e9d9239d64a96a7c5fc6
--- /dev/null
+++ b/Modules/Core/Metadata/include/otbSarCalibrationLookupData.h
@@ -0,0 +1,72 @@
+#ifndef SarCalibrationLookupData_H
+#define SarCalibrationLookupData_H 1
+#include <string>
+#include <itkLightObject.h>
+#include <itkNumericTraits.h>
+#include <itkObjectFactory.h>
+
+namespace otb {
+
+class ITK_EXPORT SarCalibrationLookupData : public itk::LightObject {
+
+  public:
+
+    /** Standard typedefs */
+  typedef SarCalibrationLookupData          Self;
+  typedef itk::LightObject                 Superclass;
+  typedef itk::SmartPointer<Self>          Pointer;
+  typedef itk::SmartPointer<const Self>    ConstPointer;
+
+  /** Creation through the object factory */
+  itkNewMacro(Self);
+
+  /** RTTI */
+  itkTypeMacro(SarCalibrationLookupData, itk::LightObject);
+
+  typedef itk::IndexValueType IndexValueType;
+
+  enum {
+    SIGMA = 0,
+    BETA,
+    GAMMA,
+    DN
+  };
+
+  SarCalibrationLookupData()
+    :m_Type(0)
+  {
+
+  }
+
+  virtual ~SarCalibrationLookupData()
+  {
+  }
+
+  virtual double GetValue(const IndexValueType itkNotUsed(x), const IndexValueType itkNotUsed(y))
+  {
+    return 1.0;
+  }
+
+  void SetType(short t)
+  {
+    m_Type = t;
+  }
+
+  itkGetMacro(Type, short);
+
+  void PrintSelf(std::ostream & os, itk::Indent indent) const
+  {
+    os << indent << " lookup table type:'" << m_Type << "'" << std::endl;
+    Superclass::PrintSelf(os, indent);
+  }
+
+private:
+
+  SarCalibrationLookupData(const Self&); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+  short m_Type;
+
+};
+
+}
+#endif
diff --git a/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h
index f78fa3e87cabf9cd888cad5900c3636c2120795d..dd6529ab2454abc3274b3e5d7645cec4b06d4106 100644
--- a/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSarDefaultImageMetadataInterface.h
@@ -58,8 +58,7 @@ public:
   typedef double                                     RealType;
   typedef PointSetType::PointType                    PointType;
 
-
-  RealType   GetRadiometricCalibrationScale() const
+  RealType GetRadiometricCalibrationScale() const
   {
     itkExceptionMacro("GetRadiometricCalibrationScale() not implemented in SarDefaultImageMetadataInterface, no captor type found");
   }
@@ -194,9 +193,9 @@ public:
 
   /** Get the 3 spectral band numbers corresponding to the default display for visualization,
    *  in the order R, G, B */
-    std::vector<unsigned int> GetDefaultDisplay() const
+    UIntVectorType GetDefaultDisplay() const
   {
-    std::vector<unsigned int> rgb(3);
+    UIntVectorType rgb(3);
     rgb[0] = 0;
     rgb[1] = 0;
     rgb[2] = 0;
diff --git a/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h
index 73f055cbdcab660835dd526a3c806f8d318e4703..3ed787e142b5696bce239adf57a5b3b339e77090 100644
--- a/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h
+++ b/Modules/Core/Metadata/include/otbSarImageMetadataInterface.h
@@ -19,9 +19,11 @@
 #define __otbSarImageMetadataInterface_h
 
 #include <string>
-
+#include <vector>
 #include "otbImageMetadataInterfaceBase.h"
 #include "itkPointSet.h"
+#include "otbSarCalibrationLookupData.h"
+#include "otbStringUtils.h"
 
 namespace otb
 {
@@ -50,11 +52,25 @@ public:
   typedef Superclass::VectorType                     VectorType;
   typedef Superclass::VariableLengthVectorType       VariableLengthVectorType;
   typedef Superclass::ImageKeywordlistType           ImageKeywordlistType;
+  typedef Superclass::UIntVectorType                 UIntVectorType;
+  typedef Superclass::StringVectorType               StringVectorType;
   typedef itk::PointSet<double, 2>                   PointSetType;
   typedef PointSetType::Pointer                      PointSetPointer;
   typedef double                                     RealType;
   typedef PointSetType::PointType                    PointType;
+  typedef SarCalibrationLookupData                   LookupDataType;
+  typedef typename LookupDataType::Pointer          LookupDataPointerType;
+
+  virtual void CreateCalibrationLookupData(const short t);
 
+  const LookupDataPointerType GetCalibrationLookupData(const short type);
+
+  bool HasCalibrationLookupDataFlag() const;
+
+  void SetCalibrationLookupData(LookupDataType* lut)
+  {
+    m_SarLut = lut;
+  }
 
   virtual RealType   GetRadiometricCalibrationScale() const;
 
@@ -75,10 +91,18 @@ public:
   virtual double GetRadarFrequency () const = 0;
   virtual double GetCenterIncidenceAngle() const = 0;
 
+
+
+  virtual double GetRescalingFactor() const;
+
+  virtual const std::string GetProductType() const;
+
+  virtual const std::string GetAcquisitionMode() const;
+
   /** Get the enhanced band names (No enhanced band name support for SAR) */
-  std::vector<std::string> GetEnhancedBandNames() const
+  StringVectorType GetEnhancedBandNames() const
   {
-    std::vector<std::string> nothing;
+    StringVectorType nothing;
     return nothing;
   }
 
@@ -91,9 +115,13 @@ protected:
 
   void PrintSelf(std::ostream& os, itk::Indent indent) const;
 
+  LookupDataPointerType m_SarLut;
+
+
 private:
   SarImageMetadataInterface(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
+
 };
 
 } // end namespace otb
diff --git a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..c67ead32a4656b69c84f35dfabb0072dfd9d8e1a
--- /dev/null
+++ b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h
@@ -0,0 +1,236 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbSentinel1ImageMetadataInterface_h
+#define __otbSentinel1ImageMetadataInterface_h
+
+#include "otbSarImageMetadataInterface.h"
+
+
+namespace otb
+{
+/** \class Sentinel1ImageMetadataInterface
+ *
+ * \brief Creation of an "otb" Sentinel1ImageMetadataInterface that gets metadata.
+ *
+ *
+ * \ingroup OTBMetadata
+ */
+
+class ITK_ABI_EXPORT Sentinel1ImageMetadataInterface : public SarImageMetadataInterface
+{
+public:
+
+  typedef Sentinel1ImageMetadataInterface    Self;
+  typedef SarImageMetadataInterface         Superclass;
+  typedef itk::SmartPointer<Self>         Pointer;
+  typedef itk::SmartPointer<const Self> ConstPointer;
+
+  /** Method for creation through the object factory. */
+  itkNewMacro(Self);
+
+
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(Sentinel1ImageMetadataInterface, SarImageMetadataInterface);
+
+  typedef Superclass::ImageType                ImageType;
+  typedef Superclass::MetaDataDictionaryType   MetaDataDictionaryType;
+  typedef Superclass::VectorType               VectorType;
+  typedef Superclass::VariableLengthVectorType VariableLengthVectorType;
+  typedef Superclass::ImageKeywordlistType     ImageKeywordlistType;
+  typedef Superclass::RealType                  RealType;
+  typedef Superclass::LookupDataPointerType LookupDataPointerType;
+
+  /** Get the imaging production day from the ossim metadata : DATASET_PRODUCTION_DATE metadata variable */
+  int GetProductionDay() const;
+
+  /** Get the imaging production month from the ossim metadata : DATASET_PRODUCTION_DATE metadata variable */
+  int GetProductionMonth() const;
+
+  /** Get the imaging production year from the ossim metadata : DATASET_PRODUCTION_DATE metadata variable */
+  int GetProductionYear() const;
+
+  /** check sensor ID */
+  bool CanRead() const;
+
+  int GetDay() const;
+
+  int GetMonth() const;
+
+  int GetYear() const;
+
+  int GetHour() const;
+
+  int GetMinute() const;
+
+  UIntVectorType GetDefaultDisplay() const;
+
+  /*SarImageMetadataInterface pure virutals rituals */
+  double GetPRF() const;
+
+  double GetRSF() const;
+
+  double GetRadarFrequency() const;
+
+  double GetCenterIncidenceAngle() const;
+
+  /*get lookup data for calulating backscatter */
+  void CreateCalibrationLookupData(const short type);
+
+protected:
+
+  /* class ctor */
+  Sentinel1ImageMetadataInterface();
+
+  /* class dtor */
+  virtual ~Sentinel1ImageMetadataInterface() {}
+
+private:
+
+  Sentinel1ImageMetadataInterface(const Self &); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+
+/* Helper function to parse date and time into a std::vector<std::string>
+ * using boost::split() expect date time in yyyy-mm-ddThh:mm:ss.ms
+ * the date-time string is to be found in keywordlist with key 'key'
+ * fills argument dateFields of type std::vector<std::string> which is mutable!
+ * TODO: move this method into base class
+ */
+  void ParseDateTime(const char* key, std::vector<int>& dateFields) const;
+
+  mutable std::vector<int> m_ProductionDateFields;
+  mutable std::vector<int> m_AcquisitionDateFields;
+};
+
+
+
+struct Sentinel1CalibrationStruct {
+
+public:
+  double timeMJD;
+  int line;
+  std::vector<int> pixels;
+  std::vector<float> vect;
+};
+
+class Sentinel1CalibrationLookupData : public SarCalibrationLookupData
+{
+
+public:
+
+
+  /** Standard typedefs */
+  typedef Sentinel1CalibrationLookupData   Self;
+  typedef SarCalibrationLookupData         Superclass;
+  typedef itk::SmartPointer<Self>          Pointer;
+  typedef itk::SmartPointer<const Self>    ConstPointer;
+
+  /** Creation through the object factory */
+  itkNewMacro(Self);
+
+  /** RTTI */
+  itkTypeMacro(Sentinel1CalibrationLookupData, SarCalibrationLookupData);
+
+  typedef itk::IndexValueType IndexValueType;
+
+  Sentinel1CalibrationLookupData()
+    : firstLineTime(0.)
+    , lastLineTime(0.)
+    , numOfLines(0)
+    , count(0)
+    , lineTimeInterval(0.)
+  {
+
+  }
+
+  virtual ~Sentinel1CalibrationLookupData()
+  {
+
+  }
+
+  void InitParameters(short type, double ft, double lt,
+                      int lines, int c,
+                      std::vector<Sentinel1CalibrationStruct> vlist)
+  {
+    firstLineTime = ft;
+    lastLineTime = lt;
+    numOfLines = lines;
+    count = c;
+    calibrationVectorList = vlist;
+    this->SetType(type);
+    lineTimeInterval = (lt - ft) / ((lines - 1) * 1.0);
+  }
+
+  virtual double GetValue(const IndexValueType x, const IndexValueType y)
+  {
+    const int calVecIdx = GetVectorIndex(y);
+    const Sentinel1CalibrationStruct vec0 = calibrationVectorList[calVecIdx];
+    const Sentinel1CalibrationStruct vec1 = calibrationVectorList[calVecIdx + 1];
+    const double azTime = firstLineTime + y * lineTimeInterval;
+    const double muY = (azTime - vec0.timeMJD) /(vec1.timeMJD - vec0.timeMJD);
+    const int pixelIdx = GetPixelIndex(x, calibrationVectorList[calVecIdx]);
+    const double muX = (static_cast<float>(x) - static_cast<float>(vec0.pixels[pixelIdx])) / (static_cast<float>(vec0.pixels[pixelIdx + 1] - vec0.pixels[pixelIdx]));
+    const double lutVal = (1 - muY) * ((1 - muX) * vec0.vect[pixelIdx] + muX * vec0.vect[pixelIdx + 1]) +
+      muY * ((1 - muX) * vec1.vect[pixelIdx] + muX *   vec1.vect[pixelIdx + 1]);
+    return lutVal;
+  }
+
+  int GetVectorIndex(int y)
+  {
+    for (int i = 1; i < count; i++)
+      {
+      if (y < calibrationVectorList[i].line)
+        {
+        return i - 1;
+        }
+      }
+    return -1;
+
+  }
+
+  int GetPixelIndex(int x, const Sentinel1CalibrationStruct& calVec)
+  {
+    const int size = calVec.pixels.size();
+    for (int i = 0; i < size; i++)
+      {
+      if (x < calVec.pixels[i])
+        {
+        return i - 1;
+        }
+      }
+    return size - 2;
+  }
+
+private:
+
+  Sentinel1CalibrationLookupData(const Self&); //purposely not implemented
+
+  void operator =(const Self&); //purposely not implemented
+
+  double firstLineTime;
+  double lastLineTime;
+  int numOfLines;
+  int count;
+  std::vector<Sentinel1CalibrationStruct> calibrationVectorList;
+  double lineTimeInterval;
+
+};
+
+
+} // end namespace otb
+
+#endif
diff --git a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..76964bb4fc2beca05728862e17f16719e0087041
--- /dev/null
+++ b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterfaceFactory.h
@@ -0,0 +1,69 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbSentinel1ImageMetadataInterfaceFactory_h
+#define __otbSentinel1ImageMetadataInterfaceFactory_h
+
+
+#include "itkObjectFactoryBase.h"
+
+namespace otb
+{
+/** \class Sentinel1ImageMetadataInterfaceFactory
+ * \brief Creating an instance of a ImageMetadataInterface object using object factory.
+ *
+ * \ingroup OTBMetadata
+ */
+class ITK_EXPORT Sentinel1ImageMetadataInterfaceFactory : public itk::ObjectFactoryBase
+{
+public:
+  /** Standard class typedefs. */
+  typedef Sentinel1ImageMetadataInterfaceFactory Self;
+  typedef itk::ObjectFactoryBase            Superclass;
+  typedef itk::SmartPointer<Self>           Pointer;
+  typedef itk::SmartPointer<const Self>     ConstPointer;
+
+  /** Class methods used to interface with the registered factories. */
+  virtual const char* GetITKSourceVersion(void) const;
+  virtual const char* GetDescription(void) const;
+
+  /** Method for class instantiation. */
+  itkFactorylessNewMacro(Self);
+
+  /** Run-time type information (and related methods). */
+  itkTypeMacro(Sentinel1ImageMetadataInterfaceFactory, itk::ObjectFactoryBase);
+
+  /** Register one factory of this type  */
+  static void RegisterOneFactory(void)
+  {
+    Pointer factory = Sentinel1ImageMetadataInterfaceFactory::New();
+    itk::ObjectFactoryBase::RegisterFactory(factory);
+  }
+
+protected:
+  Sentinel1ImageMetadataInterfaceFactory();
+  virtual ~Sentinel1ImageMetadataInterfaceFactory();
+
+private:
+  Sentinel1ImageMetadataInterfaceFactory(const Self &); //purposely not implemented
+  void operator =(const Self&); //purposely not implemented
+
+};
+
+} // end namespace otb
+
+#endif
diff --git a/Modules/Core/Metadata/otb-module.cmake b/Modules/Core/Metadata/otb-module.cmake
index 240e6a3ee1cec76586a97c0078a34861dfb410ee..6e0e51fa4d48d4a1238a7a8de978f6f1a0a4ddc8 100644
--- a/Modules/Core/Metadata/otb-module.cmake
+++ b/Modules/Core/Metadata/otb-module.cmake
@@ -5,7 +5,7 @@ are supported. for instance: Pleiades, SPOT6, TerraSar, and so on).")
 otb_module(OTBMetadata
   DEPENDS
     OTBObjectList
-    OTBBoost
+    OTBBoostAdapters
     OTBITK
     OTBOSSIMAdapters
     OTBCommon
diff --git a/Modules/Core/Metadata/src/CMakeLists.txt b/Modules/Core/Metadata/src/CMakeLists.txt
index 458188d5246599d101d8cfa68384704f8e7929ae..77dad8c9f5ae67af5ba6ed436ab72c0954abf9a9 100644
--- a/Modules/Core/Metadata/src/CMakeLists.txt
+++ b/Modules/Core/Metadata/src/CMakeLists.txt
@@ -1,34 +1,49 @@
 set(OTBMetadata_SRC
+  otbWorldView2ImageMetadataInterfaceFactory.cxx
   otbWorldView2ImageMetadataInterface.cxx
+
+  otbQuickBirdImageMetadataInterfaceFactory.cxx
   otbQuickBirdImageMetadataInterface.cxx
-  otbWorldView2ImageMetadataInterfaceFactory.cxx
-  otbTerraSarImageMetadataInterface.cxx
-  otbImageMetadataInterfaceBase.cxx
+
   otbImageMetadataInterfaceFactory.cxx
-  otbFormosatImageMetadataInterface.cxx
+  otbImageMetadataInterfaceBase.cxx
+
   otbSpotImageMetadataInterfaceFactory.cxx
+  otbSpotImageMetadataInterface.cxx
+
   otbDefaultImageMetadataInterfaceFactory.cxx
   otbSarDefaultImageMetadataInterfaceFactory.cxx
   otbOpticalDefaultImageMetadataInterfaceFactory.cxx
-  otbSpotImageMetadataInterface.cxx
+
   otbFormosatImageMetadataInterfaceFactory.cxx
+  otbFormosatImageMetadataInterface.cxx
+
   otbOpticalImageMetadataInterfaceFactory.cxx
+  otbOpticalImageMetadataInterface.cxx
+
   otbSpot6ImageMetadataInterfaceFactory.cxx
-  otbSarImageMetadataInterfaceFactory.cxx
   otbSpot6ImageMetadataInterface.cxx
+
+  otbIkonosImageMetadataInterfaceFactory.cxx
   otbIkonosImageMetadataInterface.cxx
+
+  otbPleiadesImageMetadataInterfaceFactory.cxx
   otbPleiadesImageMetadataInterface.cxx
-  otbQuickBirdImageMetadataInterfaceFactory.cxx
-  otbOpticalImageMetadataInterface.cxx
-  otbIkonosImageMetadataInterfaceFactory.cxx
+
+  otbSarImageMetadataInterfaceFactory.cxx
   otbSarImageMetadataInterface.cxx
-  otbPleiadesImageMetadataInterfaceFactory.cxx
+
   otbTerraSarImageMetadataInterfaceFactory.cxx
+  otbTerraSarImageMetadataInterface.cxx
+
+  otbSentinel1ImageMetadataInterfaceFactory.cxx
+  otbSentinel1ImageMetadataInterface.cxx
+
   otbNoDataHelper.cxx
   )
 
 add_library(OTBMetadata ${OTBMetadata_SRC})
-target_link_libraries(OTBMetadata 
+target_link_libraries(OTBMetadata
   ${OTBBoost_LIBRARIES}
   ${OTBCommon_LIBRARIES}
   ${OTBOSSIMAdapters_LIBRARIES}
diff --git a/Modules/Core/Metadata/src/otbImageMetadataInterfaceFactory.cxx b/Modules/Core/Metadata/src/otbImageMetadataInterfaceFactory.cxx
index 248a69f7f936040f9c7ebf8f6529b9cc9743dc13..4b554bf6267ff9239d5e2beada80d77a0bae57df 100644
--- a/Modules/Core/Metadata/src/otbImageMetadataInterfaceFactory.cxx
+++ b/Modules/Core/Metadata/src/otbImageMetadataInterfaceFactory.cxx
@@ -32,6 +32,7 @@
 
 // SAR Sensors
 #include "otbTerraSarImageMetadataInterfaceFactory.h"
+#include "otbSentinel1ImageMetadataInterfaceFactory.h"
 
 #include "itkMutexLock.h"
 #include "itkMutexLockHolder.h"
@@ -109,7 +110,9 @@ ImageMetadataInterfaceFactory
       itk::ObjectFactoryBase::RegisterFactory(FormosatImageMetadataInterfaceFactory::New());
       itk::ObjectFactoryBase::RegisterFactory(QuickBirdImageMetadataInterfaceFactory::New());
       itk::ObjectFactoryBase::RegisterFactory(WorldView2ImageMetadataInterfaceFactory::New());
-      itk::ObjectFactoryBase::RegisterFactory( TerraSarImageMetadataInterfaceFactory::New() );
+      itk::ObjectFactoryBase::RegisterFactory(TerraSarImageMetadataInterfaceFactory::New());
+      itk::ObjectFactoryBase::RegisterFactory(Sentinel1ImageMetadataInterfaceFactory::New());
+
       firstTime = false;
       }
     }
diff --git a/Modules/Core/Metadata/src/otbSarImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSarImageMetadataInterface.cxx
index d1a46a96c6deb37dcdd80531bba5ba1ce72c5332..4dc45688d6f3e86a3637a86ae5735456627062f8 100644
--- a/Modules/Core/Metadata/src/otbSarImageMetadataInterface.cxx
+++ b/Modules/Core/Metadata/src/otbSarImageMetadataInterface.cxx
@@ -28,8 +28,90 @@ namespace otb
 SarImageMetadataInterface
 ::SarImageMetadataInterface()
 {
+
 }
 
+const std::string
+SarImageMetadataInterface
+::GetProductType() const
+{
+  const MetaDataDictionaryType& dict = this->GetMetaDataDictionary();
+  if (!this->CanRead())
+    {
+    itkExceptionMacro(<< "Invalid Metadata");
+    }
+
+    ImageKeywordlistType imageKeywordlist;
+
+    if (dict.HasKey(MetaDataKey::OSSIMKeywordlistKey))
+      {
+      itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, imageKeywordlist);
+      }
+
+    if (imageKeywordlist.HasKey("support_data.product_type"))
+      {
+      const std::string product_type = imageKeywordlist.GetMetadataByKey("support_data.product_type");
+      return product_type;
+      }
+    return "";
+}
+
+const std::string
+SarImageMetadataInterface
+::GetAcquisitionMode() const
+{
+  const MetaDataDictionaryType& dict = this->GetMetaDataDictionary();
+  if (!this->CanRead())
+    {
+    itkExceptionMacro(<< "Invalid Metadata");
+    }
+
+    ImageKeywordlistType imageKeywordlist;
+
+    if (dict.HasKey(MetaDataKey::OSSIMKeywordlistKey))
+      {
+      itk::ExposeMetaData<ImageKeywordlistType>(dict, MetaDataKey::OSSIMKeywordlistKey, imageKeywordlist);
+      }
+
+    if (imageKeywordlist.HasKey("support_data.acquisition_mode"))
+      {
+      const std::string acquisition_mode = imageKeywordlist.GetMetadataByKey("support_data.acquisition_mode");
+      return acquisition_mode;
+      }
+    return "";
+}
+
+void
+SarImageMetadataInterface
+::CreateCalibrationLookupData(const short itkNotUsed(t))
+{
+
+}
+
+const SarImageMetadataInterface::LookupDataPointerType
+SarImageMetadataInterface
+::GetCalibrationLookupData(const short type)
+{
+  if (HasCalibrationLookupDataFlag())
+    {
+    CreateCalibrationLookupData(type);
+    }
+
+  return m_SarLut;
+}
+
+bool
+SarImageMetadataInterface
+::HasCalibrationLookupDataFlag() const
+{
+  const ImageKeywordlist imageKeywordlist = this->GetImageKeywordlist();
+  /* checking if the key exist is more than enough */
+  if (imageKeywordlist.HasKey("support_data.calibration_lookup_flag"))
+    {
+    return true;
+    }
+  return false;
+}
 
 SarImageMetadataInterface::RealType
 SarImageMetadataInterface
@@ -63,7 +145,6 @@ SarImageMetadataInterface
   return SarImageMetadataInterface::GetConstantValuePointSet(0.0);
 }
 
-
 SarImageMetadataInterface::PointSetPointer
 SarImageMetadataInterface
 ::GetRadiometricCalibrationAntennaPatternNewGain() const
@@ -106,6 +187,12 @@ SarImageMetadataInterface
   return polynomialDegree;
 }
 
+double
+SarImageMetadataInterface
+::GetRescalingFactor() const
+{
+  return 1.0;
+}
 SarImageMetadataInterface::IndexType
 SarImageMetadataInterface
 ::GetRadiometricCalibrationNoisePolynomialDegree() const
diff --git a/Modules/Core/Metadata/src/otbSarImageMetadataInterfaceFactory.cxx b/Modules/Core/Metadata/src/otbSarImageMetadataInterfaceFactory.cxx
index 8075a2303c4dd83a1aa58e95ef490cb852bb7fe3..0cb27515e7e87d6f06f8c5390162500e6caa4509 100644
--- a/Modules/Core/Metadata/src/otbSarImageMetadataInterfaceFactory.cxx
+++ b/Modules/Core/Metadata/src/otbSarImageMetadataInterfaceFactory.cxx
@@ -22,6 +22,7 @@
 
 // SAR Sensors
 #include "otbTerraSarImageMetadataInterfaceFactory.h"
+#include "otbSentinel1ImageMetadataInterfaceFactory.h"
 
 #include "itkMutexLock.h"
 #include "itkMutexLockHolder.h"
@@ -78,7 +79,8 @@ SarImageMetadataInterfaceFactory
     itk::MutexLockHolder<itk::SimpleMutexLock> mutexHolder(mutex);
     if (firstTime)
       {
-      itk::ObjectFactoryBase::RegisterFactory( TerraSarImageMetadataInterfaceFactory::New() );
+      itk::ObjectFactoryBase::RegisterFactory(TerraSarImageMetadataInterfaceFactory::New());
+      itk::ObjectFactoryBase::RegisterFactory(Sentinel1ImageMetadataInterfaceFactory::New());
       firstTime = false;
       }
     }
diff --git a/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..daac6d7c363cabf02cf7036876653768b23144b3
--- /dev/null
+++ b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx
@@ -0,0 +1,339 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#include "otbSarImageMetadataInterface.h"
+#include "otbSentinel1ImageMetadataInterface.h"
+
+#include "otbMacro.h"
+#include "itkMetaDataObject.h"
+#include "otbImageKeywordlist.h"
+
+//useful constants
+#include <otbMath.h>
+
+namespace otb
+{
+
+Sentinel1ImageMetadataInterface
+::Sentinel1ImageMetadataInterface()
+{
+
+}
+
+bool
+Sentinel1ImageMetadataInterface::CanRead() const
+{
+  std::string sensorID = GetSensorID();
+
+  if (sensorID.find("SENTINEL-1") != std::string::npos)
+    {
+    return true;
+    }
+  else
+    return false;
+}
+
+void
+Sentinel1ImageMetadataInterface
+::CreateCalibrationLookupData(const short type)
+  {
+    bool sigmaLut = false;
+    bool betaLut = false;
+    bool gammaLut = false;
+    bool dnLut = false;
+
+    switch (type)
+      {
+      case SarCalibrationLookupData::BETA:
+      {
+      betaLut = true;
+      }
+      break;
+
+      case SarCalibrationLookupData::GAMMA:
+      {
+      gammaLut = true;
+      }
+      break;
+
+      case SarCalibrationLookupData::DN:
+      {
+      dnLut = true;
+      }
+      break;
+
+      case SarCalibrationLookupData::SIGMA:
+      default:
+        sigmaLut = true;
+        break;
+      }
+
+  const ImageKeywordlistType imageKeywordlist =  this->GetImageKeywordlist();
+
+  const double firstLineTime = Utils::LexicalCast<double>(imageKeywordlist.GetMetadataByKey("calibration.startTime"), "calibration.startTime(double)");
+
+  const double lastLineTime = Utils::LexicalCast<double>(imageKeywordlist.GetMetadataByKey("calibration.stopTime"), "calibration.stopTime(double)");
+
+  const std::string bandPrefix = "Band[0]."; //make && use GetBandPrefix(subSwath, polarisation)
+
+  const int numOfLines = Utils::LexicalCast<int>(imageKeywordlist.GetMetadataByKey(bandPrefix + "number_lines"), bandPrefix + "number_lines(int)");
+
+  const int count = Utils::LexicalCast<int>(imageKeywordlist.GetMetadataByKey("calibration.count"), "calibration.count");
+
+  std::vector<Sentinel1CalibrationStruct> calibrationVectorList(count);
+
+  for(int i = 0; i < count; i++)
+    {
+    Sentinel1CalibrationStruct calibrationVector;
+
+    std::stringstream prefix;
+    prefix << "calibration.calibrationVector[" << i << "].";
+
+    calibrationVector.line = Utils::LexicalCast<int>(imageKeywordlist.GetMetadataByKey(prefix.str() + "line"), prefix.str() + "line");
+
+    calibrationVector.timeMJD =  Utils::LexicalCast<double>(imageKeywordlist.GetMetadataByKey(prefix.str() + "azimuthTime"), prefix.str() + "azimuthTime");
+
+    Utils::ConvertStringToVector(imageKeywordlist.GetMetadataByKey(prefix.str() + "pixel"), calibrationVector.pixels, prefix.str() + "pixel");
+
+    if (sigmaLut) {
+    Utils::ConvertStringToVector(imageKeywordlist.GetMetadataByKey(prefix.str() + "sigmaNought"), calibrationVector.vect, prefix.str() + "sigmaNought");
+      }
+
+    if (betaLut) {
+    Utils::ConvertStringToVector(imageKeywordlist.GetMetadataByKey(prefix.str() + "betaNought"), calibrationVector.vect, prefix.str() + "betaNought");
+    }
+
+    if (gammaLut) {
+    Utils::ConvertStringToVector(imageKeywordlist.GetMetadataByKey(prefix.str() + "gamma"), calibrationVector.vect, prefix.str() + "gamma");
+    }
+
+    if (dnLut) {
+    Utils::ConvertStringToVector(imageKeywordlist.GetMetadataByKey(prefix.str() + "dn"), calibrationVector.vect, prefix.str() + "dn");
+    }
+
+    calibrationVectorList[i] = calibrationVector;
+
+    }
+
+  Sentinel1CalibrationLookupData::Pointer sarLut;
+  sarLut = Sentinel1CalibrationLookupData::New();
+  sarLut->InitParameters(type, firstLineTime, lastLineTime, numOfLines, count, calibrationVectorList);
+  this->SetCalibrationLookupData(sarLut);
+
+
+  }
+
+void
+Sentinel1ImageMetadataInterface
+::ParseDateTime(const char* key, std::vector<int>& dateFields) const
+{
+  if(dateFields.size() < 1 )
+    {
+    //parse from keyword list
+    if (!this->CanRead())
+      {
+      itkExceptionMacro(<< "Invalid Metadata, not a valid product");
+      }
+
+    const ImageKeywordlistType imageKeywordlist  = this->GetImageKeywordlist();
+    if (!imageKeywordlist.HasKey(key))
+      {
+      itkExceptionMacro( << "no key named " << key );
+      }
+
+    const std::string date_time_str = imageKeywordlist.GetMetadataByKey(key);
+    Utils::ConvertStringToVector(date_time_str, dateFields, key, "T:-.");
+    }
+
+}
+
+int
+Sentinel1ImageMetadataInterface::GetYear() const
+{
+  int value = 0;
+  ParseDateTime("support_data.image_date", m_AcquisitionDateFields);
+  if(m_AcquisitionDateFields.size() > 0 )
+    {
+    value = Utils::LexicalCast<int>( m_AcquisitionDateFields[0], "support_data.image_date:year(int)" );
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid year" );
+    }
+  return value;
+}
+
+int
+Sentinel1ImageMetadataInterface::GetMonth() const
+{
+  int value = 0;
+  ParseDateTime("support_data.image_date", m_AcquisitionDateFields);
+  if(m_AcquisitionDateFields.size() > 1 )
+    {
+    value = Utils::LexicalCast<int>( m_AcquisitionDateFields[1], "support_data.image_date:month(int)" );
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid month" );
+    }
+  return value;
+}
+
+int
+Sentinel1ImageMetadataInterface::GetDay() const
+{
+  int value = 0;
+  ParseDateTime("support_data.image_date", m_AcquisitionDateFields);
+  if(m_AcquisitionDateFields.size() > 2 )
+    {
+    value = Utils::LexicalCast<int>( m_AcquisitionDateFields[2], "support_data.image_date:day(int)");
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid day" );
+    }
+  return value;
+}
+
+int
+Sentinel1ImageMetadataInterface::GetHour() const
+{
+  int value = 0;
+  ParseDateTime("support_data.image_date", m_AcquisitionDateFields);
+  if(m_AcquisitionDateFields.size() > 3 )
+    {
+    value = Utils::LexicalCast<int>( m_AcquisitionDateFields[3], "support_data.image_date:hour(int)");
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid hour" );
+    }
+  return value;
+}
+
+int
+Sentinel1ImageMetadataInterface::GetMinute() const
+{
+  int value = 0;
+  ParseDateTime("support_data.image_date", m_AcquisitionDateFields);
+  if(m_AcquisitionDateFields.size() > 4 )
+    {
+    value = Utils::LexicalCast<int>( m_AcquisitionDateFields[4], "support_data.image_date:minute(int)");
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid minute" );
+    }
+  return value;
+}
+
+int
+Sentinel1ImageMetadataInterface::GetProductionYear() const
+{
+  int value = 0;
+  ParseDateTime("support_data.date", m_ProductionDateFields);
+  if(m_ProductionDateFields.size() > 0 )
+    {
+    value = Utils::LexicalCast<int>( m_ProductionDateFields[0], "support_data.date:year(int)" );
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid production year" );
+    }
+  return value;
+
+}
+
+int
+Sentinel1ImageMetadataInterface::GetProductionMonth() const
+{
+  int value = 0;
+  ParseDateTime("support_data.date", m_ProductionDateFields);
+  if(m_ProductionDateFields.size() > 1 )
+    {
+    value = Utils::LexicalCast<int>( m_ProductionDateFields[1], "support_data.date:month(int)" );
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid production month" );
+    }
+  return value;
+}
+
+int
+Sentinel1ImageMetadataInterface::GetProductionDay() const
+{
+  int value = 0;
+  ParseDateTime("support_data.date", m_ProductionDateFields);
+  if(m_ProductionDateFields.size() > 2 )
+    {
+    value = Utils::LexicalCast<int>( m_ProductionDateFields[2], "support_data.date:day(int)" );
+    }
+  else
+    {
+    itkExceptionMacro( << "Invalid production day" );
+    }
+  return value;
+}
+
+double
+Sentinel1ImageMetadataInterface::GetPRF() const
+{
+  double value = 0;
+  const ImageKeywordlistType imageKeywordlist  = this->GetImageKeywordlist();
+  if (!imageKeywordlist.HasKey("support_data.pulse_repetition_frequency"))
+    {
+    return value;
+    }
+
+  value = Utils::LexicalCast<double>( imageKeywordlist.GetMetadataByKey("support_data.pulse_repetition_frequency"),
+                                      "support_data.pulse_repetition_frequency(double)" );
+
+  return value;
+}
+
+
+Sentinel1ImageMetadataInterface::UIntVectorType
+Sentinel1ImageMetadataInterface::GetDefaultDisplay() const
+{
+  UIntVectorType rgb(3);
+  rgb[0] = 0;
+  rgb[1] = 0;
+  rgb[2] = 0;
+  return rgb;
+}
+
+double
+Sentinel1ImageMetadataInterface::GetRSF() const
+{
+  return 0;
+}
+
+double
+Sentinel1ImageMetadataInterface::GetRadarFrequency() const
+{
+  return 0;
+}
+
+double
+Sentinel1ImageMetadataInterface::GetCenterIncidenceAngle() const
+{
+  return 0;
+}
+
+} // end namespace otb
diff --git a/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterfaceFactory.cxx b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterfaceFactory.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..424f825c20ff9e735ab582d44b1519e430374f73
--- /dev/null
+++ b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterfaceFactory.cxx
@@ -0,0 +1,58 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+
+#include <typeinfo>
+#include <cassert>
+
+#include "otbSentinel1ImageMetadataInterfaceFactory.h"
+#include "otbSentinel1ImageMetadataInterface.h"
+
+#include "itkCreateObjectFunction.h"
+#include "itkVersion.h"
+
+namespace otb
+{
+Sentinel1ImageMetadataInterfaceFactory
+::Sentinel1ImageMetadataInterfaceFactory()
+{
+  this->RegisterOverride("SarImageMetadataInterface",
+                         "otbSentinel1ImageMetadataInterface",
+                         "Sentinel1 Metadata Interface",
+                         1,
+                         itk::CreateObjectFunction<Sentinel1ImageMetadataInterface>::New());
+}
+
+Sentinel1ImageMetadataInterfaceFactory
+::~Sentinel1ImageMetadataInterfaceFactory()
+{
+}
+
+const char*
+Sentinel1ImageMetadataInterfaceFactory::GetITKSourceVersion(void) const
+{
+  return ITK_SOURCE_VERSION;
+}
+
+const char*
+Sentinel1ImageMetadataInterfaceFactory::GetDescription() const
+{
+  return "Sentinel1 Metadata Interface Factory, handle Sentinel1 metadata in OTB";
+}
+
+} // end namespace otb
diff --git a/Modules/Core/Metadata/test/CMakeLists.txt b/Modules/Core/Metadata/test/CMakeLists.txt
index b48fbffaef79197293daba9fec698e7fe0581bfb..7cf31ac3f3b85b70acc2b6bcb2d192a147e4532c 100644
--- a/Modules/Core/Metadata/test/CMakeLists.txt
+++ b/Modules/Core/Metadata/test/CMakeLists.txt
@@ -19,10 +19,12 @@ otbSpotImageMetadataInterfaceNew.cxx
 otbQuickBirdImageMetadataInterfaceNew.cxx
 otbIkonosImageMetadataInterfaceNew.cxx
 otbTerraSarImageMetadataInterfaceNew.cxx
+otbSentinel1ImageMetadataInterfaceNew.cxx
 otbWorldView2ImageMetadataInterfaceNew.cxx
 otbDefaultImageMetadataInterface.cxx
 otbImageMetadataInterfaceTest2.cxx
 otbNoDataHelperTest.cxx
+otbSarCalibrationLookupDataTest.cxx
 )
 
 add_executable(otbMetadataTestDriver ${OTBMetadataTests})
@@ -74,6 +76,17 @@ otb_add_test(NAME ioTvSarImageMetadataInterfaceTest_TSX1PANGKALANBUUNUsingHHCosF
   ${TEMP}/ioTvSarImageMetadataInterface_TSX1PANGKALANBUUNUsingHHCosFile.txt
   )
 
+otb_add_test(NAME ioTvImageMetadataInterfaceBaseTest_Sentinel1 COMMAND otbMetadataTestDriver
+  --compare-ascii ${EPSILON_9} ${BASELINE_FILES}/ioTvImageMetadataInterfaceBase_Sentinel1.txt
+  ${TEMP}/ioTvImageMetadataInterfaceBase_Sentinel1.txt
+  otbImageMetadataInterfaceBaseTest
+  LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff}
+  ${TEMP}/ioTvImageMetadataInterfaceBase_Sentinel1.txt
+  )
+
+otb_add_test(NAME ioTuSentinel1ImageMetadataInterfaceNew COMMAND otbMetadataTestDriver
+  otbSentinel1ImageMetadataInterfaceNew )
+
 otb_add_test(NAME ioTuDefaultImageMetadataInterfaceFactoryNew COMMAND otbMetadataTestDriver
   otbDefaultImageMetadataInterfaceFactoryNew )
 
@@ -353,6 +366,13 @@ foreach( current_file ${GenericTestSPOT6_DATA_INPUTS} )
     )
 endforeach()
 
-
 otb_add_test(NAME coreMetaDataNoDataHelperTest COMMAND otbMetadataTestDriver
   otbNoDataHelperTest)
+
+otb_add_test(NAME ioTvSarCalibrationLookupDataTest_SENTINEL1 COMMAND otbMetadataTestDriver
+  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvSarCalibrationLookupDataTest_SENTINEL1.txt
+  ${TEMP}/ioTvSarCalibrationLookupDataTest_SENTINEL1.txt
+  otbSarCalibrationLookupDataTest
+  ${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_300_300.tif?&geom=${INPUTDATA}/SENTINEL1_SLC_S6_1S_extract_300_300.geom
+  ${TEMP}/ioTvSarCalibrationLookupDataTest_SENTINEL1.txt
+  )
\ No newline at end of file
diff --git a/Modules/Core/Metadata/test/otbMetadataTestDriver.cxx b/Modules/Core/Metadata/test/otbMetadataTestDriver.cxx
index cd06f2f46e9f46fb412b1f30a278374070ac7405..9b48c72a5bb07d49db1b90cf2e8bc0da4e95aa5e 100644
--- a/Modules/Core/Metadata/test/otbMetadataTestDriver.cxx
+++ b/Modules/Core/Metadata/test/otbMetadataTestDriver.cxx
@@ -18,8 +18,10 @@ void RegisterTests()
   REGISTER_TEST(otbQuickBirdImageMetadataInterfaceNew);
   REGISTER_TEST(otbIkonosImageMetadataInterfaceNew);
   REGISTER_TEST(otbTerraSarImageMetadataInterfaceNew);
+  REGISTER_TEST(otbSentinel1ImageMetadataInterfaceNew);
   REGISTER_TEST(otbWorldView2ImageMetadataInterfaceNew);
   REGISTER_TEST(otbDefaultImageMetadataInterface);
   REGISTER_TEST(otbImageMetadataInterfaceTest2);
   REGISTER_TEST(otbNoDataHelperTest);
+  REGISTER_TEST(otbSarCalibrationLookupDataTest);
 }
diff --git a/Modules/Core/Metadata/test/otbSarCalibrationLookupDataTest.cxx b/Modules/Core/Metadata/test/otbSarCalibrationLookupDataTest.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..5d323c95d9f81644e7256057177b01b4e3e25875
--- /dev/null
+++ b/Modules/Core/Metadata/test/otbSarCalibrationLookupDataTest.cxx
@@ -0,0 +1,75 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+
+#include <iostream>
+#include "itkMacro.h"
+#include "otbImage.h"
+#include "otbImageFileReader.h"
+#include "otbSarImageMetadataInterfaceFactory.h"
+
+int otbSarCalibrationLookupDataTest(int argc, char* argv[])
+{
+  typedef double                                  RealType;
+  typedef otb::SarImageMetadataInterface             ImageMetadataInterfaceType;
+  typedef otb::SarCalibrationLookupData              LookupDataType;
+  typedef otb::Image<double,  2>                     InputImageType;
+  typedef otb::ImageFileReader<InputImageType>       ImageReaderType;
+
+  if (argc < 3 )
+    {
+    std::cerr << "Usage: otbSarCalibationLookupDataTest /path/to/input/file /path/to/output/file  !"<< std::endl;
+    return EXIT_FAILURE;
+    }
+  ImageReaderType::Pointer reader = ImageReaderType::New();
+  reader->SetFileName(argv[1]);
+  reader->UpdateOutputInformation();
+
+  const char *  outFileName = argv[2];
+  std::ofstream outfile;
+  outfile.open(outFileName);
+
+  ImageMetadataInterfaceType::Pointer imageMetadataInterface =
+    otb::SarImageMetadataInterfaceFactory::CreateIMI( reader->GetOutput()->GetMetaDataDictionary() );
+
+  if (!imageMetadataInterface.IsNotNull())
+    {
+    std::cerr << "cannot create a otb::SarImageMetadataInterface for input image." << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  const std::string sensorId = imageMetadataInterface->GetSensorID();
+
+  outfile << sensorId << std::endl;
+
+  LookupDataType::Pointer lookupDataObj = imageMetadataInterface->GetCalibrationLookupData(0);
+
+  if (!lookupDataObj.IsNotNull())
+    {
+    std::cerr << "lookupDataObj is Null"<< std::endl;
+    return EXIT_FAILURE;
+    }
+
+  RealType lutVal = static_cast<RealType>(lookupDataObj->GetValue(10,19));
+
+  outfile << imageMetadataInterface->HasCalibrationLookupDataFlag() << std::endl;
+  outfile << lutVal << std::endl;
+
+  return EXIT_SUCCESS;
+
+}
diff --git a/Modules/Core/Metadata/test/otbSentinel1ImageMetadataInterfaceNew.cxx b/Modules/Core/Metadata/test/otbSentinel1ImageMetadataInterfaceNew.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c0a805ab1832a490c49fbbf2c1732c239efdbe8b
--- /dev/null
+++ b/Modules/Core/Metadata/test/otbSentinel1ImageMetadataInterfaceNew.cxx
@@ -0,0 +1,32 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+
+
+#include "itkMacro.h"
+#include <iostream>
+#include "otbSentinel1ImageMetadataInterface.h"
+
+int otbSentinel1ImageMetadataInterfaceNew(int itkNotUsed(argc), char * itkNotUsed(argv) [])
+{
+  otb::Sentinel1ImageMetadataInterface::Pointer object = otb::Sentinel1ImageMetadataInterface::New();
+
+  std::cout << object << std::endl;
+
+  return EXIT_SUCCESS;
+}
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp
index 0da1b33a18dd02fcbc479cfdea9fca1da468288e..dd59bd2d8d9d7db8cad0d02cded1f5a12bab636f 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.cpp
@@ -30,7 +30,7 @@
 #include <ossim/base/ossimNotifyContext.h>
 #include "ossimTileMapModel.h"
 #include "ossimSpot6Model.h"
-
+#include "ossimSentinel1Model.h"
 //***
 // Define Trace flags for use within this file:
 //***
@@ -45,15 +45,16 @@ static ossimTrace traceDebug = ossimTrace("ossimPluginProjectionFactory:debug");
 namespace ossimplugins
 {
 
+   bool ossimPluginProjectionFactory::initalized_;
 
-ossimPluginProjectionFactory* ossimPluginProjectionFactory::instance()
-{
-   static ossimPluginProjectionFactory* factoryInstance =
-      new ossimPluginProjectionFactory();
+   ossimPluginProjectionFactory ossimPluginProjectionFactory::factoryInstance;
+
+   ossimPluginProjectionFactory* ossimPluginProjectionFactory::instance()
+   {
+      return initalized_ ? &factoryInstance : 0;
+
+   }
 
-   return factoryInstance;
-}
-   
 ossimProjection* ossimPluginProjectionFactory::createProjection(
    const ossimFilename& filename, ossim_uint32 /*entryIdx*/)const
 {
@@ -61,14 +62,35 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
    ossimRefPtr<ossimProjection> projection = 0;
    //traceDebug.setTraceFlag(true);
 
-   if(traceDebug())
+   // Sentinel1
+   if ( !projection )
    {
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimRadarSat2Model" << std::endl;
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimSentinel1Model" << std::endl;
+      }
+
+      ossimRefPtr<ossimSentinel1Model> model = new ossimSentinel1Model();
+      if ( model->open(filename) )
+      {
+         projection = model.get();
+      }
+      else
+      {
+         model = 0;
+      }
    }
 
    if ( !projection )
    {
+
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimRadarSat2Model" << std::endl;
+      }
+
       ossimRefPtr<ossimRadarSat2Model> model = new ossimRadarSat2Model();
       if ( model->open(filename) )
       {
@@ -84,16 +106,16 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
          model = 0;
       }
    }
-   
-   if(traceDebug())
-   {
-      ossimNotify(ossimNotifyLevel_DEBUG)
-             << MODULE << " DEBUG: testing ossimPleiadesModel" << std::endl;
-   }
 
    // Pleiades
    if ( !projection )
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimPleiadesModel" << std::endl;
+      }
+
       ossimRefPtr<ossimPleiadesModel> model = new ossimPleiadesModel();
       if ( model->open(filename) )
       {
@@ -105,14 +127,14 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
       }
    }
 
-   if(traceDebug())
-   	{
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimTerraSarModel" << std::endl;
-    }
-
    if ( !projection )
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimTerraSarModel" << std::endl;
+      }
+
       ossimRefPtr<ossimTerraSarModel> model = new ossimTerraSarModel();
 
      if ( model->open(filename) )
@@ -130,14 +152,15 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
       }
    }
 
-   if(traceDebug())
-   {
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimErsSarModel" << std::endl;
-   }
 
+   // ErsSar
    if ( !projection )
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimErsSarModel" << std::endl;
+      }
       ossimRefPtr<ossimErsSarModel> model = new ossimErsSarModel();
       if ( model->open(filename) )
       {
@@ -149,14 +172,14 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
       }
    }
 
-   if(traceDebug())
-   {
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimEnvisatSarModel" << std::endl;
-   }
-
    if (!projection)
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimEnvisatSarModel" << std::endl;
+      }
+
      ossimRefPtr<ossimEnvisatAsarModel> model = new ossimEnvisatAsarModel();
      if (model->open(filename))
      {
@@ -168,14 +191,14 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
      }
    }
 
-   if(traceDebug())
+   if (!projection)
    {
-    	ossimNotify(ossimNotifyLevel_DEBUG)
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
         	   << MODULE << " DEBUG: testing ossimRadarSatModel" << std::endl;
-   }
+      }
 
-   if (!projection)
-   {
      ossimRefPtr<ossimRadarSatModel> model = new ossimRadarSatModel();
      if (model->open(filename))
      {
@@ -187,14 +210,14 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
      }
    }
 
-   if(traceDebug())
-   {
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimAlosPalsarModel" << std::endl;
-   }
-
    if (!projection)
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimAlosPalsarModel" << std::endl;
+      }
+
      ossimRefPtr<ossimAlosPalsarModel> model = new ossimAlosPalsarModel();
      if (model->open(filename))
      {
@@ -206,47 +229,52 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
      }
    }
 
-   if(traceDebug())
-   	{
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimFormosatModel" << std::endl;
-    }
-
-   ossimFilename formosatTest = filename;
-   formosatTest = formosatTest.setExtension("geom");
-   if(!formosatTest.exists())
+   if (!projection)
    {
-      formosatTest = filename.path();
-      formosatTest = formosatTest.dirCat(ossimFilename("METADATA.DIM"));
-      if (formosatTest.exists() == false)
+
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimFormosatModel" << std::endl;
+      }
+
+      ossimFilename formosatTest = filename;
+      formosatTest = formosatTest.setExtension("geom");
+      if(!formosatTest.exists())
       {
          formosatTest = filename.path();
-         formosatTest = formosatTest.dirCat(ossimFilename("metadata.dim"));
+         formosatTest = formosatTest.dirCat(ossimFilename("METADATA.DIM"));
+         if (formosatTest.exists() == false)
+         {
+            formosatTest = filename.path();
+            formosatTest = formosatTest.dirCat(ossimFilename("metadata.dim"));
+         }
       }
-   }
-   if(formosatTest.exists())
-   {
-      ossimRefPtr<ossimFormosatDimapSupportData> meta =
-         new ossimFormosatDimapSupportData;
-      if(meta->loadXmlFile(formosatTest))
+      if(formosatTest.exists())
       {
-   		 ossimRefPtr<ossimFormosatModel> model = new ossimFormosatModel(meta.get());
-         if(!model->getErrorStatus())
+         ossimRefPtr<ossimFormosatDimapSupportData> meta =
+            new ossimFormosatDimapSupportData;
+         if(meta->loadXmlFile(formosatTest))
          {
-            projection = model.get();
+            ossimRefPtr<ossimFormosatModel> model = new ossimFormosatModel(meta.get());
+            if(!model->getErrorStatus())
+            {
+               projection = model.get();
+            }
+            model = 0;
          }
-         model = 0;
       }
    }
 
-   if(traceDebug())
-   {
-    	ossimNotify(ossimNotifyLevel_DEBUG)
-        	   << MODULE << " DEBUG: testing ossimTileMapModel" << std::endl;
-   }
 
    if (!projection)
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimTileMapModel" << std::endl;
+      }
+
      ossimRefPtr<ossimTileMapModel> model = new ossimTileMapModel();
      if (model->open(filename))
      {
@@ -258,19 +286,20 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
      }
    }
 
-   if(traceDebug())
-   {
-      ossimNotify(ossimNotifyLevel_DEBUG)
-             << MODULE << " DEBUG: testing ossimSpot6Model" << std::endl;
-   }
 
    // Spot6
    if ( !projection )
    {
+      if(traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG)
+            << MODULE << " DEBUG: testing ossimSpot6Model" << std::endl;
+      }
+
       ossimRefPtr<ossimSpot6Model> model = new ossimSpot6Model();
       if ( model->open(filename) )
       {
-         projection = model.get(); 
+         projection = model.get();
       }
       else
       {
@@ -278,6 +307,7 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
       }
    }
 
+
    //***
    // ADD_MODEL: (Please leave this comment for the next programmer)
    //***
@@ -315,10 +345,10 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
         	   << MODULE << " DEBUG: Entering ...." << std::endl;
    }
 
-   //   else if (name == STATIC_TYPE_NAME(ossimCosmoSkymedModel))
-   //    {
-   //      return new ossimCosmoSkymedModel;
-   //   }
+   // else if (name == STATIC_TYPE_NAME(ossimCosmoSkymedModel))
+   // {
+   //    return new ossimCosmoSkymedModel;
+   // }
    if (name == STATIC_TYPE_NAME(ossimRadarSat2Model))
    {
       return new ossimRadarSat2Model();
@@ -359,6 +389,11 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
    {
      return new ossimSpot6Model;
    }
+   else if (name == STATIC_TYPE_NAME(ossimSentinel1Model))
+   {
+     return new ossimSentinel1Model;
+   }
+
 
    //***
    // ADD_MODEL: (Please leave this comment for the next programmer)
@@ -474,6 +509,15 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
          }
       }
 
+      else if (type == "ossimSentinel1Model")
+      {
+         result = new ossimSentinel1Model();
+         if ( !result->loadState(kwl, prefix) )
+         {
+            result = 0;
+         }
+      }
+
    //***
    // ADD_MODEL: (Please leave this comment for the next programmer)
    //***
@@ -493,7 +537,7 @@ ossimProjection* ossimPluginProjectionFactory::createProjection(
     	ossimNotify(ossimNotifyLevel_DEBUG)
         	   << MODULE << " DEBUG: End ...." << std::endl;
    }
-   
+
    return result.release();
 }
 
@@ -515,13 +559,14 @@ void ossimPluginProjectionFactory::getTypeNameList(std::vector<ossimString>& typ
    typeList.push_back(STATIC_TYPE_NAME(ossimRadarSatModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimRadarSat2Model));
    typeList.push_back(STATIC_TYPE_NAME(ossimTerraSarModel));
-   //   result.push_back(STATIC_TYPE_NAME(ossimCosmoSkymedModel));
+//   typeList.push_back(STATIC_TYPE_NAME(ossimCosmoSkymedModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimEnvisatAsarModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimErsSarModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimAlosPalsarModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimFormosatModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimTileMapModel));
    typeList.push_back(STATIC_TYPE_NAME(ossimPleiadesModel));
+   typeList.push_back(STATIC_TYPE_NAME(ossimSentinel1Model));
    typeList.push_back(STATIC_TYPE_NAME(ossimSpot6Model));
 
    //***
@@ -534,9 +579,9 @@ bool ossimPluginProjectionFactory::isTileMap(const ossimFilename& filename)const
 {
   ossimFilename temp(filename);
   temp.downcase();
-  
+
   ossimString os = temp.beforePos(4);
-  
+
   if(temp.ext()=="otb")
   {
     return true;
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.h
index 5205d76900b981971e903c497f4a0ef70ecd7c73..f245079a9735c077e6231e51d507fa550269172f 100644
--- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.h
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimPluginProjectionFactory.h
@@ -52,8 +52,29 @@ public:
 
    virtual void getTypeNameList(std::vector<ossimString>& typeList)const;
 protected:
-   ossimPluginProjectionFactory(){}
+
    bool isTileMap(const ossimFilename& filename) const;
+
+private:
+   ossimPluginProjectionFactory()
+   {
+      initalized_ = true;
+   }
+
+   ~ossimPluginProjectionFactory()
+   {
+      initalized_ = false;
+   }
+
+   static bool initalized_;
+
+   static ossimPluginProjectionFactory factoryInstance;
+
+   ossimPluginProjectionFactory(ossimPluginProjectionFactory const&);              // Don't
+                                                                                   // Implement
+
+   void operator=(ossimPluginProjectionFactory const&); // Don't implement
+
 };
 }
 
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..80d85d15606f910640f8863dd5b0ff31871b9970
--- /dev/null
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp
@@ -0,0 +1,542 @@
+#include "ossimSentinel1Model.h"
+
+namespace ossimplugins
+{
+
+// Define Trace flags for use within this file:
+   static ossimTrace traceExec  ("ossimSentinel1Model:exec");
+   static ossimTrace traceDebug ("ossimSentinel1Model:debug");
+
+   RTTI_DEF1(ossimSentinel1Model, "ossimSentinel1Model", ossimSarModel);
+
+//*************************************************************************************************
+// Constructor
+//*************************************************************************************************
+   ossimSentinel1Model::ossimSentinel1Model()
+      : ossimSarModel()
+   {
+      theManifestDoc = new ossimXmlDocument();
+      theProduct = new ossimSentinel1ProductDoc();
+      this->clearFields();
+
+   }
+
+    void ossimSentinel1Model::clearFields()
+    {
+       theOCN = false;
+       theSLC = false;
+       theManifestKwl.clear();
+       theManifestFile = ossimFilename::NIL;
+       theProductXmlFile = ossimFilename::NIL;
+       theProduct->clearFields();
+
+    }
+
+
+//*************************************************************************************************
+// Constructor
+//*************************************************************************************************
+   ossimSentinel1Model::ossimSentinel1Model(const ossimSentinel1Model& rhs)
+      :ossimSarModel(rhs)
+   {
+
+   }
+
+//*************************************************************************************************
+// Destructor
+//*************************************************************************************************
+   ossimSentinel1Model::~ossimSentinel1Model()
+   {
+      theProduct = 0;
+      if (traceExec())  ossimNotify(ossimNotifyLevel_DEBUG) << "DEBUG DESTRUCTOR: ~ossimSentinel1Model(): entering..." << std::endl;
+   }
+
+//*************************************************************************************************
+// Infamous DUP
+//*************************************************************************************************
+   ossimObject* ossimSentinel1Model::dup() const
+   {
+      return new ossimSentinel1Model(*this);
+   }
+
+//*************************************************************************************************
+// Print
+//*************************************************************************************************
+   std::ostream& ossimSentinel1Model::print(std::ostream& out) const
+   {
+      // Capture stream flags since we are going to mess with them.
+      std::ios_base::fmtflags f = out.flags();
+
+      out << "\nDump of ossimSentinel1Model at address " << (hex) << this
+          << (dec)
+          << "\n------------------------------------------------"
+          << "\n  theImageID            = " << theImageID
+          << "\n  theImageSize          = " << theImageSize
+
+          << "\n------------------------------------------------"
+          << "\n  " << endl;
+
+      // Set the flags back.
+      out.flags(f);
+      return ossimSarModel::print(out);
+
+   }
+
+//*************************************************************************************************
+// Save State
+//*************************************************************************************************
+   bool ossimSentinel1Model::saveState(ossimKeywordlist& kwl,
+                                      const char* prefix) const
+   {
+
+      kwl.add(prefix,
+              ossimKeywordNames::TYPE_KW,
+              "ossimSentinel1Model",
+              true);
+
+      kwl.add("support_data.",
+              "calibration_lookup_flag",
+              "true",
+              true);
+
+      kwl.addList(theManifestKwl, true);
+
+         if(theProduct.get())
+         {
+            kwl.addList(theProduct->getProductKwl(), true);
+            //   theProduct->saveState(kwl, prefix);
+         }
+         ossimSarModel::saveState(kwl, prefix);
+         return true;
+   }
+
+
+//*************************************************************************************************
+// Load State
+//*************************************************************************************************
+   bool ossimSentinel1Model::loadState(const ossimKeywordlist& kwl,
+                                      const char* prefix)
+   {
+      //theManifestKwl.addList(kwl, true);
+
+      ossimSarModel::loadState(kwl, prefix);
+      return true;
+   }
+
+   bool ossimSentinel1Model::findSafeManifest(const ossimFilename& file, ossimFilename& manifestFile)
+   {
+      manifestFile = ossimFilename(file.path().path() + "/manifest.safe");
+
+      if(!manifestFile.exists())
+      {
+         if (traceDebug())
+         {
+            ossimNotify(ossimNotifyLevel_DEBUG) << "manifest.safe " << manifestFile << " doesn't exist ...\n";
+         }
+         return false;
+      }
+      return true;
+   }
+
+   bool ossimSentinel1Model::open(const ossimFilename& file)
+   {
+
+      static const char MODULE[] = "ossimplugins::ossimSentinel1Model::open";
+      //traceDebug.setTraceFlag(true);
+
+      if (traceDebug())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << MODULE << " entered...\n";
+      }
+
+      bool result = false;
+
+      if ( !file.exists() || (file.ext().downcase() != "tiff") )
+      {
+         return false;
+      }
+      else
+      {
+         theGSD.makeNan();
+
+         ossimFilename safeFile;
+         bool foundManifestFile = findSafeManifest(file, safeFile);
+         while (foundManifestFile)
+         {
+            if(theManifestDoc.get())
+            {
+               if( !theManifestDoc->openFile(safeFile))
+               {
+                  std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+                  break;
+               }
+            }
+            else
+            {
+               ossimNotify(ossimNotifyLevel_DEBUG) << MODULE << " theManifestDoc..\n";
+               break;
+            }
+
+            if ( !this->isSentinel1(safeFile))
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            ossimString productFile;
+            if ( !this->getAnnotationFileLocation(safeFile, "^product"))
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            // Set the image ID to the scene ID.
+            if ( !this->getImageId( theImageID ) )
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            if ( !this->standAloneProductInformation( ) )
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            // Set the sensor ID to the mission ID.
+            if ( !this->initSensorID( theSensorID ) )
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            if ( !this->readProduct( safeFile ) )
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            if ( !this->initImageSize( theImageSize ) )
+             {
+                std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+                break;
+             }
+
+            theImageClipRect = ossimDrect( 0, 0, theImageSize.x-1, theImageSize.y-1 );
+            theSubImageOffset.x = 0.0;
+            theSubImageOffset.y = 0.0;
+
+            if ( !this->initGsd( theGSD ) )
+             {
+                std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+                break;
+             }
+
+            theMeanGSD = (theGSD.x + theGSD.y)/2.0;
+
+            if ( !this->initSRGR( ) )
+            {
+               std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+               break;
+            }
+
+            // if ( !theSafeManifest->initPlatformPosition( ) )
+            // {
+            //    break;
+            // }
+            // else
+            // {
+            //    std::cerr << MODULE << "error at line:" << __LINE__ << std::endl;
+            // }
+
+
+            return true;
+         }
+
+//    // If we broke out of the while, something happened...
+         return false;
+      }
+
+   }
+
+
+   bool ossimSentinel1Model::getImageId( ossimString& s) const
+   {
+      ossimString xpath;
+      xpath = "/xfdu:XFDU/metadataSection/metadataObject/metadataWrap/xmlData/s1sarl1:standAloneProductInformation/s1sarl1:missionDataTakeID";
+      return ossim::getPath(xpath, theManifestDoc.get(), s);
+   }
+
+   bool ossimSentinel1Model::initSensorID(ossimString& s)
+   {
+      const ossimRefPtr<ossimXmlNode> safePlatform = theManifestDoc->getRoot()->findFirstNode("metadataSection/metadataObject/metadataWrap/xmlData/safe:platform");
+      ossimString familyName, instrumentId;
+      bool ret1 = safePlatform->getChildTextValue(familyName, "safe:familyName");
+      bool ret2 = safePlatform->getChildTextValue(instrumentId, "safe:number");
+
+      theManifestKwl.add("support_data.",
+                     "instrument",
+                      "S1" + instrumentId,
+                      true);
+
+      s = familyName + instrumentId;
+      return (ret1 && ret2);
+   }
+
+   bool ossimSentinel1Model::getAnnotationFileLocation(const ossimFilename &manifestFile, const char* pattern)
+   {
+
+      static const char MODULE[] = "ossimSentinel1SafeManifest::getAnnotationFileLocation";
+      //traceDebug.setTraceFlag(true);
+      const ossimString prefix = "support_data.";
+      const ossimString xpath =  "/xfdu:XFDU/dataObjectSection/dataObject";
+
+      vector<ossimRefPtr<ossimXmlNode> > xml_nodes;
+
+      theManifestDoc->findNodes(xpath, xml_nodes);
+
+      ossimRefPtr<ossimXmlNode> dataObjectNode = xml_nodes[0];
+      ossimString dataObjectId;
+      dataObjectNode->getAttributeValue(dataObjectId , "ID");
+
+      if ( dataObjectId.match(pattern) )
+      {
+         ossim::getPath(xpath +  "/byteStream/fileLocation", theManifestDoc.get(), theProductXmlFile);
+         xml_nodes.clear();
+         theManifestDoc->findNodes(xpath +  "/byteStream/fileLocation", xml_nodes);
+         if(xml_nodes.size() < 1 )
+         {
+            std::cerr << "error :" << __LINE__ << std::endl;
+            return  false;
+         }
+         xml_nodes[0]->getAttributeValue(theProductXmlFile , "href");
+         theProductXmlFile.setPath(manifestFile.path() + "/annotation");
+
+      }
+      return true;
+   }
+
+
+   bool ossimSentinel1Model::standAloneProductInformation()
+   {
+      static const char MODULE[] = "ossimSentinel1ProductDoc::parseSafe";
+
+      const ossimString prefix = "support_data.";
+
+      const ossimRefPtr<ossimXmlNode> safeProcessing = theManifestDoc->getRoot()->findFirstNode("metadataSection/metadataObject/metadataWrap/xmlData/safe:processing");
+      const ossimRefPtr<ossimXmlNode> facility = safeProcessing->findFirstNode("safe:facility");
+      const ossimRefPtr<ossimXmlNode> software = facility->findFirstNode("safe:software");
+      const ossimString org = facility->getAttributeValue("organisation");
+      const ossimString name = software->getAttributeValue("name");
+      const ossimString version = software->getAttributeValue("version");
+
+      theManifestKwl.add(prefix,
+                      "Processing_system_identifier",
+                      org + " " + name + " " + version,
+                      true);
+
+      theManifestKwl.add(prefix,
+                      ossimKeywordNames::DATE_KW,
+                      safeProcessing->getAttributeValue("start"),
+                      true);
+
+      const ossimRefPtr<ossimXmlNode> acquisitionPeriod = theManifestDoc->getRoot()->findFirstNode("metadataSection/metadataObject/metadataWrap/xmlData/safe:acquisitionPeriod");
+      ossimString acqStartTime = acquisitionPeriod->getChildTextValue("safe:startTime");
+
+      theManifestKwl.add(prefix,
+                      "first_line_time",
+                      acqStartTime,
+                      true);
+
+      theManifestKwl.add(prefix,
+                      "last_line_time",
+                      acquisitionPeriod->getChildTextValue("safe:stopTime"),
+                      true);
+      //RK
+      theManifestKwl.add(prefix,
+                      ossimKeywordNames::IMAGE_DATE_KW,
+                      acqStartTime,
+                      true);
+
+      const ossimRefPtr<ossimXmlNode> instrumentNode =
+         theManifestDoc->getRoot()->findFirstNode("metadataSection/metadataObject/metadataWrap/xmlData/safe:platform/safe:instrument");
+      ossimString swath =  instrumentNode->getChildTextValue("s1sarl1:swath");
+      ossimString acquisition_mode =  instrumentNode->getChildTextValue("s1sarl1:mode");
+
+      if( acquisition_mode.empty())
+      {
+         ossimRefPtr<ossimXmlNode>  instrumentModeNode =  instrumentNode->findFirstNode("safe:extension/s1sarl1:instrumentMode");
+         if(instrumentModeNode.get())
+         {
+            acquisition_mode = instrumentModeNode->getChildTextValue("s1sarl1:mode");
+            swath = instrumentModeNode->getChildTextValue("s1sarl1:swath");
+         }
+      }
+
+      theManifestKwl.add(prefix,
+                      "acquisition_mode",
+                      acquisition_mode,
+                      true);
+
+      theManifestKwl.add(prefix,
+                      "swath",
+                      swath,
+                      true);
+
+      if (acquisition_mode == "IW" || acquisition_mode == "EW")
+         theProduct->setTOPSAR(true);
+
+      const ossimRefPtr<ossimXmlNode> orbitReference =
+         theManifestDoc->getRoot()->findFirstNode("metadataSection/metadataObject/metadataWrap/xmlData/safe:orbitReference");
+
+      std::vector<ossimRefPtr<ossimXmlNode> > orbitNumberNodes;
+      const ossimString orbitReference_xpath = "/xfdu:XFDU/metadataSection/metadataObject/metadataWrap/xmlData/safe:orbitReference";
+         theManifestDoc->findNodes(orbitReference_xpath + "/safe:orbitNumber", orbitNumberNodes);
+
+      std::vector<ossimRefPtr<ossimXmlNode> >::const_iterator it = orbitNumberNodes.begin();
+      while( it != orbitNumberNodes.end())
+      {
+         const ossimRefPtr<ossimXmlAttribute> attribute =    (*it)->findAttribute("type");
+         if( attribute.get() )
+         {
+            if( attribute->getValue() == "start" )
+            {
+            theManifestKwl.add(prefix, "abs_orbit", (*it)->getText(), true);
+            break;
+            }
+         }
+         ++it;
+      }
+
+      orbitNumberNodes.clear();
+      theManifestDoc->findNodes(orbitReference_xpath + "/safe:relativeOrbitNumber", orbitNumberNodes);
+
+      std::vector<ossimRefPtr<ossimXmlNode> >::const_iterator it2 = orbitNumberNodes.begin();
+      while( it2 != orbitNumberNodes.end())
+      {
+         const ossimRefPtr<ossimXmlAttribute> attribute =    (*it2)->findAttribute("start");
+         if( attribute.get() )
+         {
+            if( attribute->getValue() == "start" )
+            {
+               theManifestKwl.add(prefix, "rel_orbit", (*it2)->getText(), true);
+               break;
+            }
+         }
+         ++it2;
+      }
+
+      theManifestKwl.add(prefix, "orbit_cycle", orbitReference->getChildTextValue("safe:cycleNumber"), true);
+
+      ossimString orbit_pass = "";
+      orbit_pass = orbitReference->getChildTextValue("s1:pass");
+
+      if( orbit_pass.empty() )
+      {
+         orbit_pass = orbitReference->getChildTextValue("safe:extension/s1:orbitProperties/s1:pass");
+      }
+
+      theManifestKwl.add(prefix,
+                         "orbit_pass",
+                         orbit_pass,
+                         true);
+
+      ossimString productType = "unknown";
+      const ossimRefPtr<ossimXmlNode> standAloneProductInformation =
+         theManifestDoc->getRoot()->findFirstNode("metadataSection/metadataObject/metadataWrap/xmlData/s1sarl1:standAloneProductInformation");
+
+      if (theOCN)
+      {
+         productType = "OCN";
+      }
+      else
+      {
+         if (standAloneProductInformation.get())
+            productType  = standAloneProductInformation->getChildTextValue("s1sarl1:productType");
+      }
+
+      theManifestKwl.add(prefix,
+                      "product_type",
+                      productType,
+                      true);
+
+      if( productType.contains("SLC" ) )
+      {
+         //ossimKeywordNames::PIXEL_TYPE_KW;  RK
+         theManifestKwl.add("sample_type", "COMPLEX",  true);
+         theProduct->setSLC(true);
+
+      }
+      else
+      {
+         theManifestKwl.add("sample_type", "DETECTED",  true);
+         theManifestKwl.add(prefix, "srgr_flag", "true",  true);
+      }
+
+      return true;
+   }
+
+   bool ossimSentinel1Model::isSentinel1(const ossimFilename &manifestFile )
+   {
+      theOCN = isLevel2(manifestFile);
+      if( isLevel1(manifestFile) || theOCN  || isLevel0(manifestFile))
+         return true;
+      else
+         return false;
+   }
+
+   bool ossimSentinel1Model::isLevel1(const ossimFilename& file)
+   {
+      bool productXmlCheck = checkDirectory(file, "annotation", ".xml");
+
+      return productXmlCheck && checkDirectory(file, "measurement", ".tiff");
+   }
+
+   bool ossimSentinel1Model::isLevel2(const ossimFilename& file)
+   {
+
+      return checkDirectory(file, "measurement",".nc");
+   }
+
+   bool ossimSentinel1Model::isLevel0(const ossimFilename& file)
+   {
+      return checkDirectory(file, "measurement",".dat");
+   }
+
+   bool ossimSentinel1Model::checkDirectory(const ossimFilename& file, const char* d, const char* ext)
+   {
+      //check dir is valid first
+      ossimDirectory dir = ossimDirectory(file.path() + "/" + d + "/");
+      std::vector<ossimFilename> result;
+      dir.findAllFilesThatMatch(result, ext);
+      if ( result.size() < 1 )
+      {
+         if (traceExec())
+         {
+            ossimNotify(ossimNotifyLevel_FATAL)
+               << " DEBUG:" << " checkDirectory failed for: " << file.path()   << "/" << d << " with ext ="<< ext << std::endl;
+         }
+         return false;
+      }
+
+      return true;
+   }
+
+   bool ossimSentinel1Model::readProduct(const ossimFilename &manifestFile )
+   {
+      theProduct->setMetadataDirectory( manifestFile.path() );
+      bool ret = theProduct->readProductMetadata( );
+      if ( ret )
+      {
+         theProduct->readCalibrationMetadata();
+         theProduct->readNoiseMetadata();
+      }
+      else
+      {
+         ossimNotify(ossimNotifyLevel_FATAL) << " theProduct->readProductMetadata() failed" << std::endl;
+      }
+
+      return true;
+   }
+
+} //end namespace
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.h
new file mode 100644
index 0000000000000000000000000000000000000000..ccfa6c4ed8289edbc583caa78081e4fc41745a01
--- /dev/null
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.h
@@ -0,0 +1,159 @@
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL-2
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#ifndef ossimSentinel1Model_HEADER
+#define ossimSentinel1Model_HEADER
+
+#include <ossim/base/ossimCommon.h>
+#include <ossim/base/ossimFilename.h>
+#include <ossim/base/ossimDirectory.h>
+#include <ossim/base/ossimKeywordNames.h>
+#include <ossim/base/ossimNotify.h>
+#include <ossim/base/ossimRefPtr.h>
+#include <ossim/base/ossimString.h>
+#include <ossim/base/ossimTrace.h>
+#include <ossim/base/ossimXmlDocument.h>
+#include <ossim/base/ossimXmlNode.h>
+
+//#include <ossim/projection/ossimSensorModel.h>
+//#include <ossim/projection/ossimCoarseGridModel.h>
+#include <ossim/projection/ossimSarModel.h>
+
+#include <ossim/support_data/ossimSupportFilesList.h>
+
+#include "ossimPluginConstants.h"
+#include "ossimPluginCommon.h"
+#include <iostream>
+#include <cmath>
+#include <cstdio>
+
+//#include "ossimGeometricSarSensorModel.h"
+
+#include "ossimSentinel1ProductDoc.h"
+
+//ossimGeometricSarSensorModel
+
+namespace ossimplugins
+{
+
+   class OSSIM_PLUGINS_DLL ossimSentinel1Model : public ossimSarModel
+   {
+   public:
+      /*!
+       * CONSTRUCTORS:
+       */
+      /** @brief default constructor */
+      ossimSentinel1Model();
+
+      /** @brief copy constructor */
+      ossimSentinel1Model(const ossimSentinel1Model& rhs);
+
+      /** @brief Destructor */
+      virtual ~ossimSentinel1Model();
+
+
+      bool open(const ossimFilename& file);
+
+      /*!
+       * Returns pointer to a new instance, copy of this.
+       * Not implemented yet!  Returns NULL...
+       */
+      virtual ossimObject* dup() const;
+
+      /*!
+       * Extends base-class implementation. Dumps contents of object to ostream.
+       */
+      virtual std::ostream& print(std::ostream& out) const;
+
+      /*!
+       * Fulfills ossimObject base-class pure virtuals. Loads and saves geometry
+       * KWL files. Returns true if successful.
+       */
+      virtual bool saveState(ossimKeywordlist& kwl,
+                             const char* prefix=NULL) const;
+
+      virtual bool loadState(const ossimKeywordlist& kwl,
+                             const char* prefix=NULL);
+
+    bool checkDirectory(const ossimFilename& file, const char* d, const char *ext);
+
+    bool isLevel0(const ossimFilename& file);
+
+    bool isLevel2(const ossimFilename& file);
+
+    bool isLevel1(const ossimFilename& file);
+
+    bool isSentinel1(const ossimFilename &manifestFile);
+
+    bool readProduct(const ossimFilename &manifestFile);
+
+    bool getImageId(ossimString& s) const;
+
+    bool initSensorID(ossimString& s);
+
+    bool standAloneProductInformation();
+
+    bool getAnnotationFileLocation(const ossimFilename &manifestFile, const char* pattern);
+
+
+    bool initImageSize(ossimIpt& imageSize) const
+    {
+       // theImageClipRect = ossimDrect(0, 0, theImageSize.x-1, theImageSize.y-1);
+       // theSubImageOffset.x = 0.0;
+       // theSubImageOffset.y = 0.0;
+
+       return theProduct->initImageSize(imageSize );
+    }
+
+    bool initGsd(ossimDpt& gsd) const
+    {
+       return theProduct->initGsd( gsd );
+    }
+
+    const ossimKeywordlist getManifestKwl() const
+    {
+       return theManifestKwl;
+    }
+
+    bool isSLC() { return  theSLC; }
+
+    bool initSRGR()
+    {
+       //   theProduct->initSRGR( );
+       return true;
+    }
+
+    bool findSafeManifest(const ossimFilename& file, ossimFilename& safeFile);
+
+    void clearFields();
+
+
+   protected:
+
+    TYPE_DATA
+
+  private:
+
+    ossimFilename                          theProductXmlFile;
+    ossimFilename                          theManifestFile;
+    ossimKeywordlist                       theManifestKwl;
+    ossimRefPtr<ossimXmlDocument>          theManifestDoc;
+    ossimRefPtr<ossimSentinel1ProductDoc>  theProduct;
+    bool                                   theOCN;
+    bool                                   theSLC;
+
+
+    }; //end class ossimSentinel1Model
+
+}  //end namespace ossimplugins
+
+
+#endif /* #ifndef ossimSentinel1Model_HEADER */
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1ProductDoc.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1ProductDoc.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b069f6f1a512467ef457f002b4c2c5ea90a42dcc
--- /dev/null
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1ProductDoc.cpp
@@ -0,0 +1,721 @@
+#include "ossimSentinel1ProductDoc.h"
+#include <ossim/base/ossimDirectory.h>
+#include <ossim/base/ossimDate.h>
+
+// Define Trace flags for use within this file:
+static ossimTrace traceExec  ("ossimSentinel1SupportData:exec");
+static ossimTrace traceDebug ("ossimSentinel1SupportData:debug");
+
+namespace ossimplugins
+{
+
+   static const char LOAD_FROM_PRODUCT_FILE_KW[] = "load_from_product_file_flag";
+   static const char PRODUCT_XML_FILE_KW[] = "product_xml_filename";
+   static const char SUPPORT_DATA_PREFIX[] = "support_data.";
+
+   ossimSentinel1ProductDoc::ossimSentinel1ProductDoc ()
+      : ossimErrorStatusInterface ()
+      , theRangeSpacingTotal (0.0)
+      , theAzimuthSpacingTotal (0.0)
+      , theSLC (false)
+      , theTOPSAR (false)
+   {
+
+   }
+
+   ossimSentinel1ProductDoc::~ossimSentinel1ProductDoc ()
+   {
+
+   }
+
+   bool ossimSentinel1ProductDoc::openMetadataFile(ossimRefPtr<ossimXmlDocument>& doc, const ossimString file) const
+   {
+      if ( !doc->openFile( file ) )
+      {
+         std::cerr << "ossimSentinel1ProductDoc::openMetadataFile() failed." << std::endl;
+         return false;
+      }
+
+      return true;
+   }
+
+
+   double
+   ossimSentinel1ProductDoc
+   ::getModifiedJulianDate(const ossimString utcTimeString)
+   {
+
+      std::vector<ossimString> date_time;
+      std::vector<ossimString> output;
+
+      utcTimeString.split(date_time, "T");
+
+      date_time[0].split(output, "-");
+
+      if (output.size () != 3)
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid date\n";
+      }
+
+      char* stop;
+      int year = std::strtol( output[0].c_str(), &stop, 10);
+      if ( *stop != 0 )
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid year\n";
+      }
+
+      stop  = 0;
+      int month = std::strtol( output[1].c_str(), &stop, 10);
+      if ( *stop != 0 )
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid month\n";
+      }
+      stop  = 0;
+      int day = std::strtol( output[2].c_str(), &stop, 10);
+      if ( *stop != 0 )
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid day\n";
+      }
+      /* Parse time */
+      output.clear();
+      date_time[1].split(output, ":");
+      if (output.size () != 3)
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid time\n";
+      }
+
+      stop  = 0;
+      int hours = std::strtol( output[0].c_str(), &stop, 10);
+      if ( *stop != 0 )
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid hours\n";
+      }
+
+      stop  = 0;
+      int minutes = std::strtol( output[1].c_str(), &stop, 10);
+      if ( *stop != 0 )
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid minutes\n";
+      }
+
+      stop  = 0;
+      int seconds = std::strtod( output[2].c_str(), &stop);
+      if ( *stop != 0 )
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "invalid seconds in float\n";
+      }
+
+/* Below method could replace all above split and convert. But there is a lot of
+   checks done in  ossimLocalTm::setIso8601( ) which slows us down. And I dont
+   want that. */
+/*
+  ossimLocalTm otm;
+  if ( !otm.setIso8601(utcString) )
+  {
+  }
+  ossimDate ossimdate(otm);
+*/
+
+      ossimDate ossimdate(month, day, year);
+      ossimdate.setHour(hours);
+      ossimdate.setMin(minutes);
+      ossimdate.setFloatSec(seconds);
+      return ossimdate.getModifiedJulian();
+
+   }
+
+   bool ossimSentinel1ProductDoc::readProductMetadata()
+   {
+      bool commonMetadataRetrieved = false;
+      double heightSum = 0.0;
+      int numBands = 0;
+
+      ossimDirectory annotationDir( theManifestDirectory.dirCat( "annotation") );
+      std::vector<ossimFilename> files;
+      annotationDir.findAllFilesThatMatch(files, ".xml");
+      std::vector<ossimFilename>::const_iterator it = files.begin();
+
+
+
+      for (int count=0; it != files.end(); ++it,  ++count)
+      {
+         ossimRefPtr<ossimXmlDocument> theProductXmlDocument = new ossimXmlDocument();
+         openMetadataFile(theProductXmlDocument, (*it) );
+
+         const ossimRefPtr<ossimXmlNode> adsHeader = theProductXmlDocument->getRoot()->findFirstNode("adsHeader");
+
+         const ossimString swath = adsHeader->getChildTextValue("swath");
+         const ossimString polarisation = adsHeader->getChildTextValue("polarisation");
+
+         std::stringstream _tempstrm;
+         _tempstrm << "Band[" << count << "].";
+         const ossimString bandPrefix = _tempstrm.str();
+
+         theProductKwl.add(bandPrefix,
+                         "swath",
+                         swath,
+                         true);
+
+         theProductKwl.add(bandPrefix,
+                         "polarisation",
+                         polarisation,
+                         true);
+
+         theProductKwl.add(bandPrefix,
+                         "annotation",
+                         (*it).file(),
+                         true);
+
+         theProductKwl.add(bandPrefix,
+                         "first_line_time",
+                         adsHeader->getChildTextValue("startTime"),
+                         true);
+
+         theProductKwl.add(bandPrefix,
+                         "last_line_time",
+                         adsHeader->getChildTextValue("stopTime"),
+                         true);
+         //RK maybe use this->getManifestPrefix()
+         theProductKwl.add(SUPPORT_DATA_PREFIX,
+                      "mds1_tx_rx_polar",
+                      polarisation,
+                      true);
+
+         const ossimRefPtr<ossimXmlNode> imageInformation = theProductXmlDocument->getRoot()->findFirstNode("imageAnnotation/imageInformation");
+
+         const ossimRefPtr<ossimXmlNode> productInformation = theProductXmlDocument->getRoot()->findFirstNode("generalAnnotation/productInformation");
+
+         theProductKwl.add(SUPPORT_DATA_PREFIX,
+                         "data_take_id",
+                         adsHeader->getChildTextValue("missionDataTakeId"),
+                         true);
+
+         theProductKwl.add(SUPPORT_DATA_PREFIX,
+                         "slice_num",
+                         imageInformation->getChildTextValue("sliceNumber"),
+                         true);
+
+         theProductKwl.add(SUPPORT_DATA_PREFIX,
+                         "line_time_interval",
+                         imageInformation->getChildTextValue("azimuthTimeInterval"),
+                         true);
+
+         theRangeSpacingTotal += imageInformation->getChildTextValue("rangePixelSpacing").toFloat64();
+
+         theAzimuthSpacingTotal += imageInformation->getChildTextValue("azimuthPixelSpacing").toFloat64();
+
+         theProductKwl.add(bandPrefix,
+                         ossimKeywordNames::NUMBER_SAMPLES_KW,
+                         imageInformation->getChildTextValue("numberOfSamples"),
+                         true);
+
+         theProductKwl.add(bandPrefix,
+                         ossimKeywordNames::NUMBER_LINES_KW,
+                         imageInformation->getChildTextValue("numberOfLines"),
+                         true);
+
+         theProductKwl.add(bandPrefix,
+                         "sample_type", //ossimKeywordNames::PIXEL_TYPE_KW,
+                         imageInformation->getChildTextValue("pixelValue").upcase(),
+                         true);
+
+         heightSum += getBandTerrainHeight(theProductXmlDocument);
+
+
+         if (!commonMetadataRetrieved)
+         {
+            // these should be the same for all swaths
+            //RK div by oneMillion taken from S1tlbx
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                              "range_sampling_rate",
+                              productInformation->getChildTextValue("rangeSamplingRate"),
+                              true);
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                              "radar_frequency",
+                              productInformation->getChildTextValue("radarFrequency"),
+                              true);
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                            "line_time_interval",
+                            imageInformation->getChildTextValue("azimuthTimeInterval"),
+                            true);
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                              "slant_range_to_first_pixel",
+                              imageInformation->getChildTextValue("slantRangeTime"),
+                              true);
+
+            const ossimRefPtr<ossimXmlNode> downlinkInformation =
+               theProductXmlDocument->getRoot()->findFirstNode("generalAnnotation/downlinkInformationList/downlinkInformation");
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                            "pulse_repetition_frequency",
+                            downlinkInformation->getChildTextValue("prf"),
+                            true);
+
+            const ossimRefPtr<ossimXmlNode> swathProcParams =
+               theProductXmlDocument->getRoot()->findFirstNode("imageAnnotation/processingInformation/swathProcParamsList/swathProcParams");
+            const ossimRefPtr<ossimXmlNode> rangeProcessingNode = swathProcParams->findFirstNode("rangeProcessing");
+            const ossimRefPtr<ossimXmlNode> azimuthProcessingNode = swathProcParams->findFirstNode("azimuthProcessing");
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                            "azimuth_bandwidth",
+                              azimuthProcessingNode->getChildTextValue("processingBandwidth"),
+                            true);
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                            "range_bandwidth",
+                              rangeProcessingNode->getChildTextValue("processingBandwidth"),
+                            true);
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                            "range_looks",
+                            rangeProcessingNode->getChildTextValue("numberOfLooks"),
+                            true);
+
+            theProductKwl.add(SUPPORT_DATA_PREFIX,
+                            "azimuth_looks",
+                            azimuthProcessingNode->getChildTextValue("numberOfLooks"),
+                            true);
+
+            if(!theTOPSAR || !theSLC)
+            {
+               theProductKwl.add(SUPPORT_DATA_PREFIX,
+                               ossimKeywordNames::NUMBER_SAMPLES_KW,
+                               imageInformation->getChildTextValue("numberOfSamples"),
+                               true);
+
+               theProductKwl.add(SUPPORT_DATA_PREFIX,
+                               ossimKeywordNames::NUMBER_LINES_KW,
+                               imageInformation->getChildTextValue("numberOfLines"),
+                            true);
+            }
+
+            const ossimRefPtr<ossimXmlNode> orbitList = theProductXmlDocument->getRoot()->findFirstNode("generalAnnotation/orbitList");
+            addOrbitStateVectors(orbitList);
+
+            const ossimRefPtr<ossimXmlNode> coordinateConversionList = theProductXmlDocument->getRoot()->findFirstNode("coordinateConversion/coordinateConversionList");
+            addSRGRCoefficients(SUPPORT_DATA_PREFIX, coordinateConversionList);
+
+            const ossimRefPtr<ossimXmlNode> dcEstimateList = theProductXmlDocument->getRoot()->findFirstNode("dopplerCentroid/dcEstimateList");
+            addDopplerCentroidCoefficients(dcEstimateList);
+
+            commonMetadataRetrieved = true;
+         }
+
+         ++numBands;
+      }
+
+      if(theSLC)
+      {
+         numBands = numBands * 2; // real and imaginary
+      }
+
+
+      theProductKwl.add(SUPPORT_DATA_PREFIX,
+                      "range_spacing",
+                      theRangeSpacingTotal / (double)numBands,
+                      true);
+
+      theProductKwl.add(SUPPORT_DATA_PREFIX,
+                      "azimuth_spacing",
+                      theAzimuthSpacingTotal / (double)numBands,
+                      true);
+
+      theProductKwl.add(SUPPORT_DATA_PREFIX,
+                      "avg_scene_height",
+                      heightSum / (double)files.size(),
+                      true);
+
+      theProductKwl.add(SUPPORT_DATA_PREFIX,
+                      ossimKeywordNames::NUMBER_BANDS_KW,
+                      numBands,
+                      true);
+      return true;
+   }
+
+   void ossimSentinel1ProductDoc::addDopplerCentroidCoefficients(const ossimRefPtr<ossimXmlNode>& dcEstimateList)
+   {
+      if (!dcEstimateList.get())
+         return;
+
+      ossimString count_str;
+      dcEstimateList->getAttributeValue(count_str, "count");
+      const int count  = count_str.toInt();
+      if( count < 1)
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "No doppler centroid coefficients available in metadata!!\n";
+         return;
+      }
+      else
+      {
+         ossimXmlNode::ChildListType dcEstimates;
+         dcEstimateList->findChildNodes("dcEstimate", dcEstimates);
+
+         ossimXmlNode::ChildListType::const_iterator it = dcEstimates.begin();
+
+         int index = 1;
+
+         while( it != dcEstimates.end())
+         {
+            //Doppler_Centroid_Coefficients.dop_coef_list;
+            const ossimString prefix = "dopplerCentroid.dop_coef_list" + ossimString::toString(index) + ".";
+
+            ++index;
+
+            const ossimRefPtr<ossimXmlNode> dcEstimate = (*it);
+            theProductKwl.add(prefix,
+                            "dop_coef_time",
+                            dcEstimate->getChildTextValue("azimuthTime"),
+                            true);
+            //RK
+            const double ref_time = dcEstimate->getChildTextValue("t0").toFloat64() * 1e9; // s to ns
+
+            theProductKwl.add(prefix,
+                            "slant_range_time",
+                            ref_time,
+                            true);
+
+            const ossimString ns = dcEstimate->getChildTextValue("ns");
+
+            if( !ns.empty() )
+               theProductKwl.add(prefix,
+                               "slant_range_time",
+                               ns,
+                               true);
+
+            const ossimString coeffStr = dcEstimate->getChildTextValue("geometryDcPolynomial");
+
+            if (!coeffStr.empty())
+            {
+               const ossimString separatorList = " ";
+               std::vector<ossimString> result;
+
+               coeffStr.split(result, separatorList, true);
+
+               std::vector<ossimString>::const_iterator coeff = result.begin();
+
+               int count = 1;
+
+               while (coeff != result.end())
+               {
+                  const ossimString coeff_prefix =  prefix + ossimString::toString(count) + ".";
+
+                  theProductKwl.add(coeff_prefix,
+                                  "dop_coef",
+                                  (*coeff),
+                                  true);
+
+                  ++coeff;
+
+                  ++count;
+               }
+
+            } //if (!coeffStr.empty())
+
+            ++it;
+
+         } // while( it != dcEstimates.end())
+
+      } // else count < 1
+    }
+
+
+   double ossimSentinel1ProductDoc::getBandTerrainHeight( const ossimRefPtr<ossimXmlDocument>& theProductXmlDocument )
+   {
+      double heightSum = 0.0;
+      vector< ossimRefPtr<ossimXmlNode> > heightList;
+      theProductXmlDocument->findNodes("/product/generalAnnotation/terrainHeightList/terrainHeight", heightList);
+      vector<ossimRefPtr<ossimXmlNode> >::const_iterator it = heightList.begin();
+      while(it != heightList.end())
+      {
+         heightSum += (*it)->getChildTextValue("value").toFloat64();
+         ++it;
+      }
+      return heightSum / heightList.size();
+   }
+
+   bool ossimSentinel1ProductDoc::initImageSize(ossimIpt& imageSize) const
+   {
+      const ossimString samples_str = theProductKwl.find(SUPPORT_DATA_PREFIX, ossimKeywordNames::NUMBER_SAMPLES_KW);
+      const ossimString lines_str = theProductKwl.find(SUPPORT_DATA_PREFIX, ossimKeywordNames::NUMBER_LINES_KW);
+
+      imageSize.samp =  samples_str.toInt();
+      imageSize.line =  lines_str.toInt();
+
+      return true;
+   }
+
+   bool ossimSentinel1ProductDoc::initGsd( ossimDpt& gsd) const
+   {
+      gsd.x =  theRangeSpacingTotal;
+      gsd.y =  theAzimuthSpacingTotal;
+      return true;
+   }
+
+   void ossimSentinel1ProductDoc::addOrbitStateVectors(const ossimRefPtr<ossimXmlNode>& orbitList)
+   {
+
+      if (!orbitList.get())
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "No orbitVectorList info available in metadata!!\n";
+         return;
+      }
+
+      ossimXmlNode::ChildListType stateVectorList;
+      orbitList->findChildNodes("orbit", stateVectorList);
+
+      if(stateVectorList.size() < 1)
+      {
+         ossimNotify(ossimNotifyLevel_DEBUG) << "No orbitVectorList info available in metadata!!\n";
+         return;
+      }
+
+      for (int i = 0; i < stateVectorList.size(); ++i)
+      {
+         //orbit_state_vectors
+         const ossimString orbit_prefix = "orbitList.orbit[" + ossimString::toString(i)  + "].";
+
+         theProductKwl.add(orbit_prefix,
+                         "time",
+                         stateVectorList[i]->getChildTextValue("time"),
+                         true);
+
+         theProductKwl.add(orbit_prefix,
+                         "x_pos",
+                         stateVectorList[i]->getChildTextValue("position/x").toFloat64(),
+                         true);
+
+         theProductKwl.add(orbit_prefix,
+                         "y_pos",
+                         stateVectorList[i]->getChildTextValue("position/y").toFloat64(),
+                         true);
+
+         theProductKwl.add(orbit_prefix,
+                         "z_pos",
+                         stateVectorList[i]->getChildTextValue("position/z").toFloat64(),
+                         true);
+
+         theProductKwl.add(orbit_prefix,
+                         "x_vel",
+                         stateVectorList[i]->getChildTextValue("velocity/x").toFloat64(),
+                         true);
+
+         theProductKwl.add(orbit_prefix,
+                         "y_vel",
+                         stateVectorList[i]->getChildTextValue("velocity/y").toFloat64(),
+                         true);
+
+         theProductKwl.add(orbit_prefix,
+                         "z_vel",
+                         stateVectorList[i]->getChildTextValue("velocity/z").toFloat64(),
+                         true);
+      }
+   }
+
+   void ossimSentinel1ProductDoc::addSRGRCoefficients(const char* prefix, const ossimRefPtr<ossimXmlNode>& coordinateConversionList)
+   {
+      if (!coordinateConversionList.get())
+         return;
+
+      ossimString count_str;
+      coordinateConversionList->getAttributeValue(count_str, "count");
+      const int count  = count_str.toInt();
+      if( count < 1)
+      {
+         if(traceDebug())
+            ossimNotify(ossimNotifyLevel_DEBUG) << "No coordinate conversion info available in metadata!!\n";
+         return;
+      }
+      else
+      {
+         ossimNotify(ossimNotifyLevel_FATAL) << "shouldn't reach here!!\n";
+         return;
+      }
+
+    }
+
+   void ossimSentinel1ProductDoc::readCalibrationMetadata()
+   {
+      ossimDirectory calibrationDir( theManifestDirectory.dirCat( "annotation/calibration") );
+      std::vector<ossimFilename> files;
+      calibrationDir.findAllFilesThatMatch(files, "calibration*");
+      std::vector<ossimFilename>::const_iterator it = files.begin();
+
+      std::stringstream strm;
+      for (; it != files.end(); ++it)
+      {
+         ossimRefPtr<ossimXmlDocument> calibrationDoc = new ossimXmlDocument();
+         openMetadataFile(calibrationDoc, (*it) );
+
+         ossimRefPtr<ossimXmlNode> adsHeader = calibrationDoc->getRoot()->findFirstNode("adsHeader");
+         ossimRefPtr<ossimXmlNode> calibrationInformation = calibrationDoc->getRoot()->findFirstNode("calibrationInformation");
+         ossimRefPtr<ossimXmlNode> calibrationVectorList = calibrationDoc->getRoot()->findFirstNode("calibrationVectorList");
+
+         const ossimString calibrationPrefix = "calibration.";
+
+         theProductKwl.add(calibrationPrefix,
+                         "swath",
+                         adsHeader->getChildTextValue("swath"),
+                         true);
+
+         theProductKwl.add(calibrationPrefix,
+                         "polarisation",
+                         adsHeader->getChildTextValue("polarisation"),
+                         true);
+
+         theProductKwl.add(calibrationPrefix,
+                         "startTime",
+                         getModifiedJulianDate(adsHeader->getChildTextValue("startTime")),
+                         true);
+
+         theProductKwl.add(calibrationPrefix,
+                         "stopTime",
+                         getModifiedJulianDate(adsHeader->getChildTextValue("stopTime")),
+                         true);
+
+         theProductKwl.add(calibrationPrefix,
+                         "absoluteCalibrationConstant",
+                         calibrationInformation->getChildTextValue("absoluteCalibrationConstant"),
+                         true);
+
+         theProductKwl.add(calibrationPrefix,
+                         "count",
+                         calibrationVectorList->getAttributeValue("count"),
+                         true);
+
+         const ossimRefPtr<ossimXmlNode> calibrationRoot = calibrationDoc->getRoot();
+         std::vector< ossimRefPtr<ossimXmlNode> > calibrationVectors;
+         calibrationRoot->findChildNodes("calibrationVectorList/calibrationVector", calibrationVectors);
+         for( unsigned int idx = 0; idx < calibrationVectors.size(); ++idx)
+         {
+
+         const ossimString calibrationVectorPrefix = calibrationPrefix + "calibrationVector[" + ossimString::toString(idx) + "].";
+
+         const ossimRefPtr<ossimXmlNode> node = calibrationVectors[idx]->findFirstNode("pixel");
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "pixel_count",
+                         node->getAttributeValue("count"),
+                         false);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "azimuthTime",
+                         getModifiedJulianDate(calibrationVectors[idx]->getChildTextValue("azimuthTime")),
+                         true);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "line",
+                         calibrationVectors[idx]->getChildTextValue("line"),
+                         true);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "pixel",
+                         calibrationVectors[idx]->getChildTextValue("pixel"),
+                         true);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "sigmaNought",
+                         calibrationVectors[idx]->getChildTextValue("sigmaNought"),
+                         true);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "betaNought",
+                         calibrationVectors[idx]->getChildTextValue("betaNought"),
+                         true);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "gamma",
+                         calibrationVectors[idx]->getChildTextValue("gamma"),
+                         true);
+
+         theProductKwl.add(calibrationVectorPrefix,
+                         "dn",
+                         calibrationVectors[idx]->getChildTextValue("dn"),
+                         true);
+
+            //  calibrationVectors[idx]->toKwl(theProductKwl, "calibrationVectorList_" + ossimString::toString(idx+1) + ".");
+         }
+       }
+   }
+
+   void ossimSentinel1ProductDoc::readNoiseMetadata()
+   {
+      ossimDirectory calibrationDir( theManifestDirectory.dirCat( "annotation/calibration") );
+      std::vector<ossimFilename> files;
+      calibrationDir.findAllFilesThatMatch(files, "noise*");
+      std::vector<ossimFilename>::const_iterator it = files.begin();
+      const ossimString noisePrefix = "noise.";
+
+      for (; it != files.end(); ++it)
+      {
+         ossimRefPtr<ossimXmlDocument> noiseDoc = new ossimXmlDocument();
+         openMetadataFile(noiseDoc, (*it) );
+
+         const ossimRefPtr<ossimXmlNode> noiseRoot = noiseDoc->getRoot();
+         std::vector< ossimRefPtr<ossimXmlNode> > noiseVectors;
+         noiseRoot->findChildNodes("noiseVectorList/noiseVector", noiseVectors);
+         for( unsigned int idx = 0; idx < noiseVectors.size(); ++idx)
+         {
+            const ossimString noiseVectorPrefix = noisePrefix + "noiseVector[" + ossimString::toString(idx) + "].";
+
+            const ossimRefPtr<ossimXmlNode> node = noiseVectors[idx]->findFirstNode("pixel");
+
+            theProductKwl.add(noiseVectorPrefix,
+                              "pixel_count",
+                              node->getAttributeValue("count"),
+                              false);
+
+            theProductKwl.add(noiseVectorPrefix,
+                              "azimuthTime",
+                              getModifiedJulianDate(noiseVectors[idx]->getChildTextValue("azimuthTime")),
+                              true);
+
+            theProductKwl.add(noiseVectorPrefix,
+                              "line",
+                              noiseVectors[idx]->getChildTextValue("line"),
+                              true);
+
+            theProductKwl.add(noiseVectorPrefix,
+                              "pixel",
+                              noiseVectors[idx]->getChildTextValue("pixel"),
+                              true);
+
+            theProductKwl.add(noiseVectorPrefix,
+                              "noiseLut",
+                              noiseVectors[idx]->getChildTextValue("noiseLut"),
+                              true);
+
+            //noiseVectorList[idx]->toKwl(theProductKwl, "noiseVectorList_" + ossimString::toString(idx+1) + ".");
+         }
+      }
+   }
+
+
+   void ossimSentinel1ProductDoc::clearFields( )
+   {
+      theProductKwl.clear();
+   }
+   //RK
+   // bool ossimSentinel1ProductDoc::saveState(ossimKeywordlist& kwl,
+   //                                               const char* prefix)const
+   // {
+   //    kwl.addList(theProductKwl);
+
+   //    kwl.add(prefix,
+   //            "sample_type",
+   //            theSampleType,
+   //            true);
+
+   //    return true;
+   // }
+
+   // bool ossimSentinel1ProductDoc::loadState(const ossimKeywordlist& kwl,
+   //                                               const char* prefix)
+   // {
+
+   //    return true;
+
+   // }
+}
diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1ProductDoc.h b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1ProductDoc.h
new file mode 100644
index 0000000000000000000000000000000000000000..22ab04efa2440e453b50a4b1a525a5c47c800b60
--- /dev/null
+++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1ProductDoc.h
@@ -0,0 +1,112 @@
+//----------------------------------------------------------------------------
+//
+// "Copyright Centre National d'Etudes Spatiales"
+//
+// License:  LGPL-2
+//
+// See LICENSE.txt file in the top level directory for more details.
+//
+//----------------------------------------------------------------------------
+// $Id$
+
+#ifndef ossimSentinel1ProductDoc_HEADER
+#define ossimSentinel1ProductDoc_HEADER
+
+#include <ossim/base/ossimConstants.h>
+#include <ossim/base/ossimIpt.h>
+#include <ossim/base/ossimObject.h>
+#include <ossim/base/ossimString.h>
+#include <ossim/base/ossimErrorStatusInterface.h>
+#include <ossim/base/ossimFilename.h>
+#include <ossim/base/ossimDpt.h>
+#include <ossim/base/ossimDrect.h>
+#include <ossim/base/ossimGpt.h>
+#include <ossim/base/ossimXmlDocument.h>
+#include <ossim/base/ossimXmlNode.h>
+#include <ossim/base/ossimKeywordlist.h>
+#include <ossim/base/ossimNotify.h>
+#include <ossim/base/ossimNotifyContext.h>
+#include <ossim/base/ossimKeywordNames.h>
+#include <ossim/base/ossimTrace.h>
+#include <ossim/base/ossimCommon.h>
+#include "ossimPluginCommon.h"
+#include "ossimPluginConstants.h"
+
+#include <cstdio>
+#include <vector>
+#include <sstream>
+#include <iostream>
+#include <iterator>
+
+namespace ossimplugins
+{
+
+   class OSSIM_PLUGINS_DLL ossimSentinel1ProductDoc : public ossimObject,
+                                                   public ossimErrorStatusInterface
+   {
+   public:
+
+      ossimSentinel1ProductDoc();
+
+      virtual ~ossimSentinel1ProductDoc();
+
+      void clearFields();
+
+      bool openMetadataFile(ossimRefPtr<ossimXmlDocument>& doc, const ossimString file) const;
+
+      bool initImageSize(ossimIpt& imageSize) const;
+
+      bool initGsd( ossimDpt& gsd) const;
+
+      void addSRGRCoefficients(const char* prefix, const ossimRefPtr<ossimXmlNode>& coordinateConversion);
+
+      void addDopplerCentroidCoefficients(const ossimRefPtr<ossimXmlNode>& dcEstimateList);
+
+      void addOrbitStateVectors(const ossimRefPtr<ossimXmlNode>& dcEstimateList);
+
+      void readCalibrationMetadata();
+
+      void readNoiseMetadata();
+
+      double getModifiedJulianDate(const ossimString utc_time);
+
+      bool readProductMetadata( );
+
+      double getBandTerrainHeight( const ossimRefPtr<ossimXmlDocument>& theProductXmlDocument );
+
+      inline const ossimKeywordlist getProductKwl() const
+      {
+         return theProductKwl;
+      }
+
+      inline void setMetadataDirectory(const ossimFilename d)
+      {
+         theManifestDirectory = d;
+      }
+
+
+      inline bool setSLC(bool b)
+      {
+         theSLC = true;
+      }
+
+      inline bool setTOPSAR(bool b)
+      {
+         theTOPSAR = true;
+      }
+
+   private:
+      ossimFilename theManifestDirectory;
+      double theRangeSpacingTotal;
+      double theAzimuthSpacingTotal;
+      bool theTOPSAR;
+      bool theSLC;
+      ossimFilename theProductXmlFile;
+      ossimString theSampleType;
+      ossimKeywordlist theProductKwl;
+
+      };
+
+}
+
+#endif /* #ifndef ossimSentinel1ProductDoc_HEADER */
diff --git a/SuperBuild/CMake/External_ossim.cmake b/SuperBuild/CMake/External_ossim.cmake
index 20948d3bf68e676ee3fbad5728bb38b6355f116e..2222495018c21c4bd0dbadea243996f101d5d867 100644
--- a/SuperBuild/CMake/External_ossim.cmake
+++ b/SuperBuild/CMake/External_ossim.cmake
@@ -44,80 +44,32 @@ else()
     set(OSSIM_CXX_FLAGS /EHsc)
   endif()
   
-  if(0)
-    # SVN version
-    ExternalProject_Add(ossim_cmakemodules
-      PREFIX ${proj}/_cmakemodules
-      SVN_REPOSITORY "http://svn.osgeo.org/ossim/trunk/ossim_package_support/cmake/CMakeModules"
-      SVN_REVISION -r 23087
-      CONFIGURE_COMMAND ""
-      BUILD_COMMAND ""
-      INSTALL_COMMAND ""
-      PATCH_COMMAND ${CMAKE_COMMAND} -E copy
-        ${CMAKE_SOURCE_DIR}/patches/${proj}/OssimUtilities.cmake
-        ${CMAKE_BINARY_DIR}/${proj}/_cmakemodules/src/ossim_cmakemodules)
-      
-    list(APPEND ${proj}_DEPENDENCIES ossim_cmakemodules)
-  
-    ExternalProject_Add(${proj}
-      PREFIX ${proj}
-      SVN_REPOSITORY "http://svn.osgeo.org/ossim/trunk/ossim/"
-      SVN_REVISION -r 23092
-      BINARY_DIR ${OSSIM_SB_BUILD_DIR}
-      INSTALL_DIR ${SB_INSTALL_PREFIX}
-      DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
-      CMAKE_CACHE_ARGS
-        -DOSSIM_VERSION:STRING=1.8.18-1
-        -DCMAKE_INSTALL_PREFIX:STRING=${SB_INSTALL_PREFIX}
-        -DCMAKE_BUILD_TYPE:STRING=Release
-        -DCMAKE_CXX_FLAGS:STRING=${OSSIM_CXX_FLAGS}
-        -DBUILD_OSSIM_MPI_SUPPORT:BOOL=OFF
-        -DBUILD_OSSIM_APPS:BOOL=OFF
-        -DBUILD_OSSIM_FRAMEWORKS:BOOL=OFF
-        -DINSTALL_ARCHIVE_DIR:STRING=lib
-        -DINSTALL_LIBRARY_DIR:STRING=lib
-        -DCMAKE_PREFIX_PATH:STRING=${SB_INSTALL_PREFIX};${CMAKE_PREFIX_PATH}
-        ${OSSIM_SB_CONFIG}
-      DEPENDS ${${proj}_DEPENDENCIES}
-      CMAKE_COMMAND ${SB_CMAKE_COMMAND}
-      )
-      
-      ExternalProject_Add_Step(${proj} copy_CMakeModules
-        COMMAND ${CMAKE_COMMAND} -E copy_directory
-        ${CMAKE_BINARY_DIR}/${proj}/_cmakemodules/src/ossim_cmakemodules ${OSSIM_SB_SRC}/CMakeModules
-        DEPENDEES patch update
-        DEPENDERS configure
-      )
-  else()
-    # archive version
-    ExternalProject_Add(${proj}
-      PREFIX ${proj}
-      URL "https://www.orfeo-toolbox.org/packages/ossim-minimal-r23092.tar.gz"
-      URL_MD5 1bb7247fa490eb4a6e57b3c2e129d587
-      BINARY_DIR ${OSSIM_SB_BUILD_DIR}
-      INSTALL_DIR ${SB_INSTALL_PREFIX}
-      DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
-      CMAKE_CACHE_ARGS
-        -DOSSIM_VERSION:STRING=1.8.18-1
-        -DProject_WC_REVISION:STRING=23092
-        -DCMAKE_INSTALL_PREFIX:STRING=${SB_INSTALL_PREFIX}
-        -DCMAKE_BUILD_TYPE:STRING=Release
-        -DCMAKE_CXX_FLAGS:STRING=${OSSIM_CXX_FLAGS}
-        -DBUILD_OSSIM_MPI_SUPPORT:BOOL=OFF
-        -DBUILD_OSSIM_FREETYPE_SUPPORT:BOOL=ON
-        -DBUILD_OSSIM_APPS:BOOL=OFF
-        -DBUILD_OSSIM_FRAMEWORKS:BOOL=OFF
-        -DINSTALL_ARCHIVE_DIR:STRING=lib
-        -DINSTALL_LIBRARY_DIR:STRING=lib
-        -DCMAKE_PREFIX_PATH:STRING=${SB_INSTALL_PREFIX};${CMAKE_PREFIX_PATH}
-        ${OSSIM_SB_CONFIG}
-      PATCH_COMMAND ${CMAKE_COMMAND} -E copy
-        ${CMAKE_SOURCE_DIR}/patches/${proj}/OssimUtilities.cmake
-        ${OSSIM_SB_SRC}/CMakeModules
-      DEPENDS ${${proj}_DEPENDENCIES}
-      CMAKE_COMMAND ${SB_CMAKE_COMMAND}
-      )
-  endif()
+  # archive version
+  ExternalProject_Add(${proj}
+    PREFIX ${proj}
+    URL "https://www.orfeo-toolbox.org/packages/ossim-minimal-r23537.tar.gz"
+    URL_MD5 1a37403053711447a8f174bb875cca6b
+    BINARY_DIR ${OSSIM_SB_BUILD_DIR}
+    INSTALL_DIR ${SB_INSTALL_PREFIX}
+    DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
+    CMAKE_CACHE_ARGS
+    -DProject_WC_REVISION:STRING=23537
+    -DCMAKE_INSTALL_PREFIX:STRING=${SB_INSTALL_PREFIX}
+    -DCMAKE_BUILD_TYPE:STRING=Release
+    -DCMAKE_CXX_FLAGS:STRING=${OSSIM_CXX_FLAGS}
+    -DBUILD_OSSIM_MPI_SUPPORT:BOOL=OFF
+    -DBUILD_OSSIM_FREETYPE_SUPPORT:BOOL=ON
+    -DBUILD_OSSIM_APPS:BOOL=OFF
+    -DBUILD_OSSIM_TEST_APPS:BOOL=OFF
+    -DBUILD_OSSIM_FRAMEWORKS:BOOL=OFF
+    -DBUILD_WMS:BOOL=OFF
+    -DINSTALL_ARCHIVE_DIR:STRING=lib
+    -DINSTALL_LIBRARY_DIR:STRING=lib
+    -DCMAKE_PREFIX_PATH:STRING=${SB_INSTALL_PREFIX};${CMAKE_PREFIX_PATH}
+    ${OSSIM_SB_CONFIG}
+    DEPENDS ${${proj}_DEPENDENCIES}
+    CMAKE_COMMAND ${SB_CMAKE_COMMAND}
+    )
   
   set(_SB_${proj}_INCLUDE_DIR ${SB_INSTALL_PREFIX}/include)
   if(WIN32)