diff --git a/dune/gfe/mixedriemanniantrsolver.cc b/dune/gfe/mixedriemanniantrsolver.cc
index 6b26eb0a2ab281942523b23ba94af62ac920da6e..345919c47912fbcb8f7f576b8fe42b33616e4e3b 100644
--- a/dune/gfe/mixedriemanniantrsolver.cc
+++ b/dune/gfe/mixedriemanniantrsolver.cc
@@ -311,6 +311,8 @@ void MixedRiemannianTrustRegionSolver<GridType,Basis0,TargetSpace0,Basis1,Target
     // \todo Use global index set instead of basis for parallel computations
     MaxNormTrustRegion<blocksize0> trustRegion0(assembler_->basis0_.indexSet().size(), initialTrustRegionRadius_);
     MaxNormTrustRegion<blocksize1> trustRegion1(assembler_->basis1_.indexSet().size(), initialTrustRegionRadius_);
+    trustRegion0.set(initialTrustRegionRadius_, std::get<0>(scaling_));
+    trustRegion1.set(initialTrustRegionRadius_, std::get<1>(scaling_));
 
     std::vector<BoxConstraint<field_type,blocksize0> > trustRegionObstacles0;
     std::vector<BoxConstraint<field_type,blocksize1> > trustRegionObstacles1;
diff --git a/dune/gfe/mixedriemanniantrsolver.hh b/dune/gfe/mixedriemanniantrsolver.hh
index 69306d4a98bc72008d25a28bbf03db0bc788914f..4c311e0c8515a1e53fc32bee21e8278fe5e23245 100644
--- a/dune/gfe/mixedriemanniantrsolver.hh
+++ b/dune/gfe/mixedriemanniantrsolver.hh
@@ -57,7 +57,10 @@ public:
         : NumProc(NumProc::FULL),
 
           h1SemiNorm0_(nullptr), h1SemiNorm1_(nullptr)
-    {}
+    {
+        std::fill(std::get<0>(scaling_).begin(), std::get<0>(scaling_).end(), 1.0);
+        std::fill(std::get<1>(scaling_).begin(), std::get<1>(scaling_).end(), 1.0);
+    }
 
     /** \brief Set up the solver using a monotone multigrid method as the inner solver */
     void setup(const GridType& grid,
@@ -77,6 +80,16 @@ public:
                int baseIterations,
                double baseTolerance,
                bool instrumented);
+
+    void setScaling(const Dune::FieldVector<double,blocksize0+blocksize1>& scaling)
+    {
+      for (int i=0; i<3; i++)
+      {
+        std::get<0>(scaling_)[i] = scaling[i];
+        std::get<1>(scaling_)[i] = scaling[i+3];
+      }
+    }
+
 #if 0
     void setIgnoreNodes(const Dune::BitSetVector<blocksize0>& ignoreNodes)
     {
@@ -114,6 +127,9 @@ protected:
     /** \brief The initial trust-region radius in the maximum-norm */
     double initialTrustRegionRadius_;
 
+    /** \brief Trust-region norm scaling */
+    std::tuple<Dune::FieldVector<double,3>, Dune::FieldVector<double,3> > scaling_;
+
     /** \brief Maximum number of trust-region steps */
     int maxTrustRegionSteps_;
 
diff --git a/src/mixed-cosserat-continuum.cc b/src/mixed-cosserat-continuum.cc
index 9a3512ebdfb40595890a0e9d088b18509d41b103..dd7230da4ecf994b936cfda4818cf556f10b78f8 100644
--- a/src/mixed-cosserat-continuum.cc
+++ b/src/mixed-cosserat-continuum.cc
@@ -320,6 +320,8 @@ int main (int argc, char *argv[]) try
                  baseTolerance,
                  instrumented);
 
+        solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling"));
+
         ////////////////////////////////////////////////////////
         //   Set Dirichlet values
         ////////////////////////////////////////////////////////