diff --git a/common/configparser.cc b/common/configparser.cc
index 091563200e0cc6f889f33c427ed129e9b4d66193..dad996f8509efa6de6131d29816a80bae0eff99d 100644
--- a/common/configparser.cc
+++ b/common/configparser.cc
@@ -30,14 +30,15 @@ void ConfigParser::parseFile(std::string file)
   {
     string line;
     getline(in, line);
-    line = trim(line);
+    line = ltrim(line);
     switch (line[0]) {
     case '#' :
       break;
     case '[' :
+      line = rtrim(line);
       if (line[line.length()-1] == ']')
       {
-        prefix = trim(line.substr(1, line.length()-2));
+        prefix = rtrim(ltrim(line.substr(1, line.length()-2)));
         if (prefix != "")
           prefix += ".";
       }
@@ -46,24 +47,32 @@ void ConfigParser::parseFile(std::string file)
       string::size_type mid = line.find("=");
       if (mid != string::npos)
       {
-        string key = prefix+trim(line.substr(0, mid));
-        string value = trim(line.substr(mid+1));
+        string key = prefix+rtrim(ltrim(line.substr(0, mid)));
+        string value = ltrim(line.substr(mid+1));
 
-        // handle quoted strings
-        if (value.length()>1)
+        if (value.length()>0)
         {
-          switch (value[0]) {
-          case '\'' :
-            if (value[value.length()-1] == '\'')
-              value = value.substr(1, value.length()-2);
-            break;
-          case '"' :
-            if (value[value.length()-1] == '"')
-              value = value.substr(1, value.length()-2);
-            break;
-          default :
-            break;
+          // handle quoted strings
+          if ((value[0]=='\'')or (value[0]=='"'))
+          {
+            char quote = value[0];
+            value=value.substr(1);
+            while (*(rtrim(value).rbegin())!=quote)
+            {
+              if (not in.eof())
+              {
+                string l;
+                getline(in, l);
+                value = value+"\n"+l;
+              }
+              else
+                value = value+quote;
+            }
+            value = rtrim(value);
+            value = value.substr(0,value.length()-1);
           }
+          else
+            value = rtrim(value);
         }
 
         if (keysInFile.count(key) != 0)
@@ -116,7 +125,7 @@ void ConfigParser::report(const string prefix) const
   ValueIt vend = values.end();
 
   for(; vit!=vend; ++vit)
-    cout << prefix + vit->first << " = " << vit->second << endl;
+    cout << prefix + vit->first << " = \"" << vit->second << "\"" << endl;
 
   typedef map<string, ConfigParser>::const_iterator SubIt;
   SubIt sit = subs.begin();
@@ -284,37 +293,22 @@ namespace Dune {
 
 }  // end namespace Dune
 
-
-static inline bool is_space(char c)
+string ConfigParser::ltrim(const string& s)
 {
-  switch (c) {
-  case ' ' :
-  case '\n' :
-  case '\r' :
-    return true;
-  default :
-    return false;
-  }
+  std::size_t firstNonWS = s.find_first_not_of(" \t\n\r");
+
+  if (firstNonWS!=string::npos)
+    return s.substr(firstNonWS);
+  return string();
 }
 
-string ConfigParser::trim(const string& s) const
+string ConfigParser::rtrim(const string& s)
 {
-  string::const_iterator b = s.begin();
-  string::const_iterator e = s.end();
-
-  for ( ; ; )
-    if (b != e)
-      if (is_space(*b))
-        ++b;
-      else
-        break;
-    else
-      return string();
-
-  while (is_space(e[-1]))
-    --e;
+  std::size_t lastNonWS = s.find_last_not_of(" \t\n\r");
 
-  return string(b, e);
+  if (lastNonWS!=string::npos)
+    return s.substr(0, lastNonWS+1);
+  return string();
 }
 
 const ConfigParser::KeyVector& ConfigParser::getValueKeys() const
diff --git a/common/configparser.hh b/common/configparser.hh
index 6b19b9d97d28cd74b0cf8176e90e720693df6847..f4d8f0e58409602e3a25d8353aca41470b18ecca 100644
--- a/common/configparser.hh
+++ b/common/configparser.hh
@@ -52,6 +52,9 @@ namespace Dune {
      \endverbatim
    *
    * All keys with a common 'prefix.' belong to the same substructure called 'prefix'.
+   * Leading and trailing spaces and tabs are removed from the values unless you use
+   * single or double quotes around them.
+   * Using single or double quotes you can also have multiline values.
    *
    */
   class ConfigParser
@@ -226,9 +229,8 @@ namespace Dune {
 
     std::map<std::string, std::string> values;
     std::map<std::string, ConfigParser> subs;
-    std::string trim(const std::string& s) const;
-
-
+    static std::string ltrim(const std::string& s);
+    static std::string rtrim(const std::string& s);
   };
 } // end namespace dune