diff --git a/dune/gfe/assemblers/localfirstordermodel.hh b/dune/gfe/assemblers/localfirstordermodel.hh
index e9bcb5319af256331a84da47b006dfe8e6d05351..6e2f4132837b7d77322baa0debdd6555dc5b291d 100644
--- a/dune/gfe/assemblers/localfirstordermodel.hh
+++ b/dune/gfe/assemblers/localfirstordermodel.hh
@@ -16,6 +16,7 @@ namespace Dune::GFE
       : public LocalEnergyTypes<TargetSpace>
     {
       using Gradient = std::vector<typename TargetSpace::TangentVector>;
+      using CompositeGradient = TupleVector<std::vector<typename TargetSpace::TangentVector> >;
     };
 
     /** \brief A class exporting container types for sets of tangent vectors -- specialization for product manifolds
@@ -25,6 +26,7 @@ namespace Dune::GFE
       : public LocalEnergyTypes<ProductManifold<Factors...> >
     {
       using Gradient = std::vector<typename ProductManifold<Factors...>::TangentVector>;
+      using CompositeGradient = TupleVector<std::vector<typename Factors::TangentVector>... >;
     };
 
   }  // namespace Impl
diff --git a/dune/gfe/assemblers/mixedgfeassembler.hh b/dune/gfe/assemblers/mixedgfeassembler.hh
index d3e8a8f8f1caf7afa0fbcb23217df31752dd160a..f4182de4bf2113a77da8b48460feabe23dc37bf1 100644
--- a/dune/gfe/assemblers/mixedgfeassembler.hh
+++ b/dune/gfe/assemblers/mixedgfeassembler.hh
@@ -192,8 +192,10 @@ assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0,
         localConfiguration[_1][i-nDofs0] = configuration1[multiIndex[1]];
     }
 
-    std::vector<Dune::FieldVector<double,blocksize0> > localGradient0(nDofs0);
-    std::vector<Dune::FieldVector<double,blocksize1> > localGradient1(nDofs1);
+    Dune::TupleVector<std::vector<Dune::FieldVector<double,blocksize0> >,
+        std::vector<Dune::FieldVector<double,blocksize1> > > localGradient;
+    localGradient[_0].resize(nDofs0);
+    localGradient[_1].resize(nDofs1);
 
     using Row0 = Dune::MultiTypeBlockVector<Dune::Matrix<Dune::FieldMatrix<double, blocksize0, blocksize0> >,
         Dune::Matrix<Dune::FieldMatrix<double, blocksize0, blocksize1> > >;
@@ -207,7 +209,7 @@ assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0,
     // setup local matrix and gradient
     localStiffness_->assembleGradientAndHessian(localView,
                                                 localConfiguration,
-                                                localGradient0, localGradient1,
+                                                localGradient,
                                                 localHessian);
 
     // Add element matrix to global stiffness matrix
@@ -252,9 +254,9 @@ assembleGradientAndHessian(const std::vector<TargetSpace0>& configuration0,
 
       // Add local gradient to global gradient
       if (row[0] == 0)
-        gradient0[row[1]] += localGradient0[i];
+        gradient0[row[1]] += localGradient[_0][i];
       else
-        gradient1[row[1]] += localGradient1[i-nDofs0];
+        gradient1[row[1]] += localGradient[_1][i-nDofs0];
     }
 
   }
diff --git a/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh b/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
index cd640f226db6ad1dedef7678b1f02599b37d5a02..ae5620df418df9eecfa7ba56c93a6256598c7877 100644
--- a/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
+++ b/dune/gfe/assemblers/mixedlocalgeodesicfestiffness.hh
@@ -47,24 +47,12 @@ template<class Basis, class TargetSpace>
 class MixedLocalGeodesicFEStiffness
   : public Dune::GFE::LocalFirstOrderModel<Basis,TargetSpace>
 {
-  using DeformationTargetSpace = std::decay_t<decltype(std::declval<TargetSpace>()[Dune::Indices::_0])>;
-  using OrientationTargetSpace = std::decay_t<decltype(std::declval<TargetSpace>()[Dune::Indices::_1])>;
-
-  // Number type
-  typedef typename TargetSpace::ctype RT;
-
 public:
-
-  //! Dimension of a tangent space
-  constexpr static int blocksize0 = DeformationTargetSpace::TangentVector::dimension;
-  constexpr static int blocksize1 = OrientationTargetSpace::TangentVector::dimension;
-
   /** \brief Assemble the local stiffness matrix at the current position
    */
   virtual void assembleGradientAndHessian(const typename Basis::LocalView& localView,
                                           const typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::CompositeCoefficients& localConfiguration,
-                                          std::vector<typename DeformationTargetSpace::TangentVector>& localDeformationGradient,
-                                          std::vector<typename OrientationTargetSpace::TangentVector>& localOrientationGradient,
+                                          typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::CompositeGradient& localGradient,
                                           typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::MixedHessian& localHessian) const = 0;
 };
 
diff --git a/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh b/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
index bdcedd6b7659ad211520e8e5f64718487990ca94..d62186934244861875b5d72509af1b63adf1fd88 100644
--- a/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
+++ b/dune/gfe/assemblers/mixedlocalgfeadolcstiffness.hh
@@ -80,8 +80,7 @@ public:
    */
   virtual void assembleGradientAndHessian(const typename Basis::LocalView& localView,
                                           const typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::CompositeCoefficients& localConfiguration,
-                                          std::vector<typename TargetSpace0::TangentVector>& localGradient0,
-                                          std::vector<typename TargetSpace1::TangentVector>& localGradient1,
+                                          typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::CompositeGradient& localGradient,
                                           HessianType& localHessian) const override;
 
   const Dune::GFE::LocalEnergy<Basis, Dune::GFE::ProductManifold<ATargetSpace0, ATargetSpace1> >* localEnergy_;
@@ -158,8 +157,7 @@ template <class Basis, class TargetSpace0, class TargetSpace1>
 void MixedLocalGFEADOLCStiffness<Basis, TargetSpace0, TargetSpace1>::
 assembleGradientAndHessian(const typename Basis::LocalView& localView,
                            const typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::CompositeCoefficients& localConfiguration,
-                           std::vector<typename TargetSpace0::TangentVector>& localGradient0,
-                           std::vector<typename TargetSpace1::TangentVector>& localGradient1,
+                           typename Dune::GFE::Impl::MixedLocalStiffnessTypes<TargetSpace>::CompositeGradient& localGradient,
                            HessianType& localHessian) const
 {
   int rank = Dune::MPIHelper::getCommunication().rank();
@@ -203,7 +201,7 @@ assembleGradientAndHessian(const typename Basis::LocalView& localView,
       localEmbeddedGradient0[i][j] = g[idx++];
 
     // Express gradient in local coordinate system
-    localConfiguration[_0][i].orthonormalFrame().mv(localEmbeddedGradient0[i],localGradient0[i]);
+    localConfiguration[_0][i].orthonormalFrame().mv(localEmbeddedGradient0[i],localGradient[_0][i]);
   }
 
   for (size_t i=0; i<localConfiguration[_1].size(); i++) {
@@ -211,7 +209,7 @@ assembleGradientAndHessian(const typename Basis::LocalView& localView,
       localEmbeddedGradient1[i][j] = g[idx++];
 
     // Express gradient in local coordinate system
-    localConfiguration[_1][i].orthonormalFrame().mv(localEmbeddedGradient1[i],localGradient1[i]);
+    localConfiguration[_1][i].orthonormalFrame().mv(localEmbeddedGradient1[i],localGradient[_1][i]);
   }
 
   /////////////////////////////////////////////////////////////////