diff --git a/modules/io/pymod/export_map_io.cc b/modules/io/pymod/export_map_io.cc
index 6f30e29616033f81e30b91c2cc4dbdb147895118..e2b10e158a946cb5c1a768eb843766fe14b25aaf 100644
--- a/modules/io/pymod/export_map_io.cc
+++ b/modules/io/pymod/export_map_io.cc
@@ -132,6 +132,8 @@ void export_map_io()
     .def("GetFormat", &TIF::GetFormat)
     .def("SetSigned", &TIF::SetSigned)
     .def("GetSigned", &TIF::GetSigned)
+    .def("SetBitDepth", &TIF::SetBitDepth)
+    .def("GetBitDepth", &TIF::GetBitDepth)
     .def("GetPhasecolor", &TIF::GetPhasecolor)
     .def("SetPhasecolor", &TIF::SetPhasecolor)
     .def("SetSubimage", &TIF::SetSubimage)
@@ -143,9 +145,13 @@ void export_map_io()
     .def("GetNormalizeOnSave", &PNG::GetNormalizeOnSave)
   ;
 
-  class_<DAT, bases<ImageFormatBase> >("DAT", init<bool,Endianess>((arg("normalize_on_save") = false,arg("endianess") = OST_LOCAL_ENDIAN)))
-    .def("SetNormalizeOnSave", &PNG::SetNormalizeOnSave)
-    .def("GetNormalizeOnSave", &PNG::GetNormalizeOnSave)
+  class_<DAT, bases<ImageFormatBase> >("DAT", init<bool,Format,bool,Endianess>((arg("normalize_on_save") = false,arg("format")=OST_DEFAULT_FORMAT,arg("signed")=false,arg("endianess") = OST_LOCAL_ENDIAN)))
+    .def("SetNormalizeOnSave", &DAT::SetNormalizeOnSave)
+    .def("GetNormalizeOnSave", &DAT::GetNormalizeOnSave)
+    .def("SetSigned", &DAT::SetSigned)
+    .def("GetSigned", &DAT::GetSigned)
+    .def("SetBitDepth", &DAT::SetBitDepth)
+    .def("GetBitDepth", &DAT::GetBitDepth)
   ;
 
   class_<JPK, bases<TIF> >("JPK", init<boost::logic::tribool,Format,bool,bool,int>
diff --git a/modules/io/src/img/map_io_dat_handler.cc b/modules/io/src/img/map_io_dat_handler.cc
index 988d590e5a333a8ab9a6d9ac17c175f17833d549..c2503261e5cd59aa257818b3da27d8e0e6cadfa2 100644
--- a/modules/io/src/img/map_io_dat_handler.cc
+++ b/modules/io/src/img/map_io_dat_handler.cc
@@ -17,6 +17,7 @@
 // along with this library; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
+#include <ost/stdint.hh>
 #include <boost/shared_array.hpp>
 #include <boost/filesystem/operations.hpp>
 #include <boost/filesystem/fstream.hpp>
@@ -34,11 +35,33 @@ namespace ost { namespace io {
 
 String DAT::FORMAT_STRING = "defined_dat";
 
-DAT::DAT(bool normalize_on_save, Endianess end):
-    ImageFormatBase(FORMAT_STRING)
+DAT::DAT(bool normalize_on_save, Format bit_depth, bool sign, Endianess end):
+    ImageFormatBase(FORMAT_STRING),
+    normalize_on_save_(normalize_on_save),
+    bit_depth_(bit_depth),
+    signed_(sign),
+    endianness_(end)
 {
-    normalize_on_save_ = normalize_on_save;
-    endianness_ = end;
+}
+
+Format DAT::GetBitDepth() const
+{
+  return bit_depth_;
+}
+
+void DAT::SetBitDepth (Format bitdepth)
+{
+  bit_depth_ = bitdepth;
+}
+
+bool DAT::GetSigned () const
+{
+  return signed_;
+}
+
+void DAT::SetSigned (bool sign)
+{
+  signed_ = sign;
 }
 
 Endianess DAT::GetEndianess() const
@@ -92,7 +115,7 @@ void MapIODatHandler::Import(img::MapHandle& sh, const boost::filesystem::path&
   infile.close();
 }
 
-template <int CONVERSIONTYPE>
+template <int CONVERSIONTYPE,typename DATATYPE>
 void real_filler(img::MapHandle& sh, std::istream& file)
 {
   BinaryIStream<CONVERSIONTYPE> file_bin(file);
@@ -101,7 +124,7 @@ void real_filler(img::MapHandle& sh, std::istream& file)
   img::Progress::Instance().Register(&this_dummy,size[1],100);
   for(unsigned int row=0;row<size[1];row++) {
     for(unsigned int column=0;column<size[0];column++) {
-      short value;
+      DATATYPE value;
       file_bin >> value;
       sh.SetReal(img::Point(column,row),static_cast<Real>(value));
     }
@@ -110,7 +133,7 @@ void real_filler(img::MapHandle& sh, std::istream& file)
   img::Progress::Instance().DeRegister(&this_dummy);
 }
 
-template <int CONVERSIONTYPE>
+template <int CONVERSIONTYPE,typename DATATYPE>
 void real_dumper(const img::MapHandle& sh, std::ostream& file, const DAT& formatdat)
 {
   BinaryOStream<CONVERSIONTYPE> file_bin(file);
@@ -124,7 +147,7 @@ void real_dumper(const img::MapHandle& sh, std::ostream& file, const DAT& format
     for(unsigned int row=0;row<size[1];row++) {
       for(unsigned int column=0;column<size[0];column++)
       {
-        file_bin << static_cast<short>(norm.Convert(sh.GetReal(img::Point(column,row))));
+        file_bin << static_cast<DATATYPE>(norm.Convert(sh.GetReal(img::Point(column,row))));
       }
       img::Progress::Instance().AdvanceProgress(&this_dummy);
     }
@@ -151,21 +174,168 @@ void MapIODatHandler::Import(img::MapHandle& sh, std::istream& file, const Image
   uint  filesize = end-start;
   file.seekg(curr_pos,std::ios::beg);
 
-  unsigned int size=static_cast<unsigned int>(sqrt(filesize/2.0));
-   // default origin is top-left
-  sh.Reset(img::Extent(img::Point(0,0),img::Size(size,size)), img::REAL, img::SPATIAL);
-
-  switch(formatdat.GetEndianess()) {
-  case OST_BIG_ENDIAN:
-    real_filler<OST_BIG_ENDIAN>(sh,file);
+  double datasize=1.0;
+  switch(formatdat.GetBitDepth()){
+  case OST_BIT8_FORMAT:
+  case OST_DEFAULT_FORMAT:
+    datasize=1.0;
+    break;
+  case OST_BIT16_FORMAT:
+    datasize=2.0;
     break;
-  case OST_LITTLE_ENDIAN:
-    real_filler<OST_LITTLE_ENDIAN>(sh,file);
+  case OST_BIT32_FORMAT:
+    datasize=4.0;
     break;
-  case OST_VAX_DATA:
-    real_filler<OST_VAX_DATA>(sh,file);
+  case OST_FLOAT_FORMAT:
+    datasize=sizeof(float);
     break;
- }
+  case OST_DOUBLE_FORMAT:
+    datasize=sizeof(double);
+    break;
+  }
+  unsigned int size=static_cast<unsigned int>(sqrt(filesize/datasize));
+   // default origin is top-left
+  sh.Reset(img::Extent(img::Point(0,0),img::Size(size,size)), img::REAL, img::SPATIAL);
+
+  if(formatdat.GetSigned()){
+    switch(formatdat.GetBitDepth()){
+    case OST_BIT8_FORMAT:
+    case OST_DEFAULT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,int8_t>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,int8_t>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,int8_t>(sh,file);
+        break;
+      }
+      break;
+    case OST_BIT16_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,int16_t>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,int16_t>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,int16_t>(sh,file);
+        break;
+      }
+      break;
+    case OST_BIT32_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,int32_t>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,int32_t>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,int32_t>(sh,file);
+        break;
+      }
+      break;
+    case OST_FLOAT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,float>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,float>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,float>(sh,file);
+        break;
+      }
+      break;
+    case OST_DOUBLE_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,double>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,double>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,double>(sh,file);
+        break;
+      }
+      break;
+    }
+  }else{
+    switch(formatdat.GetBitDepth()){
+    case OST_BIT8_FORMAT:
+    case OST_DEFAULT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,uint8_t>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,uint8_t>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,uint8_t>(sh,file);
+        break;
+      }
+      break;
+    case OST_BIT16_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,uint16_t>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,uint16_t>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,uint16_t>(sh,file);
+        break;
+      }
+      break;
+    case OST_BIT32_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,uint32_t>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,uint32_t>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,uint32_t>(sh,file);
+        break;
+      }
+      break;
+    case OST_FLOAT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,float>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,float>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,float>(sh,file);
+        break;
+      }
+      break;
+    case OST_DOUBLE_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_filler<OST_BIG_ENDIAN,double>(sh,file);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_filler<OST_LITTLE_ENDIAN,double>(sh,file);
+        break;
+      case OST_VAX_DATA:
+        real_filler<OST_VAX_DATA,double>(sh,file);
+        break;
+      }
+      break;
+    }
+  }
 }
 
 void MapIODatHandler::Export(const img::MapHandle& mh2,
@@ -197,17 +367,145 @@ void MapIODatHandler::Export(const img::MapHandle& sh, std::ostream& file,const
     throw IOException("DAT IO: Dat format only supports square 2D images");
   }
 
-  switch(formatdat.GetEndianess()) {
-  case OST_BIG_ENDIAN:
-    real_dumper<OST_BIG_ENDIAN>(sh,file,formatdat);
-    break;
-  case OST_LITTLE_ENDIAN:
-    real_dumper<OST_LITTLE_ENDIAN>(sh,file,formatdat);
-    break;
-  case OST_VAX_DATA:
-    real_dumper<OST_VAX_DATA>(sh,file,formatdat);
-    break;
- }
+  if(formatdat.GetSigned()){
+    switch(formatdat.GetBitDepth()){
+    case OST_BIT8_FORMAT:
+    case OST_DEFAULT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,int8_t>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,int8_t>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,int8_t>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_BIT16_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,int16_t>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,int16_t>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,int16_t>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_BIT32_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,int32_t>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,int32_t>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,int32_t>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_FLOAT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,float>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,float>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,float>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_DOUBLE_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,double>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,double>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,double>(sh,file,formatdat);
+        break;
+      }
+      break;
+    }
+  }else{
+    switch(formatdat.GetBitDepth()){
+    case OST_BIT8_FORMAT:
+    case OST_DEFAULT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,int8_t>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,int8_t>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,int8_t>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_BIT16_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,int16_t>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,int16_t>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,int16_t>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_BIT32_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,int32_t>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,int32_t>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,int32_t>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_FLOAT_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,float>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,float>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,float>(sh,file,formatdat);
+        break;
+      }
+      break;
+    case OST_DOUBLE_FORMAT:
+      switch(formatdat.GetEndianess()) {
+      case OST_BIG_ENDIAN:
+        real_dumper<OST_BIG_ENDIAN,double>(sh,file,formatdat);
+        break;
+      case OST_LITTLE_ENDIAN:
+        real_dumper<OST_LITTLE_ENDIAN,double>(sh,file,formatdat);
+        break;
+      case OST_VAX_DATA:
+        real_dumper<OST_VAX_DATA,double>(sh,file,formatdat);
+        break;
+      }
+      break;
+    }
+  }
 }
 
 }} // namespaces
