diff --git a/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh b/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh
index 44a4bc7a7404d249b48397fe5f4ebb3ee97dad83..292267a457833b2e42eda4015b56765fec9f2be6 100644
--- a/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh
+++ b/dumux/material/fluidmatrixinteractions/mp/2poftadapter.hh
@@ -23,27 +23,38 @@
  *        available under the M-phase API for material laws.
  * Also use the temperature dependent version of the material laws.
  */
-#ifndef DUMUX_MP_2P_OFT_ADAPTER_HH
-#define DUMUX_MP_2P_OFT_ADAPTER_HH
+#ifndef DUMUX_MP_OFT_ADAPTER_HH
+#define DUMUX_MP_OFT_ADAPTER_HH
 
 #include <algorithm>
+#include <cassert>
+#include <dumux/common/typetraits/typetraits.hh>
 
-namespace Dumux
+namespace Dumux {
+
+/*!
+ * \ingroup Fluidmatrixinteractions
+ * \brief Adapts the interface of the MpNc material law to the standard-Dumux material law.
+ * Also use the temperature dependent version of the material laws.
+ */
+template <class MaterialLaw, int numPhases>
+class MPOfTAdapter
 {
+    static_assert(AlwaysFalse<MaterialLaw>::value, "Adapter not implemented for the specified number of phases");
+};
+
+
 /*!
  * \ingroup Fluidmatrixinteractions
  * \brief Adapts the interface of the MpNc material law to the standard-Dumux material law.
  * Also use the temperature dependent version of the material laws.
  */
-template <int wPhaseIdx, class TwoPLaw>
-class TwoPOfTAdapter
+template <class MaterialLaw>
+class MPOfTAdapter<MaterialLaw, 2>
 {
-    enum { nPhaseIdx = (wPhaseIdx == 0)?1:0 };
 
 public:
-    using Params = typename TwoPLaw::Params;
-    using Scalar = typename Params::Scalar;
-    enum { numPhases = 2 };
+    using Params = typename MaterialLaw::Params;
 
     /*!
      * \brief The capillary pressure-saturation curve.
@@ -56,13 +67,16 @@ public:
     static void capillaryPressures(pcContainerT &pc,
                                    const Params &params,
                                    const FluidState &fluidState,
-                                   int wPhaseIdx = 0)
+                                   int wPhaseIdx)
     {
+        assert(pc.size() == 2);
+        const int nPhaseIdx = 1 - wPhaseIdx;
+
         // non-wetting phase gets the capillary pressure added
         pc[nPhaseIdx] = 0;
 
         // wetting phase does not get anything added
-        pc[wPhaseIdx] = - TwoPLaw::pc(params, fluidState.saturation(wPhaseIdx), fluidState.temperature(wPhaseIdx));
+        pc[wPhaseIdx] = - MaterialLaw::pc(params, fluidState.saturation(wPhaseIdx), fluidState.temperature(wPhaseIdx));
     }
 
     /*!
@@ -70,14 +84,18 @@ public:
      * \param kr Container for relative permeability
      * \param params Array of parameters
      * \param fluidState Fluidstate
+     * \param wPhaseIdx the phase index of the wetting phase
      */
     template <class krContainerT, class FluidState>
     static void relativePermeabilities(krContainerT &kr,
-                   const Params &params,
-                   const FluidState &fluidState)
+                                       const Params &params,
+                                       const FluidState &fluidState,
+                                       int wPhaseIdx)
     {
-        kr[wPhaseIdx] = TwoPLaw::krw(params, fluidState.saturation(wPhaseIdx));
-        kr[nPhaseIdx] = TwoPLaw::krn(params, fluidState.saturation(wPhaseIdx));
+        assert(kr.size() == 2);
+        const int nPhaseIdx = 1 - wPhaseIdx;
+        kr[wPhaseIdx] = MaterialLaw::krw(params, fluidState.saturation(wPhaseIdx));
+        kr[nPhaseIdx] = MaterialLaw::krn(params, fluidState.saturation(wPhaseIdx));
     }
 };
 }
diff --git a/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh b/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh
index 050135d640b02f46b8877739fd23e640ae56c5da..093a509aa54c3d24edd3a486e857b7ce646fdf72 100644
--- a/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh
+++ b/dumux/material/fluidmatrixinteractions/mp/mpadapter.hh
@@ -74,13 +74,14 @@ public:
      * \param values Container for the return values
      * \param params Array of parameters
      * \param state Fluidstate
+     * \param wPhaseIdx the phase index of the wetting phase
      */
     template <class ContainerT, class FluidState>
     static void relativePermeabilities(ContainerT &values,
                                        const Params &params,
-                                       const FluidState &state)
+                                       const FluidState &state,
+                                       int wPhaseIdx)
     {
-        const int wPhaseIdx = state.wettingPhase();
         assert(values.size() == 2);
         const int nPhaseIdx = 1 - wPhaseIdx;
         values[wPhaseIdx] = MaterialLaw::krw(params, state.saturation(wPhaseIdx));
diff --git a/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh b/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh
index 055ef6bfae89a77773224f85862ee83d8c786f91..049d7b57bafa06fde5adbbb213540ed19a0b328d 100644
--- a/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh
+++ b/dumux/material/fluidmatrixinteractions/mp/mplinearmaterial.hh
@@ -86,7 +86,8 @@ public:
     template <class ContainerT, class FluidState>
     static void relativePermeabilities(ContainerT &values,
                                        const Params &params,
-                                       const FluidState &state)
+                                       const FluidState &state,
+                                       int wPhaseIdx = 0)
     {
         using std::max;
         using std::min;
diff --git a/dumux/porousmediumflow/mpnc/volumevariables.hh b/dumux/porousmediumflow/mpnc/volumevariables.hh
index 904f7cb6be5c73e0971dc30c1fb62064e1854b31..6a1d378a361fd5225abe0344f2953e707281c9b5 100644
--- a/dumux/porousmediumflow/mpnc/volumevariables.hh
+++ b/dumux/porousmediumflow/mpnc/volumevariables.hh
@@ -106,14 +106,15 @@ public:
 
         //calculate the remaining quantities
         const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
+        const int wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol);
         // relative permeabilities
         using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
         using MPAdapter = MPAdapter<MaterialLaw, numFluidPhases()>;
-        MPAdapter::relativePermeabilities(relativePermeability_,
-                                            materialParams,
-                                            fluidState_);
+        MPAdapter::relativePermeabilities(relativePermeability_, materialParams, fluidState_, wPhaseIdx);
+
         typename FluidSystem::ParameterCache paramCache;
         paramCache.updateAll(fluidState_);
+
         if (enableDiffusion)
         {
             for (int phaseIdx = 0; phaseIdx < numFluidPhases(); ++phaseIdx)
@@ -561,13 +562,12 @@ public:
 
         //calculate the remaining quantities
         const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
+        const int wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol);
 
         // relative permeabilities
         using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
         using MPAdapter = MPAdapter<MaterialLaw, numFluidPhases()>;
-        MPAdapter::relativePermeabilities(relativePermeability_,
-                                          materialParams,
-                                          fluidState_);
+        MPAdapter::relativePermeabilities(relativePermeability_,  materialParams, fluidState_, wPhaseIdx);
         typename FluidSystem::ParameterCache paramCache;
         paramCache.updateAll(fluidState_);
         if (enableDiffusion)