Index: /XIOS/trunk/src/config/domain_attribute.conf
===================================================================
--- /XIOS/trunk/src/config/domain_attribute.conf	(revision 1548)
+++ /XIOS/trunk/src/config/domain_attribute.conf	(revision 1549)
@@ -62,2 +62,7 @@
 DECLARE_ATTRIBUTE(StdString, domain_ref)
 DECLARE_ATTRIBUTE(int,       prec)
+
+DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ibegin)
+DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ni)
+DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_jbegin)
+DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_nj)
Index: /XIOS/trunk/src/config/domain_attribute_private.conf
===================================================================
--- /XIOS/trunk/src/config/domain_attribute_private.conf	(revision 1548)
+++ /XIOS/trunk/src/config/domain_attribute_private.conf	(revision 1549)
@@ -26,8 +26,8 @@
 DECLARE_ARRAY_PRIVATE(double, 2, bounds_latvalue_unstructured_read_from_file)
 
-DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ibegin)
-DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ni)
-DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_jbegin)
-DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_nj)
+//DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ibegin)
+//DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ni)
+//DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_jbegin)
+//DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_nj)
 
 // Local zoom information
Index: /XIOS/trunk/src/config/extract_domain_attribute.conf
===================================================================
--- /XIOS/trunk/src/config/extract_domain_attribute.conf	(revision 1549)
+++ /XIOS/trunk/src/config/extract_domain_attribute.conf	(revision 1549)
@@ -0,0 +1,5 @@
+/* GLOBAL */
+DECLARE_ATTRIBUTE(int             , ni)
+DECLARE_ATTRIBUTE(int             , nj)
+DECLARE_ATTRIBUTE(int             , ibegin)
+DECLARE_ATTRIBUTE(int             , jbegin)
Index: /XIOS/trunk/src/config/node_type.conf
===================================================================
--- /XIOS/trunk/src/config/node_type.conf	(revision 1548)
+++ /XIOS/trunk/src/config/node_type.conf	(revision 1549)
@@ -105,5 +105,9 @@
 #ifdef __XIOS_CReorderDomain__
    DECLARE_NODE(ReorderDomain, reorder_domain)
-#endif //__XIOS_CReduceScalarToScalar_
+#endif //__XIOS_CReorderDomain_
+
+#ifdef __XIOS_CExtractDomain__
+   DECLARE_NODE(ExtractDomain, extract_domain)
+#endif //__XIOS_CExtractDomain__
 
 #ifdef __XIOS_CContext__
Index: /XIOS/trunk/src/distribution_client.cpp
===================================================================
--- /XIOS/trunk/src/distribution_client.cpp	(revision 1548)
+++ /XIOS/trunk/src/distribution_client.cpp	(revision 1549)
@@ -614,4 +614,10 @@
   int tempI = dataIIndex + dataIBegin,
       tempJ = (dataJIndex + dataJBegin);
+  if (ni == 0)
+  {
+    int i = 0;
+    j = 0;
+    return i;
+  }
   int i = (dataDim == 1) ? (tempI) % ni
                          : (tempI) ;
Index: /XIOS/trunk/src/generate_fortran_interface.cpp
===================================================================
--- /XIOS/trunk/src/generate_fortran_interface.cpp	(revision 1548)
+++ /XIOS/trunk/src/generate_fortran_interface.cpp	(revision 1549)
@@ -36,4 +36,5 @@
   CExpandDomain expandDomain;
   CReorderDomain reorderDomain;
+  CExtractDomain extractDomain;
 
   CInterpolateAxis interpolateAxis;
@@ -315,4 +316,15 @@
   reorderDomain.generateFortranInterface(file);
 
+  file.open((path+"extract_domain_interface_attr.F90").c_str());
+  extractDomain.generateFortran2003Interface(file);
+  file.close();
+
+  file.open((path+"icextract_domain_attr.cpp").c_str());
+  extractDomain.generateCInterface(file);
+  file.close();
+
+  file.open((path+"iextract_domain_attr.F90").c_str());
+  extractDomain.generateFortranInterface(file);
+
   file.close();
   
Index: /XIOS/trunk/src/group_factory_decl.cpp
===================================================================
--- /XIOS/trunk/src/group_factory_decl.cpp	(revision 1548)
+++ /XIOS/trunk/src/group_factory_decl.cpp	(revision 1549)
@@ -44,3 +44,4 @@
   macro(CReduceScalarToScalarGroup)
   macro(CReorderDomainGroup)
