diff --git a/Code/Core/otbWrapperApplication.cxx b/Code/Core/otbWrapperApplication.cxx
index 3a9be2e9c6725b3899e3c7bbfb0d0a09cfd971c7..82deb00353e0e1bf573efc50be62d3ecf4926ac0 100644
--- a/Code/Core/otbWrapperApplication.cxx
+++ b/Code/Core/otbWrapperApplication.cxx
@@ -24,7 +24,9 @@ namespace Wrapper
 {
 
 Application::Application(): m_Name(""), m_Description("")
-{}
+{
+  m_ParameterList = ParameterList::New();
+}
 
 Application::~Application()
 {}
diff --git a/Code/Core/otbWrapperApplication.h b/Code/Core/otbWrapperApplication.h
index 448bc8ebfaf1f440e553ac0b3b81843e46eeb9b7..77a040669b38e2e9ce3b5bc9ceff81dd7b46c13e 100644
--- a/Code/Core/otbWrapperApplication.h
+++ b/Code/Core/otbWrapperApplication.h
@@ -61,7 +61,7 @@ public:
   /** Get the parameter description */
   itkGetStringMacro(Description);
 
-  ParameterList& GetParameterList()
+  ParameterList* GetParameterList()
   {
     return m_ParameterList;
   }
@@ -82,7 +82,7 @@ private:
 
   std::string m_Name;
   std::string m_Description;
-  ParameterList m_ParameterList;
+  ParameterList::Pointer m_ParameterList;
 
 }; //end class
 
diff --git a/Code/Core/otbWrapperParameterList.h b/Code/Core/otbWrapperParameterList.h
index 830283f69a4727d9df53b9804b26dbca4a92b781..89bccf1b613fe7c77a211c0117cdbc8c6c8d1750 100644
--- a/Code/Core/otbWrapperParameterList.h
+++ b/Code/Core/otbWrapperParameterList.h
@@ -27,36 +27,43 @@ namespace otb
 namespace Wrapper
 {
 
-// We'll see if we need more than that later...
-typedef std::vector<Parameter::Pointer> ParameterList;
-
 /**
  * \class WrapperParameterList
  */
-
-/*
-class ITK_EXPORT ParameterList : public itk::Object
+class ITK_EXPORT ParameterList
+  : public Parameter
 {
 public:
   typedef ParameterList                        Self;
-  typedef itk::Object                          Superclass;
+  typedef Parameter                            Superclass;
   typedef itk::SmartPointer<Self>              Pointer;
   typedef itk::SmartPointer<const Self>        ConstPointer;
+
   typedef Parameter                            ParameterType;
 
   itkNewMacro(Self);
 
-  itkTypeMacro(ParameterList,itk::Object);
+  itkTypeMacro(ParameterList,Parameter);
 
-  void AddParameter();
+  void AddParameter(ParameterType::Pointer p)
+  {
+    m_ParameterList.push_back(p);
+  }
 
-  ParameterType * GetParameter(std::string & key);
+  ParameterType::Pointer GetParameter(unsigned int i)
+  {
+    return m_ParameterList[i];
+  }
 
-  std::vector<Parameter::Pointer>& GetList();
+  unsigned int GetNumberOfParameters()
+  {
+    m_ParameterList.size();
+  }
 
 protected:
   ParameterList()
   {}
+
   virtual ~ParameterList()
   {}
 
@@ -67,8 +74,8 @@ private:
   std::vector<Parameter::Pointer> m_ParameterList;
 
 };
-*/
+
 }
 }
 
-#endif // __otbWrapperParameter_h
+#endif
diff --git a/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterFactory.cxx b/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterFactory.cxx
index bdce1cd02d7f02b36648e0239b5fe04981e3eabb..e1a7c421233c5f0e4f8aecbc345a84e9fb130982 100644
--- a/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterFactory.cxx
+++ b/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterFactory.cxx
@@ -22,6 +22,7 @@
 #include "otbWrapperQtWidgetFloatParameter.h"
 #include "otbWrapperQtWidgetStringParameter.h"
 #include "otbWrapperQtWidgetChoiceParameter.h"
+#include "otbWrapperQtWidgetParameterGroup.h"
 
 namespace otb
 {
@@ -40,14 +41,14 @@ public:
 
   static QWidget* Create( Parameter* param )
   {
-  QWidget* widget = 0;
-  TParameterType* specificParam = dynamic_cast<TParameterType *>(param);
-
-  if (specificParam)
-    {
-    widget = new TQtWidget(specificParam);
-    }
-  return widget;
+    QWidget* widget = 0;
+    TParameterType* specificParam = dynamic_cast<TParameterType *>(param);
+
+    if (specificParam)
+      {
+      widget = new TQtWidget(specificParam);
+      }
+    return widget;
   }
 };
 
