diff --git a/Solver/function.cpp b/Solver/function.cpp
index f11579954a1bfbd3e991c801cb10b98eef989f00..1edcd97bd388b128ab81abdbad6774b4abaef8fe 100644
--- a/Solver/function.cpp
+++ b/Solver/function.cpp
@@ -206,7 +206,7 @@ void dataCacheDouble::_eval()
 const function * dataCacheMap::_translate(const function *f) const 
 {
   //special case
-  if (f == function::getSolution()) {
+  if (f == function::getSolution() || f == _containerSolution) {
     f = _functionSolution;
     if (f == NULL) {
       dataCacheMap *parent = _parent;
@@ -218,7 +218,7 @@ const function * dataCacheMap::_translate(const function *f) const
       if (f == NULL) 
         Msg::Error ("solution function has not been set");
     }
-  } else if (f == function::getSolutionGradient()) {
+  } else if (f == function::getSolutionGradient() || f == _containerSolutionGradient) {
     f = _functionSolutionGradient;
     if (f == NULL) {
       dataCacheMap *parent = _parent;
diff --git a/Solver/function.h b/Solver/function.h
index ea4f7d009911a7e049152ee380540bf88a3abfd7..84ee4052d42a7f0314c08ec742105dbdbd9a8dd0 100644
--- a/Solver/function.h
+++ b/Solver/function.h
@@ -201,7 +201,7 @@ class dataCacheDouble {
 };
 
 class dataCacheMap {
-  const function *_functionSolution, *_functionSolutionGradient, *_functionCoordinates;
+  const function *_functionSolution, *_functionSolutionGradient, *_functionCoordinates, *_containerSolution, *_containerSolutionGradient;
   //handle function solution and funciton solution gradient
   //we should get rid of them
   const function * _translate (const function *) const;
@@ -215,9 +215,9 @@ class dataCacheMap {
   std::vector<dataCacheDouble*> _toInvalidateOnElement;
   MElement *_element;
   dataCacheMap() {
-    _functionSolution = _functionSolutionGradient = _functionCoordinates = NULL;
+    _functionSolution = _functionSolutionGradient = _functionCoordinates = _containerSolution = _containerSolutionGradient = NULL;
     _nbEvaluationPoints = 0;
-    _parent=NULL;
+    _parent = NULL;
   }
   ~dataCacheMap();
   void addDataCacheDouble(dataCacheDouble *data, bool invalidatedOnElement)
@@ -269,6 +269,13 @@ class dataCacheMap {
     _functionSolution = functionSolution;
     _functionSolutionGradient = functionSolutionGradient;
   }
+  inline void setReferenceSolutionFunction(const function *functionSolution, const function *functionSolutionGradient) {
+    _containerSolution = functionSolution;
+    _containerSolutionGradient = functionSolutionGradient;
+    for(std::list<dataCacheMap*>::iterator it = _children.begin(); it != _children.end(); it++) {
+      (*it)->setReferenceSolutionFunction(functionSolution, functionSolutionGradient);
+    }
+  }
   void setNbEvaluationPoints(int nbEvaluationPoints);
   inline int getNbEvaluationPoints() { return _nbEvaluationPoints; }
 };