diff --git a/CHANGELOG.md b/CHANGELOG.md
index a5a86d95765fa610e4e886ffe2b15ce7d32f93a8..7431b7d0fb4d1f93c021fb256f55d2ecfcf5f029 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Master
 
+- Building `dune-gfe` now requires Dune 2.9 or newer. Older configurations
+  have not gotten CI-tested for quite a while, anyway.
+
 - The `RigidBodyMotion` class has been removed.  Please use
   `ProductManifold<RealTuple,Rotation>` from now on.
 
diff --git a/dune.module b/dune.module
index 669495ee9b904b0864cea7f848511eb8cf4aa155..93dba47bebbb8130d5803ac82106dd98245f7e36 100644
--- a/dune.module
+++ b/dune.module
@@ -7,5 +7,5 @@ Module: dune-gfe
 Version: svn
 Maintainer: oliver.sander@tu-dresden.de
 #depending on
-Depends: dune-common(>=2.7) dune-grid(>=2.7) dune-uggrid dune-istl dune-localfunctions dune-geometry (>=2.7) dune-functions (>=2.7) dune-solvers dune-fufem dune-elasticity (>=2.7) dune-gmsh4
+Depends: dune-grid(>=2.9) dune-uggrid dune-istl dune-localfunctions dune-functions (>=2.9) dune-solvers dune-fufem dune-elasticity (>=2.9) dune-gmsh4
 Suggests: dune-foamgrid dune-parmg dune-vtk dune-curvedgrid
diff --git a/dune/gfe/assemblers/cosseratenergystiffness.hh b/dune/gfe/assemblers/cosseratenergystiffness.hh
index d22e4a4bb2d3046320d0e2939fceb8123163e4b1..a7105cbe0f1e19e14eddc77624628d23b2618a68 100644
--- a/dune/gfe/assemblers/cosseratenergystiffness.hh
+++ b/dune/gfe/assemblers/cosseratenergystiffness.hh
@@ -9,10 +9,6 @@
 
 #include <dune/fufem/boundarypatch.hh>
 
-#if DUNE_VERSION_LT(DUNE_COMMON, 2, 9)
-#include <dune/matrix-vector/transpose.hh>
-#endif
-
 #include <dune/gfe/assemblers/localenergy.hh>
 #ifdef PROJECTED_INTERPOLATION
 #include <dune/gfe/localprojectedfefunction.hh>
@@ -269,17 +265,10 @@ public:
 
     Dune::FieldMatrix<field_type,3,3> wryness(0);
 
-#if DUNE_VERSION_LT(DUNE_COMMON, 2, 9)
-    Dune::FieldMatrix<field_type,dim,dim> transposeR;
-    Dune::MatrixVector::transpose(R,transposeR);
-    auto axialVectorx1 = SkewMatrix<field_type,3>(transposeR*dRx1).axial();
-    auto axialVectorx2 = SkewMatrix<field_type,3>(transposeR*dRx2).axial();
-    auto axialVectorx3 = SkewMatrix<field_type,3>(transposeR*dRx3).axial();
-#else
     auto axialVectorx1 = SkewMatrix<field_type,3>(transpose(R)*dRx1).axial();
     auto axialVectorx2 = SkewMatrix<field_type,3>(transpose(R)*dRx2).axial();
     auto axialVectorx3 = SkewMatrix<field_type,3>(transpose(R)*dRx3).axial();
