diff --git a/problems/cosserat-continuum-cantilever.parset b/problems/cosserat-continuum-cantilever.parset
index a697675dde85aed1bb666aa657d391ded7affca2..9440301af2c2e3a244b9799310e33768d16e1212 100644
--- a/problems/cosserat-continuum-cantilever.parset
+++ b/problems/cosserat-continuum-cantilever.parset
@@ -24,7 +24,7 @@ numHomotopySteps = 1
 tolerance = 1e-3
 
 # Max number of steps of the trust region solver
-maxTrustRegionSteps = 200
+maxSolverSteps = 200
 
 trustRegionScaling = 1 1 1 0.01 0.01 0.01
 
diff --git a/problems/cosserat-continuum-wriggers-l-shape.parset b/problems/cosserat-continuum-wriggers-l-shape.parset
index eb108bf0f5cbdf7474cd46f1234f78c263009278..12c715bd9e9618fa4ce069b8409584294f0f5660 100644
--- a/problems/cosserat-continuum-wriggers-l-shape.parset
+++ b/problems/cosserat-continuum-wriggers-l-shape.parset
@@ -20,7 +20,7 @@ numHomotopySteps = 1
 tolerance = 1e-8
 
 # Max number of steps of the trust region solver
-maxTrustRegionSteps = 1000
+maxSolverSteps = 1000
 
 trustRegionScaling = 1 1 1 0.01 0.01 0.01
 
diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc
index 6c38993bacdd13e961c60e084ae2ff226357c866..19fcf4135b2debf46457c937552555e858481b33 100644
--- a/src/cosserat-continuum.cc
+++ b/src/cosserat-continuum.cc
@@ -53,6 +53,7 @@
 #include <dune/gfe/mixedriemanniantrsolver.hh>
 #else
 #include <dune/gfe/geodesicfeassemblerwrapper.hh>
+#include <dune/gfe/riemannianpnsolver.hh>
 #include <dune/gfe/riemanniantrsolver.hh>
 #include <dune/gfe/rigidbodymotion.hh>
 #endif
@@ -124,7 +125,8 @@ int main (int argc, char *argv[]) try
     const int numLevels                   = parameterSet.get<int>("numLevels");
     int numHomotopySteps                  = parameterSet.get<int>("numHomotopySteps");
     const double tolerance                = parameterSet.get<double>("tolerance");
-    const int maxTrustRegionSteps         = parameterSet.get<int>("maxTrustRegionSteps");
+    const int maxSolverSteps              = parameterSet.get<int>("maxSolverSteps");
+    const double initialRegularization    = parameterSet.get<double>("initialRegularization", 1000);
     const double initialTrustRegionRadius = parameterSet.get<double>("initialTrustRegionRadius");
     const int multigridIterations         = parameterSet.get<int>("numIt");
     const int nu1                         = parameterSet.get<int>("nu1");
@@ -456,7 +458,7 @@ int main (int argc, char *argv[]) try
                      x,
                      deformationDirichletDofs,
                      orientationDirichletDofs, tolerance,
-                     maxTrustRegionSteps,
+                     maxSolverSteps,
                      initialTrustRegionRadius,
                      multigridIterations,
                      mgTolerance,
@@ -494,7 +496,7 @@ int main (int argc, char *argv[]) try
                      xTargetSpace,
                      dirichletDofsTargetSpace,
                      tolerance,
-                     maxTrustRegionSteps,
+                     maxSolverSteps,
                      initialTrustRegionRadius,
                      multigridIterations,
                      mgTolerance,
@@ -540,26 +542,45 @@ int main (int argc, char *argv[]) try
               for (int j = 3; j < TargetSpace::TangentVector::dimension; j ++)
                 dirichletDofsTargetSpace[i][j] = orientationDirichletDofs[i][j-3];
             }
-
-            RiemannianTrustRegionSolver<DeformationFEBasis, TargetSpace> solver;
-            solver.setup(*grid,
-                     &assembler,
-                     xTargetSpace,
-                     dirichletDofsTargetSpace,
-                     tolerance,
-                     maxTrustRegionSteps,
-                     initialTrustRegionRadius,
-                     multigridIterations,
-                     mgTolerance,
-                     mu, nu1, nu2,
-                     baseIterations,
-                     baseTolerance,
-                     instrumented);
-
-            solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling"));
-            solver.setInitialIterate(xTargetSpace);
-            solver.solve();
-            xTargetSpace = solver.getSol();
+            if (parameterSet.get<std::string>("solvertype", "trustRegion") == "trustRegion") {
+
+                RiemannianTrustRegionSolver<DeformationFEBasis, TargetSpace> solver;
+                solver.setup(*grid,
+                         &assembler,
+                         xTargetSpace,
+                         dirichletDofsTargetSpace,
+                         tolerance,
+                         maxSolverSteps,
+                         initialTrustRegionRadius,
+                         multigridIterations,
+                         mgTolerance,
+                         mu, nu1, nu2,
+                         baseIterations,
+                         baseTolerance,
+                         instrumented);
+
+                solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling"));
+                solver.setInitialIterate(xTargetSpace);
+                solver.solve();
+                xTargetSpace = solver.getSol();
+            } else { //parameterSet.get<std::string>("solvertype") == "proximalNewton"
+#if DUNE_VERSION_LT(DUNE_COMMON, 2, 8)
+                DUNE_THROW(Exception, "Please install dune-solvers >= 2.8 to use the Proximal Newton Solver with Cholmod!");
+#else
+                RiemannianProximalNewtonSolver<DeformationFEBasis, TargetSpace> solver;
+                solver.setup(*grid,
+                             &assembler,
+                             xTargetSpace,
+                             dirichletDofsTargetSpace,
+                             tolerance,
+                             maxSolverSteps,
+                             initialRegularization,
+                             instrumented);
+                solver.setInitialIterate(xTargetSpace);
+                solver.solve();
+                xTargetSpace = solver.getSol();
+#endif
+            }
 
             for (int i = 0; i < xTargetSpace.size(); i++) {
               x[_0][i] = xTargetSpace[i].r;