Index: branches/reconfiguration/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h
===================================================================
--- branches/reconfiguration/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h	(revision 977)
+++ branches/reconfiguration/modules/vci_mem_cache/caba/source/include/vci_mem_cache.h	(revision 985)
@@ -549,8 +549,5 @@
 
       // Component attributes
-      std::list<soclib::common::Segment> m_seglist;          // segments allocated
       size_t                             m_nseg;             // number of segments
-      soclib::common::Segment            **m_seg;            // array of segments pointers
-      size_t                             m_seg_config;       // config segment index
       const size_t                       m_srcid_x;          // global index on RAM network
       const size_t                       m_initiators;       // Number of initiators
@@ -587,7 +584,8 @@
 
       // broadcast address
-      uint32_t                           m_broadcast_boundaries;
+      uint32_t m_broadcast_boundaries;
 
       // configuration interface constants
+      soclib::common::Segment* m_config_seg;
       const uint32_t m_config_addr_mask;
       const uint32_t m_config_regr_width;
Index: branches/reconfiguration/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp
===================================================================
--- branches/reconfiguration/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 977)
+++ branches/reconfiguration/modules/vci_mem_cache/caba/source/src/vci_mem_cache.cpp	(revision 985)
@@ -373,5 +373,4 @@
         p_dspin_clack("p_dspin_clack"),
 
-        m_seglist(mtp.getSegmentList(tgtid_d)),
         m_nseg(0),
         m_srcid_x(mtx.indexForId(srcid_x)),
@@ -408,6 +407,6 @@
 
         // CONFIG interface
+        m_config_seg(NULL),
         m_config_addr_mask((1 << 12) - 1),
-
         m_config_regr_width(7),
         m_config_func_width(3),
@@ -532,8 +531,7 @@
 
             // Get the segments associated to the MemCache
+            std::list<soclib::common::Segment> seglist = mtp.getSegmentList(tgtid_d);
             std::list<soclib::common::Segment>::iterator seg;
-            size_t i = 0;
-
-            for (seg = m_seglist.begin(); seg != m_seglist.end(); seg++)
+            for (seg = seglist.begin(); seg != seglist.end(); seg++)
             {
                 std::cout << "    => segment " << seg->name()
@@ -543,19 +541,26 @@
             }
 
-            assert((m_nseg > 0) and
-                    "MEMC ERROR : At least one segment must be mapped to this component");
-
-            m_seg = new soclib::common::Segment*[m_nseg];
-
-            for (seg = m_seglist.begin(); seg != m_seglist.end(); seg++)
-            {
-                if (seg->special()) m_seg_config = i;
-                m_seg[i] = & (*seg);
-                i++;
-            }
-
-            addr_t gid = m_seg[0]->baseAddress() >> (vci_param_int::N - x_width - y_width);
+            assert((m_nseg > 1) and
+                    "MEMC ERROR : At least two segments must be mapped to this component");
+
+            for (seg = seglist.begin(); seg != seglist.end(); ++seg)
+            {
+                if (!seg->special()) continue;
+                m_config_seg = new soclib::common::Segment(*seg);
+                break;
+            }
+
+            assert(m_config_seg && "MEMC_ERROR: the configuration segment is not mapped");
+
+            const int cluster_offset_width = (vci_param_int::N - x_width - y_width);
+            const addr_t cluster_offset_mask = (1ULL << cluster_offset_width) - 1;
+
+            addr_t gid = m_config_seg->baseAddress() >> cluster_offset_width;
             m_x_self = (gid >> m_y_width) & ((1 << m_x_width) - 1);
             m_y_self =  gid               & ((1 << m_y_width) - 1);
+
+            // mask the cluster coordinates to support configuration requests on
+            // reallocated segments
+            *m_config_seg = m_config_seg->masked(cluster_offset_mask);
 
             // Allocation for IXR_RSP FSM
@@ -987,5 +992,5 @@
     /////////////////////////////////
     {
-        delete [] m_seg;
+        if (m_config_seg) delete m_config_seg;
 
         delete [] r_ixr_rsp_to_xram_rsp_rok;
@@ -1303,25 +1308,19 @@
                     }
 #endif
-                    // checking segmentation violation
-                    addr_t   address = p_vci_tgt.address.read();
-                    uint32_t plen    = p_vci_tgt.plen.read();
-                    bool     config  = false;
-
-                    for (size_t seg_id = 0; (seg_id < m_nseg) ; seg_id++)
-                    {
-                        if (m_seg[seg_id]->contains(address) &&
-                                m_seg[seg_id]->contains(address + plen - vci_param_int::B))
-                        {
-                            if (m_seg[seg_id]->special()) config = true;
-                        }
-                    }
-
-                    if (config)     /////////// configuration command
-                    {
+                    // check for configuration commands
+                    uint32_t plen = p_vci_tgt.plen.read();
+                    addr_t   mask = (1ULL << (vci_param_int::N - m_x_width - m_y_width)) - 1;
+                    addr_t   base = p_vci_tgt.address.read() & mask;
+                    addr_t   last = base + plen - vci_param_int::B;
+
+                    if (m_config_seg->contains(base) && m_config_seg->contains(last))
+                    {
+                        // configuration command
                         if (!p_vci_tgt.eop.read()) r_tgt_cmd_fsm = TGT_CMD_ERROR;
                         else                       r_tgt_cmd_fsm = TGT_CMD_CONFIG;
                     }
-                    else           //////////// memory access
-                    {
+                    else
+                    {
+                        // memory access
                         if (p_vci_tgt.cmd.read() == vci_param_int::CMD_READ)
                         {
