diff --git a/Modules/Applications/AppDimensionalityReduction/include/otbDimensionalityReductionTrainSOM.txx b/Modules/Applications/AppDimensionalityReduction/include/otbDimensionalityReductionTrainSOM.txx
index 17067cc4bddbc02411d13a20a5cfd2173894faec..51cdd9e1acf1ededba9b54f93260e10c16962572 100644
--- a/Modules/Applications/AppDimensionalityReduction/include/otbDimensionalityReductionTrainSOM.txx
+++ b/Modules/Applications/AppDimensionalityReduction/include/otbDimensionalityReductionTrainSOM.txx
@@ -34,62 +34,47 @@ TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>
 {
   AddChoice("algorithm.som", "OTB SOM");
   SetParameterDescription("algorithm.som",
-                          "This group of parameters allows setting SOM parameters. "
-                          );
-
-  AddParameter(ParameterType_Int, "algorithm.som.dim","Dimension of the map");
-  SetParameterDescription("algorithm.som.dim","Dimension of the SOM map.");
-  
-  AddParameter(ParameterType_StringList ,  "algorithm.som.s",   "Size");
-    SetParameterDescription("algorithm.som.s", "Size of the SOM map");
-    MandatoryOff("algorithm.som.s");
-    
-  AddParameter(ParameterType_StringList ,  "algorithm.som.n",   "Size Neighborhood");
-    SetParameterDescription("algorithm.som.n", "Size of the initial neighborhood in the SOM map");
-    MandatoryOff("algorithm.som.n");
-    
-    AddParameter(ParameterType_Int,  "algorithm.som.sx",   "SizeX");
-    SetParameterDescription("algorithm.som.sx", "X size of the SOM map");
-    MandatoryOff("algorithm.som.sx");
-
-    AddParameter(ParameterType_Int,  "algorithm.som.sy",   "SizeY");
-    SetParameterDescription("algorithm.som.sy", "Y size of the SOM map");
-    MandatoryOff("algorithm.som.sy");
-
-    AddParameter(ParameterType_Int,  "algorithm.som.nx",   "NeighborhoodX");
-    SetParameterDescription("algorithm.som.nx", "X size of the initial neighborhood in the SOM map");
-    MandatoryOff("algorithm.som.nx");
-
-    AddParameter(ParameterType_Int,  "algorithm.som.ny",   "NeighborhoodY");
-    SetParameterDescription("algorithm.som.ny", "Y size of the initial neighborhood in the SOM map");
-    MandatoryOff("algorithm.som.nx");
-
-    AddParameter(ParameterType_Int,  "algorithm.som.ni",   "NumberIteration");
-    SetParameterDescription("algorithm.som.ni", "Number of iterations for SOM learning");
-    MandatoryOff("algorithm.som.ni");
-
-    AddParameter(ParameterType_Float,  "algorithm.som.bi",   "BetaInit");
-    SetParameterDescription("algorithm.som.bi", "Initial learning coefficient");
-    MandatoryOff("algorithm.som.bi");
-
-    AddParameter(ParameterType_Float,  "algorithm.som.bf",   "BetaFinal");
-    SetParameterDescription("algorithm.som.bf", "Final learning coefficient");
-    MandatoryOff("algorithm.som.bf");
-
-    AddParameter(ParameterType_Float,  "algorithm.som.iv",   "InitialValue");
-    SetParameterDescription("algorithm.som.iv", "Maximum initial neuron weight");
-    MandatoryOff("algorithm.som.iv");
-    
-    SetDefaultParameterInt("algorithm.som.sx", 32);
-    SetDefaultParameterInt("algorithm.som.sy", 32);
-    SetDefaultParameterInt("algorithm.som.nx", 10);
-    SetDefaultParameterInt("algorithm.som.ny", 10);
-    SetDefaultParameterInt("algorithm.som.ni", 5);
-    SetDefaultParameterFloat("algorithm.som.bi", 1.0);
-    SetDefaultParameterFloat("algorithm.som.bf", 0.1);
-    SetDefaultParameterFloat("algorithm.som.iv", 10.0);
-
- 
+    "This group of parameters allows setting SOM parameters. ");
+
+  AddParameter(ParameterType_StringList , "algorithm.som.s", "Map size");
+  SetParameterDescription("algorithm.som.s", "Sizes of the SOM map (one per "
+    "dimension). For instance, [12;15] means a 2D map of size 12x15. Support"
+    "2D to 5D maps.");
+  MandatoryOff("algorithm.som.s");
+
+  AddParameter(ParameterType_StringList , "algorithm.som.n", "Neighborhood sizes");
+  SetParameterDescription("algorithm.som.n", "Sizes of the initial neighborhood "
+    "in the SOM map (one per dimension). The number of sizes should be the same"
+    " as the map sizes");
+  MandatoryOff("algorithm.som.n");
+
+  AddParameter(ParameterType_Int, "algorithm.som.ni", "NumberIteration");
+  SetParameterDescription("algorithm.som.ni", "Number of iterations for SOM learning");
+  MandatoryOff("algorithm.som.ni");
+
+  AddParameter(ParameterType_Float, "algorithm.som.bi", "BetaInit");
+  SetParameterDescription("algorithm.som.bi", "Initial learning coefficient");
+  MandatoryOff("algorithm.som.bi");
+
+  AddParameter(ParameterType_Float, "algorithm.som.bf", "BetaFinal");
+  SetParameterDescription("algorithm.som.bf", "Final learning coefficient");
+  MandatoryOff("algorithm.som.bf");
+
+  AddParameter(ParameterType_Float, "algorithm.som.iv", "InitialValue");
+  SetParameterDescription("algorithm.som.iv", "Maximum initial neuron weight");
+  MandatoryOff("algorithm.som.iv");
+
+  std::vector<std::string> size(2, std::string("10"));
+  std::vector<std::string> radius(2, std::string("3"));
+  SetParameterStringList("algorithm.som.s", size, false);
+  SetParameterStringList("algorithm.som.n", radius, false);
+  DisableParameter("algorithm.som.s");
+  DisableParameter("algorithm.som.n");
+
+  SetDefaultParameterInt("algorithm.som.ni", 5);
+  SetDefaultParameterFloat("algorithm.som.bi", 1.0);
+  SetDefaultParameterFloat("algorithm.som.bf", 0.1);
+  SetDefaultParameterFloat("algorithm.som.iv", 10.0);
 }
 
 template <class TInputValue, class TOutputValue>