diff --git a/modules/io/src/img/map_io_dat_handler.hh b/modules/io/src/img/map_io_dat_handler.hh
index 92335aa170b08ef1ac32b36b25436471810c0746..9244c705be6870ddd82f74d3a06c4127c22d0143 100644
--- a/modules/io/src/img/map_io_dat_handler.hh
+++ b/modules/io/src/img/map_io_dat_handler.hh
@@ -34,7 +34,13 @@ class DLLEXPORT_OST_IO DAT: public ImageFormatBase
 
  public:
 
-  DAT(bool normalize_on_save = true,Endianess endianness = OST_LOCAL_ENDIAN);
+  DAT(bool normalize_on_save = true, Format bit_depth = OST_DEFAULT_FORMAT, bool sign = false,Endianess endianness = OST_LOCAL_ENDIAN);
+
+  Format GetBitDepth() const;
+  void SetBitDepth ( Format bitdepth);
+
+  bool GetSigned () const;
+  void SetSigned (bool sign);
 
   Endianess GetEndianess() const;
   void SetEndianess(Endianess end);
@@ -45,6 +51,8 @@ class DLLEXPORT_OST_IO DAT: public ImageFormatBase
  private:
 
   bool normalize_on_save_;
+  Format bit_depth_;
+  bool signed_;
   Endianess endianness_;
 };
 
