diff --git a/dumux/material/components/tabulatedcomponent.hh b/dumux/material/components/tabulatedcomponent.hh
index c4347531b000650fd2d3c7db36b3b8e413cbbdf7..85f4468579441ff90dbd40dc0e7b04f041406093 100644
--- a/dumux/material/components/tabulatedcomponent.hh
+++ b/dumux/material/components/tabulatedcomponent.hh
@@ -31,6 +31,7 @@
 #include <cmath>
 #include <limits>
 #include <cassert>
+#include <vector>
 #include <iostream>
 
 #include <dumux/common/exceptions.hh>
@@ -48,12 +49,11 @@ namespace Components {
  * At the moment, this class can only handle the sub-critical fluids
  * since it tabulates along the vapor pressure curve.
  *
- * \tparam Scalar  The type used for scalar values
- * \tparam Scalar  The component which ought to be tabulated
- * \tparam verbose If set to true, a warning will be printed each time
- *                 a request can not be fulfilled from the tabulated
- *                 arrays. This is quite useful for debugging
- *                 purposes.
+ * \tparam Scalar The type used for scalar values
+ * \tparam RawComponent The component which ought to be tabulated
+ * \tparam useVaporPressure If set to true, the min/max pressure
+ *                          values for gas&liquid phase will be set
+ *                          depending on the vapor pressure.
  */
 template <class Scalar, class RawComponent, bool useVaporPressure=true>
 class TabulatedComponent
@@ -86,144 +86,32 @@ public:
         nPress_ = nPress;
         nDensity_ = nPress_;
 
-        // allocate the arrays
-        vaporPressure_ = new Scalar[nTemp_];
-        minGasDensity__ = new Scalar[nTemp_];
-        maxGasDensity__ = new Scalar[nTemp_];
-        minLiquidDensity__ = new Scalar[nTemp_];
-        maxLiquidDensity__ = new Scalar[nTemp_];
-
-        gasEnthalpy_ = new Scalar[nTemp_*nPress_];
-        liquidEnthalpy_ = new Scalar[nTemp_*nPress_];
-        gasHeatCapacity_ = new Scalar[nTemp_*nPress_];
-        liquidHeatCapacity_ = new Scalar[nTemp_*nPress_];
-        gasDensity_ = new Scalar[nTemp_*nPress_];
-        liquidDensity_ = new Scalar[nTemp_*nPress_];
-        gasViscosity_ = new Scalar[nTemp_*nPress_];
-        liquidViscosity_ = new Scalar[nTemp_*nPress_];
-        gasThermalConductivity_ = new Scalar[nTemp_*nPress_];
-        liquidThermalConductivity_ = new Scalar[nTemp_*nPress_];
-        gasPressure_ = new Scalar[nTemp_*nDensity_];
-        liquidPressure_ = new Scalar[nTemp_*nDensity_];
-
+        // resize & initilialize the arrays with NaN
         assert(std::numeric_limits<Scalar>::has_quiet_NaN);
-        Scalar NaN = std::numeric_limits<Scalar>::quiet_NaN();
-
-        // fill the temperature-pressure arrays
-        for (unsigned iT = 0; iT < nTemp_; ++ iT) {
-            Scalar temperature = iT * (tempMax_ - tempMin_)/(nTemp_ - 1) + tempMin_;
-
-            try { vaporPressure_[iT] = RawComponent::vaporPressure(temperature); }
-            catch (Dune::NotImplemented) { vaporPressure_[iT] = NaN; }
-            catch (NumericalProblem) { vaporPressure_[iT] = NaN; }
-
-            Scalar pgMax = maxGasPressure_(iT);
-            Scalar pgMin = minGasPressure_(iT);
-
-            // fill the temperature, pressure gas arrays
-            for (unsigned iP = 0; iP < nPress_; ++ iP) {
-                Scalar pressure = iP * (pgMax - pgMin)/(nPress_ - 1) + pgMin;
-
-                unsigned i = iT + iP*nTemp_;
-
-                try { gasEnthalpy_[i] = RawComponent::gasEnthalpy(temperature, pressure); }
-                catch (Dune::NotImplemented) { gasEnthalpy_[i] = NaN; }
-                catch (NumericalProblem) { gasEnthalpy_[i] = NaN; }
-
-                try { gasHeatCapacity_[i] = RawComponent::gasHeatCapacity(temperature, pressure); }
-                catch (Dune::NotImplemented) { gasHeatCapacity_[i] = NaN; }
-                catch (NumericalProblem) { gasHeatCapacity_[i] = NaN; }
-
-                try { gasDensity_[i] = RawComponent::gasDensity(temperature, pressure); }
-                catch (Dune::NotImplemented) { gasDensity_[i] = NaN; }
-                catch (NumericalProblem) { gasDensity_[i] = NaN; }
-
-                try { gasViscosity_[i] = RawComponent::gasViscosity(temperature, pressure); }
-                catch (Dune::NotImplemented) { gasViscosity_[i] = NaN; }
-                catch (NumericalProblem) { gasViscosity_[i] = NaN; }
-
-                try { gasThermalConductivity_[i] = RawComponent::gasThermalConductivity(temperature, pressure); }
-                catch (Dune::NotImplemented) { gasThermalConductivity_[i] = NaN; }
-                catch (NumericalProblem) { gasThermalConductivity_[i] = NaN; }
-            }
-
-            Scalar plMin = minLiquidPressure_(iT);
-            Scalar plMax = maxLiquidPressure_(iT);
-            for (unsigned iP = 0; iP < nPress_; ++ iP) {
-                Scalar pressure = iP * (plMax - plMin)/(nPress_ - 1) + plMin;
-
-                unsigned i = iT + iP*nTemp_;
-
-                try { liquidEnthalpy_[i] = RawComponent::liquidEnthalpy(temperature, pressure); }
-                catch (Dune::NotImplemented) { liquidEnthalpy_[i] = NaN; }
-                catch (NumericalProblem) { liquidEnthalpy_[i] = NaN; }
-
-                try { liquidHeatCapacity_[i] = RawComponent::liquidHeatCapacity(temperature, pressure); }
-                catch (Dune::NotImplemented) { liquidHeatCapacity_[i] = NaN; }
-                catch (NumericalProblem) { liquidHeatCapacity_[i] = NaN; }
-
-                try { liquidDensity_[i] = RawComponent::liquidDensity(temperature, pressure); }
-                catch (Dune::NotImplemented) { liquidDensity_[i] = NaN; }
-                catch (NumericalProblem) { liquidDensity_[i] = NaN; }
-
-                try { liquidViscosity_[i] = RawComponent::liquidViscosity(temperature, pressure); }
-                catch (Dune::NotImplemented) { liquidViscosity_[i] = NaN; }
-                catch (NumericalProblem) { liquidViscosity_[i] = NaN; }
-
-                try { liquidThermalConductivity_[i] = RawComponent::liquidThermalConductivity(temperature, pressure); }
-                catch (Dune::NotImplemented) { liquidThermalConductivity_[i] = NaN; }
-                catch (NumericalProblem) { liquidThermalConductivity_[i] = NaN; }
-            }
-        }
-
-        // fill the temperature-density arrays
-        for (unsigned iT = 0; iT < nTemp_; ++ iT) {
-            Scalar temperature = iT * (tempMax_ - tempMin_)/(nTemp_ - 1) + tempMin_;
-
-            // calculate the minimum and maximum values for the gas
-            // densities
-            minGasDensity__[iT] = RawComponent::gasDensity(temperature, minGasPressure_(iT));
-            if (iT < nTemp_ - 1)
-                maxGasDensity__[iT] = RawComponent::gasDensity(temperature, maxGasPressure_(iT + 1));
-            else
-                maxGasDensity__[iT] = RawComponent::gasDensity(temperature, maxGasPressure_(iT));
-
-            // fill the temperature, density gas arrays
-            for (unsigned iRho = 0; iRho < nDensity_; ++ iRho) {
-                Scalar density =
-                    Scalar(iRho)/(nDensity_ - 1) *
-                    (maxGasDensity__[iT] - minGasDensity__[iT])
-                    +
-                    minGasDensity__[iT];
-
-                unsigned i = iT + iRho*nTemp_;
-
-                try { gasPressure_[i] = RawComponent::gasPressure(temperature, density); }
-                catch (NumericalProblem) { gasPressure_[i] = NaN; }
-            }
-
-            // calculate the minimum and maximum values for the liquid
-            // densities
-            minLiquidDensity__[iT] = RawComponent::liquidDensity(temperature, minLiquidPressure_(iT));
-            if (iT < nTemp_ - 1)
-                maxLiquidDensity__[iT] = RawComponent::liquidDensity(temperature, maxLiquidPressure_(iT + 1));
-            else
-                maxLiquidDensity__[iT] = RawComponent::liquidDensity(temperature, maxLiquidPressure_(iT));
-
-            // fill the temperature, density liquid arrays
-            for (unsigned iRho = 0; iRho < nDensity_; ++ iRho) {
-                Scalar density =
-                    Scalar(iRho)/(nDensity_ - 1) *
-                    (maxLiquidDensity__[iT] - minLiquidDensity__[iT])
-                    +
-                    minLiquidDensity__[iT];
-
-                unsigned i = iT + iRho*nTemp_;
-
-                try { liquidPressure_[i] = RawComponent::liquidPressure(temperature, density); }
-                catch (NumericalProblem) { liquidPressure_[i] = NaN; }
-            }
-        }
+        const auto NaN = std::numeric_limits<Scalar>::quiet_NaN();
+
+        vaporPressure_.resize(nTemp_, NaN);
+        minGasDensity_.resize(nTemp_, NaN);
+        maxGasDensity_.resize(nTemp_, NaN);
+        minLiquidDensity_.resize(nTemp_, NaN);
+        maxLiquidDensity_.resize(nTemp_, NaN);
+
+        const std::size_t numEntriesTp = nTemp_*nPress_; // = nTemp_*nDensity_
+        gasEnthalpy_.resize(numEntriesTp, NaN);
+        liquidEnthalpy_.resize(numEntriesTp, NaN);
+        gasHeatCapacity_.resize(numEntriesTp, NaN);
+        liquidHeatCapacity_.resize(numEntriesTp, NaN);
+        gasDensity_.resize(numEntriesTp, NaN);
+        liquidDensity_.resize(numEntriesTp, NaN);
+        gasViscosity_.resize(numEntriesTp, NaN);
+        liquidViscosity_.resize(numEntriesTp, NaN);
+        gasThermalConductivity_.resize(numEntriesTp, NaN);
+        liquidThermalConductivity_.resize(numEntriesTp, NaN);
+        gasPressure_.resize(numEntriesTp, NaN);
+        liquidPressure_.resize(numEntriesTp, NaN);
+
+        //! initialize vapor pressure array depending on useVaporPressure
+        initVaporPressure_();
     }
 
     /*!
@@ -272,9 +160,8 @@ public:
     {
         using std::isnan;
         Scalar result = interpolateT_(vaporPressure_, T);
-        if (isnan(result)) {
+        if (isnan(result))
             return RawComponent::vaporPressure(T);
-        }
         return result;
     }
 
@@ -287,7 +174,7 @@ public:
      */
     static Scalar vaporTemperature(Scalar pressure)
     {
-            return RawComponent::vaporTemperature(pressure);
+        return RawComponent::vaporTemperature(pressure);
     }
 
     /*!
@@ -298,11 +185,19 @@ public:
      */
     static const Scalar gasEnthalpy(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateGasTP_(gasEnthalpy_,
-                                          temperature,
-                                          pressure);
+        Scalar result = interpolateTP_(gasEnthalpy_, temperature, pressure,
+                                       pressGasIdx_, minGasPressure_, maxGasPressure_, "gas");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!gasEnthalpyInitialized_)
+            {
+                auto gasEnth = [] (auto T, auto p) { return RawComponent::gasEnthalpy(T, p); };
+                initTPArray_(gasEnth, minGasPressure_, maxGasPressure_, gasEnthalpy_);
+                gasEnthalpyInitialized_ = true;
+                return gasEnthalpy(temperature, pressure);
+            }
+
             printWarning_("gasEnthalpy", temperature, pressure);
             return RawComponent::gasEnthalpy(temperature, pressure);
         }
