diff --git a/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh b/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh
index 12d2b789530bdbeb07227514992cedb4354d9ee9..d7129ef58df34963cb8f0e366c10700e0d1fab62 100644
--- a/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh
+++ b/dune/gfe/assemblers/geodesicfeassemblerwrapper.hh
@@ -28,16 +28,16 @@ namespace Dune::GFE {
 
     //!
     typedef Dune::FieldMatrix<double, blocksize, blocksize> MatrixBlock;
-    typedef typename MixedGFEAssembler<Basis, MixedSpace0, MixedSpace1>::MatrixType MatrixType;
+    typedef typename MixedGFEAssembler<Basis, TargetSpace>::MatrixType MatrixType;
 
   protected:
-    MixedGFEAssembler<Basis, MixedSpace0, MixedSpace1>* mixedAssembler_;
+    MixedGFEAssembler<Basis, TargetSpace>* mixedAssembler_;
 
   public:
     const ScalarBasis& basis_;
 
     /** \brief Constructor for a given grid */
-    GeodesicFEAssemblerWrapper(MixedGFEAssembler<Basis, MixedSpace0, MixedSpace1>* mixedAssembler, ScalarBasis& basis)
+    GeodesicFEAssemblerWrapper(MixedGFEAssembler<Basis, TargetSpace>* mixedAssembler, ScalarBasis& basis)
       : mixedAssembler_(mixedAssembler),
       basis_(basis)
     {
diff --git a/dune/gfe/assemblers/mixedgfeassembler.hh b/dune/gfe/assemblers/mixedgfeassembler.hh
index 854fd36d8b3167aaf1a5e94733717792649cbe35..a3010a1ec862df81b79df032c74fddc58adf50c6 100644
--- a/dune/gfe/assemblers/mixedgfeassembler.hh
+++ b/dune/gfe/assemblers/mixedgfeassembler.hh
@@ -14,12 +14,14 @@
 
 /** \brief A global FE assembler for problems involving functions that map into non-Euclidean spaces
  */
-template <class Basis, class TargetSpace0, class TargetSpace1>
+template <class Basis, class TargetSpace>
 class MixedGFEAssembler {
 
   typedef typename Basis::GridView GridView;
   typedef typename GridView::template Codim<0>::template Partition<Dune::Interior_Partition>::Iterator ElementIterator;
-  using TargetSpace = Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1>;
+
+  using TargetSpace0 = std::tuple_element_t<0,TargetSpace>;
+  using TargetSpace1 = std::tuple_element_t<1,TargetSpace>;
   using LocalStiffness = LocalGeodesicFEStiffness<Basis, TargetSpace>;
 
 
@@ -86,8 +88,8 @@ public:
 
 
 
-template <class Basis, class TargetSpace0, class TargetSpace1>
-void MixedGFEAssembler<Basis,TargetSpace0,TargetSpace1>::
+template <class Basis, class TargetSpace>
+void MixedGFEAssembler<Basis,TargetSpace>::
 getMatrixPattern(Dune::MatrixIndexSet& nb00,
                  Dune::MatrixIndexSet& nb01,
                  Dune::MatrixIndexSet& nb10,
@@ -134,8 +136,8 @@ getMatrixPattern(Dune::MatrixIndexSet& nb00,
 
 }
 
-template <class Basis, class TargetSpace0, class TargetSpace1>
-void MixedGFEAssembler<Basis,TargetSpace0,TargetSpace1>::
+template <class Basis, class TargetSpace>
+void MixedGFEAssembler<Basis,TargetSpace>::
 assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0,
                            const std::vector<TargetSpace1>& configuration1,
                            Dune::BlockVector<Dune::FieldVector<double, blocksize0> >& gradient0,
@@ -278,8 +280,8 @@ assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0,
   }
 }
 
-template <class Basis, class TargetSpace0, class TargetSpace1>
-double MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>::
+template <class Basis, class TargetSpace>
+double MixedGFEAssembler<Basis, TargetSpace>::
 computeEnergy(const std::vector<TargetSpace0>& configuration0,
               const std::vector<TargetSpace1>& configuration1) const
 {
diff --git a/dune/gfe/mixedriemannianpnsolver.cc b/dune/gfe/mixedriemannianpnsolver.cc
index 588414a00fa5ee5e7a41c09f1fa8141557210b91..167c7d92ac8da258b589ff57b3d0bd39126fd297 100644
--- a/dune/gfe/mixedriemannianpnsolver.cc
+++ b/dune/gfe/mixedriemannianpnsolver.cc
@@ -12,7 +12,7 @@ template <class MixedBasis,
     class BitVector>
 void Dune::GFE::MixedRiemannianProximalNewtonSolver<MixedBasis,Basis0,TargetSpace0,Basis1,TargetSpace1,BitVector>::
 setup(const GridType& grid,
-      const MixedGFEAssembler<MixedBasis, TargetSpace0, TargetSpace1>* assembler,
+      const MixedGFEAssembler<MixedBasis, TargetSpace>* assembler,
       const SolutionType& x,
       const BitVector& dirichletNodes,
       double tolerance,
diff --git a/dune/gfe/mixedriemannianpnsolver.hh b/dune/gfe/mixedriemannianpnsolver.hh
index a0314bbd02f5dc22db8807d9e7a3f299f5cfe608..37e24bf19dc07df7a3d605afdfc0dc5fbccde933 100644
--- a/dune/gfe/mixedriemannianpnsolver.hh
+++ b/dune/gfe/mixedriemannianpnsolver.hh
@@ -31,6 +31,8 @@ namespace Dune::GFE
   {
     using GridType = typename MixedBasis::GridView::Grid;
 
+    using TargetSpace = ProductManifold<TargetSpace0,TargetSpace1>;
+
     const static int blocksize0 = TargetSpace0::TangentVector::dimension;
     const static int blocksize1 = TargetSpace1::TangentVector::dimension;
 
@@ -64,7 +66,7 @@ namespace Dune::GFE
     {}
 
     void setup(const GridType& grid,
-               const MixedGFEAssembler<MixedBasis, TargetSpace0, TargetSpace1>* assembler,
+               const MixedGFEAssembler<MixedBasis, TargetSpace>* assembler,
                const SolutionType& x,
                const BitVector& dirichletNodes,
                double tolerance,
@@ -105,7 +107,7 @@ namespace Dune::GFE
     std::unique_ptr<MatrixType> hessianMatrix_;
 
     /** \brief The assembler for the material law */
-    const MixedGFEAssembler<MixedBasis, TargetSpace0, TargetSpace1>* assembler_;
+    const MixedGFEAssembler<MixedBasis, TargetSpace>* assembler_;
 
     /** \brief The solver for the quadratic inner problems */
     std::shared_ptr<Solvers::CholmodSolver<MatrixType, CorrectionType, BitVector> > innerSolver_;
diff --git a/dune/gfe/mixedriemanniantrsolver.cc b/dune/gfe/mixedriemanniantrsolver.cc
index 890be19551821fc1a33ab9c13b4e4b8778916212..770f3c56ae8808ad7b80aeb5ccc59282234144d7 100644
--- a/dune/gfe/mixedriemanniantrsolver.cc
+++ b/dune/gfe/mixedriemanniantrsolver.cc
@@ -27,7 +27,7 @@ template <class GridType,
     class Basis1, class TargetSpace1>
 void MixedRiemannianTrustRegionSolver<GridType,Basis,Basis0,TargetSpace0,Basis1,TargetSpace1>::
 setup(const GridType& grid,
-      const MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>* assembler,
+      const MixedGFEAssembler<Basis, TargetSpace>* assembler,
       const Basis0& tmpBasis0,
       const Basis1& tmpBasis1,
       const SolutionType& x,
diff --git a/dune/gfe/mixedriemanniantrsolver.hh b/dune/gfe/mixedriemanniantrsolver.hh
index 9740d09af53367be2f0ba8df0c9337b236d1406b..2c17bbcb033f1214d5ea4181e7f454517c365ad8 100644
--- a/dune/gfe/mixedriemanniantrsolver.hh
+++ b/dune/gfe/mixedriemanniantrsolver.hh
@@ -20,6 +20,7 @@
 #include <dune/solvers/iterationsteps/mmgstep.hh>
 
 #include <dune/gfe/assemblers/mixedgfeassembler.hh>
+#include <dune/gfe/spaces/productmanifold.hh>
 
 /** \brief Riemannian trust-region solver for geodesic finite-element problems */
 template <class GridType,
@@ -34,6 +35,8 @@ class MixedRiemannianTrustRegionSolver
 
   const static int gridDim = GridType::dimension;
 
+  using TargetSpace = Dune::GFE::ProductManifold<TargetSpace0,TargetSpace1>;
+
   // Centralize the field type here
   typedef double field_type;
 
@@ -73,7 +76,7 @@ public:
 
   /** \brief Set up the solver using a monotone multigrid method as the inner solver */
   void setup(const GridType& grid,
-             const MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>* assembler,
+             const MixedGFEAssembler<Basis, TargetSpace>* assembler,
              const Basis0& basis0,
              const Basis1& basis1,
              const SolutionType& x,
@@ -152,7 +155,7 @@ protected:
   std::unique_ptr<MatrixType> hessianMatrix_;
 
   /** \brief The assembler for the material law */
-  const MixedGFEAssembler<Basis, TargetSpace0, TargetSpace1>* assembler_;
+  const MixedGFEAssembler<Basis, TargetSpace>* assembler_;
 
   /** \brief TEMPORARY: The two separate matrices */
   std::unique_ptr<Basis0> basis0_;
diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc
index 440bb93890d49ff49280d86b5b0a176b8e39e6cc..09da40393ab3b483d5bc3a6ad18af4994576f064 100644
--- a/src/cosserat-continuum.cc
+++ b/src/cosserat-continuum.cc
@@ -503,9 +503,7 @@ int main (int argc, char *argv[]) try
 
       LocalGeodesicFEADOLCStiffness<CompositeBasis,TargetSpace> localGFEADOLCStiffness(&localCosseratEnergy,
                                                                                        adolcScalarMode);
-      MixedGFEAssembler<CompositeBasis,
-          RealTuple<double,3>,
-          Rotation<double,3> > mixedAssembler(compositeBasis, localGFEADOLCStiffness);
+      MixedGFEAssembler<CompositeBasis,TargetSpace> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 #if MIXED_SPACE
       if (parameterSet.get<std::string>("solvertype", "trustRegion") == "trustRegion")
       {
@@ -637,9 +635,7 @@ int main (int argc, char *argv[]) try
 
       localGFEStiffness = std::make_shared<StiffnessType>(&localCosseratEnergy, adolcScalarMode);
 #endif
-      MixedGFEAssembler<CompositeBasis,
-          RealTuple<double,3>,
-          Rotation<double,3> > mixedAssembler(compositeBasis, localGFEStiffness);
+      MixedGFEAssembler<CompositeBasis,TargetSpace> mixedAssembler(compositeBasis, localGFEStiffness);
 #if MIXED_SPACE
       MixedRiemannianTrustRegionSolver<GridType,
           CompositeBasis,
diff --git a/src/film-on-substrate.cc b/src/film-on-substrate.cc
index 7ae51bf0fc8f5df310a9445de3c7fe5a2e87e67b..efd0f302a09243de149e066ac50389464756fbe5 100644
--- a/src/film-on-substrate.cc
+++ b/src/film-on-substrate.cc
@@ -537,9 +537,7 @@ int main (int argc, char *argv[]) try
     sumEnergy.addLocalEnergy(surfaceCosseratEnergy);
 
     LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(&sumEnergy);
-    MixedGFEAssembler<CompositeBasis,
-        RealTuple<double,dim>,
-        Rotation<double,dim> > mixedAssembler(compositeBasis, localGFEADOLCStiffness);
+    MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 
     ////////////////////////////////////////////////////////
     //   Set Dirichlet values
diff --git a/src/simofoxshell.cc b/src/simofoxshell.cc
index 4b5d52f9f008b705d08fae85a2ccbf714a570c24..f67062dd6a8f300514493519f97dcb83421315ae 100644
--- a/src/simofoxshell.cc
+++ b/src/simofoxshell.cc
@@ -325,8 +325,7 @@ int main(int argc, char *argv[]) try
     LocalGeodesicFEADOLCStiffness<decltype(compositeBasis),
         TargetSpace> localGFEADOLCStiffness(&simoFoxEnergyADOLCLocalStiffness);
 
-    MixedGFEAssembler<decltype(compositeBasis),
-        RealTuple<double,3>, UnitVector<double,3> > assembler(compositeBasis, localGFEADOLCStiffness);
+    MixedGFEAssembler<decltype(compositeBasis),TargetSpace> assembler(compositeBasis, localGFEADOLCStiffness);
     ////////////////////////////////////////////////////////
     //   Set Dirichlet values
     ////////////////////////////////////////////////////////
diff --git a/test/cosseratcontinuumtest.cc b/test/cosseratcontinuumtest.cc
index 9fb4c175ae84cf9e1687980a962c85c79b2e3743..e741625d63bed19b394a09c102f246df6ab01a0a 100644
--- a/test/cosseratcontinuumtest.cc
+++ b/test/cosseratcontinuumtest.cc
@@ -217,9 +217,7 @@ int main (int argc, char *argv[])
   sumEnergy.addLocalEnergy(neumannEnergy);
 
   LocalGeodesicFEADOLCStiffness<CompositeBasis,RigidBodyMotion> localGFEADOLCStiffness(&sumEnergy);
-  MixedGFEAssembler<CompositeBasis,
-      RealTuple<double,dim>,
-      Rotation<double,dim> > mixedAssembler(compositeBasis, localGFEADOLCStiffness);
+  MixedGFEAssembler<CompositeBasis,RigidBodyMotion> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 
   MixedRiemannianTrustRegionSolver<GridType,
       CompositeBasis,
diff --git a/test/filmonsubstratetest.cc b/test/filmonsubstratetest.cc
index b39e1b92a5ba1856d344b6ac7c9f0648cdd1a90a..9b543291648d950ac2fc8e628f11d89d77ac9c32 100644
--- a/test/filmonsubstratetest.cc
+++ b/test/filmonsubstratetest.cc
@@ -364,9 +364,7 @@ int main (int argc, char *argv[])
   sumEnergy.addLocalEnergy(surfaceCosseratEnergy);
 
   LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> localGFEADOLCStiffness(&sumEnergy);
-  MixedGFEAssembler<CompositeBasis,
-      RealTuple<double,dim>,
-      Rotation<double,dim> > mixedAssembler(compositeBasis, localGFEADOLCStiffness);
+  MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, localGFEADOLCStiffness);
 
   ////////////////////////////////////////////////////////
   //   Set Dirichlet values
diff --git a/test/geodesicfeassemblerwrappertest.cc b/test/geodesicfeassemblerwrappertest.cc
index cc32fdc27789c7281cdfd71815050485a9d8602b..9b6cf7a7b86b47e35035debf59538a2e9ae5a6dc 100644
--- a/test/geodesicfeassemblerwrappertest.cc
+++ b/test/geodesicfeassemblerwrappertest.cc
@@ -141,9 +141,7 @@ int main (int argc, char *argv[])
                                                                                      nullptr);
   LocalGeodesicFEADOLCStiffness<CompositeBasis,
       GFE::ProductManifold<RealTuple<double,dim>,Rotation<double,dim> > > mixedLocalGFEADOLCStiffness(&cosseratEnergy);
-  MixedGFEAssembler<CompositeBasis,
-      RealTuple<double,dim>,
-      Rotation<double,dim> > mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness);
+  MixedGFEAssembler<CompositeBasis,RBM> mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness);
 
   using DeformationFEBasis = Functions::LagrangeBasis<GridView,displacementOrder>;
   DeformationFEBasis deformationFEBasis(gridView);
diff --git a/test/mixedriemannianpnsolvertest.cc b/test/mixedriemannianpnsolvertest.cc
index c8a178c473d836cdc2facb275cef31931f82e98a..89ddeb07e3c28c2e934efedb95ac1391bf5cb0f5 100644
--- a/test/mixedriemannianpnsolvertest.cc
+++ b/test/mixedriemannianpnsolvertest.cc
@@ -172,9 +172,7 @@ int main (int argc, char *argv[])
 
   LocalGeodesicFEADOLCStiffness<CompositeBasis,RBM> mixedLocalGFEADOLCStiffness(&cosseratEnergy);
 
-  MixedGFEAssembler<CompositeBasis,
-      RealTuple<double,dim>,
-      Rotation<double,dim> > mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness);
+  MixedGFEAssembler<CompositeBasis, RBM> mixedAssembler(compositeBasis, mixedLocalGFEADOLCStiffness);
 
   using GFEAssemblerWrapper = GFE::GeodesicFEAssemblerWrapper<CompositeBasis, DeformationFEBasis, RBM, RealTuple<double, dim>, Rotation<double,dim> >;
   GFEAssemblerWrapper assembler(&mixedAssembler, deformationFEBasis);