diff --git a/src/assemblers.cc b/src/assemblers.cc
index b9a3e76b93f0ebf96e011b61cbbda9b36d6b847a..d78bb999cb6abff0e010cd92ac8dfa61a4039895 100644
--- a/src/assemblers.cc
+++ b/src/assemblers.cc
@@ -12,6 +12,7 @@
 #include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/weightedmassassembler.hh>
 #include <dune/fufem/boundarypatch.hh>
+#include <dune/fufem/computestress.hh>
 #include <dune/fufem/functions/basisgridfunction.hh>
 #include <dune/fufem/functions/constantfunction.hh>
 
@@ -90,6 +91,24 @@ void MyAssembler<GridView, dimension>::assembleNeumann(
                                              neumannBoundary);
 }
 
+template <class GridView, int dimension>
+void MyAssembler<GridView, dimension>::assembleNormalStress(
+    BoundaryPatch<GridView> const &frictionalBoundary,
+    ScalarVector &normalStress, double youngModulus, double poissonRatio,
+    Vector const &displacement) {
+
+  Vector traction;
+  Stress<GridView>::getElasticSurfaceNormalStress // misnomer(!)
+      (frictionalBoundary, displacement, traction, youngModulus, poissonRatio);
+
+  std::vector<typename Vector::block_type> normals;
+  frictionalBoundary.getNormals(normals);
+  for (size_t i = 0; i < traction.size(); ++i) {
+    normalStress[i] = normals[i] * traction[i];
+    assert(normalStress[i] <= 0.0);
+  }
+}
+
 template <class GridView, int dimension>
 auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity(
     BoundaryPatch<GridView> const &frictionalBoundary,
diff --git a/src/assemblers.hh b/src/assemblers.hh
index a281251e7f91d76c08c12734253bd2b5a876e13b..c90235cc879567ba18618499765eb8186fef86a3 100644
--- a/src/assemblers.hh
+++ b/src/assemblers.hh
@@ -67,6 +67,10 @@ template <class GridView, int dimension> class MyAssembler {
                        Dune::VirtualFunction<double, double> const &neumann,
                        double relativeTime);
 
+  void assembleNormalStress(BoundaryPatch<GridView> const &frictionalBoundary,
+                            ScalarVector &normalStress, double youngModulus,
+                            double poissonRatio, Vector const &displacement);
+
   std::shared_ptr<GlobalRuinaNonlinearity<Matrix, Vector, GridView>>
   assembleFrictionNonlinearity(
       BoundaryPatch<GridView> const &frictionalBoundary,
diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 918f4994e51c955a3f3a9959b21e75b521de8b15..eb4b38acb852dc9373932ccd7628ecdc6568ddc6 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -190,21 +190,7 @@ int main(int argc, char *argv[]) {
     Vector ell(fineVertexCount);
     computeExternalForces(0.0, ell);
 
-    ScalarVector normalStress(fineVertexCount);
-    normalStress = (myGeometry.A[1] - myGeometry.C[1]) *
-                   parset.get<double>("gravity") *
-                   parset.get<double>("body.density");
-    MyGlobalFrictionData<dims> frictionInfo(parset.sub("boundary.friction"),
-                                            myGeometry);
-
     // {{{ Initial conditions
-    ScalarVector alpha_initial(fineVertexCount);
-    alpha_initial =
-        std::log(parset.get<double>("boundary.friction.initialState"));
-    auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity(
-        frictionalBoundary, frictionInfo, normalStress);
-    myGlobalNonlinearity->updateLogState(alpha_initial);
-
     using LinearFactory = SolverFactory<
         dims, BlockNonlinearTNNMGProblem<ConvexProblem<
                   ZeroNonlinearity<LocalVector, LocalMatrix>, Matrix>>,
@@ -240,6 +226,20 @@ int main(int argc, char *argv[]) {
     u_initial = 0.0;
     solveLinearProblem(dirichletNodes, A, ell, u_initial, ANorm,
                        parset.sub("u0.solver"));
+
+    ScalarVector alpha_initial(fineVertexCount);
+    alpha_initial =
+        std::log(parset.get<double>("boundary.friction.initialState"));
+    ScalarVector normalStress(fineVertexCount);
+    myAssembler.assembleNormalStress(frictionalBoundary, normalStress,
+                                     body.getYoungModulus(),
+                                     body.getPoissonRatio(), u_initial);
+    MyGlobalFrictionData<dims> frictionInfo(parset.sub("boundary.friction"),
+                                            myGeometry);
+    auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity(
+        frictionalBoundary, frictionInfo, normalStress);
+    myGlobalNonlinearity->updateLogState(alpha_initial);
+
     Vector v_initial(fineVertexCount);
     v_initial = 0.0;
     {