@@ -317,11 +212,19 @@ public:
      */
     static const Scalar liquidEnthalpy(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateLiquidTP_(liquidEnthalpy_,
-                                             temperature,
-                                             pressure);
+        Scalar result = interpolateTP_(liquidEnthalpy_, temperature, pressure,
+                                       pressLiquidIdx_, minLiquidPressure_, maxLiquidPressure_, "liquid");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!liquidEnthalpyInitialized_)
+            {
+                auto liqEnth = [] (auto T, auto p) { return RawComponent::liquidEnthalpy(T, p); };
+                initTPArray_(liqEnth, minLiquidPressure_, maxLiquidPressure_, liquidEnthalpy_);
+                liquidEnthalpyInitialized_ = true;
+                return liquidEnthalpy(temperature, pressure);
+            }
+
             printWarning_("liquidEnthalpy", temperature, pressure);
             return RawComponent::liquidEnthalpy(temperature, pressure);
         }
@@ -336,11 +239,19 @@ public:
      */
     static const Scalar gasHeatCapacity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateGasTP_(gasHeatCapacity_,
-                                          temperature,
-                                          pressure);
+        Scalar result = interpolateTP_(gasHeatCapacity_, temperature, pressure,
+                                       pressGasIdx_, minGasPressure_, maxGasPressure_, "gas");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!gasHeatCapacityInitialized_)
+            {
+                auto gasHC = [] (auto T, auto p) { return RawComponent::gasHeatCapacity(T, p); };
+                initTPArray_(gasHC, minGasPressure_, maxGasPressure_, gasHeatCapacity_);
+                gasHeatCapacityInitialized_ = true;
+                return gasHeatCapacity(temperature, pressure);
+            }
+
             printWarning_("gasHeatCapacity", temperature, pressure);
             return RawComponent::gasHeatCapacity(temperature, pressure);
         }
