diff --git a/dumux/io/gnuplotinterface.hh b/dumux/io/gnuplotinterface.hh
index bd37789ea1fdca6928613805d5772657f58e458d..94bbefd34bafa6d5e0628621871c1acb35cd04d6 100644
--- a/dumux/io/gnuplotinterface.hh
+++ b/dumux/io/gnuplotinterface.hh
@@ -38,6 +38,7 @@
 #include <cmath>
 #include <fstream>
 #include <iostream>
+#include <iomanip>
 #include <sstream>
 #include <string>
 #include <vector>
@@ -62,7 +63,7 @@ public:
 
     //! \brief The constructor
     GnuplotInterface(bool persist = true) :
-        pipe_(0), openPlotWindow_(true), persist_(persist),
+        pipe_(0), openPlotWindow_(true), persist_(persist), createImage_(true),
         terminalType_("x11"), outputDirectory_("./"),
         datafileSeparator_(' '), linetype_("solid"),
         xRangeIsSet_(false), yRangeIsSet_(false),
@@ -101,20 +102,15 @@ public:
     void plot(const std::string &filename = "")
     {
         // set correct terminal and general options
-        std::string plot = "reset\n";
-        plot += "set datafile separator \'" + std::string(1, datafileSeparator_) + "\'\n";
-
-        // set the terminal if the defaults were overwritten
-        if (terminalType_.compare("x11") != 0 || linetype_.compare("solid") != 0)
-          plot += "set term " + terminalType_ + " " + linetype_ + " " + " \n";
+        std::string plot = "set datafile separator \'" + std::string(1, datafileSeparator_) + "\'\n";
 
         // set the labels and axes ranges
         plot += "set xlabel \"" + xLabel_ + "\"\n";
         plot += "set ylabel \"" + yLabel_ + "\"\n";
         if (xRangeIsSet_)
-            plot += "set xrange [" + std::to_string(xRangeMin_) + ":" + std::to_string(xRangeMax_) + "]" + "\n";
+            plot += "set xrange [" + toStringWithPrecision(xRangeMin_) + ":" + toStringWithPrecision(xRangeMax_) + "]" + "\n";
         if (yRangeIsSet_)
-            plot += "set yrange [" + std::to_string(yRangeMin_) + ":" + std::to_string(yRangeMax_) + "]" + "\n";
+            plot += "set yrange [" + toStringWithPrecision(yRangeMin_) + ":" + toStringWithPrecision(yRangeMax_) + "]" + "\n";
 
         // set user defined options
         plot += plotOptions_ + "\n";
@@ -145,23 +141,33 @@ public:
         }
 
         // live plot of the results if gnuplot is installed
-#ifdef HAVE_GNUPLOT
+
+        std::string interactivePlot = "reset\n";
+
+        // set the terminal if the defaults were overwritten
+        if (terminalType_.compare("x11") != 0 || linetype_.compare("solid") != 0)
+            interactivePlot += "set term " + terminalType_ + " " + linetype_ + " " + " \n";
+
+        interactivePlot += plot;
         if (openPlotWindow_)
-            executeGnuplot(plot.c_str());
-#endif
+            executeGnuplot(interactivePlot.c_str());
 
         // create a gnuplot file if a filename is specified
         if (filename.compare("") != 0)
         {
-            plotCommandForFile += "\n";
-            plotCommandForFile += "set term pngcairo size 800,600 " + linetype_ + " \n";
-            plotCommandForFile += "set output \"" + filename + ".png\"\n";
-            plotCommandForFile += "replot\n";
+            std::string filePlot = "reset\n";
+            filePlot += "set term pngcairo size 800,600 " + linetype_ + " \n";
+            filePlot += "set output \"" + filename + ".png\"\n";
+            filePlot += plot;
             std::string gnuplotFileName = outputDirectory_ + filename + ".gp";
             std::ofstream file;
             file.open(gnuplotFileName);
-            file << plotCommandForFile;
+            file << filePlot;
             file.close();
+
+          // live plot of the results
+          if (createImage_)
+              executeGnuplot(filePlot.c_str());
         }
     }
 