diff --git a/modules/io/src/img/map_io_tiff_handler.cc b/modules/io/src/img/map_io_tiff_handler.cc
index 10c1a5c3f754a2a9b70cfd9da68f704b8e43cb45..26305654bb02c52523eae0bb7a35fd84a08ddd61 100644
--- a/modules/io/src/img/map_io_tiff_handler.cc
+++ b/modules/io/src/img/map_io_tiff_handler.cc
@@ -47,21 +47,21 @@ namespace ost { namespace io {
 String TIF::FORMAT_STRING="defined_tiff";
 
  TIF::TIF(boost::logic::tribool normalize_on_save, Format bit_depth, bool sign, bool phasecolor, int subimage):
-    ImageFormatBase(FORMAT_STRING)
+  ImageFormatBase(FORMAT_STRING),
+  normalize_on_save_(normalize_on_save),
+  bit_depth_(bit_depth),
+  signed_(sign),
+  phasecolor_(phasecolor)
 {
-  normalize_on_save_ = normalize_on_save;
-  bit_depth_ = bit_depth;
-  signed_ = sign;
-  phasecolor_ = phasecolor;
 }
 
 TIF::TIF(String format_string, boost::logic::tribool  normalize_on_save, Format bit_depth,bool sign, bool phasecolor, int subimage):
-  ImageFormatBase(format_string)
+  ImageFormatBase(FORMAT_STRING),
+  normalize_on_save_(normalize_on_save),
+  bit_depth_(bit_depth),
+  signed_(sign),
+  phasecolor_(phasecolor)
 {
-  normalize_on_save_ = normalize_on_save;
-  bit_depth_ = bit_depth;
-  signed_ = sign;
-  phasecolor_ = phasecolor;
 }
 
 Format TIF::GetBitDepth() const