diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 5571ac5c3230395a870e3642fdfc094915af861b..4747485f483853b2dbb6194169914b44cbf59add 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -56,6 +56,7 @@
 #include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/massassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh>
+#include <dune/fufem/assemblers/localassemblers/viscosityassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh>
 #include <dune/fufem/boundarypatch.hh>
 #include <dune/fufem/dunepython.hh>
@@ -106,19 +107,18 @@ initTimeStepper(Config::scheme scheme,
                 FunctionType const &velocityDirichletFunction,
                 Dune::BitSetVector<dimension> const &velocityDirichletNodes,
                 MatrixType const &massMatrix, MatrixType const &stiffnessMatrix,
-                MatrixType const &dampingMatrix, double wc,
-                VectorType const &u_initial, VectorType const &v_initial,
-                VectorType const &a_initial) {
+                MatrixType const &dampingMatrix, VectorType const &u_initial,
+                VectorType const &v_initial, VectorType const &a_initial) {
   switch (scheme) {
     case Config::Newmark:
       return Dune::make_shared<
           Newmark<VectorType, MatrixType, FunctionType, dims>>(
-          stiffnessMatrix, massMatrix, dampingMatrix, wc, u_initial, v_initial,
+          stiffnessMatrix, massMatrix, dampingMatrix, u_initial, v_initial,
           a_initial, velocityDirichletNodes, velocityDirichletFunction);
     case Config::BackwardEuler:
       return Dune::make_shared<
           BackwardEuler<VectorType, MatrixType, FunctionType, dims>>(
-          stiffnessMatrix, massMatrix, dampingMatrix, wc, u_initial, v_initial,
+          stiffnessMatrix, massMatrix, dampingMatrix, u_initial, v_initial,
           velocityDirichletNodes, velocityDirichletFunction);
     default:
       assert(false);
@@ -312,9 +312,14 @@ int main(int argc, char *argv[]) {
       localStiffness(E, nu);
       p1Assembler.assembleOperator(localStiffness, A);
     }
-
-    auto const wc = parset.get<double>("problem.damping");
-    MatrixType const &C = A;
+    MatrixType C;
+    {
+      ViscosityAssembler<GridType, P1Basis::LocalFiniteElement,
+                         P1Basis::LocalFiniteElement> const
+      localViscosity(parset.get<double>("body.shearViscosity"),
+                     parset.get<double>("body.bulkViscosity"));
+      p1Assembler.assembleOperator(localViscosity, C);
+    }
 
     SingletonMatrixType frictionalBoundaryMassMatrix;
     EnergyNorm<SingletonMatrixType, SingletonVectorType> const stateEnergyNorm(
@@ -404,13 +409,12 @@ int main(int argc, char *argv[]) {
       {
         accelerationRHS = 0.0;
         Arithmetic::addProduct(accelerationRHS, A, u_initial);
-        Arithmetic::addProduct(accelerationRHS, wc, C, v_initial);
+        Arithmetic::addProduct(accelerationRHS, C, v_initial);
         myGlobalNonlinearity->updateState(alpha_initial);
         // NOTE: We assume differentiability of Psi at v0 here!
         myGlobalNonlinearity->addGradient(v_initial, accelerationRHS);
         accelerationRHS -= ell;
-        // instead of multiplying M by (1.0 - wc), we divide the RHS
-        accelerationRHS *= -1.0 / (1.0 - wc);
+        accelerationRHS *= -1.0;
       }
       LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), // FIXME
                                             refinements, *grid,
@@ -460,7 +464,7 @@ int main(int argc, char *argv[]) {
     auto timeSteppingScheme =
         initTimeStepper(parset.get<Config::scheme>("timeSteps.scheme"),
                         velocityDirichletFunction, velocityDirichletNodes, M, A,
-                        C, wc, u_initial, v_initial, a_initial);
+                        C, u_initial, v_initial, a_initial);
     auto stateUpdater = initStateUpdater<SingletonVectorType, VectorType>(
         parset.get<Config::stateModel>("boundary.friction.stateModel"),
         alpha_initial, frictionalNodes, frictionData);
diff --git a/src/one-body-sample.parset b/src/one-body-sample.parset
index 7eb60fab0c0a6441526dc04134c0e832d0fd40e9..4f663a2fafd60496faa6e117456c4272e5589eb6 100644
--- a/src/one-body-sample.parset
+++ b/src/one-body-sample.parset
@@ -5,7 +5,6 @@ writeVTK      = false
 
 [problem]
 finalTime = 15
-damping   = 0.0 # Needs to lie in [0,1)
 
 [body]
 E       = 5e7
@@ -13,6 +12,8 @@ nu      = 0.3 # The closer we get to 0.5, the more wiggly everything gets
 density = 5000
 height  = 1
 width   = 5
+shearViscosity = 0
+bulkViscosity  = 0
 
 [boundary.friction]
 mu0          = 0.6
diff --git a/src/timestepping/backward_euler.cc b/src/timestepping/backward_euler.cc
index d9828616cd137f2e9274744d55ade3a87a80de24..288ddb6094f658c54752f90fbf6f322511c74ee3 100644
--- a/src/timestepping/backward_euler.cc
+++ b/src/timestepping/backward_euler.cc
@@ -1,13 +1,12 @@
 template <class VectorType, class MatrixType, class FunctionType, size_t dim>
 BackwardEuler<VectorType, MatrixType, FunctionType, dim>::BackwardEuler(
     MatrixType const &_A, MatrixType const &_M, MatrixType const &_C,
-    double _wc, VectorType const &_u_initial, VectorType const &_v_initial,
+    VectorType const &_u_initial, VectorType const &_v_initial,
     Dune::BitSetVector<dim> const &_dirichletNodes,
     FunctionType const &_dirichletFunction)
     : A(_A),
       M(_M),
       C(_C),
-      wc(_wc),
       u(_u_initial),
       v(_v_initial),
       dirichletNodes(_dirichletNodes),
@@ -57,14 +56,14 @@ void BackwardEuler<VectorType, MatrixType, FunctionType, dim>::setup(
     indices.exportIdx(AM);
   }
   AM = 0.0;
-  Arithmetic::addProduct(AM, (1.0 - wc) / tau, M);
-  Arithmetic::addProduct(AM, wc, C);
+  Arithmetic::addProduct(AM, 1.0 / tau, M);
+  Arithmetic::addProduct(AM, 1.0, C);
   Arithmetic::addProduct(AM, tau, A);
 
   // set up RHS
   {
     rhs = ell;
-    Arithmetic::addProduct(rhs, (1.0 - wc) / tau, M, v_o);
+    Arithmetic::addProduct(rhs, 1.0 / tau, M, v_o);
     Arithmetic::subtractProduct(rhs, A, u_o);
   }
 
diff --git a/src/timestepping/backward_euler.hh b/src/timestepping/backward_euler.hh
index 02e8ddc62255b6d5a928deed22ab3efeae6eda53..50d73d0a101b419d2856c9f32baba86f8558ba9f 100644
--- a/src/timestepping/backward_euler.hh
+++ b/src/timestepping/backward_euler.hh
@@ -6,7 +6,7 @@ class BackwardEuler
     : public TimeSteppingScheme<VectorType, MatrixType, FunctionType, dim> {
 public:
   BackwardEuler(MatrixType const &_A, MatrixType const &_M,
-                MatrixType const &_C, double _wc, VectorType const &_u_initial,
+                MatrixType const &_C, VectorType const &_u_initial,
                 VectorType const &_v_initial,
                 Dune::BitSetVector<dim> const &_dirichletNodes,
                 FunctionType const &_dirichletFunction);
@@ -22,7 +22,6 @@ class BackwardEuler
   MatrixType const &A;
   MatrixType const &M;
   MatrixType const &C;
-  double wc;
   VectorType u;
   VectorType v;
   Dune::BitSetVector<dim> const &dirichletNodes;
diff --git a/src/timestepping/newmark.cc b/src/timestepping/newmark.cc
index 9e7fb91f9ba2baeceb4173285934ad7e05609c54..d1ce9f3962aeaacb29cfe5532aeea3bac28ab63b 100644
--- a/src/timestepping/newmark.cc
+++ b/src/timestepping/newmark.cc
@@ -1,14 +1,13 @@
 template <class VectorType, class MatrixType, class FunctionType, size_t dim>
 Newmark<VectorType, MatrixType, FunctionType, dim>::Newmark(
     MatrixType const &_A, MatrixType const &_M, MatrixType const &_C,
-    double _wc, VectorType const &_u_initial, VectorType const &_v_initial,
+    VectorType const &_u_initial, VectorType const &_v_initial,
     VectorType const &_a_initial,
     Dune::BitSetVector<dim> const &_dirichletNodes,
     FunctionType const &_dirichletFunction)
     : A(_A),
       M(_M),
       C(_C),
-      wc(_wc),
       u(_u_initial),
       v(_v_initial),
       a(_a_initial),
@@ -61,15 +60,15 @@ void Newmark<VectorType, MatrixType, FunctionType, dim>::setup(
     indices.exportIdx(AM);
   }
   AM = 0.0;
-  Arithmetic::addProduct(AM, (1.0 - wc) * 2.0 / tau, M);
-  Arithmetic::addProduct(AM, wc, C);
+  Arithmetic::addProduct(AM, 2.0 / tau, M);
+  Arithmetic::addProduct(AM, 1.0, C);
   Arithmetic::addProduct(AM, tau / 2.0, A);
 
   // set up RHS
   {
     rhs = ell;
-    Arithmetic::addProduct(rhs, (1.0 - wc) * 2.0 / tau, M, v_o);
-    Arithmetic::addProduct(rhs, 1.0 - wc, M, a_o);
+    Arithmetic::addProduct(rhs, 2.0 / tau, M, v_o);
+    Arithmetic::addProduct(rhs, M, a_o);
     Arithmetic::subtractProduct(rhs, tau / 2.0, A, v_o);
     Arithmetic::subtractProduct(rhs, A, u_o);
   }
diff --git a/src/timestepping/newmark.hh b/src/timestepping/newmark.hh
index cfd3b5f1744f85d2086852eba29bba827cdd2129..ce00de305a579a4fc36256e28e5cb861f9210171 100644
--- a/src/timestepping/newmark.hh
+++ b/src/timestepping/newmark.hh
@@ -6,8 +6,8 @@ class Newmark
     : public TimeSteppingScheme<VectorType, MatrixType, FunctionType, dim> {
 public:
   Newmark(MatrixType const &_A, MatrixType const &_M, MatrixType const &_C,
-          double _wc, VectorType const &_u_initial,
-          VectorType const &_v_initial, VectorType const &_a_initial,
+          VectorType const &_u_initial, VectorType const &_v_initial,
+          VectorType const &_a_initial,
           Dune::BitSetVector<dim> const &_dirichletNodes,
           FunctionType const &_dirichletFunction);
 
@@ -22,7 +22,6 @@ class Newmark
   MatrixType const &A;
   MatrixType const &M;
   MatrixType const &C;
-  double wc;
   VectorType u;
   VectorType v;
   VectorType a;