diff --git a/test/porousmediumflow/3p/implicit/3pniconductionproblem.hh b/test/porousmediumflow/3p/implicit/3pniconductionproblem.hh
index b5adb99f47318162535a1dccc82c17b5d576a350..86095d018698dc3b318b84d16fc476dc18333dc6 100644
--- a/test/porousmediumflow/3p/implicit/3pniconductionproblem.hh
+++ b/test/porousmediumflow/3p/implicit/3pniconductionproblem.hh
@@ -94,21 +94,23 @@ SET_TYPE_PROP(ThreePNIConductionProblem,
 template <class TypeTag>
 class ThreePNIConductionProblem : public ImplicitPorousMediaProblem<TypeTag>
 {
-    typedef ImplicitPorousMediaProblem<TypeTag> ParentType;
-
-    typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
-    typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar;
-    typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry;
-    typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables;
-    typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem;
-    typedef typename GET_PROP_TYPE(TypeTag, BoundaryTypes) BoundaryTypes;
-    typedef typename GET_PROP_TYPE(TypeTag, TimeManager) TimeManager;
-    typedef typename GET_PROP_TYPE(TypeTag, ThermalConductivityModel) ThermalConductivityModel;
-    typedef typename GET_PROP_TYPE(TypeTag, VolumeVariables) VolumeVariables;
-    typedef H2O<Scalar> IapwsH2O;
+    using ParentType = ImplicitPorousMediaProblem<TypeTag>;
+
+    using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
+    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
+    using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVElementGeometry);
+    using PrimaryVariables = typename GET_PROP_TYPE(TypeTag, PrimaryVariables);
+    using FluidSystem = typename GET_PROP_TYPE(TypeTag, FluidSystem);
+    using BoundaryTypes = typename GET_PROP_TYPE(TypeTag, BoundaryTypes);
+    using TimeManager = typename GET_PROP_TYPE(TypeTag, TimeManager);
+    using ThermalConductivityModel = typename GET_PROP_TYPE(TypeTag, ThermalConductivityModel);
+    using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables);
+    using ElementVolumeVariables = typename GET_PROP_TYPE(TypeTag, ElementVolumeVariables);
+    using SubControlVolumeFace = typename GET_PROP_TYPE(TypeTag, SubControlVolumeFace);
+    using IapwsH2O = H2O<Scalar>;
 
     // copy some indices for convenience
-    typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices;
+    using Indices = typename GET_PROP_TYPE(TypeTag, Indices);
     enum {
         // world dimension
         dimWorld = GridView::dimensionworld
@@ -125,12 +127,9 @@ class ThreePNIConductionProblem : public ImplicitPorousMediaProblem<TypeTag>
         temperatureIdx = Indices::temperatureIdx
     };
 
-
-    typedef typename GridView::template Codim<0>::Entity Element;
-    typedef typename GridView::Intersection Intersection;
-
-    typedef Dune::FieldVector<Scalar, dimWorld> GlobalPosition;
-
+    using Element = typename GridView::template Codim<0>::Entity;
+    using Intersection = typename GridView::Intersection;
+    using GlobalPosition = Dune::FieldVector<Scalar, dimWorld>;
 
 public:
     ThreePNIConductionProblem(TimeManager &timeManager, const GridView &gridView)
@@ -249,9 +248,9 @@ public:
      * \param values The boundary types for the conservation equations
      * \param globalPos The position for which the bc type should be evaluated
      */
