diff --git a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h
index 81909d152832b2a6ef7f6c98333db05835a805b3..fd9959d81c1c598c5e03149538c6661e9cf19e91 100644
--- a/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h
+++ b/Modules/IO/ExtendedFilename/include/otbExtendedFilenameToWriterOptions.h
@@ -76,12 +76,22 @@ public:
     std::vector<std::string>                     optionList;
   };
 
+  typedef std::pair<int, double> NoDataPairType;
+  typedef std::vector<NoDataPairType> NoDataListType;
+  NoDataListType m_NoDataList;
+  bool has_noDataValue;
+
   /* Set Methods */
   void SetExtendedFileName(const char * extFname) ITK_OVERRIDE;
   /* Get Methods */
   bool SimpleFileNameIsSet () const;
+  bool NoDataValueIsSet () const;
   bool WriteGEOMFileIsSet () const;
   bool WriteRPCTagsIsSet() const;
+  NoDataListType GetNoDataList () const {
+    return m_NoDataList;
+  }
+
   bool GetWriteGEOMFile () const;
   bool GetWriteRPCTags() const;
   bool gdalCreationOptionsIsSet () const;
diff --git a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx
index b3413fdc53286ac0cbf322f76783edf10c4cdc6f..6d2481a7b8ee910430d1f3e646ab49e384519b2a 100644
--- a/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx
+++ b/Modules/IO/ExtendedFilename/src/otbExtendedFilenameToWriterOptions.cxx
@@ -22,6 +22,7 @@
 #include "otb_boost_string_header.h"
 #include <itksys/RegularExpression.hxx>
 #include "otb_boost_tokenizer_header.h"
+#include "otbStringUtils.h"
 
 namespace otb
 {
@@ -37,6 +38,8 @@ ExtendedFilenameToWriterOptions
 
   m_Options.writeRPCTags.first = false;
   m_Options.writeRPCTags.second = false;
+
+  has_noDataValue = false;
   
   m_Options.gdalCreationOptions.first = false;
   m_Options.streamingType.first       = false;
@@ -51,6 +54,7 @@ ExtendedFilenameToWriterOptions
   m_Options.optionList.push_back("streaming:type");
   m_Options.optionList.push_back("streaming:sizemode");
   m_Options.optionList.push_back("streaming:sizevalue");
+  m_Options.optionList.push_back("nodata");
   m_Options.optionList.push_back("box");
   m_Options.optionList.push_back("bands");
 }
@@ -93,6 +97,38 @@ ExtendedFilenameToWriterOptions
        m_Options.writeGEOMFile.second = false;
        }
      }
+  
+  if (!map["nodata"].empty())
+     {
+       std::string nodata_values = map["nodata"];
+       std::vector<std::string> nodata_list;
+       boost::split(nodata_list, nodata_values, boost::is_any_of(","),
+		    boost::token_compress_on);
+       std::vector<std::string>::const_iterator listIt = nodata_list.begin();
+       for(; listIt != nodata_list.end(); ++listIt) {
+       std::string nodata_pair = (*listIt);
+       std::vector<std::string> per_band_no_data;
+       boost::split(per_band_no_data,
+		    nodata_pair,
+		    boost::is_any_of(":"),
+		    boost::token_compress_on);
+       if (per_band_no_data.size() == 1)
+	 {
+	   double val = Utils::LexicalCast<double>(per_band_no_data[0],
+						   "nodata value");
+	   m_NoDataList.push_back(NoDataPairType(1, val));
+	 }
+       else
+	 {
+	   int band = Utils::LexicalCast<int>(per_band_no_data[0],
+						   "nodata value");
+	   double val = Utils::LexicalCast<double>(per_band_no_data[1],
+						   "nodata value");
+	   m_NoDataList.push_back(NoDataPairType(band, val));
+	 }
+       }
+       has_noDataValue = true;
+     }
 
   if (!map["writerpctags"].empty())
      {
@@ -204,6 +240,13 @@ ExtendedFilenameToWriterOptions
     }
 }
 
