diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt
index eaebb85c819c7d88936b565b9b875901a615e01e..551267f3eaf29754d47145cf26f4e7b441771fe8 100755
--- a/Testing/Code/IO/CMakeLists.txt
+++ b/Testing/Code/IO/CMakeLists.txt
@@ -1893,6 +1893,13 @@ ADD_TEST(ioTvImageMetadataInterfaceQBTest ${IO_TESTS17}
         ${LARGEDATA}/TOULOUSE/QuickBird/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF
         ${TEMP}/ioTvImageMetadataInterfaceQB.txt
 )
+ADD_TEST(ioTvImageMetadataInterfaceQBCevennesTest ${IO_TESTS17}
+         --compare-ascii 0 ${BASELINE_FILES}/ioTvImageMetadataInterfaceQBCevennes.txt
+                         ${TEMP}/ioTvImageMetadataInterfaceQBCevennes.txt
+        otbImageMetadataInterfaceTest
+        ${LARGEDATA}/CEVENNES/06FEB12104912-P1BS-005533998070_01_P001.TIF
+        ${TEMP}/ioTvImageMetadataInterfaceQBCevennes.txt
+)
 ADD_TEST(ioTvImageMetadataInterfaceIKONOSTest ${IO_TESTS17}
          --compare-ascii 0 ${BASELINE_FILES}/ioTvImageMetadataInterfaceIKONOS.txt
                          ${TEMP}/ioTvImageMetadataInterfaceIKONOS.txt
diff --git a/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx b/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx
index d4d84e2905a25e1651780a2a70df4dfca15a9894..e8f5f4051fce12831450057571128ea7fbdbeb5f 100644
--- a/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx
+++ b/Testing/Code/IO/otbImageMetadataInterfaceTest.cxx
@@ -41,10 +41,8 @@ int otbImageMetadataInterfaceTest (int argc, char* argv[])
   ImageReaderType::Pointer reader = ImageReaderType::New();
   reader->SetFileName( inputFilename  );
   reader->UpdateOutputInformation();
-
   otb::ImageMetadataInterface::Pointer lImageMetadata = otb::ImageMetadataInterface::New();
 
-
   std::ofstream file;
   file.open(outputFilename);
 
@@ -56,7 +54,7 @@ int otbImageMetadataInterfaceTest (int argc, char* argv[])
   file<<"GetYear:            "<<lImageMetadata->GetYear(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   file<<"GetSolarIrradiance: "<<lImageMetadata->GetSolarIrradiance(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   file<<"GetSunElevation:    "<<lImageMetadata->GetSunElevation(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
-
+  file<<"GetSunAzimuth:    "<<lImageMetadata->GetSunAzimuth(reader->GetOutput()->GetMetaDataDictionary())<<std::endl;
   file.close();
 
   return EXIT_SUCCESS;
diff --git a/Utilities/otbossim/include/ossim/base/ossimFileParser.h b/Utilities/otbossim/include/ossim/base/ossimFileParser.h
new file mode 100644
index 0000000000000000000000000000000000000000..f4a0e75b512cbbe5f93f4d9ee11d0ae94b99ae8b
--- /dev/null
+++ b/Utilities/otbossim/include/ossim/base/ossimFileParser.h
@@ -0,0 +1,46 @@
+//*******************************************************************
+//
+// License:  LGPL
+// 
+// See LICENSE.txt file in the top level directory for more details.
+// 
+// Class declaration for ossimFileParser.
+// 
+// This class provides tools for parsinf a file.
+//
+//********************************************************************
+// $Id: ossimFileParser.h 14412 2009-04-27 16:58:46Z dburken $
+
+#ifndef ossimFileParser_HEADER
+#define ossimFileParser_HEADER
+
+#include <iosfwd>
+
+#include <ossim/base/ossimObject.h>
+#include <ossim/base/ossimString.h>
+
+class ossimFilename;
+
+
+class OSSIMDLLEXPORT ossimFileParser : public ossimObject
+{
+public:
+
+   /** @brief default constructor */
+   ossimFileParser();
+
+   /** virtual destructor */
+   virtual ~ossimFileParser();
+
+
+  bool getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossimString & name );
+
+  bool getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossim_float64 & value);
+ 
+
+
+
+TYPE_DATA
+};
+
+#endif /* #ifndef ossimFileParser_HEADER */
diff --git a/Utilities/otbossim/src/ossim/base/ossimFileParser.cpp b/Utilities/otbossim/src/ossim/base/ossimFileParser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7c2d2b69ec81dcd9df768582094b37e4ee0ec957
--- /dev/null
+++ b/Utilities/otbossim/src/ossim/base/ossimFileParser.cpp
@@ -0,0 +1,62 @@
+//*******************************************************************
+//
+// License:  LGPL
+// 
+// See LICENSE.txt file in the top level directory for more details.
+// 
+// Class declaration for ossimFileParser.
+// 
+// This class parses a Space Imaging Quickbird meta data file.
+//
+//********************************************************************
+// $Id: ossimFileParser.h 14412 2009-04-27 16:58:46Z dburken $
+
+#include <ossim/base/ossimFileParser.h>
+#include <ossim/base/ossimTrace.h>
+#include <iostream>
+
+RTTI_DEF1(ossimFileParser, "ossimFileParser", ossimObject);
+
+static ossimTrace traceExec  ("ossimFileParser:exec");
+static ossimTrace traceDebug ("ossimFileParser:debug");
+
+ossimFileParser::ossimFileParser()
+{
+}
+
+ossimFileParser::~ossimFileParser()
+{
+}
+
+bool ossimFileParser::getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossimString & name)
+  {
+     char * res = strstr(fileBuf, lineBeginning.c_str());
+     if (!res)
+     {
+       return false;
+      }
+    fileBuf = res;
+
+    char dummy[80], nameChar[80];
+    sscanf(res, format, dummy, nameChar);
+    name = ossimString(nameChar);
+
+    return true;
+  }
+
+ bool getEndOfLine( char * fileBuf, ossimString lineBeginning, char * format, ossim_float64 & value)
+{
+   char * res = strstr(fileBuf, lineBeginning.c_str());
+     if (!res)
+     {
+       return false;
+      }
+    fileBuf = res;
+
+    char dummy[80], nameChar[80];
+    sscanf(res, format, dummy, nameChar);
+    value = ossimString(nameChar).toFloat64();
+
+    return true;
+}
+
diff --git a/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp b/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp
index f35cf3f159526a3960050f42c8908569e594387a..51e21ec87868bbb84b8e2b175a63caa93603b3fc 100755
--- a/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp
+++ b/Utilities/otbossim/src/ossim/support_data/ossimQuickbirdMetaData.cpp
@@ -20,6 +20,8 @@
 #include <ossim/base/ossimNotify.h>
 #include <ossim/base/ossimKeywordNames.h>
 #include <ossim/base/ossimTrace.h>
+#include <ossim/base/ossimFileParser.h>
+
 
 RTTI_DEF1(ossimQuickbirdMetaData, "ossimQuickbirdMetaData", ossimObject);
 
@@ -44,28 +46,28 @@ ossimQuickbirdMetaData::~ossimQuickbirdMetaData()
 
 bool ossimQuickbirdMetaData::open(const ossimFilename& imageFile)
 {
-   static const char MODULE[] = "ossimQuickbirdMetaData::open";
+  static const char MODULE[] = "ossimQuickbirdMetaData::open";
 
-   clearFields();
+  clearFields();
 
-   //retrieve information from the metadata file
-   //if the Quickbird tif is 02APR01105228-M1BS-000000128955_01_P001.TIF
-   //the metadata file will be 02APR01105228-M1BS-000000128955_01_P001.IMD
+  //retrieve information from the metadata file
+  //if the Quickbird tif is 02APR01105228-M1BS-000000128955_01_P001.TIF
+  //the metadata file will be 02APR01105228-M1BS-000000128955_01_P001.IMD
 
-   ossimFilename metadatafile = imageFile;
-   metadatafile.setExtension(ossimString("IMD"));
+  ossimFilename metadatafile = imageFile;
+  metadatafile.setExtension(ossimString("IMD"));
 
-   if( parseMetaData(metadatafile) == false )
-   {
+  if( parseMetaData(metadatafile) == false )
+    {
       if(traceDebug())
-      {
-         ossimNotify(ossimNotifyLevel_WARN)
-         << MODULE << " errors parsing metadata" << std::endl;
-      }
+	{
+	  ossimNotify(ossimNotifyLevel_WARN)
+	    << MODULE << " errors parsing metadata" << std::endl;
+	}
       return false;
-   }
+    }
 
-   return true;
+  return true;
 }
 
 void ossimQuickbirdMetaData::clearFields()
@@ -74,7 +76,7 @@ void ossimQuickbirdMetaData::clearFields()
   theBandId = "Unknown";
   theSatID = "Unknown";
   theTLCDate = "Unknown",
-  theSunAzimuth = 0.0;
+    theSunAzimuth = 0.0;
   theSunElevation = 0.0;
 }
 