@@ -98,8 +83,8 @@ TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>
 ::BeforeTrainSOM(typename ListSampleType::Pointer trainingListSample,
         std::string modelPath)
 {
-  int SomDim = GetParameterInt("algorithm.som.dim");
-  std::cout << SomDim << std::endl;
+  std::vector<std::string> s = GetParameterStringList("algorithm.som.s");
+  int SomDim = s.size();
 
   if(SomDim == 2)
     {
@@ -123,10 +108,11 @@ TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>
     {
     typedef otb::SOMModel<InputValueType, 5> SOM5DModelType;
     TrainSOM<SOM5DModelType >(trainingListSample,modelPath);
-    }   
+    }
   if(SomDim > 5 || SomDim < 2)
     {
-    std::cerr << "k : invalid dimension" << std::endl;
+    otbAppLogFATAL(<< "Invalid number of dimensions : " << SomDim <<
+      ". Only support 2, 3, 4 or 5 dimensions");
     }
 }
 
@@ -136,26 +122,28 @@ void TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>
 ::TrainSOM(typename ListSampleType::Pointer trainingListSample,std::string modelPath)
 {
   typename TSOM::Pointer dimredTrainer = TSOM::New();
-  unsigned int dim = dimredTrainer->GetDimension();
-  std::cout << dim << std::endl;
   dimredTrainer->SetNumberOfIterations(GetParameterInt("algorithm.som.ni"));
   dimredTrainer->SetBetaInit(GetParameterFloat("algorithm.som.bi"));
   dimredTrainer->SetWriteMap(true);
   dimredTrainer->SetBetaEnd(GetParameterFloat("algorithm.som.bf"));
   dimredTrainer->SetMaxWeight(GetParameterFloat("algorithm.som.iv"));
   typename TSOM::SizeType size;
-  std::vector<std::basic_string<char>> s= GetParameterStringList("algorithm.som.s");
-  for (unsigned int i=0; i<dim; i++)
+  std::vector<std::string> s = GetParameterStringList("algorithm.som.s");
+  for (unsigned int i=0; i<s.size(); i++)
     {
-    size[i]=std::stoi(s[i]);
+    size[i]=boost::lexical_cast<unsigned int>(s[i]);
     }
 
   dimredTrainer->SetMapSize(size);
   typename TSOM::SizeType radius;
-  std::vector<std::basic_string<char>> n= GetParameterStringList("algorithm.som.n");
-  for (unsigned int i=0; i<dim; i++)
+  std::vector<std::string> n = GetParameterStringList("algorithm.som.n");
+  if (n.size() != s.size())
+    {
+    otbAppLogFATAL(<< "Wrong number of neighborhood radii : expected "<< s.size() << " ; got "<< n.size());
+    }
+  for (unsigned int i=0; i < n.size(); i++)
     {
-    radius[i]=std::stoi(n[i]);
+    radius[i]=boost::lexical_cast<unsigned int>(n[i]);
     }
   dimredTrainer->SetNeighborhoodSizeInit(radius);
   dimredTrainer->SetInputListSample(trainingListSample);