diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index ece150274243e2b84bdcdb5282f331820ca70151..5bd3397a415b37332beea489816d6351d6fdc0cb 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -77,17 +77,6 @@ static int vsnprintf(char *str, size_t size, const char *fmt, va_list ap)
 
 void Msg::Init(int argc, char **argv)
 {
-  int sargc = argc;
-  char **sargv = argv;
-  for(int i = 0; i < argc; i++){
-    std::string val(argv[i]);
-    if(val == "info" || val == "-info" ||
-       val == "help" || val == "-help"){
-      sargc = 0;
-      sargv = 0;
-      break;
-    }
-  }
 #if defined(HAVE_MPI)
   int flag;
   MPI_Initialized(&flag);
@@ -97,7 +86,16 @@ void Msg::Init(int argc, char **argv)
   MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
 #endif
 #if defined(HAVE_PETSC)
+  // prune argv from stuff that confuses PETSc
+  int sargc = 0;
+  char **sargv = new char*[argc];
+  for(int i = 0; i < argc; i++){
+    std::string val(argv[i]);
+    if(val != "-info" && val != "-help" && val != "-v")
+      sargv[sargc++] = argv[i];
+  }
   PetscInitialize(&sargc, &sargv, PETSC_NULL, PETSC_NULL);
+  delete [] sargv;
   PetscPopSignalHandler();
 #endif
 #if defined(HAVE_SLEPC)