diff --git a/src/enumparser.cc b/src/enumparser.cc
index e7d58c5035cbf9c12840d94de4e3fd4d83facfb8..f5649effd99a20d95a7dc966246182af0cf56e92 100644
--- a/src/enumparser.cc
+++ b/src/enumparser.cc
@@ -56,6 +56,17 @@ Config::stateModel StringToEnum<Config::stateModel>::convert(
   DUNE_THROW(Dune::Exception, "failed to parse enum");
 }
 
+Config::PatchType StringToEnum<Config::PatchType>::convert(
+    std::string const &s) {
+  if (s == "Rectangular")
+    return Config::Rectangular;
+
+  if (s == "Trapezoidal")
+    return Config::Trapezoidal;
+
+  DUNE_THROW(Dune::Exception, "failed to parse enum");
+}
+
 Solver::VerbosityMode StringToEnum<Solver::VerbosityMode>::convert(
     std::string const &s) {
   if (s == "full")
@@ -73,4 +84,5 @@ Solver::VerbosityMode StringToEnum<Solver::VerbosityMode>::convert(
 template std::istream &operator>>(std::istream &lhs, Config::FrictionModel &);
 template std::istream &operator>>(std::istream &lhs, Config::stateModel &);
 template std::istream &operator>>(std::istream &lhs, Config::scheme &);
+template std::istream &operator>>(std::istream &lhs, Config::PatchType &);
 template std::istream &operator>>(std::istream &lhs, Solver::VerbosityMode &);
diff --git a/src/enumparser.hh b/src/enumparser.hh
index 7eaa0fa6ed49e47034ad7b33b3dd6c0c62847f2e..0f5cd5d80b76ba815a449a9828ae35647c36f126 100644
--- a/src/enumparser.hh
+++ b/src/enumparser.hh
@@ -23,6 +23,10 @@ template <> struct StringToEnum<Config::scheme> {
   static Config::scheme convert(std::string const &s);
 };
 
+template <> struct StringToEnum<Config::PatchType> {
+  static Config::PatchType convert(std::string const &s);
+};
+
 template <> struct StringToEnum<Solver::VerbosityMode> {
   static Solver::VerbosityMode convert(std::string const &s);
 };
diff --git a/src/enums.hh b/src/enums.hh
index a6bf4ad0f89c0f606637a61d84e5c2fdbf74821a..0ec8540dfe171fb667a18dabff0570140e7c9969 100644
--- a/src/enums.hh
+++ b/src/enums.hh
@@ -5,6 +5,7 @@ struct Config {
   enum FrictionModel { Truncated, Regularised };
   enum stateModel { AgeingLaw, SlipLaw };
   enum scheme { Newmark, BackwardEuler };
+  enum PatchType { Rectangular, Trapezoidal };
 };
 
 #endif
diff --git a/src/sand-wedge-data/parset-3D.cfg b/src/sand-wedge-data/parset-3D.cfg
index 3495d53fd360b8167acea58f3632cdeefc124f83..3ff0794d1a6ddd68e3338995b925dea90a158f94 100644
--- a/src/sand-wedge-data/parset-3D.cfg
+++ b/src/sand-wedge-data/parset-3D.cfg
@@ -2,6 +2,9 @@
 [boundary.friction]
 smallestDiameter= 2e-2  # [m]
 
+[boundary.friction.weakening]
+patchType       = Trapezoidal
+
 [timeSteps]
 refinementTolerance = 1e-5
 
diff --git a/src/sand-wedge-data/weakpatch.hh b/src/sand-wedge-data/weakpatch.hh
index a6162ebe7ad6ec96f470d32f5a72182b113f8bff..0ae7f614a27614e4747fe0c9fefc95fb444c366b 100644
--- a/src/sand-wedge-data/weakpatch.hh
+++ b/src/sand-wedge-data/weakpatch.hh
@@ -1,7 +1,8 @@
 #ifndef SRC_SAND_WEDGE_DATA_WEAKPATCH_HH
 #define SRC_SAND_WEDGE_DATA_WEAKPATCH_HH
 
-template <class LocalVector> ConvexPolyhedron<LocalVector> getWeakPatch() {
+template <class LocalVector>
+ConvexPolyhedron<LocalVector> getWeakPatch(Dune::ParameterTree const &parset) {
   ConvexPolyhedron<LocalVector> weakPatch;
 #if MY_DIM == 3
   weakPatch.vertices.resize(4);
@@ -11,6 +12,16 @@ template <class LocalVector> ConvexPolyhedron<LocalVector> getWeakPatch() {
     weakPatch.vertices[k][2] = -MyGeometry::depth / 2.0;
     weakPatch.vertices[k + 2][2] = MyGeometry::depth / 2.0;
   }
+  switch (parset.get<Config::PatchType>("patchType")) {
+    case Config::Rectangular:
+      break;
+    case Config::Trapezoidal:
+      weakPatch.vertices[1][0] += 0.05 * MyGeometry::lengthScale;
+      weakPatch.vertices[3][0] -= 0.05 * MyGeometry::lengthScale;
+      break;
+    default:
+      assert(false);
+  }
 #else
   weakPatch.vertices.resize(2);
   weakPatch.vertices[0] = MyGeometry::X;
diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc
index c717b88748bdf5b961677279d53b7e5b1eda762e..f6ed06934ca0bc0b882e1ee603e600caae7d756c 100644
--- a/src/sand-wedge.cc
+++ b/src/sand-wedge.cc
@@ -119,7 +119,8 @@ int main(int argc, char *argv[]) {
     using ScalarMatrix = MyAssembler::ScalarMatrix;
     using ScalarVector = MyAssembler::ScalarVector;
 
-    auto weakPatch = getWeakPatch<LocalVector>();
+    auto const weakPatch =
+        getWeakPatch<LocalVector>(parset.sub("boundary.friction.weakening"));
 
     // {{{ Set up grid
     GridConstructor<Grid> gridConstructor;
@@ -140,8 +141,8 @@ int main(int argc, char *argv[]) {
     std::cout << "min diameter: " << minDiameter << std::endl;
     std::cout << "max diameter: " << maxDiameter << std::endl;
 
-    GridView const leafView = grid->leafGridView();
-    size_t const leafVertexCount = leafView.size(dims);
+    auto const leafView = grid->leafGridView();
+    auto const leafVertexCount = leafView.size(dims);
 
     std::cout << "Number of DOFs: " << leafVertexCount << std::endl;