-    void boundaryTypesAtPos(BoundaryTypes &values,
-                            const GlobalPosition &globalPos) const
+    BoundaryTypes boundaryTypesAtPos(const GlobalPosition &globalPos) const
     {
+        BoundaryTypes values;
         if(globalPos[0] < eps_ || globalPos[0] > this->bBoxMax()[0] - eps_)
         {
             values.setAllDirichlet();
@@ -260,6 +259,7 @@ public:
         {
             values.setAllNeumann();
         }
+        return values;
     }
 
     /*!
@@ -271,37 +271,36 @@ public:
      *
      * For this method, the \a values parameter stores primary variables.
      */
-    void dirichletAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const
+    PrimaryVariables dirichletAtPos(const GlobalPosition &globalPos) const
     {
+        PrimaryVariables values(0.0);
         initial_(values, globalPos);
 
-//        condition for the N2 molefraction at left boundary
         if (globalPos[0] < eps_)
-        {
             values[temperatureIdx] = temperatureHigh_;
-        }
-
-
+        return values;
     }
 
     /*!
-     * \brief Evaluate the boundary conditions for a Neumann
+     * \brief Evaluate the boundary conditions for a neumann
      *        boundary segment.
      *
-     * For this method, the \a priVars parameter stores the mass flux
-     * in normal direction of each component. Negative values mean
-     * influx.
+     * \param values The neumann values for the conservation equations
+     * \param element The finite element
+     * \param fvGeometry The finite-volume geometry in the box scheme
+     * \param intersection The intersection between element and boundary
+     * \param scvIdx The local vertex index
+     * \param boundaryFaceIdx The index of the boundary face
      *
-     * The units must be according to either using mole or mass fractions. (mole/(m^2*s) or kg/(m^2*s))
+     * For this method, the \a values parameter stores the mass flux
+     * in normal direction of each phase. Negative values mean influx.
      */
-    void neumann(PrimaryVariables &priVars,
-                 const Element &element,
-                 const FVElementGeometry &fvGeometry,
-                 const Intersection &intersection,
-                 const int scvIdx,
-                 const int boundaryFaceIdx) const
+    PrimaryVariables neumann(const Element &element,
+                             const FVElementGeometry& fvGeometry,
+                             const ElementVolumeVariables& elemVolVars,
+                             const SubControlVolumeFace& scvf) const
     {
-        priVars = 0;
+        return PrimaryVariables(0.0);
     }
 
     // \}
@@ -312,20 +311,14 @@ public:
     // \{
 
     /*!
-     * \brief Evaluate the source term for all phases within a given
-     *        sub-control-volume.
-     *
-     * For this method, the \a priVars parameter stores the rate mass
-     * of a component is generated or annihilate per volume
-     * unit. Positive values mean that mass is created, negative ones
-     * mean that it vanishes.
+     * \brief Returns the source term at specific position in the domain.
      *
-     * The units must be according to either using mole or mass fractions. (mole/(m^3*s) or kg/(m^3*s))
+     * \param values The source values for the primary variables
+     * \param globalPos The position
      */
-    void sourceAtPos(PrimaryVariables &priVars,
-                     const GlobalPosition &globalPos) const
+    PrimaryVariables sourceAtPos(const GlobalPosition &globalPos) const
     {
-        priVars = Scalar(0.0);
+        return PrimaryVariables(0.0);
     }
 
     /*!
@@ -337,9 +330,11 @@ public:
      * For this method, the \a values parameter stores primary
      * variables.
      */
-    void initialAtPos(PrimaryVariables &values, const GlobalPosition &globalPos) const
+    PrimaryVariables initialAtPos(const GlobalPosition &globalPos) const
     {
+        PrimaryVariables values(0.0);
         initial_(values, globalPos);
+        return values;
     }
 
     // \}
diff --git a/test/porousmediumflow/3p/implicit/3pnispatialparams.hh b/test/porousmediumflow/3p/implicit/3pnispatialparams.hh
index 16dec769e42caedac70c4ccba56df26b0b0a7d1e..6fdd140d43ea3268e4537f0db0943b48dc9e8486 100644
--- a/test/porousmediumflow/3p/implicit/3pnispatialparams.hh
+++ b/test/porousmediumflow/3p/implicit/3pnispatialparams.hh
@@ -70,24 +70,32 @@ SET_PROP(ThreePNISpatialParams, MaterialLaw)
 template<class TypeTag>
 class ThreePNISpatialParams : public ImplicitSpatialParams<TypeTag>
 {
-    typedef ImplicitSpatialParams<TypeTag> ParentType;
-    typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid;
-    typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
-    typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar;
-
-    typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector;
-
-
-    typedef typename GET_PROP_TYPE(TypeTag, FVElementGeometry) FVElementGeometry;
-    typedef typename GridView::template Codim<0>::Entity Element;
+    using ParentType = ImplicitSpatialParams<TypeTag>;
+    using Problem = typename GET_PROP_TYPE(TypeTag, Problem);
+    using Grid = typename GET_PROP_TYPE(TypeTag, Grid);
+    using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
+    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
+
+    using SolutionVector = typename GET_PROP_TYPE(TypeTag, SolutionVector);
+
+    using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVElementGeometry);
+    using SubControlVolume = typename GET_PROP_TYPE(TypeTag, SubControlVolume);
+    using Element = typename GridView::template Codim<0>::Entity;
+    enum {
+        dimWorld=GridView::dimensionworld
+    };
+    using CoordScalar = typename Grid::ctype;
+    using GlobalPosition = Dune::FieldVector<CoordScalar,dimWorld>;
 
 public:
+    // export permeability type
+    using PermeabilityType = Scalar;
 
-    typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw;
-    typedef typename MaterialLaw::Params MaterialLawParams;
+    using MaterialLaw = typename GET_PROP_TYPE(TypeTag, MaterialLaw);
+    using  MaterialLawParams = typename MaterialLaw::Params;
 
-    ThreePNISpatialParams(const GridView &gridView)
-        : ParentType(gridView)
+    ThreePNISpatialParams(const Problem& problem, const GridView &gridView)
+        : ParentType(problem, gridView)
     {
         permeability_ = 1e-10;
         porosity_ = 0.4;
@@ -126,43 +134,31 @@ public:
     }
 
     /*!
-     * \brief Define the intrinsic permeability \f$\mathrm{[m^2]}\f$.
+     * \brief Returns the scalar intrinsic permeability \f$[m^2]\f$
      *
-     * \param element The current finite element
-     * \param fvGeometry The current finite volume geometry of the element
-     * \param scvIdx The index of the sub-control volume
+     * \param globalPos The global position
      */
-    const Scalar intrinsicPermeability(const Element &element,
-                                       const FVElementGeometry &fvGeometry,
-                                       const int scvIdx) const
+    Scalar permeabilityAtPos(const GlobalPosition& globalPos) const
     {
         return permeability_;
     }
 
     /*!
-     * \brief Define the porosity \f$\mathrm{[-]}\f$.
+     * \brief Returns the porosity \f$[-]\f$
      *
-     * \param element The finite element
-     * \param fvGeometry The finite volume geometry
-     * \param scvIdx The local index of the sub-control volume where
+     * \param globalPos The global position
      */
-    double porosity(const Element &element,
-                    const FVElementGeometry &fvGeometry,
-                    const int scvIdx) const
+    Scalar porosityAtPos(const GlobalPosition& globalPos) const
     {
         return porosity_;
     }
 
-        /*!
-     * \brief return the parameter object for the Brooks-Corey material law which depends on the position
+    /*!
+     * \brief Returns the parameter object for the Brooks-Corey material law
      *
-     * \param element The current finite element
-     * \param fvGeometry The current finite volume geometry of the element
-     * \param scvIdx The index of the sub-control volume
+     * \param globalPos The global position
      */
-    const MaterialLawParams& materialLawParams(const Element &element,
-                                               const FVElementGeometry &fvGeometry,
-                                               const int scvIdx) const
+    const MaterialLawParams& materialLawParamsAtPos(const GlobalPosition& globalPos) const
     {
         return materialParams_;
     }
@@ -172,13 +168,9 @@ public:
      *
      * This is only required for non-isothermal models.
      *
-     * \param element The finite element
-     * \param fvGeometry The finite volume geometry
-     * \param scvIdx The local index of the sub-control volume
+     * \param globalPos The global position
      */
-    Scalar solidHeatCapacity(const Element &element,
-                             const FVElementGeometry &fvGeometry,
-                             const int scvIdx) const
+    Scalar solidHeatCapacityAtPos(const GlobalPosition& globalPos) const
     {
         return 790; // specific heat capacity of granite [J / (kg K)]
     }
@@ -188,13 +180,9 @@ public:
      *
      * This is only required for non-isothermal models.
      *
-     * \param element The finite element
-     * \param fvGeometry The finite volume geometry
-     * \param scvIdx The local index of the sub-control volume
+     * \param globalPos The global position
      */
-    Scalar solidDensity(const Element &element,
-                        const FVElementGeometry &fvGeometry,
-                        const int scvIdx) const
+    Scalar solidDensityAtPos(const GlobalPosition& globalPos) const
     {
         return 2700; // density of granite [kg/m^3]
     }
@@ -202,14 +190,11 @@ public:
     /*!
      * \brief Returns the thermal conductivity \f$\mathrm{[W/(m K)]}\f$ of the porous material.
      *
-     * \param element The finite element
-     * \param fvGeometry The finite volume geometry
-     * \param scvIdx The local index of the sub-control volume where
-     *                    the heat capacity needs to be defined
+     * This is only required for non-isothermal models.
+     *
+     * \param globalPos The global position
      */
-    Scalar solidThermalConductivity(const Element &element,
-                                    const FVElementGeometry &fvGeometry,
-                                    const int scvIdx) const
+    Scalar solidThermalConductivityAtPos(const GlobalPosition& globalPos) const
     {
         return lambdaSolid_;
     }
diff --git a/test/porousmediumflow/3p/implicit/infiltration3pproblem.hh b/test/porousmediumflow/3p/implicit/infiltration3pproblem.hh
index 9b5a9307125da39cedc51173422e40888cfad10c..89a8f9c264f76c8907931a760f52080b2eaea98f 100644
--- a/test/porousmediumflow/3p/implicit/infiltration3pproblem.hh
+++ b/test/porousmediumflow/3p/implicit/infiltration3pproblem.hh
@@ -237,7 +237,7 @@ public:
             if (pc < 0.0) pc = 0.0;
 
             sw = invertPcgw_(pc,
-                             this->spatialParams().materialLawParams());
+                             this->spatialParams().materialLawParamsAtPos(globalPos));
             if (sw < swr) sw = swr;
             if (sw > 1.-sgr) sw = 1.-sgr;
 
