diff --git a/dune/common/configparser.cc b/dune/common/configparser.cc
index bb6b7b2b4bbb4ef35772042b264fd3a6af747073..dfedca30faabb6ba7688d5856e0e63236dc53237 100644
--- a/dune/common/configparser.cc
+++ b/dune/common/configparser.cc
@@ -137,7 +137,7 @@ void ConfigParser::report(const string prefix) const
   }
 }
 
-bool ConfigParser::hasKey(const string& key)
+bool ConfigParser::hasKey(const string& key) const
 {
   string::size_type dot = key.find(".");
 
@@ -147,14 +147,14 @@ bool ConfigParser::hasKey(const string& key)
     if (subs.count(prefix) == 0)
       return false;
 
-    ConfigParser& s = sub(prefix);
+    const ConfigParser& s = sub(prefix);
     return s.hasKey(key.substr(dot+1));
   }
   else
     return (values.count(key) != 0);
 }
 
-bool ConfigParser::hasSub(const string& key)
+bool ConfigParser::hasSub(const string& key) const
 {
   string::size_type dot = key.find(".");
 
@@ -164,7 +164,7 @@ bool ConfigParser::hasSub(const string& key)
     if (subs.count(prefix) == 0)
       return false;
 
-    ConfigParser& s = sub(prefix);
+    const ConfigParser& s = sub(prefix);
     return s.hasSub(key.substr(dot+1));
   }
   else
@@ -184,6 +184,19 @@ ConfigParser& ConfigParser::sub(const string& key)
     return subs[key];
 }
 
+const ConfigParser& ConfigParser::sub(const string& key) const
+{
+  string::size_type dot = key.find(".");
+
+  if (dot != string::npos)
+  {
+    const ConfigParser& s = sub(key.substr(0,dot));
+    return s.sub(key.substr(dot+1));
+  }
+  else
+    return subs.find(key)->second;
+}
+
 string& ConfigParser::operator[] (const string& key)
 {
   string::size_type dot = key.find(".");
diff --git a/dune/common/configparser.hh b/dune/common/configparser.hh
index 79e7498f1a2ca58de43b2c72333182d058e3515d..7d0076b28e33fe8bbf3389ac98154013eefcff1f 100644
--- a/dune/common/configparser.hh
+++ b/dune/common/configparser.hh
@@ -94,7 +94,7 @@ namespace Dune {
      * \param key key name
      * \return true if key exists in structure, otherwise false
      */
-    bool hasKey(const std::string& key);
+    bool hasKey(const std::string& key) const;
 
 
     /** \brief test for substructure
@@ -104,7 +104,7 @@ namespace Dune {
      * \param sub substructure name
      * \return true if substructure exists in structure, otherwise false
      */
-    bool hasSub(const std::string& sub);
+    bool hasSub(const std::string& sub) const;
 
 
     /** \brief get value reference for key
@@ -140,6 +140,14 @@ namespace Dune {
     ConfigParser& sub(const std::string& sub);
 
 
+    /** \brief get const substructure by name
+     *
+     * \param sub substructure name
+     * \return reference to substructure
+     */
+    const ConfigParser& sub(const std::string& sub) const;
+
+
     /** \brief get value as string
      *
      * Returns pure string value for given key.