+  macro(CExtractDomainGroup)
 }
Index: /XIOS/trunk/src/group_template_decl.cpp
===================================================================
--- /XIOS/trunk/src/group_template_decl.cpp	(revision 1548)
+++ /XIOS/trunk/src/group_template_decl.cpp	(revision 1549)
@@ -33,4 +33,5 @@
   macro(ReduceScalarToScalar)
   macro(ReorderDomain)
+  macro(ExtractDomain)
 
 }
Index: /XIOS/trunk/src/node/domain.cpp
===================================================================
--- /XIOS/trunk/src/node/domain.cpp	(revision 1548)
+++ /XIOS/trunk/src/node/domain.cpp	(revision 1549)
@@ -77,4 +77,5 @@
      m["expand_domain"] = TRANS_EXPAND_DOMAIN;
      m["reorder_domain"] = TRANS_REORDER_DOMAIN;
+     m["extract_domain"] = TRANS_EXTRACT_DOMAIN;
    }
 
@@ -1212,6 +1213,6 @@
 
    /*
-     Fill in longitude and latitude value from clients (or models) into internal values lonvalue, latvalue which
-     will be used by XIOS.
+     Fill in longitude, latitude, bounds, and area into internal values (lonvalue, latvalue, bounds_lonvalue, bounds_latvalue, areavalue)
+     which will be used by XIOS.
    */
    void CDomain::completeLonLatClient(void)
@@ -1219,4 +1220,6 @@
      bool lonlatValueExisted = (0 != lonvalue.numElements()) || (0 != latvalue.numElements());
      checkBounds() ;
+     checkArea() ;
+
      if (!lonvalue_2d.isEmpty() && !lonlatValueExisted)
      {
@@ -1313,4 +1316,17 @@
        }
      }
+
+     if (!area.isEmpty() && areavalue.isEmpty())
+     {
+        areavalue.resize(ni*nj);
+       for (int j = 0; j < nj; ++j)
+       {
+         for (int i = 0; i < ni; ++i)
+         {
+           int k = j * ni + i;
+           areavalue(k) = area(i,j);
+         }
+       }
+     }
    }
 
@@ -1455,5 +1471,5 @@
                << "[ id = " << this->getId() << " , context = '" << CObjectFactory::GetCurrentContextId() << " ] "
                << "'bounds_lon_1d' dimension is not compatible with 'nvertex'." << std::endl
-               << "'bounds_lon_1d' dimension is " << bounds_lon_1d.extent(1)
+               << "'bounds_lon_1d' dimension is " << bounds_lon_1d.extent(0)
                << " but nvertex is " << nvertex.getValue() << ".");
 
@@ -1462,5 +1478,5 @@
                << "[ id = " << this->getId() << " , context = '" << CObjectFactory::GetCurrentContextId() << " ] "
                << "'bounds_lon_2d' dimension is not compatible with 'nvertex'." << std::endl
-               << "'bounds_lon_2d' dimension is " << bounds_lon_2d.extent(2)
+               << "'bounds_lon_2d' dimension is " << bounds_lon_2d.extent(0)
                << " but nvertex is " << nvertex.getValue() << ".");
 
@@ -1479,5 +1495,5 @@
                << "[ id = " << this->getId() << " , context = '" << CObjectFactory::GetCurrentContextId() << " ] "
                << "'bounds_lat_1d' dimension is not compatible with 'nvertex'." << std::endl
-               << "'bounds_lat_1d' dimension is " << bounds_lat_1d.extent(1)
+               << "'bounds_lat_1d' dimension is " << bounds_lat_1d.extent(0)
                << " but nvertex is " << nvertex.getValue() << ".");
 
@@ -1486,5 +1502,5 @@
                << "[ id = " << this->getId() << " , context = '" << CObjectFactory::GetCurrentContextId() << " ] "
                << "'bounds_lat_2d' dimension is not compatible with 'nvertex'." << std::endl
-               << "'bounds_lat_2d' dimension is " << bounds_lat_2d.extent(2)
+               << "'bounds_lat_2d' dimension is " << bounds_lat_2d.extent(0)
                << " but nvertex is " << nvertex.getValue() << ".");
 
@@ -1525,16 +1541,16 @@
                << "Area size is " << area.extent(0) << " x " << area.extent(1) << ".");
        }