@@ -96,7 +98,7 @@ std::ostream& ossimQuickbirdMetaData::print(std::ostream& out) const
 }
 
 bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl,
-                                          const char* prefix)const
+				       const char* prefix)const
 {
 
 
@@ -115,12 +117,12 @@ bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl,
           theBandId,
           true);
 
-    kwl.add(prefix,
+  kwl.add(prefix,
           "sat_id",
           theSatID,
           true);
 
-   kwl.add(prefix,
+  kwl.add(prefix,
           "tlc_date",
           theTLCDate,
           true);
@@ -140,7 +142,7 @@ bool ossimQuickbirdMetaData::saveState(ossimKeywordlist& kwl,
 }
 
 bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl,
-                                          const char* prefix)
+				       const char* prefix)
 {
   clearFields();
 
@@ -149,51 +151,51 @@ bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl,
   
   lookup = kwl.find(prefix, ossimKeywordNames::TYPE_KW);
   if (lookup)
-  {
-     s = lookup;
-     if(s != "ossimQuickbirdMetaData")
-     {
-        return false;
-     }
-  }
+    {
+      s = lookup;
+      if(s != "ossimQuickbirdMetaData")
+	{
+	  return false;
+	}
+    }
 
   lookup = kwl.find(prefix, "generation_date");
   if (lookup)
-  {
-     theGenerationDate = lookup;
-  }
+    {
+      theGenerationDate = lookup;
+    }
 
   lookup = kwl.find(prefix, "band_id");
   if (lookup)
-  {
-     theBandId = lookup;
-  }
+    {
+      theBandId = lookup;
+    }
 
   lookup = kwl.find(prefix, "sat_id");
   if (lookup)
-  {
-     theSatID = lookup;
-  }
+    {
+      theSatID = lookup;
+    }
 
   lookup = kwl.find(prefix, "tlc_date");
   if (lookup)
-  {
-     theTLCDate= lookup;
-  }
+    {
+      theTLCDate= lookup;
+    }
 
   lookup = kwl.find(prefix, ossimKeywordNames::AZIMUTH_ANGLE_KW);
   if (lookup)
-  {
-     s = lookup;
-     theSunAzimuth = s.toFloat64();
-  }
+    {
+      s = lookup;
+      theSunAzimuth = s.toFloat64();
+    }
 
   lookup = kwl.find(prefix, ossimKeywordNames::ELEVATION_ANGLE_KW);
   if (lookup)
-  {
-     s = lookup;
-     theSunElevation = s.toFloat64();
-  }
+    {
+      s = lookup;
+      theSunElevation = s.toFloat64();
+    }
 
   return true;
 }
