diff --git a/patches/README b/patches/README
index bcb91ea8018cf778c79a3cd01b911c0ccee753bb..2d6250de9b3fc9e03a138fab3f4e7376cf72b8c5 100644
--- a/patches/README
+++ b/patches/README
@@ -1,7 +1,12 @@
+- If you want to run a Dumux multidomain model with Dune 2.4, the module
+  dune-multidomaingrid has to be patched: apply multidomaingrid-2.3.patch in the
+  directory containing the releases/2.3-branch of dune-multidomaingrid, e.g.:
+  patch -p1 <../dumux/patches/multidomaingrid-2.3.patch
+
 - If the AMGBackend should be used without SuperLU as coarse grid solver, it can
   be benefitial to decrease the corresponding tolerance. To do so, apply the
   patch istl-2.3.0.patch in your directory containing
-  DUNE-ISTL 2.3.0, e.g.:
+  dune-istl 2.3.0, e.g.:
   patch -p1 <../dumux/patches/istl-2.3.0.patch
 
 - If UG has been installed for parallel usage, and you want to run a Dumux
diff --git a/patches/multidomaingrid-2.3.patch b/patches/multidomaingrid-2.3.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4fedee6f9dc0c3783b39880866358068b6db6080
--- /dev/null
+++ b/patches/multidomaingrid-2.3.patch
@@ -0,0 +1,292 @@
+diff --git a/dune/grid/multidomaingrid/entity.hh b/dune/grid/multidomaingrid/entity.hh
+index 2de5650..25e049a 100644
+--- a/dune/grid/multidomaingrid/entity.hh
++++ b/dune/grid/multidomaingrid/entity.hh
+@@ -3,6 +3,7 @@
+ 
+ #include <dune/grid/common/entity.hh>
+ #include <dune/grid/common/gridenums.hh>
++#include <dune/common/version.hh>
+ 
+ namespace Dune {
+ 
+@@ -178,6 +179,12 @@ public:
+     return _hostEntityPointer->template count<cc>();
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_GRID, 2, 4)
++  int subEntities(int cc) const {
++    return _hostEntityPointer->subEntities(cc);
++  }
++#endif
++
+   Geometry geometry() const {
+     return Geometry(_hostEntityPointer->geometry());
+   }
+@@ -271,6 +278,12 @@ public:
+     return _hostEntityPointer->template count<cc>();
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_GRID, 2, 4)
++  int subEntities(int cc) const {
++    return _hostEntityPointer->subEntities(cc);
++  }
++#endif
++
+   template<int cc>
+   typename GridImp::template Codim<cc>::EntityPointer subEntity(int i) const {
+     return EntityPointerWrapper<cc,GridImp>(_hostEntityPointer->template subEntity<cc>(i));
+diff --git a/dune/grid/multidomaingrid/geometry.hh b/dune/grid/multidomaingrid/geometry.hh
+index 517abe2..0a47501 100644
+--- a/dune/grid/multidomaingrid/geometry.hh
++++ b/dune/grid/multidomaingrid/geometry.hh
+@@ -2,6 +2,7 @@
+ #define DUNE_MULTIDOMAINGRID_GEOMETRY_HH
+ 
+ #include <dune/grid/common/geometry.hh>
++#include <dune/common/version.hh>
+ 
+ namespace Dune {
+ 
+@@ -102,6 +103,7 @@ private:
+ } // namespace mdgrid
+ 
+ 
++#if !DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
+ namespace FacadeOptions {
+ 
+ template< int mydim, int coorddim, class GridImp >
+@@ -111,6 +113,7 @@ struct StoreGeometryReference< mydim, coorddim, GridImp, mdgrid::GeometryWrapper
+ };
+ 
+ } // namespace FacadeOptions
++#endif
+ 
+ } // namespace Dune
+ 
+diff --git a/dune/grid/multidomaingrid/indexsets.hh b/dune/grid/multidomaingrid/indexsets.hh
+index 96ca13b..01b982c 100644
+--- a/dune/grid/multidomaingrid/indexsets.hh
++++ b/dune/grid/multidomaingrid/indexsets.hh
+@@ -21,6 +21,7 @@
+ #include <boost/swap.hpp>
+ 
+ #include <dune/common/shared_ptr.hh>
++#include <dune/common/version.hh>
+ #include <dune/grid/common/exceptions.hh>
+ #include <dune/grid/common/indexidset.hh>
+ 
+@@ -237,7 +238,11 @@ T& rw(const T& t) {
+ template<typename GridImp, typename HostGridViewType>
+ class IndexSetWrapper :
+     public Dune::IndexSet<GridImp,IndexSetWrapper<GridImp,HostGridViewType>,
+-                          typename HostGridViewType::IndexSet::IndexType>
++                          typename HostGridViewType::IndexSet::IndexType
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++                          , typename HostGridViewType::IndexSet::Types
++#endif
++                         >
+ {
+ 
+   template<typename, typename>
+@@ -275,6 +280,9 @@ public:
+ 
+ 
+   typedef typename HostIndexSet::IndexType IndexType;
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  typedef typename HostIndexSet::Types Types;
++#endif
+   static const int dimension = remove_const<GridImp>::type::dimension;
+   static const std::size_t maxSubDomains = SubDomainSet::maxSize;
+ 
+@@ -384,6 +392,12 @@ public:
+     return r;
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  Types types (int codim) const {
++    return _hostGridView.indexSet().types(codim);
++  }
++#endif
++
+   //! Returns a list of all geometry types with codimension codim contained in the grid.
+   const std::vector<GeometryType>& geomTypes(int codim) const {
+     return _hostGridView.indexSet().geomTypes(codim);
+diff --git a/dune/grid/multidomaingrid/localgeometry.hh b/dune/grid/multidomaingrid/localgeometry.hh
+index 7e9a748..2f8049d 100644
+--- a/dune/grid/multidomaingrid/localgeometry.hh
++++ b/dune/grid/multidomaingrid/localgeometry.hh
+@@ -2,6 +2,7 @@
+ #define DUNE_MULTIDOMAINGRID_LOCALGEOMETRY_HH
+ 
+ #include <dune/grid/common/geometry.hh>
++#include <dune/common/version.hh>
+ 
+ namespace Dune {
+ 
+@@ -104,6 +105,7 @@ private:
+ } // namespace mdgrid
+ 
+ 
++#if !DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
+ namespace FacadeOptions {
+ 
+ template< int mydim, int coorddim, class GridImp >
+@@ -113,6 +115,7 @@ struct StoreGeometryReference< mydim, coorddim, GridImp, mdgrid::LocalGeometryWr
+ };
+ 
+ } // namespace FacadeOptions
++#endif
+ 
+ } // namespace Dune
+ 
+diff --git a/dune/grid/multidomaingrid/subdomaingrid/entity.hh b/dune/grid/multidomaingrid/subdomaingrid/entity.hh
+index 2d5a43d..f65c6a8 100644
+--- a/dune/grid/multidomaingrid/subdomaingrid/entity.hh
++++ b/dune/grid/multidomaingrid/subdomaingrid/entity.hh
+@@ -3,6 +3,7 @@
+ 
+ #include <dune/grid/common/entity.hh>
+ #include <dune/grid/common/gridenums.hh>
++#include <dune/common/version.hh>
+ 
+ namespace Dune {
+ 
+@@ -190,6 +191,12 @@ public:
+     return _multiDomainEntityPointer->template count<cc>();
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  int subEntities(int cc) const {
++    return _multiDomainEntityPointer->subEntities(cc);
++  }
++#endif
++
+   Geometry geometry() const {
+     return Geometry(hostEntity().geometry());
+   }
+@@ -302,6 +309,12 @@ public:
+     return hostEntity().template count<cc>();
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  int subEntities(int cc) const {
++    return hostEntity().subEntities(cc);
++  }
++#endif
++
+   template<int cc>
+   typename GridImp::template Codim<cc>::EntityPointer subEntity(int i) const {
+     return EntityPointerWrapper<cc,GridImp>(_grid,_multiDomainEntityPointer->template subEntity<cc>(i));
+diff --git a/dune/grid/multidomaingrid/subdomaingrid/geometry.hh b/dune/grid/multidomaingrid/subdomaingrid/geometry.hh
+index 235bf2f..6aa23fc 100644
+--- a/dune/grid/multidomaingrid/subdomaingrid/geometry.hh
++++ b/dune/grid/multidomaingrid/subdomaingrid/geometry.hh
+@@ -2,6 +2,7 @@
+ #define DUNE_MULTIDOMAINGRID_SUBDOMAINGRID_GEOMETRY_HH
+ 
+ #include <dune/grid/common/geometry.hh>
++#include <dune/common/version.hh>
+ 
+ namespace Dune {
+ 
+@@ -78,12 +79,20 @@ public:
+     return _hostGeometry.center();
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  const JacobianTransposed
++#else
+   const JacobianTransposed&
++#endif
+   jacobianTransposed(const LocalCoords& local) const {
+     return _hostGeometry.jacobianTransposed(local);
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  const JacobianInverseTransposed
++#else
+   const JacobianInverseTransposed&
++#endif
+   jacobianInverseTransposed(const LocalCoords& local) const {
+     return _hostGeometry.jacobianInverseTransposed(local);
+   }
+@@ -103,6 +112,7 @@ private:
+ } // namespace mdgrid
+ 
+ 
++#if !DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
+ namespace FacadeOptions {
+ 
+ template< int mydim, int coorddim, class GridImp >
+@@ -112,6 +122,7 @@ struct StoreGeometryReference< mydim, coorddim, GridImp, mdgrid::subdomain::Geom
+ };
+ 
+ } // namespace FacadeOptions
++#endif
+ 
+ } // namespace Dune
+ 
+diff --git a/dune/grid/multidomaingrid/subdomaingrid/indexsets.hh b/dune/grid/multidomaingrid/subdomaingrid/indexsets.hh
+index b510dcd..e45b7c1 100644
+--- a/dune/grid/multidomaingrid/subdomaingrid/indexsets.hh
++++ b/dune/grid/multidomaingrid/subdomaingrid/indexsets.hh
+@@ -9,6 +9,7 @@
+ #include <tuple>
+ #include <boost/scoped_ptr.hpp>
+ #include <boost/bind.hpp>
++#include <dune/common/version.hh>
+ #include <dune/grid/common/indexidset.hh>
+ #include <dune/grid/multidomaingrid/utility.hh>
+ 
+@@ -57,6 +58,9 @@ public:
+   typedef SubDomainIndex SubDomainIndexType DUNE_DEPRECATED_MSG("Use SubDomainIndex instead.");
+   typedef SubDomainIndex SubDomainType DUNE_DEPRECATED_MSG("Use SubDomainIndex instead.");
+   typedef typename MDIndexSet::IndexType IndexType;
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  typedef typename MDIndexSet::Types Types;
++#endif
+   static const int dimension = remove_const<GridImp>::type::dimension;
+   //typedef typename SubDomainSet::DomainType DomainType;
+   //static const std::size_t maxSubDomains = MDGrid::MDGridTraits::template Codim
+@@ -86,6 +90,12 @@ public:
+     return _mdIndexSet.subIndex(_grid.domain(),_grid.multiDomainEntity(e),i,codim);
+   }
+ 
++#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
++  Types types (int codim) const {
++    return _mdIndexSet.types(codim);
++  }
++#endif
++
+   const std::vector<GeometryType>& geomTypes(int codim) const {
+     return _mdIndexSet.geomTypesForSubDomain(_grid.domain(),codim);
+   }
+diff --git a/dune/grid/multidomaingrid/subdomaingrid/localgeometry.hh b/dune/grid/multidomaingrid/subdomaingrid/localgeometry.hh
+index bd1cc68..b8096cb 100644
+--- a/dune/grid/multidomaingrid/subdomaingrid/localgeometry.hh
++++ b/dune/grid/multidomaingrid/subdomaingrid/localgeometry.hh
+@@ -2,6 +2,7 @@
+ #define DUNE_MULTIDOMAINGRID_SUBDOMAINGRID_LOCALGEOMETRY_HH
+ 
+ #include <dune/grid/common/geometry.hh>
++#include <dune/common/version.hh>
+ 
+ namespace Dune {
+ 
+@@ -103,6 +104,7 @@ private:
+ } // namespace mdgrid
+ 
+ 
++#if !DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4)
+ namespace FacadeOptions {
+ 
+ template< int mydim, int coorddim, class GridImp >
+@@ -112,6 +114,7 @@ struct StoreGeometryReference< mydim, coorddim, GridImp, mdgrid::subdomain::Loca
+ };
+ 
+ } // namespace FacadeOptions
++#endif
+ 
+ } // namespace Dune
+ 
diff --git a/test/multidomain/README b/test/multidomain/README
index 8ea1fa2c771dea595d16c10b7d0f5566b54ca25d..cd513ff45d04c6952c7e230d6356e4b1ca78476e 100755
--- a/test/multidomain/README
+++ b/test/multidomain/README
@@ -1,15 +1,17 @@
 == Running the test cases in test/multidomain ==
 
-You need the following releases of the DUNE core modules and
-dune-multidomain(grid):
-Dune core modules: release 2.3
-Dune-PDELab: release 2.0
-dune-multidomaingrid: release branch 2.3
-dune-multidomain: release branch 2.0
+You need the following versions of the required Dune modules:
+Dune core modules, dune-typetree, dune-multidomaingrid: release (branch) 2.3
+Dune-PDELab, dune-multidomain: release (branch) 2.0
+
 For your convenience we provide the Shell script installRequiredModules.sh
 in the same folder as this README. Alternatively, you can use the script
 checkout-dumux from dumux.org/download/.
 
+Alternatively, you can use version 2.4 of the Dune core modules
+(_not_ dune-typetree which stays at 2.3). In this case, you have to patch
+dune-multidomaingrid. See the patches directory for more information.
+
 Install the external grid manager UG and a direct linear solver like SuperLU
 or PARDISO. You need Boost fusion for dune-multidomaingrid.