diff --git a/dune/gfe/assemblers/cosseratenergystiffness.hh b/dune/gfe/assemblers/cosseratenergystiffness.hh
index 08831326982b1b697f3fd8062b650e38e0fd06fb..2bbac9fb0315842dab4755a470ce1fc87b993e4f 100644
--- a/dune/gfe/assemblers/cosseratenergystiffness.hh
+++ b/dune/gfe/assemblers/cosseratenergystiffness.hh
@@ -72,9 +72,7 @@ public:
 template<class Basis, int dim, class field_type=double>
 class CosseratEnergyLocalStiffness
   : public Dune::GFE::LocalEnergy<Basis,Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >,
-    public MixedLocalGeodesicFEStiffness<Basis,
-        RealTuple<field_type,dim>,
-        Rotation<field_type,dim> >
+    public MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >
 {
   // grid types
   typedef typename Basis::GridView GridView;
diff --git a/dune/gfe/assemblers/mixedgfeassembler.hh b/dune/gfe/assemblers/mixedgfeassembler.hh
index 29c61a41aca5f0e690cd870788bb65f4ece0d114..21203f0d04c279280297f651170778fba9d2f45f 100644
--- a/dune/gfe/assemblers/mixedgfeassembler.hh
+++ b/dune/gfe/assemblers/mixedgfeassembler.hh
@@ -36,15 +36,13 @@ public:
       Dune::MultiTypeBlockVector<MatrixBlock10,MatrixBlock11> > MatrixType;
   const Basis basis_;
 
-  MixedLocalGeodesicFEStiffness<Basis,
-      TargetSpace0,
-      TargetSpace1>* localStiffness_;
+  MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1> >* localStiffness_;
 
 public:
 
   /** \brief Constructor for a given grid */
   MixedGFEAssembler(const Basis& basis,
-                    MixedLocalGeodesicFEStiffness<Basis, TargetSpace0, TargetSpace1>* localStiffness)
+                    MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<TargetSpace0, TargetSpace1> >* localStiffness)
     : basis_(basis),
     localStiffness_(localStiffness)
   {}
diff --git a/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh b/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
index 83d5212b57058b2e60899892c4b5645384bcac50..f3bddce776cc6d3859801c8a5c4a438311ca8144 100644
--- a/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
+++ b/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
@@ -5,9 +5,16 @@
 #include <dune/istl/matrix.hh>
 
 
-template<class Basis, class DeformationTargetSpace, class OrientationTargetSpace>
+/** \brief Abstract base class for second-order energy approximations on one grid element
+ *
+ * \tparam TargetSpace The space we map into.  MUST be a ProductManifold with two factors
+ */
+template<class Basis, class TargetSpace>
 class MixedLocalGeodesicFEStiffness
 {
+  using DeformationTargetSpace = std::decay_t<decltype(std::declval<TargetSpace>()[Dune::Indices::_0])>;
+  using OrientationTargetSpace = std::decay_t<decltype(std::declval<TargetSpace>()[Dune::Indices::_1])>;
+
   // grid types
   typedef typename Basis::GridView GridView;
   typedef typename GridView::ctype DT;
diff --git a/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh b/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
index 18a120a5f5806ebb3d0e2686c8247609116dbe66..7fb2f4c3498a99fac4d6d1148b0477d6d8a41f8c 100644
--- a/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
+++ b/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
@@ -13,12 +13,13 @@
 #include <dune/istl/matrix.hh>
 
 #include <dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh>
+#include <dune/gfe/spaces/productmanifold.hh>
 
 /** \brief Assembles energy gradient and Hessian with ADOL-C (automatic differentiation)
  */
 template<class Basis, class TargetSpace0, class TargetSpace1>
 class MixedLocalGFEADOLCStiffness
-  : public MixedLocalGeodesicFEStiffness<Basis,TargetSpace0,TargetSpace1>
+  : public MixedLocalGeodesicFEStiffness<Basis,Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1> >
 {
   // grid types
   typedef typename Basis::GridView GridView;
@@ -43,8 +44,8 @@ public:
   constexpr static int embeddedBlocksize0 = TargetSpace0::EmbeddedTangentVector::dimension;
   constexpr static int embeddedBlocksize1 = TargetSpace1::EmbeddedTangentVector::dimension;
 
-  MixedLocalGFEADOLCStiffness(const MixedLocalGeodesicFEStiffness<Basis, ATargetSpace0,
-      ATargetSpace1>* energy, bool adolcScalarMode = false)
+  MixedLocalGFEADOLCStiffness(const MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<ATargetSpace0,
+      ATargetSpace1> >* energy, bool adolcScalarMode = false)
     : localEnergy_(energy),
     adolcScalarMode_(adolcScalarMode)
   {}
@@ -64,7 +65,7 @@ public:
                                           std::vector<typename TargetSpace0::TangentVector>& localGradient0,
                                           std::vector<typename TargetSpace1::TangentVector>& localGradient1) override;
 
-  const MixedLocalGeodesicFEStiffness<Basis, ATargetSpace0, ATargetSpace1>* localEnergy_;
+  const MixedLocalGeodesicFEStiffness<Basis, Dune::GFE::ProductManifold<ATargetSpace0, ATargetSpace1> >* localEnergy_;
   const bool adolcScalarMode_;
 };
 