@@ -349,6 +355,16 @@ public:
         openPlotWindow_ = openPlotWindow;
     }
 
+    /*!
+     * \brief Define whether gnuplot should create .png files
+     *
+     * \param createImage Create an image or not
+     */
+    void setCreateImage(bool createImage)
+    {
+        createImage_ = createImage;
+    }
+
     /*!
      * \brief Sets the datafile separator
      *
@@ -393,8 +409,10 @@ private:
     // Give plot command to gnuplot
     void executeGnuplot(const std::string& plotCommand) const
     {
+#ifdef HAVE_GNUPLOT
         fputs((plotCommand + "\n").c_str(), pipe_);
         fflush(pipe_);
+#endif
     }
 
     // Check validity of number
@@ -408,9 +426,19 @@ private:
             Dune::dwarn << "warning: " << text << " is infinity, adjust your data range" << std::endl;
     }
 
+    // Convert string with higher precision
+    template <typename T>
+    std::string toStringWithPrecision(const T value, const int n = 8)
+    {
+        std::ostringstream out;
+        out << std::setprecision(n) << value;
+        return out.str();
+    }
+
     std::FILE * pipe_;
     bool openPlotWindow_;
     bool persist_;
+    bool createImage_;
     std::string terminalType_;
     std::string outputDirectory_;
     char datafileSeparator_;
diff --git a/dumux/material/components/simpleco2.hh b/dumux/material/components/simpleco2.hh
index 51d8e99372e24da3bbdb3ffdfff46c7aa91e94e2..8e7e1ecc479fbc303ac56336a49b3056120fb4b1 100644
--- a/dumux/material/components/simpleco2.hh
+++ b/dumux/material/components/simpleco2.hh
@@ -51,7 +51,7 @@ public:
      * \brief A human readable name for the \f$CO_2\f$.
      */
     static std::string name()
-    { return "CO2"; }
+    { return "SimpleCO2"; }
 
     /*!
      * \brief The molar mass in \f$\mathrm{[kg/mol]}\f$ of \f$CO_2\f$.
diff --git a/dumux/material/components/simpleh2o.hh b/dumux/material/components/simpleh2o.hh
index 568705d6f261994002648039ffdba8c8dd0700d5..93d1bac55f8c07f6d9956003cbe1e46a2cffcb20 100644
--- a/dumux/material/components/simpleh2o.hh
+++ b/dumux/material/components/simpleh2o.hh
@@ -53,7 +53,7 @@ public:
      * \brief A human readable name for the water.
      */
     static std::string name()