-       if (areavalue.isEmpty())
-       {
-          areavalue.resize(ni*nj);
-         for (int j = 0; j < nj; ++j)
-         {
-           for (int i = 0; i < ni; ++i)
-           {
-             int k = j * ni + i;
-             areavalue(k) = area(i,j);
-           }
-         }
-       }
+//       if (areavalue.isEmpty())
+//       {
+//          areavalue.resize(ni*nj);
+//         for (int j = 0; j < nj; ++j)
+//         {
+//           for (int i = 0; i < ni; ++i)
+//           {
+//             int k = j * ni + i;
+//             areavalue(k) = area(i,j);
+//           }
+//         }
+//       }
      }
    }
Index: /XIOS/trunk/src/node/extract_domain.cpp
===================================================================
--- /XIOS/trunk/src/node/extract_domain.cpp	(revision 1549)
+++ /XIOS/trunk/src/node/extract_domain.cpp	(revision 1549)
@@ -0,0 +1,74 @@
+#include "extract_domain.hpp"
+#include "type.hpp"
+
+namespace xios {
+
+  /// ////////////////////// DÃ©finitions ////////////////////// ///
+
+  CExtractDomain::CExtractDomain(void)
+    : CObjectTemplate<CExtractDomain>(), CExtractDomainAttributes(), CTransformation<CDomain>()
+  { /* Ne rien faire de plus */ }
+
+  CExtractDomain::CExtractDomain(const StdString & id)
+    : CObjectTemplate<CExtractDomain>(id), CExtractDomainAttributes(), CTransformation<CDomain>()
+  { /* Ne rien faire de plus */ }
+
+  CExtractDomain::~CExtractDomain(void)
+  {}
+
+  CTransformation<CDomain>* CExtractDomain::create(const StdString& id, xml::CXMLNode* node)
+  {
+    CExtractDomain* extractDomain = CExtractDomainGroup::get("extract_domain_definition")->createChild(id);
+    if (node) extractDomain->parse(*node);
+    return static_cast<CTransformation<CDomain>*>(extractDomain);
+  }
+
+  bool CExtractDomain::_dummyRegistered = CExtractDomain::registerTrans();
+  bool CExtractDomain::registerTrans()
+  {
+    registerTransformation(TRANS_EXTRACT_DOMAIN, CExtractDomain::create);
+  }
+
+  //----------------------------------------------------------------
+
+  StdString CExtractDomain::GetName(void)    { return StdString("extract_domain"); }
+  StdString CExtractDomain::GetDefName(void) { return StdString("extract_domain"); }
+  ENodeType CExtractDomain::GetType(void)    { return eExtractDomain; }
+
+  void CExtractDomain::checkValid(CDomain* domainSrc)
+  {
+    int ni_glo = domainSrc->ni_glo.getValue();
+    int nj_glo = domainSrc->nj_glo.getValue();
+
+    // RÃ©solution et vÃ©rification des donnÃ©es globales de extract.
+    if (!this->ni.isEmpty() || !this->nj.isEmpty() ||
+        !this->ibegin.isEmpty() || !this->jbegin.isEmpty())
+    {
+       if (this->ni.isEmpty()     || this->nj.isEmpty() ||
+           this->ibegin.isEmpty() || this->jbegin.isEmpty())
+       {
+         ERROR("CExtractDomain::checkValid(CDomain* domainSrc)",
+               << "If one of extract attributes is defined then all extract attributes must be defined.") ;
+       }
+       else
+       {
+          int iend = ibegin + ni - 1;
+          int jend = jbegin + nj - 1;
+
+          if (ibegin < 0  || jbegin < 0 || iend > ni_glo - 1 || jend > nj_glo - 1)
+            ERROR("CExtractDomain::checkValid(CDomain* domainSrc)",
+                  << "Extract is wrongly defined, "
+                  << "please check the values : 'ni' (" << ni.getValue() << "), 'nj' (" << nj.getValue() << "), "
+                  << "'ibegin' (" << ibegin.getValue() << "), 'jbegin' (" << jbegin.getValue() << ")");
+       }
+    }
+    else
+    {
+       ni = ni_glo;
+       nj = nj_glo;
+       ibegin = 0;
+       jbegin = 0;
+    }
+  }
+
+}
Index: /XIOS/trunk/src/node/extract_domain.hpp
===================================================================
--- /XIOS/trunk/src/node/extract_domain.hpp	(revision 1549)
+++ /XIOS/trunk/src/node/extract_domain.hpp	(revision 1549)
@@ -0,0 +1,67 @@
+#ifndef __XIOS_CExtractDomain__
+#define __XIOS_CExtractDomain__
+
+/// xios headers ///
+#include "xios_spl.hpp"
+#include "attribute_enum.hpp"
+#include "attribute_enum_impl.hpp"
+#include "attribute_array.hpp"
+#include "declare_attribute.hpp"
+#include "object_template.hpp"
+#include "group_factory.hpp"
+#include "declare_group.hpp"
+#include "transformation.hpp"
+#include "domain.hpp"
+
+namespace xios {
+  /// ////////////////////// DÃ©clarations ////////////////////// ///
+  class CExtractDomainGroup;
+  class CExtractDomainAttributes;
+  class CExtractDomain;
+  class CDomain;
+
+  ///--------------------------------------------------------------
+
+  // Declare/Define CFileAttribute
+  BEGIN_DECLARE_ATTRIBUTE_MAP(CExtractDomain)
+#include "extract_domain_attribute.conf"
+  END_DECLARE_ATTRIBUTE_MAP(CExtractDomain)
+
+  ///--------------------------------------------------------------
+  /*!
+    \class CExtractDomain
+    This class describes extract_domain in xml file.
+  */
+  class CExtractDomain
+    : public CObjectTemplate<CExtractDomain>
+    , public CExtractDomainAttributes
+    , public CTransformation<CDomain>
+  {
+    public :
+      typedef CObjectTemplate<CExtractDomain> SuperClass;
+      typedef CExtractDomainAttributes SuperClassAttribute;
+
+    public :
+      /// Constructeurs ///
+      CExtractDomain(void);
+      explicit CExtractDomain(const StdString& id);
+
+      /// Destructeur ///
+      virtual ~CExtractDomain(void);
+
+      virtual void checkValid(CDomain* axisDest);
+
+      /// Accesseurs statiques ///
+      static StdString GetName(void);
+      static StdString GetDefName(void);
+      static ENodeType GetType(void);
+    private:
+      static bool registerTrans();
+      static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node);
+      static bool _dummyRegistered;
+  }; // class CExtractDomain
+
+  DECLARE_GROUP(CExtractDomain);
+} // namespace xios
+
+#endif // __XIOS_CExtractDomain__
Index: /XIOS/trunk/src/node/node_enum.hpp
===================================================================
--- /XIOS/trunk/src/node/node_enum.hpp	(revision 1548)
+++ /XIOS/trunk/src/node/node_enum.hpp	(revision 1549)
@@ -38,5 +38,6 @@
          eDuplicateScalarToAxis,
          eReduceScalarToScalar,