diff --git a/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh b/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh
index 98d941b502a7cd2e5e6eafa75aa68ed40793788a..0b50acb93f22ab57064345df1b471a720409425d 100644
--- a/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh
+++ b/dune/gfe/assemblers/nonplanarcosseratshellenergy.hh
@@ -40,9 +40,7 @@
 template<class Basis, int dim, class field_type, class StressFreeStateGridFunction>
 class NonplanarCosseratShellEnergy
   : public Dune::GFE::LocalEnergy<Basis,Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >,
-    public MixedLocalGeodesicFEStiffness<Basis,
-        RealTuple<field_type,dim>,
-        Rotation<field_type,dim> >
+    public MixedLocalGeodesicFEStiffness<Basis,Dune::GFE::ProductManifold<RealTuple<field_type,dim>,Rotation<field_type,dim> > >
 {
   // grid types
   typedef typename Basis::GridView GridView;
diff --git a/dune/gfe/assemblers/simofoxenergy.hh b/dune/gfe/assemblers/simofoxenergy.hh
index aab8fd39677b1fc3d2ac2fefd37080142acce5b4..dddf5eb897807911557b145dc16ea8982f60a196 100644
--- a/dune/gfe/assemblers/simofoxenergy.hh
+++ b/dune/gfe/assemblers/simofoxenergy.hh
@@ -54,8 +54,8 @@ namespace Dune::GFE {
   class SimoFoxEnergyLocalStiffness
     : public Dune::GFE::LocalEnergy<Basis, RealTuple<field_type, 3>,
           UnitVector<field_type, 3> >,                             // inheritance to allow usage with LocalGeodesicFEADOLCStiffness
-      public MixedLocalGeodesicFEStiffness<Basis, RealTuple<field_type, 3>,
-          UnitVector<field_type, 3> >                                    // inheritance to allow usage with MixedGFEAssembler
+      public MixedLocalGeodesicFEStiffness<Basis, ProductManifold<RealTuple<field_type, 3>,
+          UnitVector<field_type, 3> > >                                    // inheritance to allow usage with MixedGFEAssembler
   {
     // grid types
     typedef typename Basis::GridView GridView;
diff --git a/dune/gfe/assemblers/sumenergy.hh b/dune/gfe/assemblers/sumenergy.hh
index dd450369d6a7d723ab5ed4c033825842071507d5..46f84e7b88735f9deb58ada751b857de1ba66c92 100644
--- a/dune/gfe/assemblers/sumenergy.hh
+++ b/dune/gfe/assemblers/sumenergy.hh
@@ -18,7 +18,7 @@ namespace Dune::GFE {
   template<class Basis, class ... TargetSpaces>
   class SumEnergy
     : public Dune::GFE::LocalEnergy<Basis, TargetSpaces...>,
-      public MixedLocalGeodesicFEStiffness<Basis, TargetSpaces...>
+      public MixedLocalGeodesicFEStiffness<Basis, ProductManifold<TargetSpaces...> >
       //Inheriting from MixedLocalGeodesicFEStiffness is hack, and will be replaced eventually; once MixedLocalGFEADOLCStiffness
       //will be removed and its functionality will be included in LocalGeodesicFEADOLCStiffness this is not needed anymore!