diff --git a/Modules/Visualization/Ice/src/otbGlImageActor.cxx b/Modules/Visualization/Ice/src/otbGlImageActor.cxx
index 6e1cb6568718b3f018bae20e508b9f0e8f35bd02..f95da4257f877da2ca46469cbdbc9e5367340f84 100644
--- a/Modules/Visualization/Ice/src/otbGlImageActor.cxx
+++ b/Modules/Visualization/Ice/src/otbGlImageActor.cxx
@@ -1037,7 +1037,12 @@ void GlImageActor::UpdateResolution()
     m_CurrentResolution = newResolution;
     
     std::ostringstream extFilename;
-    extFilename<<m_FileName<<"?&resol="<<m_CurrentResolution;
+    extFilename<<m_FileName;
+    if ( m_FileName.find('?') == std::string::npos )
+      {
+      extFilename << '?';
+      }
+    extFilename<<"&resol="<<m_CurrentResolution;
 
     m_FileReader->SetFileName(extFilename.str());
     m_FileReader->GetOutput()->UpdateOutputInformation();
@@ -1180,7 +1185,12 @@ void GlImageActor::AutoColorAdjustment( double & minRed, double & maxRed,
       resol = m_AvailableResolutions.size()-1;
       }
 
-    extFilename<<m_FileName<<"?&resol="<<m_AvailableResolutions[resol];
+    extFilename<<m_FileName;
+    if ( m_FileName.find('?') == std::string::npos )
+      {
+      extFilename << '?';
+      }
+    extFilename<<"&resol="<<m_AvailableResolutions[resol];
     reader->SetFileName(extFilename.str());
 
     ExtractROIFilterType::Pointer extract = ExtractROIFilterType::New();
diff --git a/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx b/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx
index 8c27068e262bce18844d61d29d5a0707ebaba9c6..633c95605770ad16d9df1e9a86d471f40ea1c07c 100644
--- a/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx
+++ b/Modules/Visualization/Ice/src/otbNonOptGlImageActor.cxx
@@ -679,7 +679,12 @@ void NonOptGlImageActor::UpdateResolution()
   m_CurrentResolution = closest;
 
   std::ostringstream extFilename;
-  extFilename<<m_FileName<<"?&resol="<<m_CurrentResolution;
+  extFilename<<m_FileName;
+  if ( m_FileName.find('?') == std::string::npos )
+    {
+    extFilename << '?';
+    }
+  extFilename<<"&resol="<<m_CurrentResolution;
 
   // std::cout<<"Extfname = "<<extFilename.str()<<std::endl;
 
diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
index 8a9386c2ebbd08ee7d437b6163fc5315de213e1c..5a93be01cdfce1284ac949083c4331ced9f0679c 100644
--- a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
+++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx
@@ -1058,7 +1058,10 @@ MainWindow
     if( importDialog->HasSubDatasets() )
       {
       if( importDialog->exec()==QDialog::Rejected )
-	return 0;
+        {
+        delete importDialog;
+        return 0;
+        }
 
       IntVector::size_type count = 0;
       IntVector indices;
@@ -1070,12 +1073,17 @@ MainWindow
 	   ++ i )
 	count +=
 	  ImportImage(
-	    QString( "%1?&sdataidx=%2" ).arg( filename ).arg( indices[ i ] ),
+	    QString( "%1%2&sdataidx=%3" ).arg( filename ).arg( filename.count(QChar('?')) ? "" : "?" ).arg( indices[ i ] ),
 	    index + count
 	  );
 
+      delete importDialog;
       return count;
       }
+    else
+      {
+      delete importDialog;
+      }
   }
   // CDS import.
   //
diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
index 956d96906dfee243403c325336c9d7a21f49efc2..d891e8f687524d9f39a5d47d6aee028eade4c47b 100644
--- a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
+++ b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx
@@ -173,8 +173,11 @@ VectorImageModel
     );
 
     QString fname = filename;
-    
-    imageFileReader->SetFileName( QFile::encodeName( fname.append(QString("?&skipgeom=true"))).constData());
+    if (!filename.contains(QChar('?')))
+      {
+      fname.append(QChar('?'));
+      }
+    imageFileReader->SetFileName( QFile::encodeName( fname.append(QString("&skipgeom=true"))).constData());
     imageFileReader->GetOutput()->UpdateOutputInformation();
     }
 
@@ -538,7 +541,12 @@ VectorImageModel
   QString lodFilename( GetFilename() );
 
   // If model is a multi-resolution image.
-  lodFilename.append( QString( "?&resol=%1" ).arg( lod ) );
+  if (lodFilename.count(QChar('?')) == 0)
+    {
+    // the filename is not an extended filename yet
+    lodFilename.append( QChar('?') );
+    }
+  lodFilename.append( QString( "&resol=%1" ).arg( lod ) );
 
   // Update m_ImageFileReader
   m_ImageFileReader->SetFileName( QFile::encodeName( lodFilename ).constData() );
diff --git a/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx b/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx
index f8264ceddaec0fb230d7df2611756cd5ac37fd71..9f5d46f9f45c235c6c1719d2ff8c0d89ef839f7e 100644
--- a/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx
+++ b/Modules/Visualization/MonteverdiGui/src/mvdImportSubDatasetDialog.cxx
@@ -172,7 +172,15 @@ ImportSubDatasetDialog
   // Fill item-model.
   otb::GDALImageIO::Pointer gdalIO( otb::GDALImageIO::New() );
 
-  std::string fname( QFile::encodeName( filename ).constData() );
+  // Check for existing options other than sdataidx
+  int posOptions = filename.indexOf(QChar('?'));
+  int posSubDataIdx = filename.indexOf(QString("sdataidx"));
+  QString cleanFilename(filename);
+  if (posOptions > 0 && posSubDataIdx <= posOptions)
+    {
+    cleanFilename = filename.section('?',0,0);
+    }
+  std::string fname( QFile::encodeName( cleanFilename ).constData() );
 
   if( gdalIO->CanReadFile( fname.c_str() ) )
     {