@@ -339,7 +339,7 @@ private:
             if (pc < 0.0) pc = 0.0;
 
             sw = invertPcgw_(pc,
-                             this->spatialParams().materialLawParams());
+                             this->spatialParams().materialLawParamsAtPos(globalPos));
             if (sw < swr) sw = swr;
             if (sw > 1.-sgr) sw = 1.-sgr;
 
diff --git a/test/porousmediumflow/3p/implicit/infiltration3pspatialparams.hh b/test/porousmediumflow/3p/implicit/infiltration3pspatialparams.hh
index e49ea0c10b28134aa33e4d7b3bf0aa192c18c6c7..0e06b9ef59b69737e6409aea94255a0eb0aba4e9 100644
--- a/test/porousmediumflow/3p/implicit/infiltration3pspatialparams.hh
+++ b/test/porousmediumflow/3p/implicit/infiltration3pspatialparams.hh
@@ -89,6 +89,9 @@ class InfiltrationThreePSpatialParams : public ImplicitSpatialParams<TypeTag>
 
 
 public:
+    // export permeability type
+    using PermeabilityType = Scalar;
+
     //get the material law from the property system
     typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw;
     typedef typename MaterialLaw::Params MaterialLawParams;
@@ -142,51 +145,33 @@ public:
     }
 
     /*!
-     * \brief Intrinsic permability
+     * \brief Returns the scalar intrinsic permeability \f$[m^2]\f$
      *
-     * \param element The current element
-     * \param fvElemGeom The current finite volume geometry of the element
-     * \param scvIdx The index of the sub-control volume
-     * \return Intrinsic permeability
+     * \param globalPos The global position
      */