-         eReorderDomain
+         eReorderDomain,
+         eExtractDomain
        } ENodeType;
 
Index: /XIOS/trunk/src/node/node_type.hpp
===================================================================
--- /XIOS/trunk/src/node/node_type.hpp	(revision 1548)
+++ /XIOS/trunk/src/node/node_type.hpp	(revision 1549)
@@ -29,4 +29,5 @@
 #include "reduce_scalar_to_scalar.hpp"
 #include "reorder_domain.hpp"
+#include "extract_domain.hpp"
 
 
Index: /XIOS/trunk/src/node/transformation_enum.hpp
===================================================================
--- /XIOS/trunk/src/node/transformation_enum.hpp	(revision 1548)
+++ /XIOS/trunk/src/node/transformation_enum.hpp	(revision 1549)
@@ -24,5 +24,6 @@
         TRANS_DUPLICATE_SCALAR_TO_AXIS = 15,
         TRANS_REDUCE_SCALAR_TO_SCALAR = 16,
-        TRANS_REORDER_DOMAIN = 17
+        TRANS_REORDER_DOMAIN = 17,
+        TRANS_EXTRACT_DOMAIN = 18
       } ETranformationType;
 
Index: /XIOS/trunk/src/object_factory_decl.cpp
===================================================================
--- /XIOS/trunk/src/object_factory_decl.cpp	(revision 1548)
+++ /XIOS/trunk/src/object_factory_decl.cpp	(revision 1549)
@@ -45,4 +45,5 @@
   macro(CReduceScalarToScalar)
   macro(CReorderDomain)
+  macro(CExtractDomain)
   
   macro(CFieldGroup)