-    { return "H2O"; }
+    { return "SimpleH2O"; }
 
     /*!
      * \brief The molar mass in \f$\mathrm{[kg/mol]}\f$ of water.
diff --git a/test/material/CMakeLists.txt b/test/material/CMakeLists.txt
index f74559ffced8bced5842afc6ddaa1f3bee35028b..eb5c90ff7b890e80a219fc9283da8f38ea24304b 100644
--- a/test/material/CMakeLists.txt
+++ b/test/material/CMakeLists.txt
@@ -1,3 +1,4 @@
+add_subdirectory("components")
 add_subdirectory("fluidsystems")
 add_subdirectory("fluidmatrixinteractions")
 add_subdirectory("immiscibleflash")
diff --git a/test/material/components/CMakeLists.txt b/test/material/components/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71bd7c8ab6dafe6c3c66421120473d2cae3b1484
--- /dev/null
+++ b/test/material/components/CMakeLists.txt
@@ -0,0 +1,76 @@
+add_executable(plot_component plotproperties.cc)
+
+dune_add_test(NAME plot_air
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "Air")
+
+dune_add_test(NAME plot_benzene
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "Benzene")
+
+dune_add_test(NAME plot_brine
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "Brine")
+
+dune_add_test(NAME plot_ch4
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "CH4")
+
+dune_add_test(NAME plot_dnapl_tce
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "DNAPL_TCE")
+
+dune_add_test(NAME plot_h2
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "H2")
+
+dune_add_test(NAME plot_h2o
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "H2O")
+
+dune_add_test(NAME plot_heavyoil
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "HeavyOil")
+
+dune_add_test(NAME plot_lnapl
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "LNAPL_oil")
+
+dune_add_test(NAME plot_mesitylene
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "Mesitylene")
+
+dune_add_test(NAME plot_n2
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "N2")
+
+dune_add_test(NAME plot_o2
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "O2")
+
+dune_add_test(NAME plot_simpleco2
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "SimpleCO2")
+
+dune_add_test(NAME plot_simpleh2o
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "SimpleH2O")
+
+dune_add_test(NAME plot_xylene
+              TARGET plot_component
+              COMMAND ./plot_component
+              CMD_ARGS "Xylene")
diff --git a/test/material/components/plotproperties.cc b/test/material/components/plotproperties.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2cfc8b5b4a844c430ad6fe8c9bc2948d41aa7de0
--- /dev/null
+++ b/test/material/components/plotproperties.cc
@@ -0,0 +1,211 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+/*****************************************************************************
+ *   See the file COPYING for full copying permissions.                      *
+ *                                                                           *
+ *   This program is free software: you can redistribute it and/or modify    *
+ *   it under the terms of the GNU General Public License as published by    *
+ *   the Free Software Foundation, either version 2 of the License, or       *
+ *   (at your option) any later version.                                     *
+ *                                                                           *
+ *   This program is distributed in the hope that it will be useful,         *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the            *
+ *   GNU General Public License for more details.                            *
+ *                                                                           *
+ *   You should have received a copy of the GNU General Public License       *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
+ *****************************************************************************/
+/*!
+ * \file
+ *
+ * \brief Plot properties of components and fluids
+ */
+
+#include "config.h"
+#include <array>
+#include <cstring>
+#include <limits>
+#include <vector>
+#include <dumux/io/gnuplotinterface.hh>
+#include <dumux/material/components/air.hh>
+#include <dumux/material/components/benzene.hh>
+#include <dumux/material/components/brine.hh>
+#include <dumux/material/components/ch4.hh>
+#include <dumux/material/components/co2.hh>
+#include <dumux/material/components/dnapl.hh>
+#include <dumux/material/components/h2.hh>
+#include <dumux/material/components/h2o.hh>
+#include <dumux/material/components/heavyoil.hh>
+#include <dumux/material/components/lnapl.hh>
+#include <dumux/material/components/mesitylene.hh>
+#include <dumux/material/components/n2.hh>
+#include <dumux/material/components/o2.hh>
+#include <dumux/material/components/simpleco2.hh>
+#include <dumux/material/components/simpleh2o.hh>
+#include <dumux/material/components/xylene.hh>
+
+using namespace std;
+
+template<class Component>
+void plotStuff(bool openPlotWindow)
+{
+    double pressure = 1e5;
+    double TMin = 273.15;
+    double TMax = 323.15;
+    double TRange = TMax - TMin;
+    const unsigned int numIntervals = 100;
+    vector<double> T(numIntervals + 1);
+    for (int i = 0; i <= numIntervals; i++)
+    {
+        T[i] = TMin + TRange * double(i) /double(numIntervals);
+    }
+
+    // components
+    const unsigned int liquidPhaseIdx = 0;
+    const unsigned int gasPhaseIdx = 1;
+
+    const unsigned int numPhases = 2;
+    array<string, numPhases> phaseNames;
+    phaseNames[liquidPhaseIdx] = "liquid";
+    phaseNames[gasPhaseIdx] = "gas";
+
+    const unsigned int numProperties = 5;
+    array<string, numProperties> propertyNames;
+    array<string, numProperties> propertyUnits;
+    unsigned int densityIdx = 0;
+    propertyNames[densityIdx] = "density";
+    propertyUnits[densityIdx] = "[kg/m^3]";
+    unsigned int enthalpyIdx = 1;
+    propertyNames[enthalpyIdx] = "enthalpy";
+    propertyUnits[enthalpyIdx] = "[J/(kg)]";
+    unsigned int heatCapacityIdx = 2;
+    propertyNames[heatCapacityIdx] = "heatCapacity";
+    propertyUnits[heatCapacityIdx] = "[J/(kg*K)]";
+    unsigned int viscosityIdx = 3;
+    propertyNames[viscosityIdx] = "viscosity";
+    propertyUnits[viscosityIdx] = "[Pa*s]";
+    unsigned int thermalConductivityIdx = 4;
+    propertyNames[thermalConductivityIdx] = "thermalConductivity";
+    propertyUnits[thermalConductivityIdx] = "[W/(m*K)]";
+    array<array<vector<double>, numProperties>, numPhases> property;
+    array<array<bool, numProperties>, numPhases> propertyAvailable;
+    array<array<array<double, 2>, numProperties>, numPhases> propertyMinMax;
+
+    // get values from component functions
+    for (unsigned int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
+    {
+        for (unsigned int propertyIdx = 0; propertyIdx < numProperties; ++propertyIdx)
+        {
+            propertyAvailable[phaseIdx][propertyIdx] = true;
+            propertyMinMax[phaseIdx][propertyIdx][0] = std::numeric_limits<double>::max();
+            propertyMinMax[phaseIdx][propertyIdx][1] = std::numeric_limits<double>::min();
+            property[phaseIdx][propertyIdx].resize(numIntervals+1);
+        }
+
+        for (int i = 0; i <= numIntervals; i++)
+        {
+            if (phaseIdx == liquidPhaseIdx)
+            {
+                try { property[phaseIdx][densityIdx][i] = Component::liquidDensity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][densityIdx] = false; }
+                try { property[phaseIdx][enthalpyIdx][i] = Component::liquidEnthalpy(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][enthalpyIdx] = false; }
+                try { property[phaseIdx][heatCapacityIdx][i] = Component::liquidHeatCapacity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][heatCapacityIdx] = false; }
+                try { property[phaseIdx][viscosityIdx][i] = Component::liquidViscosity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][viscosityIdx] = false; }
+                try { property[phaseIdx][thermalConductivityIdx][i] = Component::liquidThermalConductivity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][thermalConductivityIdx] = false; }
+            }
+            if (phaseIdx == gasPhaseIdx)
+            {
+                try { property[phaseIdx][densityIdx][i] = Component::gasDensity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][densityIdx] = false; }
+                try { property[phaseIdx][enthalpyIdx][i] = Component::gasEnthalpy(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][enthalpyIdx] = false; }
+                try { property[phaseIdx][heatCapacityIdx][i] = Component::gasHeatCapacity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][heatCapacityIdx] = false; }
+                try { property[phaseIdx][viscosityIdx][i] = Component::gasViscosity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][viscosityIdx] = false; }
+                try { property[phaseIdx][thermalConductivityIdx][i] = Component::gasThermalConductivity(T[i], pressure); }
+                catch (Dune::NotImplemented &e) { propertyAvailable[phaseIdx][thermalConductivityIdx] = false; }
+            }
+
+            for (unsigned int propertyIdx = 0; propertyIdx < numProperties; ++propertyIdx)
+            {
+                propertyMinMax[phaseIdx][propertyIdx][0] = std::min(propertyMinMax[phaseIdx][propertyIdx][0], property[phaseIdx][propertyIdx][i]);
+                propertyMinMax[phaseIdx][propertyIdx][1] = std::max(propertyMinMax[phaseIdx][propertyIdx][1], property[phaseIdx][propertyIdx][i]);
+            }
+        }
+    }
+
+    // plot densities
+    for (unsigned int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
+    {
+        for (unsigned int propertyIdx = 0; propertyIdx < numProperties; ++propertyIdx)
+        {
+            if (!propertyAvailable[phaseIdx][propertyIdx])
+                continue;
+
+            Dumux::GnuplotInterface<double> gnuplot(true);
+            gnuplot.setOpenPlotWindow(openPlotWindow);
+            gnuplot.setCreateImage(true);
+            gnuplot.setXRange(TMin, TMax);
+            gnuplot.setYRange(propertyMinMax[phaseIdx][propertyIdx][0]*0.999, propertyMinMax[phaseIdx][propertyIdx][1]*1.001);
+            gnuplot.setXlabel("temperature [K]");
+            gnuplot.setYlabel(phaseNames[phaseIdx] + " " + propertyNames[propertyIdx] + " " + propertyUnits[propertyIdx]);
+            gnuplot.setDatafileSeparator(',');
+            gnuplot.addDataSetToPlot(T, property[phaseIdx][propertyIdx], Component::name() + "_" + phaseNames[phaseIdx] + "_" + propertyNames[propertyIdx] + ".csv");
+            gnuplot.plot(Component::name() + "_" + phaseNames[phaseIdx] + "_" + propertyNames[propertyIdx]);
+        }
+    }
+}
+
+////////////////////////
+// the main function
+////////////////////////
+int main(int argc, char *argv[])
+{
+    bool openPlotWindow = false;
+    if (argc == 3 && (strcmp(argv[2], "1") || strcmp(argv[2], "true") || strcmp(argv[2], "True")))
+        openPlotWindow = true;
+
+    if (argc < 2)
+        DUNE_THROW(Dune::InvalidStateException, "At least one argument (the component name) is required!");
+
+    const std::string compName = argv[1];
+
+    if (compName == "Air")
+        plotStuff< Dumux::Air<double> >(openPlotWindow);
+    else if (compName == "Benzene")
+        plotStuff< Dumux::Benzene<double> >(openPlotWindow);
+    else if (compName == "Brine")
+        plotStuff< Dumux::Brine<double> >(openPlotWindow);
+    else if (compName == "CH4")
+        plotStuff< Dumux::CH4<double> >(openPlotWindow);
+    else if (compName == "DNAPL_TCE")
+        plotStuff< Dumux::DNAPL<double> >(openPlotWindow);
+    else if (compName == "H2")
+        plotStuff< Dumux::H2<double> >(openPlotWindow);
+    else if (compName == "H2O")
+        plotStuff< Dumux::H2O<double> >(openPlotWindow);
+    else if (compName == "HeavyOil")
+        plotStuff< Dumux::HeavyOil<double> >(openPlotWindow);
+    else if (compName == "LNAPL_oil")
+        plotStuff< Dumux::LNAPL<double> >(openPlotWindow);
+    else if (compName == "Mesitylene")
+        plotStuff< Dumux::Mesitylene<double> >(openPlotWindow);
+    else if (compName == "N2")
+        plotStuff< Dumux::N2<double> >(openPlotWindow);
+    else if (compName == "O2")
+        plotStuff< Dumux::O2<double> >(openPlotWindow);
+    else if (compName == "SimpleCO2")
+        plotStuff< Dumux::SimpleCO2<double> >(openPlotWindow);
+    else if (compName == "SimpleH2O")
+        plotStuff< Dumux::SimpleH2O<double>  >(openPlotWindow);
+    else if (compName == "Xylene")
+        plotStuff< Dumux::Xylene<double> >(openPlotWindow);
+    else
+        DUNE_THROW(Dune::NotImplemented, "Test for component " << compName);
+}