@@ -70,6 +71,7 @@ QtWidgetParameterFactory::CreateQtWidget( Parameter* param )
   typedef QtWidgetParameterGenericFactory<FloatParameter, QtWidgetFloatParameter>   FloatWidgetFactory;
   typedef QtWidgetParameterGenericFactory<StringParameter, QtWidgetStringParameter> StringWidgetFactory;
   typedef QtWidgetParameterGenericFactory<ChoiceParameter, QtWidgetChoiceParameter> ChoiceWidgetFactory;
+  typedef QtWidgetParameterGenericFactory<ParameterList, QtWidgetParameterGroup> GroupWidgetFactory;
 
   if ( EmptyWidgetFactory::CanCreate(param) )
     {
@@ -91,6 +93,10 @@ QtWidgetParameterFactory::CreateQtWidget( Parameter* param )
     {
     widget = StringWidgetFactory::Create(param);
     }
+  else if ( GroupWidgetFactory::CanCreate(param) )
+    {
+    widget = GroupWidgetFactory::Create(param);
+    }
 
   return widget;
 }
diff --git a/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.cxx b/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.cxx
index b623c7f24d20cf5aee633752d8fa1bfa37b13632..f157e0ff21c9d4c31d01511fe796acd101f82aa5 100644
--- a/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.cxx
+++ b/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.cxx
@@ -24,7 +24,7 @@ namespace otb
 namespace Wrapper
 {
 
-QtWidgetParameterGroup::QtWidgetParameterGroup(ParameterList paramList)
+QtWidgetParameterGroup::QtWidgetParameterGroup(ParameterList::Pointer paramList)
 : m_ParamList(paramList)
 {
   this->CreateWidget();
@@ -41,16 +41,13 @@ void QtWidgetParameterGroup::CreateWidget()
   gridLayout->setSpacing(1);
   gridLayout->setContentsMargins(0,0,0,0);
 
-  ParameterList::const_iterator it  = m_ParamList.begin();
-  ParameterList::const_iterator end = m_ParamList.end();
-
-  unsigned int i = 0;
-  for (; it != end; ++it, ++i)
+  unsigned int nbParams = m_ParamList->GetNumberOfParameters();
+  for (unsigned int i = 0; i < nbParams; ++i)
     {
-    QWidget* label = new QtWidgetParameterLabel( *it );
+    Parameter* param = m_ParamList->GetParameter(i);
+    QWidget* label = new QtWidgetParameterLabel( param );
     gridLayout->addWidget(label, i, 0);
-
-    QWidget* specificWidget = QtWidgetParameterFactory::CreateQtWidget( *it );
+    QWidget* specificWidget = QtWidgetParameterFactory::CreateQtWidget( param );
     gridLayout->addWidget(specificWidget, i, 1);
     }
 
diff --git a/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.h b/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.h
index d316a4481a42d8b07eca3e75d761b0f40031a60c..68f8a8b5ee0da0dba7f56b1723cc274744201f31 100644
--- a/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.h
+++ b/Code/Wrappers/QtWidget/otbWrapperQtWidgetParameterGroup.h
@@ -33,7 +33,7 @@ class QtWidgetParameterGroup : public QWidget
 {
   Q_OBJECT
 public:
-  QtWidgetParameterGroup(ParameterList);
+  QtWidgetParameterGroup(ParameterList::Pointer);
   virtual ~QtWidgetParameterGroup();
 
 private:
@@ -42,7 +42,7 @@ private:
 
   void CreateWidget();
 
-  ParameterList m_ParamList;
+  ParameterList::Pointer m_ParamList;
 
 };
 
diff --git a/Testing/otbWrapperParameterListTest.cxx b/Testing/otbWrapperParameterListTest.cxx
index bd5781aaa6e7e0eaf2b86f6a02762be41dd337fd..f74a32a509ff0ea43ba4597a1c5b91f9d67823a1 100644
--- a/Testing/otbWrapperParameterListTest.cxx
+++ b/Testing/otbWrapperParameterListTest.cxx
@@ -24,7 +24,7 @@
 int otbWrapperParameterListNew(int argc, char* argv[])
 {
   typedef otb::Wrapper::ParameterList ParameterListType;
-  ParameterListType parameters;
+  ParameterListType::Pointer parameters = ParameterListType::New();
 
   //std::cout << parameter << std::endl;
 
diff --git a/Testing/otbWrapperQtWidgetParameterFactory.cxx b/Testing/otbWrapperQtWidgetParameterFactory.cxx
index 019094da3d4fa5fa0255d31da8c7b54ced83c1cd..61a49dc665c287568ce866d06ae2d51d34d3efc1 100644
--- a/Testing/otbWrapperQtWidgetParameterFactory.cxx
+++ b/Testing/otbWrapperQtWidgetParameterFactory.cxx
@@ -129,14 +129,63 @@ int otbWrapperQtWidgetParameterGroup(int argc, char* argv[])
   stringParam->SetKey("string");
   stringParam->SetValue("test value");
 
-  otb::Wrapper::ParameterList list;
-  list.push_back((otb::Wrapper::Parameter*)intParam);
-  list.push_back((otb::Wrapper::Parameter*)floatParam);
-  list.push_back((otb::Wrapper::Parameter*)emptyParam);
-  list.push_back((otb::Wrapper::Parameter*)choiceParam);
-  list.push_back((otb::Wrapper::Parameter*)stringParam);
-
-  QWidget * group = new otb::Wrapper::QtWidgetParameterGroup(list);
+  otb::Wrapper::ParameterList::Pointer list = otb::Wrapper::ParameterList::New();
+  list->AddParameter(otb::Wrapper::Parameter::Pointer(intParam.GetPointer()));
+  list->AddParameter(otb::Wrapper::Parameter::Pointer(floatParam.GetPointer()));
+  list->AddParameter(otb::Wrapper::Parameter::Pointer(emptyParam.GetPointer()));
+  list->AddParameter(otb::Wrapper::Parameter::Pointer(choiceParam.GetPointer()));
+  list->AddParameter(otb::Wrapper::Parameter::Pointer(stringParam.GetPointer()));
+
+  otb::Wrapper::IntParameter::Pointer   intParam2 = otb::Wrapper::IntParameter::New();
+  otb::Wrapper::FloatParameter::Pointer floatParam2 = otb::Wrapper::FloatParameter::New();
+  otb::Wrapper::EmptyParameter::Pointer emptyParam2 = otb::Wrapper::EmptyParameter::New();
+  otb::Wrapper::ChoiceParameter::Pointer choiceParam2 = otb::Wrapper::ChoiceParameter::New();
+  otb::Wrapper::StringParameter::Pointer stringParam2 = otb::Wrapper::StringParameter::New();
+  intParam2->SetName("Int parameter");
+  intParam2->SetDescription("This is an int parameter");
+  intParam2->SetKey("int");
+  intParam2->SetDefaultValue(10);
+  intParam2->SetValue(5);
+  intParam2->SetMinimumValue(-10);
+  intParam2->SetMaximumValue(10);
+
+  floatParam2->SetName("Float parameter");
+  floatParam2->SetDescription("This is an float parameter");
+  floatParam2->SetKey("float");
+  floatParam2->SetDefaultValue(0.567);
+  floatParam2->SetValue(0.21);
+  floatParam2->SetMinimumValue(-3.75);
+  floatParam2->SetMaximumValue(4.97);
+
+  emptyParam2->SetName("Empty parameter");
+  emptyParam2->SetDescription("This is an empty parameter");
+  emptyParam2->SetKey("empty");
+
+  choiceParam2->SetName("Choice parameter");
+  choiceParam2->SetDescription("This is an choice parameter");
+  choiceParam2->SetKey("choice");
+  choiceParam2->AddChoice("choice1", 0);
+  choiceParam2->AddChoice("choice2", 0);
+  choiceParam2->AddChoice("choice3", 0);
+
+  stringParam2->SetName("String parameter");
+  stringParam2->SetDescription("This is a string parameter");
+  stringParam2->SetKey("string");
+  stringParam2->SetValue("test value");
+
+  otb::Wrapper::ParameterList::Pointer list2 = otb::Wrapper::ParameterList::New();
+  list2->SetName("Group parameter");
+  list2->SetDescription("This is a group parameter");
+  list2->SetKey("group");
+
+  list2->AddParameter(otb::Wrapper::Parameter::Pointer(intParam2.GetPointer()));
+  list2->AddParameter(otb::Wrapper::Parameter::Pointer(floatParam2.GetPointer()));
+  list2->AddParameter(otb::Wrapper::Parameter::Pointer(emptyParam2.GetPointer()));
+  list2->AddParameter(otb::Wrapper::Parameter::Pointer(choiceParam2.GetPointer()));
+  list2->AddParameter(otb::Wrapper::Parameter::Pointer(stringParam2.GetPointer()));
+  list2->AddParameter(otb::Wrapper::Parameter::Pointer(list.GetPointer()));
+
+  QWidget * group = new otb::Wrapper::QtWidgetParameterGroup(list2);
 
   if(group)
     {