diff --git a/dune/solvers/CMakeLists.txt b/dune/solvers/CMakeLists.txt
index 40702b0301091692ead4c61160aa645898c7c273..ea0ac135d5a20394f1d9fa8cd9ddf89ea797ae08 100644
--- a/dune/solvers/CMakeLists.txt
+++ b/dune/solvers/CMakeLists.txt
@@ -6,6 +6,11 @@ add_subdirectory("solvers")
 add_subdirectory("test")
 add_subdirectory("transferoperators")
 
+dune_add_library("dunesolvers"
+    solvers/criterion.cc)
+
+dune_register_package_flags(LIBRARIES)
+
 install(FILES
     computeenergy.hh
     DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/solvers)
diff --git a/dune/solvers/solvers/criterion.cc b/dune/solvers/solvers/criterion.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ee361a826d711b2e4f7e1dab15b02941e1556907
--- /dev/null
+++ b/dune/solvers/solvers/criterion.cc
@@ -0,0 +1,57 @@
+// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=8 sw=2 sts=2:
+
+#include <config.h>
+
+#include <tuple>
+
+#include <dune/solvers/solvers/criterion.hh>
+
+
+Dune::Solvers::Criterion::Result
+Dune::Solvers::Criterion::operator()() const
+{
+  return f_();
+}
+
+std::string
+Dune::Solvers::Criterion::header() const
+{
+  return header_;
+}
+
+Dune::Solvers::Criterion
+Dune::Solvers::operator| (const Criterion& c1, const Criterion& c2)
+{
+  return Criterion(
+      [=]() {
+        auto r1 = c1();
+        auto r2 = c2();
+        return std::make_tuple(std::get<0>(r1) or std::get<0>(r2), std::get<1>(r1).append(std::get<1>(r2)));
+      },
+      c1.header().append(c2.header()));
+}
+
+Dune::Solvers::Criterion
+Dune::Solvers::operator& (const Criterion& c1, const Criterion& c2)
+{
+  return Criterion(
+      [=]() {
+        auto r1 = c1();
+        auto r2 = c2();
+        return std::make_tuple(std::get<0>(r1) and std::get<0>(r2), std::get<1>(r1).append(std::get<1>(r2)));
+      },
+      c1.header().append(c2.header()));
+}
+
+Dune::Solvers::Criterion
+Dune::Solvers::operator~ (const Criterion& c)
+{
+  return Criterion(
+      [=]() {
+        auto r = c();
+        return std::make_tuple(not(std::get<0>(r)), std::get<1>(r));
+      },
+      c.header());
+}
+
diff --git a/dune/solvers/solvers/criterion.hh b/dune/solvers/solvers/criterion.hh
index cbdcb2f3b4d3ccd966749ca6e91d05a054f6575c..4efa7d79dc780e1e28952ddcf14b01ed7cfbc89d 100644
--- a/dune/solvers/solvers/criterion.hh
+++ b/dune/solvers/solvers/criterion.hh
@@ -110,18 +110,12 @@ namespace Dune {
        *
        * \returns A tuple<bool,string>
        */
-      Result operator()() const
-      {
-        return f_();
-      }
+      Result operator()() const;
 
       /**
        * \brief Obtain header string
        */
-      std::string header() const
-      {
-        return header_;
-      }
+      std::string header() const;
 
     protected:
       std::function<Result()> f_;
@@ -139,16 +133,7 @@ namespace Dune {
      *
      * Notice that this will store copies of both provided criteria.
      */
-    Criterion operator| (const Criterion& c1, const Criterion& c2)
-    {
-      return Criterion(
-          [=]() {
-            auto r1 = c1();
-            auto r2 = c2();
-            return std::make_tuple(std::get<0>(r1) or std::get<0>(r2), std::get<1>(r1).append(std::get<1>(r2)));
-          },
-          c1.header().append(c2.header()));
-    }
+    Criterion operator| (const Criterion& c1, const Criterion& c2);
 
     /**
      * \brief Create Criterion that combines two others using 'and'
@@ -157,16 +142,7 @@ namespace Dune {
      *
      * Notice that this will store copies of both provided criteria.
      */
-    Criterion operator& (const Criterion& c1, const Criterion& c2)
-    {
-      return Criterion(
-          [=]() {
-            auto r1 = c1();
-            auto r2 = c2();
-            return std::make_tuple(std::get<0>(r1) and std::get<0>(r2), std::get<1>(r1).append(std::get<1>(r2)));
-          },
-          c1.header().append(c2.header()));
-    }
+    Criterion operator& (const Criterion& c1, const Criterion& c2);
 
     /**
      * \brief Create Criterion that negates another
@@ -175,15 +151,7 @@ namespace Dune {
      *
      * Notice that this will store a copy of the provided criterion.
      */
-    Criterion operator~ (const Criterion& c)
-    {
-      return Criterion(
-          [=]() {
-            auto r = c();
-            return std::make_tuple(not(std::get<0>(r)), std::get<1>(r));
-          },
-          c.header());
-    }
+    Criterion operator~ (const Criterion& c);