@@ -72,3 +73,4 @@
   macro(CReduceScalarToScalarGroup)
   macro(CReorderDomainGroup)
+  macro(CExtractDomainGroup)
 }
Index: /XIOS/trunk/src/object_template_decl.cpp
===================================================================
--- /XIOS/trunk/src/object_template_decl.cpp	(revision 1548)
+++ /XIOS/trunk/src/object_template_decl.cpp	(revision 1549)
@@ -32,4 +32,5 @@
   template class CObjectTemplate<CReduceScalarToScalar>;
   template class CObjectTemplate<CReorderDomain>;
+  template class CObjectTemplate<CExtractDomain>;
   
   template class CObjectTemplate<CContextGroup>;
@@ -59,3 +60,4 @@
   template class CObjectTemplate<CReduceScalarToScalarGroup>;
   template class CObjectTemplate<CReorderDomainGroup>;
+  template class CObjectTemplate<CExtractDomainGroup>;
 }
Index: /XIOS/trunk/src/transformation/algo_types.hpp
===================================================================
--- /XIOS/trunk/src/transformation/algo_types.hpp	(revision 1548)
+++ /XIOS/trunk/src/transformation/algo_types.hpp	(revision 1549)
@@ -30,4 +30,5 @@
 #include "scalar_algorithm_reduce_scalar.hpp"
 #include "domain_algorithm_reorder.hpp"