@@ -207,27 +209,26 @@ bool ossimQuickbirdMetaData::loadState(const ossimKeywordlist& kwl,
 bool ossimQuickbirdMetaData::parseMetaData(const ossimFilename& data_file)
 {
   if (traceExec())
-  {
-    ossimNotify(ossimNotifyLevel_DEBUG)
+    {
+      ossimNotify(ossimNotifyLevel_DEBUG)
         << "DEBUG ossimQuickbirdRpcModel::parseMetaData(data_file): entering..."
         << std::endl;
-  }
+    }
 
   FILE* fptr = fopen (data_file, "r");
   if (!fptr)
-  {
-    if (traceDebug())
     {
-      ossimNotify(ossimNotifyLevel_DEBUG)
-          << "ossimQuickbirdRpcModel::parseMetaData(data_file) DEBUG:"
-          << "\nCould not open Meta data file:  " << data_file
-          << "\nreturning with error..." << std::endl;
+      if (traceDebug())
+	{
+	  ossimNotify(ossimNotifyLevel_DEBUG)
+	    << "ossimQuickbirdRpcModel::parseMetaData(data_file) DEBUG:"
+	    << "\nCould not open Meta data file:  " << data_file
+	    << "\nreturning with error..." << std::endl;
+	}
+      return false;
     }
-    return false;
-  }
 
   char* strptr;
-   // char linebuf[80];
   char dummy[80], name[80];
   double value;
 
@@ -237,142 +238,147 @@ bool ossimQuickbirdMetaData::parseMetaData(const ossimFilename& data_file)
   ossim_int32 fileSize = static_cast<ossim_int32>(data_file.fileSize());
   char* filebuf = new char[fileSize];
   fread(filebuf, 1, fileSize, fptr);
+  strptr = filebuf;
   fclose(fptr);
+  ossimFileParser parser;
+  ossimString temp;
 
   //---
   // Generation time:
   //---
-  strptr = strstr(filebuf, "\ngenerationTime =");
-  if (!strptr)
-  {
-    if(traceDebug())
+  if(parser.getEndOfLine( strptr, ossimString("\ngenerationTime ="), "%17c %s", temp))
+    theGenerationDate = ossimString(temp).before(";");
+  else
     {
-      ossimNotify(ossimNotifyLevel_FATAL)
-          << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
-          << "\n\tAborting construction. Error encountered parsing "
-          << "presumed meta-data file." << std::endl;
-
-      delete [] filebuf;
-      return false;
+      if(traceDebug())
+	{
+	  ossimNotify(ossimNotifyLevel_FATAL)
+	    << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
+	    << "\n\tAborting construction. Error encountered parsing "
+	    << "presumed meta-data file." << std::endl;
+
+	  delete [] filebuf;
+	  return false;
+	}
     }
-  }
-
-  sscanf(strptr, "%17c %s", dummy, name);
-  theGenerationDate = ossimString(name).before(";");
-
 
   //---
   // BandId:
   //---
-  strptr = strstr(filebuf, "\nbandId =");
-  if (!strptr)
-  {
-    if(traceDebug())
+  if(parser.getEndOfLine( strptr, ossimString("\nbandId ="), "%9c %s", temp))
+    theBandId = ossimString(temp).after("\"").before("\";");
+  else
     {
-      ossimNotify(ossimNotifyLevel_FATAL)
-          << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
-          << "\n\tAborting construction. Error encountered parsing "
-          << "presumed meta-data file." << std::endl;
-
-      delete [] filebuf;
-      return false;
+      if(traceDebug())
+	{
+	  ossimNotify(ossimNotifyLevel_FATAL)
+	    << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
+	    << "\n\tAborting construction. Error encountered parsing "
+	    << "presumed meta-data file." << std::endl;
+
+	  delete [] filebuf;
+	  return false;
+	}
     }
-  }
-
-  sscanf(strptr, "%9c %s", dummy, name);
-  theBandId = ossimString(name).after("\"").before("\";");
 
 
   //---
   // SatID:
   //---
-  strptr = strstr(filebuf, "\n\tsatId =");
-  if (!strptr)
-  {
-    if(traceDebug())
+  if(parser.getEndOfLine( strptr, ossimString("\n\tsatId ="), "%9c %s", temp))
+    theSatID = ossimString(temp).after("\"").before("\";");
+  else
     {
-      ossimNotify(ossimNotifyLevel_FATAL)
-          << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
-          << "\n\tAborting construction. Error encountered parsing "
-          << "presumed meta-data file." << std::endl;
-
-      delete [] filebuf;
-      return false;
+      if(traceDebug())
+	{
+	  ossimNotify(ossimNotifyLevel_FATAL)
+	    << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
+	    << "\n\tAborting construction. Error encountered parsing "
+	    << "presumed meta-data file." << std::endl;
+
+	  delete [] filebuf;
+	  return false;
+	}
     }
-  }
-  sscanf(strptr, "%9c %s", dummy, name);
-  theSatID = ossimString(name).after("\"").before("\";");
+
 
   //---
   // TLCTime:
   //---
-  strptr = strstr(filebuf, "\n\tTLCTime =");
-  if (!strptr)
-  {
-    if(traceDebug())
+  if(parser.getEndOfLine( strptr, ossimString("\n\tTLCTime ="), "%11c %s", temp))
+    theTLCDate = ossimString(temp).before("\";");
+  else
     {
-      ossimNotify(ossimNotifyLevel_FATAL)
-          << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
-          << "\n\tAborting construction. Error encountered parsing "
-          << "presumed meta-data file." << std::endl;
-
-      delete [] filebuf;
-      return false;
+      if(traceDebug())
+	{
+	  ossimNotify(ossimNotifyLevel_FATAL)
+	    << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
+	    << "\n\tAborting construction. Error encountered parsing "
+	    << "presumed meta-data file." << std::endl;
+
+	  delete [] filebuf;
+	  return false;
+	}
     }
-  }
-  sscanf(strptr, "%11c %s", dummy, name);
-  theTLCDate = ossimString(name).before("\";");
-
-   //***
-   // Sun Azimuth:
-   //***
-  strptr = strstr(strptr, "\n\tsunAz =");
-  if (!strptr)
-  {
-    if(traceDebug())
-    {
-      ossimNotify(ossimNotifyLevel_FATAL)
-          << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
-          << "\n\tAborting construction. Error encountered parsing "
-          << "presumed meta-data file." << std::endl;
 
-      delete [] filebuf;
-      return false;
-    }
-  }
-  sscanf(strptr, "%9c %s", dummy, name);
-  theSunAzimuth = ossimString(name).before(";").toFloat64();;
-
-   //***
-   // Sun Elevation:
-   //***
-  strptr = strstr(strptr, "\n\tsunEl =");
-  if (!strptr)
-  {
-    if(traceDebug())
-    {
-      ossimNotify(ossimNotifyLevel_FATAL)
-          << "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
-          << "\n\tAborting construction. Error encountered parsing "
-          << "presumed meta-data file." << std::endl;
 
-      delete [] filebuf;
-      return false;
+  //***
+  // Sun Azimuth:
+  //***
+  if(parser.getEndOfLine( strptr, ossimString("\n\tsunAz ="), "%9c %s", temp))
+    theSunAzimuth = ossimString(temp).before(";").toFloat64();
+  else
+    {
+      if(parser.getEndOfLine( strptr, ossimString("\n\tmeanSunAz ="), "%13c %s", temp))
+	theSunAzimuth = ossimString(temp).before(";").toFloat64();
+      else
+	{
+	  if(traceDebug())
+	    {
+	      ossimNotify(ossimNotifyLevel_FATAL)
+		<< "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
+		<< "\n\tAborting construction. Error encountered parsing "
+		<< "presumed meta-data file." << std::endl;
+
+	      delete [] filebuf;
+	      return false;
+	    }
+	}
     }
-  }
-  sscanf(strptr, "%9c %s", dummy, name);
-  theSunElevation = ossimString(name).before(";").toFloat64();
 
+  //***
+  // Sun Elevation:
+  //***
+  if(parser.getEndOfLine( filebuf, ossimString("\n\tsunEl ="), "%9c %s", temp))
+    theSunElevation = ossimString(temp).before(";").toFloat64();
+  else
+    {
+      if(parser.getEndOfLine( filebuf, ossimString("\n\tmeanSunEl ="), "%13c %s", temp))
+	theSunElevation = ossimString(temp).before(";").toFloat64();
+      else
+	{
+	  if(traceDebug())
+	    {
+	      ossimNotify(ossimNotifyLevel_FATAL)
+		<< "FATAL ossimQuickbirdRpcModel::parseMetaData(data_file): "
+		<< "\n\tAborting construction. Error encountered parsing "
+		<< "presumed meta-data file." << std::endl;
+
+	      delete [] filebuf;
+	      return false;
+	    }
+	}
+    }
 
   delete [] filebuf;
   filebuf = 0;
 
   if (traceExec())
-  {
-    ossimNotify(ossimNotifyLevel_DEBUG)
+    {
+      ossimNotify(ossimNotifyLevel_DEBUG)
         << "DEBUG ossimQuickbirdRpcModel::parseMetaData(data_file): returning..."
         << std::endl;
-  }
+    }
 
   return true;
 }