Index: XIOS/trunk/src/filter/pass_through_filter.cpp
===================================================================
--- XIOS/trunk/src/filter/pass_through_filter.cpp	(revision 641)
+++ XIOS/trunk/src/filter/pass_through_filter.cpp	(revision 641)
@@ -0,0 +1,13 @@
+#include "pass_through_filter.hpp"
+
+namespace xios
+{
+  CPassThroughFilter::CPassThroughFilter(CGarbageCollector& gc)
+    : CFilter(gc, 1, this)
+  { /* Nothing to do */ }
+
+  CDataPacketPtr CPassThroughFilter::apply(std::vector<CDataPacketPtr> data)
+  {
+    return data[0];
+  }
+} // namespace xios
Index: XIOS/trunk/src/filter/pass_through_filter.hpp
===================================================================
--- XIOS/trunk/src/filter/pass_through_filter.hpp	(revision 641)
+++ XIOS/trunk/src/filter/pass_through_filter.hpp	(revision 641)
@@ -0,0 +1,33 @@
+#ifndef __XIOS_CPassThroughFilter__
+#define __XIOS_CPassThroughFilter__
+
+#include "filter.hpp"
+
+namespace xios
+{
+  /*!
+   * A simple pass-through filter with one input slot.
+   * The pass-through filter is used to handle references on a field.
+   */
+  class CPassThroughFilter : public CFilter, public IFilterEngine
+  {
+    public:
+      /*!
+       * Constructs a pass-through filter with the one input slot.
+       *
+       * \param gc the associated garbage collector
+       */
+      CPassThroughFilter(CGarbageCollector& gc);
+
+    protected:
+      /*!
+       * Returns the input packet without making any modification to it.
+       *
+       * \param data a vector of packets corresponding to each slot
+       * \return the untouched source data packet
+       */
+      CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data);
+  }; // class CPassThroughFilter
+} // namespace xios
+
+#endif //__XIOS_CPassThroughFilter__
Index: XIOS/trunk/src/node/field.cpp
===================================================================
--- XIOS/trunk/src/node/field.cpp	(revision 640)
+++ XIOS/trunk/src/node/field.cpp	(revision 641)
@@ -18,4 +18,5 @@
 #include "store_filter.hpp"
 #include "file_writer_filter.hpp"
+#include "pass_through_filter.hpp"
 
 namespace xios{
@@ -609,4 +610,13 @@
       return(this->last_operation);
    }
+
+   //----------------------------------------------------------------
+
+   boost::shared_ptr<COutputPin> CField::getInstantDataFilter()
+   {
+     return instantDataFilter;
+   }
+
+   //----------------------------------------------------------------
 
    void CField::solveAllReferenceEnabledField(bool doSending2Sever)
@@ -759,9 +769,20 @@
    void CField::buildFilterGraph(CGarbageCollector& gc, bool enableOutput)
    {
+     if (!areAllReferenceSolved) solveAllReferenceEnabledField(false);
+
      // Start by building a filter which can provide the field's instant data
      if (!instantDataFilter)
      {
+       // Check if we have a reference on another field
+       if (!field_ref.isEmpty())
+       {
+         boost::shared_ptr<CPassThroughFilter> passThroughFilter(new CPassThroughFilter(gc));
+         instantDataFilter = passThroughFilter;
+         CField* fieldRef = CField::get(field_ref);
+         fieldRef->buildFilterGraph(gc, false);
+         fieldRef->getInstantDataFilter()->connectOutput(passThroughFilter, 0);
+       }
        // Check if the data is to be read from a file
-       if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read)
+       else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read)
          instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(grid));
        else // The data might be passed from the model
Index: XIOS/trunk/src/node/field.hpp
===================================================================
--- XIOS/trunk/src/node/field.hpp	(revision 640)
+++ XIOS/trunk/src/node/field.hpp	(revision 641)
@@ -93,4 +93,5 @@
          template <int N> void getData(CArray<double, N>& _data) const;
 
+         boost::shared_ptr<COutputPin> getInstantDataFilter();
 
          /// Mutateur ///
