diff --git a/dumux/linear/pdesolver.hh b/dumux/linear/pdesolver.hh
index 6f4a616787e8ae6542b973a9d6b8c34480c7ea00..2813b4d2859ccb490abdf8bac6d80a0fe334c133 100644
--- a/dumux/linear/pdesolver.hh
+++ b/dumux/linear/pdesolver.hh
@@ -111,7 +111,7 @@ public:
         Dune::Timer solveTimer(false);
         Dune::Timer updateTimer(false);
 
-        if (verbose_ && enableDynamicOutput_)
+        if (verbosity_ >= 1 && enableDynamicOutput_)
             std::cout << "Assemble: r(x^k) = dS/dt + div F - q;   M = grad r"
                       << std::flush;
 
@@ -136,7 +136,7 @@ public:
         // http://en.wikipedia.org/wiki/ANSI_escape_code
         const char clearRemainingLine[] = { 0x1b, '[', 'K', 0 };
 
-        if (verbose_ && enableDynamicOutput_)
+        if (verbosity_ >= 1 && enableDynamicOutput_)
             std::cout << "\rSolve: M deltax^k = r"
                       << clearRemainingLine << std::flush;
 
@@ -157,7 +157,7 @@ public:
         ///////////////
         // update
         ///////////////
-        if (verbose_ && enableDynamicOutput_)
+        if (verbosity_ >= 1 && enableDynamicOutput_)
             std::cout << "\rUpdate: x^(k+1) = x^k - deltax^k"
                       << clearRemainingLine << std::flush;
 
@@ -170,7 +170,7 @@ public:
             this->assembler().updateGridVariables(Backend::dofs(vars));
         updateTimer.stop();
 
-        if (verbose_)
+        if (verbosity_ >= 1)
         {
             const auto elapsedTot = assembleTimer.elapsed() + solveTimer.elapsed() + updateTimer.elapsed();
             if (enableDynamicOutput_)
@@ -214,14 +214,28 @@ public:
     /*!
      * \brief Specifies if the solver ought to be chatty.
      */
+    [[deprecated("Will be removed after release 3.9. Use setVerbosity(int).")]]
     void setVerbose(bool val)
-    { verbose_ = val; }
+    { verbosity_ = val ? 1 : 0; }
 
     /*!
      * \brief Returns true if the solver ought to be chatty.
      */
+    [[deprecated("Will be removed after release 3.9. Use int verbsity().")]]
     bool verbose() const
-    { return verbose_ ; }
+    { return verbosity_ > 0; }
+
+    /*!
+     * \brief Specifies if the solver ought to be chatty.
+     */
+    void setVerbosity(int val)
+    { verbosity_ = val; }
+
+    /*!
+     * \brief Returns true if the solver ought to be chatty.
+     */
+    int verbosity() const
+    { return verbosity_ ; }
 
     /*!
      * \brief Returns the parameter group
@@ -273,12 +287,12 @@ private:
     //! initialize the parameters by reading from the parameter tree
     void initParams_(const std::string& group = "")
     {
-        verbose_ = (Dune::MPIHelper::getCommunication().rank() == 0);
+        verbosity_ = comm_.rank() == 0 ? getParamFromGroup<int>(group, "LinearPDESolver.Verbosity", 2) : 0;
         enableDynamicOutput_ = getParamFromGroup<bool>(group, "LinearPDESolver.EnableDynamicOutput", true);
     }
 
-    //! switches on/off verbosity
-    bool verbose_;
+    //! sets verbosity-level
+    int verbosity_;
 
     //! further parameters
     bool enableDynamicOutput_;