@@ -355,11 +266,19 @@ public:
      */
     static const Scalar liquidHeatCapacity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateLiquidTP_(liquidHeatCapacity_,
-                                             temperature,
-                                             pressure);
+        Scalar result = interpolateTP_(liquidHeatCapacity_, temperature, pressure,
+                                       pressLiquidIdx_, minLiquidPressure_, maxLiquidPressure_, "liquid");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!liquidHeatCapacityInitialized_)
+            {
+                auto liqHC = [] (auto T, auto p) { return RawComponent::liquidHeatCapacity(T, p); };
+                initTPArray_(liqHC, minLiquidPressure_, maxLiquidPressure_, liquidHeatCapacity_);
+                liquidHeatCapacityInitialized_ = true;
+                return liquidHeatCapacity(temperature, pressure);
+            }
+
             printWarning_("liquidHeatCapacity", temperature, pressure);
             return RawComponent::liquidHeatCapacity(temperature, pressure);
         }
@@ -374,9 +293,7 @@ public:
      */
     static const Scalar gasInternalEnergy(Scalar temperature, Scalar pressure)
     {
-        Scalar result =
-            gasEnthalpy(temperature, pressure) - pressure/gasDensity(temperature, pressure);
-        return result;
+        return gasEnthalpy(temperature, pressure) - pressure/gasDensity(temperature, pressure);
     }
 
     /*!
@@ -387,9 +304,7 @@ public:
      */
     static const Scalar liquidInternalEnergy(Scalar temperature, Scalar pressure)
     {
-        Scalar result =
-            liquidEnthalpy(temperature, pressure) - pressure/liquidDensity(temperature, pressure);
-        return result;
+        return liquidEnthalpy(temperature, pressure) - pressure/liquidDensity(temperature, pressure);
     }
 
     /*!
@@ -400,14 +315,28 @@ public:
      */
     static Scalar gasPressure(Scalar temperature, Scalar density)
     {
-        Scalar result = interpolateGasTRho_(gasPressure_,
-                                            temperature,
-                                            density);
+        //! make sure the minimum/maximum densities have been computed
+        if (!minMaxGasDensityInitialized_)
+        {
+            auto gasRho = [] (auto T, auto p) { return RawComponent::gasDensity(T, p); };
+            initMinMaxRhoArray_(gasRho, minGasPressure_, maxGasPressure_, minGasDensity_, maxGasDensity_);
+            minMaxGasDensityInitialized_ = true;
+        }
+
+        Scalar result = interpolateTRho_(gasPressure_, temperature, density, densityGasIdx_);
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!gasPressureInitialized_)
+            {
+                auto gasPFunc = [] (auto T, auto rho) { return RawComponent::gasPressure(T, rho); };
+                initPressureArray_(gasPressure_, gasPFunc, minGasDensity_, maxGasDensity_);
+                gasPressureInitialized_ = true;
+                return gasPressure(temperature, density);
+            }
+
             printWarning_("gasPressure", temperature, density);
-            return RawComponent::gasPressure(temperature,
-                                             density);
+            return RawComponent::gasPressure(temperature, density);
         }
         return result;
     }
@@ -420,14 +349,28 @@ public:
      */
     static Scalar liquidPressure(Scalar temperature, Scalar density)
     {
-        Scalar result = interpolateLiquidTRho_(liquidPressure_,
-                                               temperature,
-                                               density);
+        //! make sure the minimum/maximum densities have been computed
+        if (!minMaxLiquidDensityInitialized_)
+        {
+            auto liqRho = [] (auto T, auto p) { return RawComponent::liquidDensity(T, p); };
+            initMinMaxRhoArray_(liqRho, minLiquidPressure_, maxLiquidPressure_, minLiquidDensity_, maxLiquidDensity_);
+            minMaxLiquidDensityInitialized_ = true;
+        }
+
+        Scalar result = interpolateTRho_(liquidPressure_, temperature, density, densityLiquidIdx_);
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!liquidPressureInitialized_)
+            {
+                auto liqPFunc = [] (auto T, auto rho) { return RawComponent::liquidPressure(T, rho); };
+                initPressureArray_(liquidPressure_, liqPFunc, minLiquidDensity_, maxLiquidDensity_);
+                liquidPressureInitialized_ = true;
+                return liquidPressure(temperature, density);
+            }
+
             printWarning_("liquidPressure", temperature, density);
-            return RawComponent::liquidPressure(temperature,
-                                                density);
+            return RawComponent::liquidPressure(temperature, density);
         }
         return result;
     }