+bool
+ExtendedFilenameToWriterOptions
+::NoDataValueIsSet () const
+{
+  return has_noDataValue;
+}
+
 bool
 ExtendedFilenameToWriterOptions
 ::SimpleFileNameIsSet () const
diff --git a/Modules/IO/IOGDAL/include/otbGDALImageIO.h b/Modules/IO/IOGDAL/include/otbGDALImageIO.h
index 49b4678ac43729314803f1bb5aecc37bac75cded..70187dabcb73b4608308b44097af198510519f1b 100644
--- a/Modules/IO/IOGDAL/include/otbGDALImageIO.h
+++ b/Modules/IO/IOGDAL/include/otbGDALImageIO.h
@@ -81,6 +81,10 @@ public:
 
   typedef std::vector<std::string> GDALCreationOptionsType;
 
+  typedef  std::vector<
+    std::pair<int, double>
+    > NoDataListType;
+
   /** Method for creation through the object factory. */
   itkNewMacro(Self);
 
@@ -111,6 +115,8 @@ public:
     m_CreationOptions = opts;
   }
 
+  void SetNoDataList(NoDataListType v) { m_NoDataList = v; }
+
   GDALCreationOptionsType GetOptions(void)
   {
     return m_CreationOptions;
@@ -188,6 +194,8 @@ public:
   /** Returns gdal pixel type as string */
   std::string GetGdalPixelTypeAsString() const;
 
+  int NbBands() { return m_NbBands;}
+
 protected:
   /**
    * Constructor.
@@ -281,6 +289,9 @@ private:
    * True if RPC tags should be exported
    */
   bool m_WriteRPCTags;
+
+
+  NoDataListType m_NoDataList;
   
 };
 
diff --git a/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx b/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx
index 28d6700f5221625e7e31a09540404f444941802c..c026462e57cfca013ffb977eafde47094ce7a2d3 100644
--- a/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx
+++ b/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx
@@ -1847,6 +1847,11 @@ void GDALImageIO::InternalWriteImageInformation(const void* buffer)
         }
       }
     }
+
+  NoDataListType::const_iterator noDataIt = m_NoDataList.begin();
+    for(; noDataIt != m_NoDataList.end(); ++noDataIt)
+    dataset->GetRasterBand(noDataIt->first)->SetNoDataValue(noDataIt->second);
+
 }
 
 std::string GDALImageIO::FilenameToGdalDriverShortName(const std::string& name) const
diff --git a/Modules/IO/ImageIO/include/otbImageFileWriter.txx b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
index b1472291f1ae216f302757ad00b69bfd161b3630..6304fb89e70becfe73c96e5402e31410fdd2c949 100644
--- a/Modules/IO/ImageIO/include/otbImageFileWriter.txx
+++ b/Modules/IO/ImageIO/include/otbImageFileWriter.txx
@@ -456,7 +456,7 @@ ImageFileWriter<TInputImage>
 
   // Manage extended filename
   if ((strcmp(m_ImageIO->GetNameOfClass(), "GDALImageIO") == 0)
-      && (m_FilenameHelper->gdalCreationOptionsIsSet() || m_FilenameHelper->WriteRPCTagsIsSet())  )
+      && (m_FilenameHelper->gdalCreationOptionsIsSet() || m_FilenameHelper->WriteRPCTagsIsSet()  || m_FilenameHelper->NoDataValueIsSet()) )
     {
     typename GDALImageIO::Pointer imageIO = dynamic_cast<GDALImageIO*>(m_ImageIO.GetPointer());
 
@@ -471,6 +471,8 @@ ImageFileWriter<TInputImage>
 
     imageIO->SetOptions(m_FilenameHelper->GetgdalCreationOptions());
     imageIO->SetWriteRPCTags(m_FilenameHelper->GetWriteRPCTags());
+    if (m_FilenameHelper->NoDataValueIsSet() )
+	imageIO->SetNoDataList(m_FilenameHelper->GetNoDataList());
     }