diff --git a/dune/gdt/localfunctional/interface.hh b/dune/gdt/localfunctional/interface.hh
index abc909467cfc18e35406846143d935c919889c50..4db9b6d5633952fd4680c570d39867591df8638e 100644
--- a/dune/gdt/localfunctional/interface.hh
+++ b/dune/gdt/localfunctional/interface.hh
@@ -8,9 +8,10 @@
 
 #include <vector>
 
-#include <dune/common/bartonnackmanifcheck.hh>
 #include <dune/common/dynvector.hh>
 
+#include <dune/stuff/common/crtp.hh>
+
 #include <dune/gdt/basefunctionset/interface.hh>
 
 namespace Dune {
@@ -19,15 +20,15 @@ namespace LocalFunctional {
 
 
 template <class Traits>
-class Codim0Interface
+class Codim0Interface : public Stuff::CRTPInterface<Codim0Interface<Traits>, Traits>
 {
 public:
   typedef typename Traits::derived_type derived_type;
 
   size_t numTmpObjectsRequired() const
   {
-    CHECK_INTERFACE_IMPLEMENTATION(asImp().numTmpObjectsRequired());
-    return asImp().numTmpObjectsRequired();
+    CHECK_CRTP(this->as_imp().numTmpObjectsRequired());
+    return this->as_imp().numTmpObjectsRequired();
   }
 
   /**
@@ -43,30 +44,21 @@ public:
   void apply(const BaseFunctionSetInterface<T, D, d, R, r, rC>& testBase, Dune::DynamicVector<R>& ret,
              std::vector<Dune::DynamicVector<R>>& tmpLocalVectors) const
   {
-    CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(asImp().apply(testBase, ret, tmpLocalVectors));
-  }
-
-  derived_type& asImp()
-  {
-    return static_cast<derived_type&>(*this);
-  }
-
-  const derived_type& asImp() const
-  {
-    return static_cast<const derived_type&>(*this);
+    CHECK_AND_CALL_CRTP(this->as_imp().apply(testBase, ret, tmpLocalVectors));
   }
 }; // class Codim0Interface
 
+
 template <class Traits>
-class Codim1Interface
+class Codim1Interface : public Stuff::CRTPInterface<Codim1Interface<Traits>, Traits>
 {
 public:
   typedef typename Traits::derived_type derived_type;
 
   size_t numTmpObjectsRequired() const
   {
-    CHECK_INTERFACE_IMPLEMENTATION(asImp().numTmpObjectsRequired());
-    return asImp().numTmpObjectsRequired();
+    CHECK_CRTP(this->as_imp().numTmpObjectsRequired());
+    return this->as_imp().numTmpObjectsRequired();
   }
 
   /**
@@ -83,17 +75,7 @@ public:
   void apply(const BaseFunctionSetInterface<T, D, d, R, r, rC>& testBase, const IntersectionType& intersection,
              Dune::DynamicVector<R>& ret, std::vector<Dune::DynamicVector<R>>& tmpLocalVectors) const
   {
-    CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(asImp().apply(testBase, intersection, ret, tmpLocalVectors));
-  }
-
-  derived_type& asImp()
-  {
-    return static_cast<derived_type&>(*this);
-  }
-
-  const derived_type& asImp() const
-  {
-    return static_cast<const derived_type&>(*this);
+    CHECK_AND_CALL_CR(this->as_imp().apply(testBase, intersection, ret, tmpLocalVectors));
   }
 }; // class Codim1Interface