@@ -460,11 +403,19 @@ public:
      */
     static Scalar gasDensity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateGasTP_(gasDensity_,
-                                          temperature,
-                                          pressure);
+        Scalar result = interpolateTP_(gasDensity_, temperature, pressure,
+                                       pressGasIdx_, minGasPressure_, maxGasPressure_, "gas");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!gasDensityInitialized_)
+            {
+                auto gasRho = [] (auto T, auto p) { return RawComponent::gasDensity(T, p); };
+                initTPArray_(gasRho, minGasPressure_, maxGasPressure_, gasDensity_);
+                gasDensityInitialized_ = true;
+                return gasDensity(temperature, pressure);
+            }
+
             printWarning_("gasDensity", temperature, pressure);
             return RawComponent::gasDensity(temperature, pressure);
         }
@@ -480,14 +431,27 @@ public:
      */
     static Scalar liquidDensity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateLiquidTP_(liquidDensity_,
-                                             temperature,
-                                             pressure);
+        Scalar result = interpolateTP_(liquidDensity_, temperature, pressure,
+                                       pressLiquidIdx_, minLiquidPressure_, maxLiquidPressure_, "liquid");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!liquidDensityInitialized_)
+            {
+                // TODO: we could get rid of the lambdas and pass the functor irectly. But,
+                //       currently Brine is a component (and not a fluid system) expecting a
+                //       third argument with a default, which cannot be wrapped in a function pointer.
+                //       For this reason we have to wrap this into a lambda here.
+                auto liqRho = [] (auto T, auto p) { return RawComponent::liquidDensity(T, p); };
+                initTPArray_(liqRho, minLiquidPressure_, maxLiquidPressure_, liquidDensity_);
+                liquidDensityInitialized_ = true;
+                return liquidDensity(temperature, pressure);
+            }
+
             printWarning_("liquidDensity", temperature, pressure);
             return RawComponent::liquidDensity(temperature, pressure);
         }
+
         return result;
     }
 
@@ -499,11 +463,19 @@ public:
      */
     static Scalar gasViscosity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateGasTP_(gasViscosity_,
-                                          temperature,
-                                          pressure);
+        Scalar result = interpolateTP_(gasViscosity_, temperature, pressure,
+                                       pressGasIdx_, minGasPressure_, maxGasPressure_, "gas");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!gasViscosityInitialized_)
+            {
+                auto gasVisc = [] (auto T, auto p) { return RawComponent::gasViscosity(T, p); };
+                initTPArray_(gasVisc, minGasPressure_, maxGasPressure_, gasViscosity_);
+                gasViscosityInitialized_ = true;
+                return gasViscosity(temperature, pressure);
+            }
+
             printWarning_("gasViscosity", temperature, pressure);
             return RawComponent::gasViscosity(temperature, pressure);
         }
@@ -518,11 +490,19 @@ public:
      */
     static Scalar liquidViscosity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateLiquidTP_(liquidViscosity_,
-                                             temperature,
-                                             pressure);
+        Scalar result = interpolateTP_(liquidViscosity_, temperature, pressure,
+                                       pressLiquidIdx_, minLiquidPressure_, maxLiquidPressure_, "liquid");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!liquidViscosityInitialized_)
+            {
+                auto liqVisc = [] (auto T, auto p) { return RawComponent::liquidViscosity(T, p); };
+                initTPArray_(liqVisc, minLiquidPressure_, maxLiquidPressure_, liquidViscosity_);
+                liquidViscosityInitialized_ = true;
+                return liquidViscosity(temperature, pressure);
+            }
+
             printWarning_("liquidViscosity",temperature, pressure);
             return RawComponent::liquidViscosity(temperature, pressure);
         }
@@ -537,11 +517,19 @@ public:
      */
     static Scalar gasThermalConductivity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateGasTP_(gasThermalConductivity_,
-                                          temperature,
-                                          pressure);
+        Scalar result = interpolateTP_(gasThermalConductivity_, temperature, pressure,
+                                       pressGasIdx_, minGasPressure_, maxGasPressure_, "gas");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!gasThermalConductivityInitialized_)
+            {
+                auto gasTC = [] (auto T, auto p) { return RawComponent::gasThermalConductivity(T, p); };
+                initTPArray_(gasTC, minGasPressure_, maxGasPressure_, gasThermalConductivity_);
+                gasThermalConductivityInitialized_ = true;
+                return gasThermalConductivity(temperature, pressure);
+            }
+
             printWarning_("gasThermalConductivity", temperature, pressure);
             return RawComponent::gasThermalConductivity(temperature, pressure);
         }
