diff --git a/test/porousmediumflow/2p/sequential/test_3d2p.cc b/test/porousmediumflow/2p/sequential/test_3d2p.cc
index 404d1f82d77abfb9b23e3434e5a6f270c4d87435..ba5e520b9374238e44e2681db25aba7480082f73 100644
--- a/test/porousmediumflow/2p/sequential/test_3d2p.cc
+++ b/test/porousmediumflow/2p/sequential/test_3d2p.cc
@@ -25,8 +25,11 @@
 
 #if HAVE_DUNE_ALUGRID
 
-#include "test_3d2pproblem.hh"
 #include <dumux/common/start.hh>
+#include <dumux/common/defaultusagemessage.hh>
+#include <dumux/common/parameterparser.hh>
+
+#include "test_3d2pproblem.hh"
 
 ////////////////////////
 // the main function
@@ -62,110 +65,105 @@ void usage(const char *progName, const std::string &errorMsg)
 
 int main(int argc, char** argv)
 {
-    Dune::ParameterTree paramTree;
-    std::string s(Dumux::readOptions_(argc, argv, paramTree));
-    if (s.empty())
-    {
-        if (paramTree.hasKey("ModelType"))
+    using namespace Dumux;
+
+    try {
+
+        Dune::ParameterTree paramTree;
+        // if the user just wanted to see the help / usage message show usage and stop program
+        if(!ParameterParser::parseCommandLineArguments(argc, argv, paramTree, usage))
         {
-            std::string modelType(paramTree.get<std::string>("ModelType"));
+            usage(argv[0], defaultUsageMessage(argv[0]));
+            return 0;
+        }
+
+        const std::string modelType(paramTree.get<std::string>("ModelType", "MPFAL"));
 
-            if (modelType == "FV")
-            {
-                typedef TTAG(FVTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used standard finite volume model\n";
-                return startReturn;
-            }
-            else if (modelType == "FVAdaptive")
-            {
-                typedef TTAG(FVAdaptiveTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used adaptive finite volume model\n";
-                return startReturn;
-            }
-            else if (modelType == "MPFAL")
-            {
-                typedef TTAG(MPFALTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used finite volume MPFA l-method model\n";
-                return startReturn;
-            }
-            else if (modelType == "MPFALAdaptive")
-            {
-                typedef TTAG(MPFALAdaptiveTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used adaptive finite volume MPFA l-method model\n";
-                return startReturn;
-            }
+        if (modelType == "FV")
+        {
+            using ProblemTypeTag = TTAG(FVTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Standard finite volume TPFA model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "FVAdaptive")
+        {
+            using ProblemTypeTag = TTAG(FVAdaptiveTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Adapative finite volume TPFA model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "MPFAL")
+        {
+            using ProblemTypeTag = TTAG(MPFALTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Standard finite volume MPFA-L model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "MPFALAdaptive")
+        {
+            using ProblemTypeTag = TTAG(MPFALAdaptiveTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Adapative finite volume MPFA-L model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
 #if PROBLEM != 1
-            else if (modelType == "Mimetic")
-            {
-                typedef TTAG(MimeticTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used mimetic finite difference model\n";
-                return startReturn;
-            }
-            else if (modelType == "MimeticAdaptive")
-            {
-                typedef TTAG(MimeticAdaptiveTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used adaptive mimetic finite difference model\n";
-                return startReturn;
-            }
-#endif
-            else
-            {
-                typedef TTAG(MPFALTwoPTestProblem) ProblemTypeTag;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Unknwon model type "<<modelType<<" specified\n";
-                std::cout<<"Default to finite volume MPFA l-method model\n";
-                return startReturn;
-            }
+        else if (modelType == "Mimetic")
+        {
+            using ProblemTypeTag = TTAG(MimeticTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Standard mimetic finite difference model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
         }
+        else if (modelType == "MimeticAdaptive")
+        {
+            using ProblemTypeTag = TTAG(MimeticAdaptiveTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Adaptive mimetic finite difference model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+#endif
         else
         {
-            typedef TTAG(MPFALTwoPTestProblem) ProblemTypeTag;
-            int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-            std::cout<<"######################################################\n";
-            std::cout<<"No model type specified\n";
-            std::cout<<"Default to finite volume MPFA l-method model\n";
-            return startReturn;
+            using ProblemTypeTag = TTAG(MPFALTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Unknown model type " << modelType << ", default to" << std::endl;
+            std::cout<<"Standard finite volume MPFA-L model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
         }
     }
-    else
-    {
-        typedef TTAG(MPFALTwoPTestProblem) ProblemTypeTag;
-        int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-        std::cout<<"######################################################\n";
-        std::cout<<s<<" is not a valid model type specification!\n";
-        std::cout<<"Default to finite volume MPFA l-method model\n";
-        return startReturn;
+    catch (ParameterException &e) {
+        std::cerr << std::endl << e << ". Abort!" << std::endl;
+        return 1;
+    }
+    catch (Dune::Exception &e) {
+        std::cerr << "Dune reported error: " << e << std::endl;
+        return 3;
+    }
+    catch (...) {
+        std::cerr << "Unknown exception thrown!\n";
+        return 4;
     }
 
     return 0;
diff --git a/test/porousmediumflow/2p/sequential/test_mpfa2p.cc b/test/porousmediumflow/2p/sequential/test_mpfa2p.cc
index 01b4cf25e99d29df01ba8c2f811537fd36f37ec4..6dea810ad3459e7a0ed5a575c01d1a9bb300d148 100644
--- a/test/porousmediumflow/2p/sequential/test_mpfa2p.cc
+++ b/test/porousmediumflow/2p/sequential/test_mpfa2p.cc
@@ -25,8 +25,11 @@
 
 #if HAVE_UG
 
-#include "test_mpfa2pproblem.hh"
 #include <dumux/common/start.hh>
+#include <dumux/common/defaultusagemessage.hh>
+#include <dumux/common/parameterparser.hh>
+
+#include "test_mpfa2pproblem.hh"
 
 ////////////////////////
 // the main function
@@ -53,98 +56,97 @@ void usage(const char *progName, const std::string &errorMsg)
 
 int main(int argc, char** argv)
 {
-    Dune::ParameterTree paramTree;
-    std::string s(Dumux::readOptions_(argc, argv, paramTree));
-    if (s.empty())
-    {
-        if (paramTree.hasKey("ModelType"))
+    using namespace Dumux;
+
+    try {
+
+        Dune::ParameterTree paramTree;
+        // if the user just wanted to see the help / usage message show usage and stop program
+        if(!ParameterParser::parseCommandLineArguments(argc, argv, paramTree, usage))
         {
-            std::string modelType(paramTree.get<std::string>("ModelType"));
+            usage(argv[0], defaultUsageMessage(argv[0]));
+            return 0;
+        }
+
+        const std::string modelType(paramTree.get<std::string>("ModelType", "MPFAL"));
 
-            if (modelType == "FV")
-            {
-                typedef TTAG(FVTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used standard finite volume model\n";
-                return startReturn;
-            }
-            else if (modelType == "FVAdaptive")
-            {
-                typedef TTAG(FVAdaptiveTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used adaptive finite volume model\n";
-                return startReturn;
-            }
-            else if (modelType == "MPFAO")
-            {
-                typedef TTAG(MPFAOTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used finite volume MPFA o-method model\n";
-                return startReturn;
-            }
-            else if (modelType == "MPFAL")
-            {
-                typedef TTAG(MPFALTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used finite volume MPFA l-method model\n";
-                return startReturn;
-            }
-            else if (modelType == "MPFALAdaptive")
-            {
-                typedef TTAG(MPFALAdaptiveTwoPTestProblem) ProblemTypeTag;
-                typedef GET_PROP(ProblemTypeTag, ParameterTree) ParamTree;
-                Dune::ParameterTree &rt = ParamTree::runTimeParams();
-                rt["ModelType"]=modelType;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Used adaptive finite volume MPFA l-method model\n";
-                return startReturn;
-            }
-            else
-            {
-                typedef TTAG(MPFAOTwoPTestProblem) ProblemTypeTag;
-                int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-                std::cout<<"######################################################\n";
-                std::cout<<"Unknwon model type "<<modelType<<" specified\n";
-                std::cout<<"Default to finite volume MPFA o-method model\n";
-                return startReturn;
-            }
+        if (modelType == "FV")
+        {
+            using ProblemTypeTag = TTAG(FVTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Standard finite volume TPFA model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "FVAdaptive")
+        {
+            using ProblemTypeTag = TTAG(FVAdaptiveTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Adaptive finite volume TPFA model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "MPFAO")
+        {
+            using ProblemTypeTag = TTAG(MPFAOTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Standard finite volume MPFA-O model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "MPFAL")
+        {
+            using ProblemTypeTag = TTAG(MPFALTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Unknown model type " << modelType << ", default to" << std::endl;
+            std::cout<<"Standard finite volume MPFA-L model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
+        }
+        else if (modelType == "MPFALAdaptive")
+        {
+            using ProblemTypeTag = TTAG(MPFALAdaptiveTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Adaptive finite volume MPFA-L model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
         }
         else
         {
-            typedef TTAG(MPFAOTwoPTestProblem) ProblemTypeTag;
-            int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-            std::cout<<"######################################################\n";
-            std::cout<<"No model type specified\n";
-            std::cout<<"Default to finite volume MPFA o-method model\n";
-            return startReturn;
+            using ProblemTypeTag = TTAG(MPFAOTwoPTestProblem);
+            // avoid unused parameter message
+            GET_PROP(ProblemTypeTag, ParameterTree)::runTimeParams()["ModelType"] = modelType;
+            std::cout<<"##########################################" << std::endl;
+            std::cout<<"Unknown model type " << modelType << ", default to" << std::endl;
+            std::cout<<"Standard finite volume MPFA-O model" << std::endl;
+            std::cout<<"##########################################" << std::endl;
+            return start<ProblemTypeTag>(argc, argv, usage);
         }
     }
-    else
-    {
-        typedef TTAG(MPFAOTwoPTestProblem) ProblemTypeTag;
-        int startReturn =  Dumux::start<ProblemTypeTag>(argc, argv, usage);
-        std::cout<<"######################################################\n";
-        std::cout<<s<<" is not a valid model type specification!\n";
-        std::cout<<"Default to finite volume MPFA o-method model\n";
-        return startReturn;
+    catch (ParameterException &e) {
+        std::cerr << std::endl << e << ". Abort!" << std::endl;
+        return 1;
+    }
+    catch (Dune::Exception &e) {
+        std::cerr << "Dune reported error: " << e << std::endl;
+        return 3;
     }
+    catch (...) {
+        std::cerr << "Unknown exception thrown!\n";
+        return 4;
+    }
+
+    return 0;
 }
 
 #else