diff --git a/Applications/Segmentation/otbSegmentation.cxx b/Applications/Segmentation/otbSegmentation.cxx
index c88e44ebe432d8ae0f67207af67255441e1d65a8..f00a42b35c4cb80a9b7e33c8bbc52b83f8c89955 100644
--- a/Applications/Segmentation/otbSegmentation.cxx
+++ b/Applications/Segmentation/otbSegmentation.cxx
@@ -250,6 +250,9 @@ private:
     AddParameter(ParameterType_Choice,"mode.vector.outmode","Writing mode for the output vector file");
     SetParameterDescription("mode.vector.outmode","This allows to set the writing behaviour for the output vector file. Please note that the actual behaviour depends on the file format.");
 
+    AddChoice("mode.vector.outmode.ulco","Update output vector file, only allow to create new layers");
+    SetParameterDescription("mode.vector.outmode.ulco","The output vector file is opened in update mode if existing. If the output layer already exists, the application stops, leaving it untouched.");
+
     AddChoice("mode.vector.outmode.ovw","Overwrite output vector file if existing.");
     SetParameterDescription("mode.vector.outmode.ovw","If the output vector file already exists, it is completely destroyed (including all its layers) and recreated from scratch.");
 
@@ -258,9 +261,6 @@ private:
     
     AddChoice("mode.vector.outmode.ulu","Update output vector file, update existing layer");
     SetParameterDescription("mode.vector.outmode.ulu","The output vector file is opened in update mode if existing. If the output layer already exists, the new geometries are appended to the layer.");
-
-    AddChoice("mode.vector.outmode.ulco","Update output vector file, only allow to create new layers");
-    SetParameterDescription("mode.vector.outmode.ulu","The output vector file is opened in update mode if existing. If the output layer already exists, the application stops, leaving it untouched.");
     
     AddParameter(ParameterType_InputImage, "mode.vector.inmask", "Mask Image");
     SetParameterDescription("mode.vector.inmask", "Only pixels whose mask value is strictly positive will be segmented.");
@@ -447,8 +447,13 @@ private:
       // Retrieve output filename as well as layer names
       std::string dataSourceName = GetParameterString("mode.vector.out");
 
+      // Retrieve the output vector opening mode
+      std::string outmode = GetParameterString("mode.vector.outmode");
+
+      std::vector<std::string> options = GetParameterStringList("mode.vector.ogroptions");
+
       // Create the DataSource in the appropriate mode
-      if(GetParameterString("mode.vector.outmode") == "ovw")
+      if(outmode == "ovw")
         {
         // Create the datasource
         ogrDS = otb::ogr::DataSource::New(dataSourceName, otb::ogr::DataSource::Modes::Overwrite);
@@ -457,14 +462,57 @@ private:
         // datasource is blank
         layer = ogrDS->CreateLayer(GetParameterString("mode.vector.layername"),
                                    &oSRS,wkbMultiPolygon,
-                                   GetParameterStringList("mode.vector.ogroptions"));
+                                   options);
+        // And create the field
+        OGRFieldDefn field(this->GetParameterString("mode.vector.fieldname").c_str(),OFTInteger);
+        layer.CreateField(field,true);
+        }
+      else if(outmode == "ulovw")
+        {
+        // Create the datasource
+        ogrDS = otb::ogr::DataSource::New(dataSourceName, otb::ogr::DataSource::Modes::Update_LayerOverwrite);
+
+        // and create the layer since we are in overwrite mode, the
+        // datasource is blank
+        layer = ogrDS->CreateLayer(GetParameterString("mode.vector.layername"),
+                                   &oSRS,wkbMultiPolygon,
+                                   options);
+        // And create the field
+        OGRFieldDefn field(this->GetParameterString("mode.vector.fieldname").c_str(),OFTInteger);
+        layer.CreateField(field,true);
+        
+        }
+      else if(outmode == "ulu")
+        {
+        // Create the datasource
+        ogrDS = otb::ogr::DataSource::New(dataSourceName, otb::ogr::DataSource::Modes::Update_LayerUpdate);
+        // and create the layer since we are in overwrite mode, the
+        // datasource is blank
+        layer = ogrDS->CreateLayer(GetParameterString("mode.vector.layername"),
+                                   &oSRS,wkbMultiPolygon,
+                                   options);
+        // And create the field
+        OGRFieldDefn field(this->GetParameterString("mode.vector.fieldname").c_str(),OFTInteger);
+        layer.CreateField(field,true);
+
+        }
+      else if(outmode == "ulco")
+        {
+        // Create the datasource
+        ogrDS = otb::ogr::DataSource::New(dataSourceName, otb::ogr::DataSource::Modes::Update_LayerCreateOnly);
+
+        // and create the layer since we are in overwrite mode, the
+        // datasource is blank
+        layer = ogrDS->CreateLayer(GetParameterString("mode.vector.layername"),
+                                   &oSRS,wkbMultiPolygon,
+                                   options);
         // And create the field
         OGRFieldDefn field(this->GetParameterString("mode.vector.fieldname").c_str(),OFTInteger);
         layer.CreateField(field,true);
         }
       else
         {
-        otbAppLogFATAL(<<"outmode not handled yet");
+        otbAppLogFATAL(<<"outmode not handled yet: "<< outmode);
         }
       }