-    const Scalar intrinsicPermeability(const SubControlVolume& scv,
-                                       const VolumeVariables& volVars) const
+    Scalar permeabilityAtPos(const GlobalPosition& globalPos) const
     {
-        const GlobalPosition &globalPos = scv.dofPosition();
         if (isFineMaterial_(globalPos))
             return fineK_;
         return coarseK_;
     }
 
     /*!
-     * \brief Porosity
+     * \brief Returns the porosity \f$[-]\f$
      *
-     * \param element The current element
-     * \param fvElemGeom The current finite volume geometry of the element
-     * \param scvIdx The index of the sub-control volume
-     * \return Porosity
+     * \param globalPos The global position
      */
-    double porosity(const SubControlVolume& scv) const
+    Scalar porosityAtPos(const GlobalPosition& globalPos) const
     {
         return porosity_;
     }
 
-
     /*!
-     * \brief Function for defining the parameters needed by constitutive relationships (kr-sw, pc-sw, etc.).
+     * \brief Returns the parameter object for the Brooks-Corey material law
      *
-     * \param element The current element
-     * \param fvElemGeom The current finite volume geometry of the element
-     * \param scvIdx The index of the sub-control volume
-     * \return the material parameters object
+     * \param globalPos The global position
      */
-    const MaterialLawParams& materialLawParams(const Element &element,
-                                               const SubControlVolume& scv) const
-    {
-        return materialParams_;
-    }
-
-    const MaterialLawParams& materialLawParams() const
+    const MaterialLawParams& materialLawParamsAtPos(const GlobalPosition& globalPos) const
     {
         return materialParams_;
     }