@@ -556,11 +544,19 @@ public:
      */
     static Scalar liquidThermalConductivity(Scalar temperature, Scalar pressure)
     {
-        Scalar result = interpolateLiquidTP_(liquidThermalConductivity_,
-                                             temperature,
-                                             pressure);
+        Scalar result = interpolateTP_(liquidThermalConductivity_, temperature, pressure,
+                                       pressLiquidIdx_, minLiquidPressure_, maxLiquidPressure_, "liquid");
         using std::isnan;
-        if (isnan(result)) {
+        if (isnan(result))
+        {
+            if (!liquidThermalConductivityInitialized_)
+            {
+                auto liqTC = [] (auto T, auto p) { return RawComponent::liquidThermalConductivity(T, p); };
+                initTPArray_(liqTC, minLiquidPressure_, maxLiquidPressure_, liquidThermalConductivity_);
+                liquidThermalConductivityInitialized_ = true;
+                return liquidThermalConductivity(temperature, pressure);
+            }
+
             printWarning_("liquidThermalConductivity", temperature, pressure);
             return RawComponent::liquidThermalConductivity(temperature, pressure);
         }
@@ -569,8 +565,7 @@ public:
 
 
 private:
-    // prints a warning if the result is not in range or the table has
-    // not been initialized
+    //! prints a warning if the result is not in range or the table has not been initialized
     static void printWarning_(const std::string& quantity, Scalar arg1, Scalar arg2)
     {
 #ifndef NDEBUG
@@ -587,79 +582,148 @@ private:
 #endif
     }
 
+    //! initializes vapor pressure if useVaporPressure = true
+    template< bool useVP = useVaporPressure, std::enable_if_t<useVP, int> = 0 >
+    static void initVaporPressure_()
+    {
+        // fill the temperature-pressure arrays
+        for (unsigned iT = 0; iT < nTemp_; ++ iT)
+        {
+            Scalar temperature = iT * (tempMax_ - tempMin_)/(nTemp_ - 1) + tempMin_;
+            vaporPressure_[iT] = RawComponent::vaporPressure(temperature);
+        }
+    }
 
-    // returns an interpolated value depending on temperature
-    static Scalar interpolateT_(const Scalar *values, Scalar T)
+    //! if !useVaporPressure, do nothing here
+    template< bool useVP = useVaporPressure, std::enable_if_t<!useVP, int> = 0 >
+    static void initVaporPressure_() {}
+
+    /*!
+     * \brief Initializes property values as function of temperature and pressure.
+     *
+     * \tparam PropFunc Function to evaluate the property prop(T, p)
+     * \tparam MinPFunc Function to evaluate the minimum pressure for a
+     *                  temperature index (depends on useVaporPressure)
+     * \tparam MaxPFunc Function to evaluate the maximum pressure for a
+     *                  temperature index (depends on useVaporPressure)
+     *
+     * \param f property function
+     * \param minP function to evaluate minimum pressure for temp idx
+     * \param maxP function to evaluate maximum pressure for temp idx
+     * \param values container to store property values
+     */
+    template<class PropFunc, class MinPFunc, class MaxPFunc>
+    static void initTPArray_(PropFunc&& f, MinPFunc&& minP,  MaxPFunc&& maxP, std::vector<Scalar>& values)
     {
-        Scalar alphaT = tempIdx_(T);
-        if (alphaT < 0 || alphaT >= nTemp_ - 1)
-            return std::numeric_limits<Scalar>::quiet_NaN();
+        for (unsigned iT = 0; iT < nTemp_; ++ iT)
+        {
+            Scalar temperature = iT * (tempMax_ - tempMin_)/(nTemp_ - 1) + tempMin_;
 
-        unsigned iT = (unsigned) alphaT;
-        alphaT -= iT;
+            Scalar pMax = maxP(iT);
+            Scalar pMin = minP(iT);
+            for (unsigned iP = 0; iP < nPress_; ++ iP)
+            {
+                Scalar pressure = iP * (pMax - pMin)/(nPress_ - 1) + pMin;
+                values[iT + iP*nTemp_] = f(temperature, pressure);
+            }
+        }
+    }
+
+    /*!
+     * \brief Initializes the minimum/maximum densities on the temperature range.
+     *
+     * \tparam RhoFunc Function to evaluate the density rho(T, p)
+     * \tparam MinPFunc Function to evaluate the minimum pressure for a
+     *                  temperature index (depends on useVaporPressure)
+     * \tparam MaxPFunc Function to evaluate the maximum pressure for a
+     *                  temperature index (depends on useVaporPressure)
+     *
+     * \param rho density function
+     * \param minP function to evaluate minimum pressure for temp idx
+     * \param maxP function to evaluate maximum pressure for temp idx
+     * \param rhoMin container to store minimum density values
+     * \param rhoMax container to store maximum density values
+     */
+    template<class RhoFunc, class MinPFunc, class MaxPFunc>
+    static void initMinMaxRhoArray_(RhoFunc&& rho,
+                                    MinPFunc&& minP,
+                                    MaxPFunc&& maxP,
+                                    std::vector<Scalar>& rhoMin,
+                                    std::vector<Scalar>& rhoMax)
+    {
+        for (unsigned iT = 0; iT < nTemp_; ++ iT)
+        {
+            Scalar temperature = iT * (tempMax_ - tempMin_)/(nTemp_ - 1) + tempMin_;
 
-        return
-            values[iT    ]*(1 - alphaT) +
-            values[iT + 1]*(    alphaT);
+            rhoMin[iT] = rho(temperature, minP(iT));
+            if (iT < nTemp_ - 1)
+                rhoMax[iT] = rho(temperature, maxP(iT + 1));
+            else
+                rhoMax[iT] = rho(temperature, maxP(iT));
+        }
     }
 
-    // returns an interpolated value for liquid depending on
-    // temperature and pressure
-    static Scalar interpolateLiquidTP_(const Scalar *values, Scalar T, Scalar p)
+    /*!
+     * \brief Initializes pressure arrays as function of temperature and density.
+     *
+     * \tparam PFunc Function to evaluate the pressure p(T, rho)
+     *
+     * \param pressure container to store pressure values
+     * \param p pressure function p(T, rho)
+     * \param rhoMin container with minimum density values
+     * \param rhoMax container with maximum density values
+     */
+    template<class PFunc>
+    static void initPressureArray_(std::vector<Scalar>& pressure, PFunc&& p,
+                                   const std::vector<Scalar>& rhoMin,
+                                   const std::vector<Scalar>& rhoMax)
     {
-        Scalar alphaT = tempIdx_(T);
-        if (alphaT < 0 || alphaT >= nTemp_ - 1) {
-            return std::numeric_limits<Scalar>::quiet_NaN();
-        }
-        using std::min;
-        using std::max;
-        unsigned iT = max<int>(0, min<int>(nTemp_ - 2, (int) alphaT));
-        alphaT -= iT;
+        for (unsigned iT = 0; iT < nTemp_; ++ iT)
+        {
+            Scalar temperature = iT * (tempMax_ - tempMin_)/(nTemp_ - 1) + tempMin_;
 
-        Scalar alphaP1 = pressLiquidIdx_(p, iT);
-        Scalar alphaP2 = pressLiquidIdx_(p, iT + 1);
+            for (unsigned iRho = 0; iRho < nDensity_; ++ iRho)
+            {
+                Scalar density = Scalar(iRho)/(nDensity_ - 1)
+                                 * (rhoMax[iT] - rhoMin[iT])
+                                 +  rhoMin[iT];
+                pressure[iT + iRho*nTemp_] = p(temperature, density);
+            }
+        }
+    }
 
-        unsigned iP1 = max<int>(0, min<int>(nPress_ - 2, (int) alphaP1));
-        unsigned iP2 = max<int>(0, min<int>(nPress_ - 2, (int) alphaP2));
-        alphaP1 -= iP1;
-        alphaP2 -= iP2;
+    //! returns an interpolated value depending on temperature
+    static Scalar interpolateT_(const std::vector<Scalar>& values, Scalar T)
+    {
+        Scalar alphaT = tempIdx_(T);
+        if (alphaT < 0 || alphaT >= nTemp_ - 1)
+            return std::numeric_limits<Scalar>::quiet_NaN();
 
-#if 0 && !defined NDEBUG
-        if(!(0 <= alphaT && alphaT <= 1.0))
-            DUNE_THROW(NumericalProblem, "Temperature out of range: "
-                       << "T=" << T << " range: [" << tempMin_ << ", " << tempMax_ << "]");
-        if(!(0 <= alphaP1 && alphaP1 <= 1.0))
-            DUNE_THROW(NumericalProblem, "First liquid pressure out of range: "
-                       << "p=" << p << " range: [" << minLiquidPressure_(tempIdx_(T)) << ", " << maxLiquidPressure_(tempIdx_(T)) << "]");
-        if(!(0 <= alphaP2 && alphaP2 <= 1.0))
-            DUNE_THROW(NumericalProblem, "Second liquid pressure out of range: "
-                       << "p=" << p << " range: [" << minLiquidPressure_(tempIdx_(T) + 1) << ", " << maxLiquidPressure_(tempIdx_(T) + 1) << "]");
-#endif
+        unsigned iT = (unsigned) alphaT;
+        alphaT -= iT;
 
-        return
-            values[(iT    ) + (iP1    )*nTemp_]*(1 - alphaT)*(1 - alphaP1) +
-            values[(iT    ) + (iP1 + 1)*nTemp_]*(1 - alphaT)*(    alphaP1) +
-            values[(iT + 1) + (iP2    )*nTemp_]*(    alphaT)*(1 - alphaP2) +
-            values[(iT + 1) + (iP2 + 1)*nTemp_]*(    alphaT)*(    alphaP2);
+        return values[iT    ]*(1 - alphaT) +
+               values[iT + 1]*(    alphaT);
     }
 
-    // returns an interpolated value for gas depending on
-    // temperature and pressure
-    static Scalar interpolateGasTP_(const Scalar *values, Scalar T, Scalar p)
+    //! returns an interpolated value depending on temperature and pressure
+    template<class GetPIdx, class MinPFunc, class MaxPFunc>
+    static Scalar interpolateTP_(const std::vector<Scalar>& values, Scalar T, Scalar p,
+                                 GetPIdx&& getPIdx, MinPFunc&& minP, MaxPFunc&& maxP,
+                                 const std::string& phaseName)
     {
         Scalar alphaT = tempIdx_(T);
         if (alphaT < 0 || alphaT >= nTemp_ - 1) {
-            // std::cerr << __LINE__ << " T: " << T << "\n";
             return std::numeric_limits<Scalar>::quiet_NaN();
         }
-
         using std::min;
         using std::max;
         unsigned iT = max<int>(0, min<int>(nTemp_ - 2, (int) alphaT));
         alphaT -= iT;
 
-        Scalar alphaP1 = pressGasIdx_(p, iT);
-        Scalar alphaP2 = pressGasIdx_(p, iT + 1);
+        Scalar alphaP1 = getPIdx(p, iT);
+        Scalar alphaP2 = getPIdx(p, iT + 1);
+
         unsigned iP1 = max<int>(0, min<int>(nPress_ - 2, (int) alphaP1));
         unsigned iP2 = max<int>(0, min<int>(nPress_ - 2, (int) alphaP2));
         alphaP1 -= iP1;
@@ -670,23 +734,22 @@ private:
             DUNE_THROW(NumericalProblem, "Temperature out of range: "
                        << "T=" << T << " range: [" << tempMin_ << ", " << tempMax_ << "]");
         if(!(0 <= alphaP1 && alphaP1 <= 1.0))
-            DUNE_THROW(NumericalProblem, "First gas pressure out of range: "
-                       << "p=" << p << " range: [" << minGasPressure_(tempIdx_(T)) << ", " << maxGasPressure_(tempIdx_(T)) << "]");
+            DUNE_THROW(NumericalProblem, "First " << phaseName " pressure out of range: "
+                       << "p=" << p << " range: [" << minP(tempIdx_(T)) << ", " << maxP(tempIdx_(T)) << "]");
         if(!(0 <= alphaP2 && alphaP2 <= 1.0))
-            DUNE_THROW(NumericalProblem, "Second gas pressure out of range: "
-                       << "p=" << p << " range: [" << minGasPressure_(tempIdx_(T) + 1) << ", " << maxGasPressure_(tempIdx_(T) + 1) << "]");
+            DUNE_THROW(NumericalProblem, "Second " << phaseName " pressure out of range: "
+                       << "p=" << p << " range: [" << minP(tempIdx_(T) + 1) << ", " << maxP(tempIdx_(T) + 1) << "]");
 #endif
 
-        return
-            values[(iT    ) + (iP1    )*nTemp_]*(1 - alphaT)*(1 - alphaP1) +
-            values[(iT    ) + (iP1 + 1)*nTemp_]*(1 - alphaT)*(    alphaP1) +
-            values[(iT + 1) + (iP2    )*nTemp_]*(    alphaT)*(1 - alphaP2) +
-            values[(iT + 1) + (iP2 + 1)*nTemp_]*(    alphaT)*(    alphaP2);
+        return values[(iT    ) + (iP1    )*nTemp_]*(1 - alphaT)*(1 - alphaP1) +
+               values[(iT    ) + (iP1 + 1)*nTemp_]*(1 - alphaT)*(    alphaP1) +
+               values[(iT + 1) + (iP2    )*nTemp_]*(    alphaT)*(1 - alphaP2) +
+               values[(iT + 1) + (iP2 + 1)*nTemp_]*(    alphaT)*(    alphaP2);
     }
 
-    // returns an interpolated value for gas depending on
-    // temperature and density
-    static Scalar interpolateGasTRho_(const Scalar *values, Scalar T, Scalar rho)
+    //! returns an interpolated value for gas depending on temperature and density
+    template<class GetRhoIdx>
+    static Scalar interpolateTRho_(const std::vector<Scalar>& values, Scalar T, Scalar rho, GetRhoIdx&& rhoIdx)
     {
         using std::min;
         using std::max;
@@ -694,52 +757,26 @@ private:
         unsigned iT = max<int>(0, min<int>(nTemp_ - 2, (int) alphaT));
         alphaT -= iT;
 
-        Scalar alphaP1 = densityGasIdx_(rho, iT);
-        Scalar alphaP2 = densityGasIdx_(rho, iT + 1);
+        Scalar alphaP1 = rhoIdx(rho, iT);
+        Scalar alphaP2 = rhoIdx(rho, iT + 1);
         unsigned iP1 = max<int>(0, min<int>(nDensity_ - 2, (int) alphaP1));
         unsigned iP2 = max<int>(0, min<int>(nDensity_ - 2, (int) alphaP2));
         alphaP1 -= iP1;
         alphaP2 -= iP2;
 
-        return
-            values[(iT    ) + (iP1    )*nTemp_]*(1 - alphaT)*(1 - alphaP1) +
-            values[(iT    ) + (iP1 + 1)*nTemp_]*(1 - alphaT)*(    alphaP1) +
-            values[(iT + 1) + (iP2    )*nTemp_]*(    alphaT)*(1 - alphaP2) +
-            values[(iT + 1) + (iP2 + 1)*nTemp_]*(    alphaT)*(    alphaP2);
+        return values[(iT    ) + (iP1    )*nTemp_]*(1 - alphaT)*(1 - alphaP1) +
+               values[(iT    ) + (iP1 + 1)*nTemp_]*(1 - alphaT)*(    alphaP1) +
+               values[(iT + 1) + (iP2    )*nTemp_]*(    alphaT)*(1 - alphaP2) +
+               values[(iT + 1) + (iP2 + 1)*nTemp_]*(    alphaT)*(    alphaP2);
     }
 
-    // returns an interpolated value for liquid depending on
-    // temperature and density
-    static Scalar interpolateLiquidTRho_(const Scalar *values, Scalar T, Scalar rho)
-    {
-        using std::min;
-        using std::max;
-        Scalar alphaT = tempIdx_(T);
-        unsigned iT = max<int>(0, min<int>(nTemp_ - 2, (int) alphaT));
-        alphaT -= iT;
-
-        Scalar alphaP1 = densityLiquidIdx_(rho, iT);
-        Scalar alphaP2 = densityLiquidIdx_(rho, iT + 1);
-        unsigned iP1 = max<int>(0, min<int>(nDensity_ - 2, (int) alphaP1));
-        unsigned iP2 = max<int>(0, min<int>(nDensity_ - 2, (int) alphaP2));
-        alphaP1 -= iP1;
-        alphaP2 -= iP2;
-
-        return
-            values[(iT    ) + (iP1    )*nTemp_]*(1 - alphaT)*(1 - alphaP1) +
-            values[(iT    ) + (iP1 + 1)*nTemp_]*(1 - alphaT)*(    alphaP1) +
-            values[(iT + 1) + (iP2    )*nTemp_]*(    alphaT)*(1 - alphaP2) +
-            values[(iT + 1) + (iP2 + 1)*nTemp_]*(    alphaT)*(    alphaP2);
-    }
-
-
-    // returns the index of an entry in a temperature field
+    //! returns the index of an entry in a temperature field
     static Scalar tempIdx_(Scalar temperature)
     {
         return (nTemp_ - 1)*(temperature - tempMin_)/(tempMax_ - tempMin_);
     }
 
-    // returns the index of an entry in a pressure field
+    //! returns the index of an entry in a pressure field
     static Scalar pressLiquidIdx_(Scalar pressure, unsigned tempIdx)
     {
         Scalar plMin = minLiquidPressure_(tempIdx);
@@ -748,7 +785,7 @@ private:
         return (nPress_ - 1)*(pressure - plMin)/(plMax - plMin);
     }
 
-    // returns the index of an entry in a temperature field
+    //! returns the index of an entry in a temperature field
     static Scalar pressGasIdx_(Scalar pressure, unsigned tempIdx)
     {
         Scalar pgMin = minGasPressure_(tempIdx);
@@ -757,24 +794,23 @@ private:
         return (nPress_ - 1)*(pressure - pgMin)/(pgMax - pgMin);
     }
 
-    // returns the index of an entry in a density field
+    //! returns the index of an entry in a density field
     static Scalar densityLiquidIdx_(Scalar density, unsigned tempIdx)
     {
-        Scalar densityMin = minLiquidDensity_(tempIdx);
-        Scalar densityMax = maxLiquidDensity_(tempIdx);
+        Scalar densityMin = minLiquidDensity_[tempIdx];
+        Scalar densityMax = maxLiquidDensity_[tempIdx];
         return (nDensity_ - 1) * (density - densityMin)/(densityMax - densityMin);
     }
 
-    // returns the index of an entry in a density field
+    //! returns the index of an entry in a density field
     static Scalar densityGasIdx_(Scalar density, unsigned tempIdx)
     {
-        Scalar densityMin = minGasDensity_(tempIdx);
-        Scalar densityMax = maxGasDensity_(tempIdx);
+        Scalar densityMin = minGasDensity_[tempIdx];
+        Scalar densityMax = maxGasDensity_[tempIdx];
         return (nDensity_ - 1) * (density - densityMin)/(densityMax - densityMin);
     }
 
-    // returns the minimum tabulized liquid pressure at a given
-    // temperature index
+    //! returns the minimum tabulized liquid pressure at a given temperature index
     static Scalar minLiquidPressure_(int tempIdx)
     {
         using std::max;
@@ -784,8 +820,7 @@ private:
             return max(pressMin_, vaporPressure_[tempIdx] / 1.1);
     }
 
-    // returns the maximum tabulized liquid pressure at a given
-    // temperature index
+    //! returns the maximum tabulized liquid pressure at a given temperature index
     static Scalar maxLiquidPressure_(int tempIdx)
     {
         using std::max;
@@ -795,8 +830,7 @@ private:
             return max(pressMax_, vaporPressure_[tempIdx] * 1.1);
     }
 
-    // returns the minumum tabulized gas pressure at a given
-    // temperature index
+    //! returns the minumum tabulized gas pressure at a given temperature index
     static Scalar minGasPressure_(int tempIdx)
     {
         using std::min;
@@ -806,8 +840,7 @@ private:
             return min(pressMin_, vaporPressure_[tempIdx] / 1.1 );
     }
 
-    // returns the maximum tabulized gas pressure at a given
-    // temperature index
+    //! returns the maximum tabulized gas pressure at a given temperature index
     static Scalar maxGasPressure_(int tempIdx)
     {
         using std::min;
@@ -817,28 +850,6 @@ private:
             return min(pressMax_, vaporPressure_[tempIdx] * 1.1);
     }
 
-
-    // returns the minimum tabulized liquid density at a given
-    // temperature index
-    static Scalar minLiquidDensity_(int tempIdx)
-    { return minLiquidDensity__[tempIdx]; }
-
-    // returns the maximum tabulized liquid density at a given
-    // temperature index
-    static Scalar maxLiquidDensity_(int tempIdx)
-    { return maxLiquidDensity__[tempIdx]; }
-
-    // returns the minumum tabulized gas density at a given
-    // temperature index
-    static Scalar minGasDensity_(int tempIdx)
-    { return minGasDensity__[tempIdx]; }
-
-    // returns the maximum tabulized gas density at a given
-    // temperature index
-    static Scalar maxGasDensity_(int tempIdx)
-    { return maxGasDensity__[tempIdx]; }
-
-
 #ifndef NDEBUG
     // specifies whether the table was initialized
     static bool initialized_;
@@ -847,35 +858,47 @@ private:
 #endif
 
     // 1D fields with the temperature as degree of freedom
-    static Scalar *vaporPressure_;
-
-    static Scalar *minLiquidDensity__;
-    static Scalar *maxLiquidDensity__;
-
-    static Scalar *minGasDensity__;
-    static Scalar *maxGasDensity__;
-
-    // 2D fields with the temperature and pressure as degrees of
-    // freedom
-    static Scalar *gasEnthalpy_;
-    static Scalar *liquidEnthalpy_;
-
-    static Scalar *gasHeatCapacity_;
-    static Scalar *liquidHeatCapacity_;
-
-    static Scalar *gasDensity_;
-    static Scalar *liquidDensity_;
-
-    static Scalar *gasViscosity_;
-    static Scalar *liquidViscosity_;
-
-    static Scalar *gasThermalConductivity_;
-    static Scalar *liquidThermalConductivity_;
-
-    // 2D fields with the temperature and density as degrees of
-    // freedom
-    static Scalar *gasPressure_;
-    static Scalar *liquidPressure_;
+    static std::vector<Scalar> vaporPressure_;
+
+    static std::vector<Scalar> minLiquidDensity_;
+    static std::vector<Scalar> maxLiquidDensity_;
+    static bool minMaxLiquidDensityInitialized_;
+
+    static std::vector<Scalar> minGasDensity_;
+    static std::vector<Scalar> maxGasDensity_;
+    static bool minMaxGasDensityInitialized_;
+
+    // 2D fields with the temperature and pressure as degrees of freedom
+    static std::vector<Scalar> gasEnthalpy_;
+    static std::vector<Scalar> liquidEnthalpy_;
+    static bool gasEnthalpyInitialized_;
+    static bool liquidEnthalpyInitialized_;
+
+    static std::vector<Scalar> gasHeatCapacity_;
+    static std::vector<Scalar> liquidHeatCapacity_;
+    static bool gasHeatCapacityInitialized_;
+    static bool liquidHeatCapacityInitialized_;
+
+    static std::vector<Scalar> gasDensity_;
+    static std::vector<Scalar> liquidDensity_;
+    static bool gasDensityInitialized_;
+    static bool liquidDensityInitialized_;
+
+    static std::vector<Scalar> gasViscosity_;
+    static std::vector<Scalar> liquidViscosity_;
+    static bool gasViscosityInitialized_;
+    static bool liquidViscosityInitialized_;
+
+    static std::vector<Scalar> gasThermalConductivity_;
+    static std::vector<Scalar> liquidThermalConductivity_;
+    static bool gasThermalConductivityInitialized_;
+    static bool liquidThermalConductivityInitialized_;
+
+    // 2D fields with the temperature and density as degrees of freedom
+    static std::vector<Scalar> gasPressure_;
+    static std::vector<Scalar> liquidPressure_;
+    static bool gasPressureInitialized_;
+    static bool liquidPressureInitialized_;
 
     // temperature, pressure and density ranges
     static Scalar tempMin_;
@@ -900,39 +923,68 @@ bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::warningPrinted_
 #endif
 
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::vaporPressure_;
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::minMaxLiquidDensityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::minMaxGasDensityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasEnthalpyInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidEnthalpyInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasHeatCapacityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidHeatCapacityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasDensityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidDensityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasViscosityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidViscosityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasThermalConductivityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidThermalConductivityInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasPressureInitialized_ = false;
+template <class Scalar, class RawComponent, bool useVaporPressure>
+bool TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidPressureInitialized_ = false;
+
+template <class Scalar, class RawComponent, bool useVaporPressure>
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::vaporPressure_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::minLiquidDensity__;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::minLiquidDensity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::maxLiquidDensity__;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::maxLiquidDensity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::minGasDensity__;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::minGasDensity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::maxGasDensity__;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::maxGasDensity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasEnthalpy_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasEnthalpy_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidEnthalpy_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidEnthalpy_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasHeatCapacity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasHeatCapacity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidHeatCapacity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidHeatCapacity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasDensity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasDensity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidDensity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidDensity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasViscosity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasViscosity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidViscosity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidViscosity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasThermalConductivity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasThermalConductivity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidThermalConductivity_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidThermalConductivity_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasPressure_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::gasPressure_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
-Scalar* TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidPressure_;
+std::vector<Scalar> TabulatedComponent<Scalar, RawComponent, useVaporPressure>::liquidPressure_;
 template <class Scalar, class RawComponent, bool useVaporPressure>
 Scalar TabulatedComponent<Scalar, RawComponent, useVaporPressure>::tempMin_;
 template <class Scalar, class RawComponent, bool useVaporPressure>