+#include "domain_algorithm_extract.hpp"
 
 
Index: /XIOS/trunk/src/transformation/domain_algorithm_extract.cpp
===================================================================
--- /XIOS/trunk/src/transformation/domain_algorithm_extract.cpp	(revision 1549)
+++ /XIOS/trunk/src/transformation/domain_algorithm_extract.cpp	(revision 1549)
@@ -0,0 +1,236 @@
+#include "domain_algorithm_extract.hpp"
+#include "extract_domain.hpp"
+#include "domain.hpp"
+#include "grid.hpp"
+#include "grid_transformation_factory_impl.hpp"
+#include "attribute_template.hpp"
+
+namespace xios {
+CGenericAlgorithmTransformation* CDomainAlgorithmExtract::create(CGrid* gridDst, CGrid* gridSrc,
+                                                             CTransformation<CDomain>* transformation,
+                                                             int elementPositionInGrid,
+                                                             std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
+                                                             std::map<int, int>& elementPositionInGridSrc2AxisPosition,
+                                                             std::map<int, int>& elementPositionInGridSrc2DomainPosition,
+                                                             std::map<int, int>& elementPositionInGridDst2ScalarPosition,
+                                                             std::map<int, int>& elementPositionInGridDst2AxisPosition,
+                                                             std::map<int, int>& elementPositionInGridDst2DomainPosition)
+{
+  std::vector<CDomain*> domainListDestP = gridDst->getDomains();
+  std::vector<CDomain*> domainListSrcP  = gridSrc->getDomains();
+
+  CExtractDomain* extractDomain = dynamic_cast<CExtractDomain*> (transformation);
+  int domainDstIndex = elementPositionInGridDst2DomainPosition[elementPositionInGrid];
+  int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
+
+  return (new CDomainAlgorithmExtract(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], extractDomain));
+}
+
+bool CDomainAlgorithmExtract::registerTrans()
+{
+  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_EXTRACT_DOMAIN, create);
+}
+
+CDomainAlgorithmExtract::CDomainAlgorithmExtract(CDomain* domainDestination, CDomain* domainSource, CExtractDomain* extractDomain)
+: CDomainAlgorithmTransformation(domainDestination, domainSource)
+{
+  extractDomain->checkValid(domainSource);
+  extractIBegin_ = extractDomain->ibegin.getValue();
+  extractJBegin_ = extractDomain->jbegin.getValue();
+
+  extractNi_  = extractDomain->ni.getValue();
+  extractNj_  = extractDomain->nj.getValue();
+
+  extractIEnd_ = extractIBegin_ + extractNi_ - 1;
+  extractJEnd_ = extractJBegin_ + extractNj_ - 1;
+
+  if (extractNi_ > domainSource->ni_glo.getValue())
+  {
+    ERROR("CDomainAlgorithmExtract::CDomainAlgorithmExtract(CDomain* domainDestination, CDomain* domainSource, CExtractDomain* extractDomain)",
+           << "Extract size is greater than size of domain source"
+           << "Size ni_glo of domain source " <<domainSource->getId() << " is " << domainSource->ni_glo.getValue()  << std::endl
+           << "Extract size is " << extractNi_ );
+  }
+
+  if (extractNj_ > domainSource->nj_glo.getValue())
+  {
+    ERROR("CDomainAlgorithmExtract::CDomainAlgorithmExtract(CDomain* domainDestination, CDomain* domainSource, CExtractDomain* extractDomain)",
+           << "Extract size is greater than size of domain source"
+           << "Size nj_glo of domain source " <<domainSource->getId() << " is " << domainSource->nj_glo.getValue()  << std::endl
+           << "Extract size is " << extractNj_ );
+  }
+
+  // Calculate the size of local domain
+  int ind, indLocSrc, indLocDest, iIdxSrc, jIdxSrc, destIBegin = -1, destJBegin = -1, niDest = 0, njDest = 0, ibeginDest, jbeginDest ;
+  int indGloDest, indGloSrc, niGloSrc = domainSrc_->ni_glo, iSrc, jSrc;
+  for (int j = 0; j < domainSrc_->nj.getValue(); j++)
+  {
+    for (int i = 0; i < domainSrc_->ni.getValue(); i++)
+    {
+      ind = j*domainSrc_->ni + i;
+      iIdxSrc = domainSrc_->i_index(ind);
+      if ((iIdxSrc >= extractIBegin_) && (iIdxSrc <= extractIEnd_))
+      {
+        jIdxSrc = domainSrc_->j_index(ind);
+        if ((jIdxSrc >= extractJBegin_) && (jIdxSrc <= extractJEnd_))
+        {
+          if ((niDest == 0) && (njDest == 0))
+          {
+            destIBegin = i;
+            destJBegin = j;
+          }
+          if (i == destIBegin) ++njDest;
+        }
+        if (j == destJBegin) ++niDest;
+
+      }
+    }
+  }
+  ibeginDest = destIBegin + domainSrc_->ibegin - extractIBegin_;
+  jbeginDest = destJBegin + domainSrc_->jbegin - extractJBegin_;
+  domainDest_->ni_glo.setValue(extractNi_);
+  domainDest_->nj_glo.setValue(extractNj_);
+  domainDest_->ni.setValue(niDest);
+  domainDest_->nj.setValue(njDest);
+  domainDest_->ibegin.setValue(ibeginDest);
+  domainDest_->jbegin.setValue(jbeginDest);
+  domainDest_->i_index.resize(niDest*njDest);
+  domainDest_->j_index.resize(niDest*njDest);
+
+  domainDest_->data_ni.setValue(niDest);
+  domainDest_->data_nj.setValue(njDest);
+  domainDest_->data_ibegin.setValue(0);  // local position
+  domainDest_->data_jbegin.setValue(0);  // local position
+  domainDest_->data_i_index.resize(niDest*njDest); // local position
+  domainDest_->data_j_index.resize(niDest*njDest); // local position
+
+  domainDest_->domainMask.resize(niDest*njDest);
+
+  if (!domainSrc_->lonvalue_1d.isEmpty())
+  {
+    if (domainDest_->type == CDomain::type_attr::rectilinear)
+    {
+      domainDest_->lonvalue_1d.resize(niDest);
+      domainDest_->latvalue_1d.resize(njDest);
+    }
+    else if (domainDest_->type == CDomain::type_attr::unstructured)
+    {
+      domainDest_->lonvalue_1d.resize(niDest);
+      domainDest_->latvalue_1d.resize(niDest);
+    }
+  }
+  else if (!domainSrc_->lonvalue_2d.isEmpty())
+  {
+    domainDest_->lonvalue_2d.resize(niDest,njDest);
+    domainDest_->latvalue_2d.resize(niDest,njDest);
+  }
+
+  if (domainSrc_->hasBounds)
+  {
+    if (!domainSrc_->bounds_lon_2d.isEmpty())
+    {
+      domainDest_->bounds_lon_2d.resize(domainDest_->nvertex, niDest, njDest);
+      domainDest_->bounds_lon_2d.resize(domainDest_->nvertex, niDest, njDest);
+    }
+    else if (!domainSrc_->bounds_lon_1d.isEmpty())
+    {
+      domainDest_->bounds_lon_1d.resize(domainDest_->nvertex, niDest);
+      domainDest_->bounds_lon_1d.resize(domainDest_->nvertex, niDest);
+    }
+  }
+  if (domainSrc_->hasArea) domainDest_->area.resize(niDest,njDest);
+
+  domainDest_->global_zoom_ni.setValue(extractNi_);
+  domainDest_->global_zoom_ibegin.setValue(0);
+  domainDest_->global_zoom_nj.setValue(extractNj_);
+  domainDest_->global_zoom_jbegin.setValue(0);
+
+  this->transformationMapping_.resize(1);
+  this->transformationWeight_.resize(1);
+  TransformationIndexMap& transMap = this->transformationMapping_[0];
+  TransformationWeightMap& transWeight = this->transformationWeight_[0];
+
+  for (int iDest = 0; iDest < niDest; iDest++)
+  {
+    iSrc = iDest + destIBegin;
+    for (int jDest = 0; jDest < njDest; jDest++)
+    {
+      jSrc = jDest + destJBegin;
+      ind = jSrc * domainSrc_->ni + iSrc;
+      iIdxSrc = domainSrc_->i_index(ind);
+      jIdxSrc = domainSrc_->j_index(ind);
+      indLocDest = jDest*niDest + iDest;
+      indGloDest = (jDest + jbeginDest)*extractNi_ + (iDest + ibeginDest);
+      indLocSrc = (jDest+destJBegin)*domainSrc_->ni + (iDest+destIBegin);
+      indGloSrc = (jIdxSrc )* niGloSrc + iIdxSrc;
+      domainDest_->i_index(indLocDest) = iDest + ibeginDest;                                             // i_index contains global positions
+      domainDest_->j_index(indLocDest) = jDest + jbeginDest;                                             // i_index contains global positions
+      domainDest_->data_i_index(indLocDest) = (domainSrc_->data_dim == 1) ? indLocDest : iDest;          // data_i_index contains local positions
+      domainDest_->data_j_index(indLocDest) = (domainSrc_->data_dim == 1) ? 0 :jDest;                    // data_i_index contains local positions
+      domainDest_->domainMask(indLocDest) = domainSrc_->domainMask(indLocSrc);
+
+      if (domainSrc_->hasArea)
+        domainDest_->area(iDest,jDest) = domainSrc_->area(iSrc,jSrc);
+
+      if (domainSrc_->hasBounds)
+      {
+        if (!domainSrc_->bounds_lon_2d.isEmpty())
+        {
+          for (int n = 0; n < domainSrc_->nvertex; ++n)
+          {
+            domainDest_->bounds_lon_2d(n,iDest,jDest) = domainSrc_->bounds_lon_2d(n,iSrc,jSrc);
+            domainDest_->bounds_lat_2d(n,iDest,jDest) = domainSrc_->bounds_lat_2d(n,iSrc,jSrc);
+          }
+        }
+        else if (!domainSrc_->bounds_lon_1d.isEmpty())
+        {
+          for (int n = 0; n < domainSrc_->nvertex; ++n)
+          {
+            domainDest_->bounds_lon_1d(n,iDest) = domainSrc_->bounds_lon_1d(n,iSrc);
+            domainDest_->bounds_lat_1d(n,iDest) = domainSrc_->bounds_lat_1d(n,iSrc);
+          }
+        }
+      }
+
+      if (domainSrc_->hasLonLat)
+      {
+        if (domainDest_->type == CDomain::type_attr::rectilinear)
+        {
+          domainDest_->latvalue_1d(jDest) = domainSrc_->latvalue_1d(jSrc);
+        }
+        else if (domainDest_->type == CDomain::type_attr::curvilinear)
+        {
+          domainDest_->lonvalue_2d(iDest,jDest) = domainSrc_->lonvalue_2d(iSrc,jSrc);
+          domainDest_->latvalue_2d(iDest,jDest) = domainSrc_->latvalue_2d(iSrc,jSrc);
+        }
+      }
+
+      transMap[indGloDest].push_back(indGloSrc);
+      transWeight[indGloDest].push_back(1.0);
+
+    }
+    if (domainSrc_->hasLonLat)
+    {
+      if (domainDest_->type == CDomain::type_attr::unstructured)
+      {
+        domainDest_->lonvalue_1d(iDest) = domainSrc_->lonvalue_1d(iSrc);
+        domainDest_->latvalue_1d(iDest) = domainSrc_->latvalue_1d(iSrc);
+      }
+      else if (domainDest_->type == CDomain::type_attr::rectilinear)
+      {
+        domainDest_->lonvalue_1d(iDest) = domainSrc_->lonvalue_1d(iSrc);
+      }
+    }
+  }
+
+}
+
+/*!
+  Compute the index mapping between domain on grid source and one on grid destination
+*/
+void CDomainAlgorithmExtract::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs)
+{
+}
+
+
+}
Index: /XIOS/trunk/src/transformation/domain_algorithm_extract.hpp
===================================================================
--- /XIOS/trunk/src/transformation/domain_algorithm_extract.hpp	(revision 1549)
+++ /XIOS/trunk/src/transformation/domain_algorithm_extract.hpp	(revision 1549)
@@ -0,0 +1,59 @@
+
+#ifndef __XIOS_DOMAIN_ALGORITHM_EXTRACT_HPP__
+#define __XIOS_DOMAIN_ALGORITHM_EXTRACT_HPP__
+
+#include "domain_algorithm_transformation.hpp"
+#include "transformation.hpp"
+
+namespace xios {
+
+class CDomain;
+class CExtractDomain;
+
+/*!
+  \class CDomainAlgorithmExtract
+  Implementing extract (alternative zoom) on domain
+*/
+class CDomainAlgorithmExtract : public CDomainAlgorithmTransformation
+{
+public:
+  CDomainAlgorithmExtract(CDomain* domainDestination, CDomain* domainSource, CExtractDomain* extractDomain);
+
+  virtual ~CDomainAlgorithmExtract() {}
+
+  static bool registerTrans();
+protected:
+  void updateDomainAttributes();
+  void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
+
+private:
+  void updateExtract();
+
+private:
+  //! Global extract begin on domain
+  int extractIBegin_;
+  int extractJBegin_;
+
+  //! Global extract end on domain
+  int extractIEnd_;
+  int extractJEnd_;
+
+  //! Global extract size on domain
+  int extractNi_;
+  int extractNj_;
+
+private:
+
+  static CGenericAlgorithmTransformation* create(CGrid* gridDst, CGrid* gridSrc,
+                                                CTransformation<CDomain>* transformation,
+                                                int elementPositionInGrid,
+                                                std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
+                                                std::map<int, int>& elementPositionInGridSrc2AxisPosition,
+                                                std::map<int, int>& elementPositionInGridSrc2DomainPosition,
+                                                std::map<int, int>& elementPositionInGridDst2ScalarPosition,
+                                                std::map<int, int>& elementPositionInGridDst2AxisPosition,
+                                                std::map<int, int>& elementPositionInGridDst2DomainPosition);
+};
+
+}
+#endif // __XIOS_DOMAIN_ALGORITHM_EXTRACT_HPP__
Index: /XIOS/trunk/src/transformation/grid_transformation_selector.cpp
===================================================================
--- /XIOS/trunk/src/transformation/grid_transformation_selector.cpp	(revision 1548)
+++ /XIOS/trunk/src/transformation/grid_transformation_selector.cpp	(revision 1549)
@@ -40,4 +40,5 @@
   CDomainAlgorithmExpand::registerTrans();
   CDomainAlgorithmReorder::registerTrans();
+  CDomainAlgorithmExtract::registerTrans();
 }
 
Index: /XIOS/trunk/src/type/type_util.hpp
===================================================================
--- /XIOS/trunk/src/type/type_util.hpp	(revision 1548)
+++ /XIOS/trunk/src/type/type_util.hpp	(revision 1549)
@@ -58,4 +58,6 @@
     class CReorderDomain;
     class CReorderDomainGroup;
+    class CExtractDomain;
+    class CExtractDomainGroup;
      
   template <typename T> inline string getStrType(void);
@@ -132,4 +134,6 @@
   macro(CReorderDomain)
   macro(CReorderDomainGroup)
+  macro(CExtractDomain)
+  macro(CExtractDomainGroup)
   
 #undef macro
Index: /XIOS/trunk/src/xml_parser_decl.cpp
===================================================================
--- /XIOS/trunk/src/xml_parser_decl.cpp	(revision 1548)
+++ /XIOS/trunk/src/xml_parser_decl.cpp	(revision 1549)
@@ -38,4 +38,5 @@
     macro( ReduceScalarToScalar )
     macro( ReorderDomain )
+    macro( ExtractDomain )
   }
 }
