diff --git a/dune/gfe/Makefile.am b/dune/gfe/Makefile.am
index 0efff862ffd04972b9fd32de277df72e676de414..fd32fe5067014b37060d440aa2361605362ee616 100644
--- a/dune/gfe/Makefile.am
+++ b/dune/gfe/Makefile.am
@@ -10,6 +10,7 @@ srcinclude_HEADERS = adolcnamespaceinjections.hh \
                      averageinterface.hh \
                      cosseratvtkwriter.hh \
                      cosseratvtkreader.hh \
+                     embeddedglobalgfefunction.hh \
                      geodesicdifference.hh \
                      geodesicfeassembler.hh \
                      geodesicfefunctionadaptor.hh \
diff --git a/dune/gfe/embeddedglobalgfefunction.hh b/dune/gfe/embeddedglobalgfefunction.hh
new file mode 100644
index 0000000000000000000000000000000000000000..6708774de982ea0162d01451a6723f4ee3eecf85
--- /dev/null
+++ b/dune/gfe/embeddedglobalgfefunction.hh
@@ -0,0 +1,113 @@
+#ifndef DUNE_GFE_EMBEDDEDGLOBALGFEFUNCTION_HH
+#define DUNE_GFE_EMBEDDEDGLOBALGFEFUNCTION_HH
+
+#include <vector>
+
+#include <dune/common/fvector.hh>
+#include <dune/common/fmatrix.hh>
+
+#include <dune/gfe/localgeodesicfefunction.hh>
+
+namespace Dune {
+
+  namespace GFE {
+
+/** \brief Global geodesic finite element function isometrically embedded in a Euclidean space
+ *
+ *  \tparam B  - The global basis type.
+ *  \tparam TargetSpace - The manifold that this functions takes its values in.
+ */
+template<class B, class TargetSpace>
+class EmbeddedGlobalGFEFunction
+: public VirtualGridViewFunction<typename B::GridView, typename TargetSpace::CoordinateType>
+{
+public:
+    typedef B Basis;
+
+    typedef typename Basis::LocalFiniteElement LocalFiniteElement;
+    typedef typename Basis::GridView GridView;
+    typedef typename GridView::template Codim<0>::Entity Element;
+    typedef typename GridView::Grid::ctype  ctype;
+
+    typedef LocalGeodesicFEFunction<GridView::dimension, ctype, LocalFiniteElement, TargetSpace> LocalGFEFunction;
+    typedef typename TargetSpace::EmbeddedTangentVector EmbeddedTangentVector;
+
+    //! Dimension of the grid.
+    enum { gridDim = GridView::dimension };
+
+    //! Dimension of the embedded tanget space
+    enum { embeddedDim = EmbeddedTangentVector::dimension };
+
+
+    //! Create global function by a global basis and the corresponding coefficient vector
+    EmbeddedGlobalGFEFunction(const Basis& basis, const std::vector<TargetSpace>& coefficients) :
+        VirtualGridViewFunction<typename B::GridView, typename TargetSpace::CoordinateType>(basis.getGridView()),
+        basis_(basis),
+        coefficients_(coefficients)
+    {}
+
+
+    /** \brief Evaluate the function at local coordinates. */
+    void evaluateLocal(const Element& element, const Dune::FieldVector<ctype,gridDim>& local, typename TargetSpace::CoordinateType& out) const
+    {
+        int numOfBaseFct = basis_.getLocalFiniteElement(element).localBasis().size();
+
+        // Extract local coefficients
+        std::vector<TargetSpace> localCoeff(numOfBaseFct);
+
+        for (int i=0; i<numOfBaseFct; i++)
+            localCoeff[i] = coefficients_[basis_.index(element,i)];
+
+        // create local gfe function
+        LocalGFEFunction localGFE(basis_.getLocalFiniteElement(element),localCoeff);
+        out = localGFE.evaluate(local).globalCoordinates();
+    }
+
+    /** \brief Evaluate the derivative of the function at local coordinates. */
+    void evaluateDerivativeLocal(const Element& element, const Dune::FieldVector<ctype,gridDim>& local,
+                                 Dune::FieldMatrix<ctype, embeddedDim, gridDim>& out) const
+    {
+        int numOfBaseFct = basis_.getLocalFiniteElement(element).localBasis().size();
+
+        // Extract local coefficients
+        std::vector<TargetSpace> localCoeff(numOfBaseFct);
+
+        for (int i=0; i<numOfBaseFct; i++)
+            localCoeff[i] = coefficients_[basis_.index(element,i)];
+
+        // create local gfe function
+        LocalGFEFunction localGFE(basis_.getLocalFiniteElement(element),localCoeff);
+
+        // use it to evaluate the derivative
+        Dune::FieldMatrix<ctype, embeddedDim, gridDim> refJac = localGFE.evaluateDerivative(local);
+
+        out =0.0;
+        //transform the gradient
+        const Dune::FieldMatrix<double,gridDim,gridDim>& jacInvTrans = element.geometry().jacobianInverseTransposed(local);
+        for (size_t k=0; k< refJac.N(); k++)
+            jacInvTrans.umv(refJac[k],out[k]);
+    }
+
+    /** \brief Export basis */
+    const Basis& basis() const
+    {
+        return basis_;
+    }
+
+    /** \brief Export coefficients. */
+    const std::vector<TargetSpace>& coefficients() const
+    {
+        return coefficients_;
+    }
+
+private:
+    //! The global basis
+    const Basis& basis_;
+    //! The coefficient vector
+    const std::vector<TargetSpace>& coefficients_;
+};
+
+  }   // namespace GFE
+
+}   // namespace Dune
+#endif