diff --git a/common/Makefile.am b/common/Makefile.am
index b653161737b1f8ee90bfebfdfcd68a52882d5322..41b9d41e326387a215b208f9d2a8b68bc4843027 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -24,7 +24,7 @@ commoninclude_HEADERS = alignment.hh array.hh \
   bartonnackmanifcheck.hh binaryfunctions.hh lru.hh fassign.hh \
   static_assert.hh smallobject.hh version.hh \
   float_cmp.cc float_cmp.hh nullptr.hh \
-	forloop.hh
+  forloop.hh function.hh
 
 if EXPRESSIONTEMPLATES
 commoninclude_HEADERS += exprtmpl.hh exprtmpl/scalar.inc exprtmpl/exprexpr.inc
diff --git a/common/function.hh b/common/function.hh
new file mode 100644
index 0000000000000000000000000000000000000000..7514a380773bbfd4639524e251b277ff93ed63a4
--- /dev/null
+++ b/common/function.hh
@@ -0,0 +1,66 @@
+// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=4 sw=2 sts=2:
+#ifndef DUNE_FUNCTION_HH
+#define DUNE_FUNCTION_HH
+
+
+namespace Dune {
+
+  /** @addtogroup Common
+     @{
+   */
+
+  /*! \file
+      \brief Simple base class templates for functions.
+   */
+
+  /**
+   * \brief Base class template for function classes
+   *
+   * \tparam Domain Type of input variable. This could be some 'const T' or 'const T&'.
+   *
+   * \tparam Range Type of output variable. This should be some non-const 'T&' to allow to return results.
+   */
+  template <class Domain, class Range>
+  class Function
+  {
+  public:
+
+    /**
+     * \brief Function evaluation.
+     *
+     * \param x Argument for function evaluation.
+     * \param y Result of function evaluation.
+     */
+    void evaluate(Domain x, Range y) const;
+  }; // end of Function class
+
+
+
+  /**
+   * \brief Virtual base class template for function classes.
+   *
+   * \tparam DomainType The type of the input variable is 'const DomainType &'
+   *
+   * \tparam RangeType The type of the output variable is 'RangeType &'
+   */
+  template <class DomainType, class RangeType>
+  class VirtualFunction :
+    public Function<const DomainType&, RangeType&>
+  {
+  public:
+
+    /**
+     * \brief Function evaluation.
+     *
+     * \param x Argument for function evaluation.
+     * \param y Result of function evaluation.
+     */
+    virtual void evaluate(const DomainType& x, RangeType& y) const = 0;
+  }; // end of VirtualFunction class
+
+  /** @} end documentation */
+
+} // end namespace
+
+#endif