diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
index 4ed51d04740fba594e099cf2d3c751f7bfe7b171..7f1111939e40c1df5b14e8789c7f091d00967514 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx
@@ -40,13 +40,31 @@ QtWidgetListViewParameter::~QtWidgetListViewParameter()
 
 void QtWidgetListViewParameter::DoUpdateGUI()
 {
-  size_t numSelected = m_ListViewParam->GetSelectedItems().size();
+  bool resetNeeded = false;
+  if (m_ListViewParam->GetNbChoices() != (unsigned int) m_ListView->count())
+    {
+    resetNeeded = true;
+    }
+  else
+    {
+    for (unsigned int i = 0; i < m_ListViewParam->GetNbChoices(); ++i)
+      {
+      QString key = m_ListViewParam->GetChoiceKey(i).c_str();
+      if (key != m_ListView->item(i)->text() )
+        {
+        resetNeeded = true;
+        break;
+        }
+      }
+    }
 
-  //Clear m_ListView add re-add choices only if no items selected.
-  //Otherwise results in mantis #1025
+  // save selected choices
+  std::vector<int> selected = m_ListViewParam->GetSelectedItems();
 
-  if(numSelected < 1)
+  //Beware of mantis #1025 and #1403
+  if(resetNeeded)
     {
+    m_SelectedItems.clear();
     while(m_ListView->takeItem(0))
       {
       m_ListView->removeItemWidget( m_ListView->takeItem(0) );
@@ -60,13 +78,25 @@ void QtWidgetListViewParameter::DoUpdateGUI()
       }
     }
 
-  //I can't find any reason for calling m_ListView->setCurrentRow(value) in this
-  //case because QListWidget is a MultiSelection widget.
-  if (m_ListView->selectionMode() == QAbstractItemView::SingleSelection)
+  // test if selection has to be updated
+  if (selected != m_SelectedItems)
     {
-    unsigned int value = m_ListViewParam->GetValue( );
-    m_ListView->setCurrentRow(value);
+    for (int idx = 0; idx < m_ListView->count(); ++idx)
+      {
+      // check if this item is selected
+      bool isSelected = false;
+      for (unsigned int k = 0 ; k < selected.size() ; ++k)
+        {
+        if (selected[k] == idx)
+          {
+          isSelected = true;
+          break;
+          }
+        }
+      m_ListView->item(idx)->setSelected(isSelected);
+      }
     }
+
 }
 
 void QtWidgetListViewParameter::DoCreateWidget()
@@ -100,7 +130,7 @@ void QtWidgetListViewParameter::SelectedItems()
   m_SelectedItems.clear();
 
   // Item changed (check if selected or not)
-  for (int idx = 0; idx < m_ListView->count(); ++idx)
+  for (int idx = 0; idx < m_ListView->count() && idx < (int) m_ListViewParam->GetNbChoices(); ++idx)
     {
     if (m_ListView->item(idx)->isSelected())
       {