-#endif
+
     for (int i=0; i<3; i++) {
       wryness[i][0] = axialVectorx1[i];
       wryness[i][1] = axialVectorx2[i];
diff --git a/dune/gfe/assemblers/cosseratrodenergy.hh b/dune/gfe/assemblers/cosseratrodenergy.hh
index 27bc7e6581e01720db259a61682a26b5037da4ec..5545ab41ae0fe2a1e5db300c24d001ade3c78f2a 100644
--- a/dune/gfe/assemblers/cosseratrodenergy.hh
+++ b/dune/gfe/assemblers/cosseratrodenergy.hh
@@ -5,9 +5,7 @@
 
 #include <dune/common/fmatrix.hh>
 #include <dune/common/version.hh>
-#if DUNE_VERSION_GTE(DUNE_COMMON, 2, 8)
 #include <dune/common/transpose.hh>
-#endif
 
 #include <dune/istl/matrix.hh>
 #include <dune/geometry/quadraturerules.hh>
@@ -255,12 +253,7 @@ namespace Dune::GFE {
     auto value = localInterpolation.evaluate(pos);
 
     auto referenceDerivative = localInterpolation.evaluateDerivative(pos);
-#if DUNE_VERSION_GTE(DUNE_COMMON, 2, 8)
     auto derivative = referenceDerivative * transpose(jit);
-#else
-    auto derivative = referenceDerivative;
-    derivative *= jit[0][0];
-#endif
 
     using Number = std::decay_t<decltype(derivative[0][0])>;
     FieldVector<Number,3> r_s = {derivative[0][0], derivative[1][0], derivative[2][0]};
diff --git a/dune/gfe/assemblers/simofoxenergy.hh b/dune/gfe/assemblers/simofoxenergy.hh
index 04c847362347763857ab534aa56f7230e422cda7..af5cad60c7e349a6fe281fae5116e2d814bf2b2f 100644
--- a/dune/gfe/assemblers/simofoxenergy.hh
+++ b/dune/gfe/assemblers/simofoxenergy.hh
@@ -3,9 +3,7 @@
 
 #include <dune/common/fmatrix.hh>
 #include <dune/common/parametertree.hh>
-#if DUNE_VERSION_GTE(DUNE_COMMON, 2, 8)
 #include <dune/common/transpose.hh>
-#endif
 #include <dune/common/tuplevector.hh>
 #include <dune/fufem/boundarypatch.hh>
 #include <dune/geometry/quadraturerules.hh>
diff --git a/dune/gfe/localprojectedfefunction.hh b/dune/gfe/localprojectedfefunction.hh
index 5f1a0c49d8ea8493529d82bf6b76fcb6d7045955..577b1d5f7ec7533099ae9fa23ed2c6565d305273 100644
--- a/dune/gfe/localprojectedfefunction.hh
+++ b/dune/gfe/localprojectedfefunction.hh
@@ -4,7 +4,6 @@
 #include <vector>
 
 #include <dune/common/fvector.hh>
-#include <dune/common/version.hh>
 
 #include <dune/geometry/type.hh>
 
@@ -177,11 +176,6 @@ namespace Dune {
 
       auto derivativeOfProjection = TargetSpace::derivativeOfProjection(embeddedInterpolation);
 
-#if ! DUNE_VERSION_GTE(DUNE_ISTL, 2, 9)
-      if constexpr (std::is_same_v<decltype(derivativeOfProjection), ScaledIdentityMatrix<RT,embeddedDim> >)
-        return derivativeOfProjection.scalar()*derivative;
-      else
-#endif
       return derivativeOfProjection*derivative;
     }
 
diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc
index 060f495b8113ab77a657f1b2230730757908279a..e9ba72e0ce8b76e72d5ff0c3e53db31dbce61ba7 100644
--- a/dune/gfe/riemannianpnsolver.cc
+++ b/dune/gfe/riemannianpnsolver.cc
@@ -11,16 +11,9 @@
 #include <dune/fufem/assemblers/localassemblers/massassembler.hh>
 #include <dune/fufem/assemblers/basisinterpolationmatrixassembler.hh>
 
-#if DUNE_VERSION_GTE(DUNE_SOLVERS, 2, 8)
-// Using a cholmod solver as the inner solver, available only since 2.8
-#include <dune/solvers/solvers/cholmodsolver.hh>
-#else
-// Using a umfpack solver as the inner solver
-#include <dune/solvers/solvers/umfpacksolver.hh>
-#endif
-
 #include <dune/solvers/norms/twonorm.hh>
 #include <dune/solvers/norms/h1seminorm.hh>
+#include <dune/solvers/solvers/cholmodsolver.hh>
 
 // The VectorCommunicator and MatrixCommunicator work only for GRID_DIM == WORLD_DIM == 2 or GRID_DIM == WORLD_DIM == 3
 #if HAVE_MPI && (!defined(GRID_DIM)or (defined(GRID_DIM) && GRID_DIM < 3)) && (!defined(WORLD_DIM)or (defined(WORLD_DIM) && WORLD_DIM < 3))
@@ -132,12 +125,8 @@ setup(const GridType& grid,
   //////////////////////////////////////////////////////////////////
   //   Create the inner solver using a cholmod solver
   //////////////////////////////////////////////////////////////////
-#if DUNE_VERSION_GTE(DUNE_SOLVERS, 2, 8)
+
   innerSolver_ = std::make_shared<Dune::Solvers::CholmodSolver<MatrixType,CorrectionType> >();
-#else
-  std::cout << "using umfpacksolver" << std::endl;
-  innerSolver_ = std::make_shared<Dune::Solvers::UMFPackSolver<MatrixType,CorrectionType> >();
-#endif
   innerSolver_->setIgnore(*globalDirichletNodes);
 
   // //////////////////////////////////////////////////////////////////////////////////////
diff --git a/dune/gfe/riemannianpnsolver.hh b/dune/gfe/riemannianpnsolver.hh
index d5a3a8559c18edda56e1792425559624742b4277..03127e120da75f5167d91bb48ddd564b3edbbbfa 100644
--- a/dune/gfe/riemannianpnsolver.hh
+++ b/dune/gfe/riemannianpnsolver.hh
@@ -14,11 +14,7 @@
 #include <dune/solvers/common/boxconstraint.hh>
 #include <dune/solvers/norms/h1seminorm.hh>
 #include <dune/solvers/solvers/iterativesolver.hh>
-#if DUNE_VERSION_GTE(DUNE_SOLVERS, 2, 8)
 #include <dune/solvers/solvers/cholmodsolver.hh>
-#else
-#include <dune/solvers/solvers/umfpacksolver.hh>
-#endif
 
 #include "riemanniantrsolver.hh"
 #include <dune/grid/utility/globalindexset.hh>
@@ -144,11 +140,8 @@ protected:
   const Assembler* assembler_;
 
   /** \brief The solver for the quadratic inner problems */
-#if DUNE_VERSION_GTE(DUNE_SOLVERS, 2, 8)
   std::shared_ptr<typename Dune::Solvers::CholmodSolver<MatrixType,CorrectionType> > innerSolver_;
-#else
-  std::shared_ptr<typename Dune::Solvers::UMFPackSolver<MatrixType,CorrectionType> > innerSolver_;
-#endif
+
   /** \brief The Dirichlet nodes */
   const Dune::BitSetVector<blocksize>* ignoreNodes_;
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ba44aef10080369b9acf10952b3b4bad5d3d1e5a..d52c8b69c9f9cf4049075705aac85aeff9a263e1 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,20 +1,16 @@
 set(programs compute-disc-error
+             film-on-substrate-stress-plot
              gradient-flow
              harmonicmaps
+             rod3d
              simofoxshell)
 #            rodobstacle)
-if (${DUNE_COMMON_VERSION} VERSION_GREATER_EQUAL 2.8)
-  set (programs rod3d ${programs})
-endif()
-if (${DUNE_ELASTICITY_VERSION} VERSION_GREATER_EQUAL 2.8)
-  set(programs film-on-substrate-stress-plot ${programs})
-endif()
 
 foreach(_program ${programs})
   add_executable(${_program} ${_program}.cc)
 endforeach()
 
-if (dune-parmg_FOUND AND dune-curvedgeometry_FOUND AND ${DUNE_ELASTICITY_VERSION} VERSION_GREATER_EQUAL 2.8)
+if (dune-parmg_FOUND AND dune-curvedgeometry_FOUND)
   add_executable("film-on-substrate" film-on-substrate.cc)
   set_property(TARGET "film-on-substrate" APPEND PROPERTY COMPILE_DEFINITIONS "WORLD_DIM=3;  LFE_ORDER=2; GFE_ORDER=2")
 	set(programs film-on-substrate ${programs})
@@ -49,10 +45,5 @@ set(programs cosserat-continuum-3d-in-3d-2-1 ${programs})
 foreach(_program ${programs})
   target_link_dune_default_libraries(${_program})
   add_dune_pythonlibs_flags(${_program})
-  if (${DUNE_COMMON_VERSION} VERSION_GREATER_EQUAL 2.8)
-    target_link_libraries(${_program} PUBLIC tinyxml2)
-  else()
-    target_link_libraries(${_program} tinyxml2)
-  endif()
-#  target_compile_options(${_program} PRIVATE "-fpermissive")
+  target_link_libraries(${_program} PUBLIC tinyxml2)
 endforeach()
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 9141ecd85da90b0e57eaa023a7b69f5d9144b179..d74606376ba3a2e87091d18ee7fd1445555c9433 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -11,6 +11,7 @@ set(TESTS
   orthogonalmatrixtest
   polardecompositiontest
   rotationtest
+  surfacecosseratstressassemblertest
   svdtest
   targetspacetest
 )
@@ -33,10 +34,6 @@ if (dune-curvedgrid_FOUND)
   set(TESTS test-cylinder ${TESTS})
 endif()
 
-if (${DUNE_COMMON_VERSION} VERSION_GREATER_EQUAL 2.8)
-  set(TESTS surfacecosseratstressassemblertest ${TESTS})
-endif()
-
 if(dune-foamgrid_FOUND)
   set(TESTS nonplanarcosseratenergytest ${TESTS})
 endif()
@@ -47,17 +44,13 @@ foreach(_test ${TESTS})
 endforeach()
 
 # Run distributed tests
-if (${DUNE_COMMON_VERSION} VERSION_GREATER_EQUAL 2.8)
 dune_add_test(SOURCES harmonicmaptest.cc
               MPI_RANKS 1 4
               TIMEOUT 600
               CMAKE_GUARD MPI_FOUND)
-endif()
 
-if (${DUNE_COMMON_VERSION} VERSION_GREATER_EQUAL 2.9)
-  dune_add_test(SOURCES cosseratcontinuumtest.cc
+dune_add_test(SOURCES cosseratcontinuumtest.cc
               TIMEOUT 600)
-endif()
 
 dune_add_test(SOURCES geodesicfeassemblerwrappertest.cc
               MPI_RANKS 1 4