diff --git a/MPSoC/mutekh/arch/soclib/ldscript.cpp b/MPSoC/mutekh/arch/soclib/ldscript.cpp
index 3f826cd44b03f75be2731519fe773338e7addd6b..2ad92939a27e3a9a72714dcd9c1388eaec5dfe9d 100644
--- a/MPSoC/mutekh/arch/soclib/ldscript.cpp
+++ b/MPSoC/mutekh/arch/soclib/ldscript.cpp
@@ -73,10 +73,14 @@ MEMORY
     mem_rom (RXAL): ORIGIN = CONFIG_ROM_ADDR, LENGTH = CONFIG_ROM_SIZE
 #endif
     mem_ram (RWAL): ORIGIN = CONFIG_RAM_ADDR, LENGTH = CONFIG_RAM_SIZE
-//ajoute DG provisiore
-//mwmr_ram (RWAL): ORIGIN = 0xA0200000, LENGTH = 0x00001000
-//mwmrd_ram (RWAL): ORIGIN = 0xB0200000, LENGTH = 0x00003000
-//19.05. une seule RAMLOCKS en cas de besoin (actually unused)
+//DG 7.9.
+#if defined(MWMR_RAM0_NAME)
+mwmr_ram0 (RWAL): ORIGIN = 0xA0200000, LENGTH = 0x00001000
+#endif
+#if defined(MWMR_RAM1_NAME)
+mwmr_ram1 (RWAL): ORIGIN = 0xA1200000, LENGTH = 0x00001000
+#endif
+
 vci_locks (RWAL): ORIGIN = 0xC0200000, LENGTH = 0x100
 
 //ajout CD
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/metadata/my_hwa0.sd b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/metadata/my_hwa0.sd
new file mode 100644
index 0000000000000000000000000000000000000000..dfcbdc2e048dad01e42f015fa79f863158fe305b
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/metadata/my_hwa0.sd
@@ -0,0 +1,25 @@
+Module('caba:MyHWA0',
+       classname = 'dsx::caba::MyHWA0',
+       header_files = [
+               "my_hwa0.h",
+
+       ],
+       interface_files = [
+       ],
+       implementation_files = [
+               "my_hwa0.cpp",
+
+       ],
+       ports = [
+       ],
+       uses = [
+           Uses('caba:fifo_virtual_copro_wrapper'),
+       ],
+       instance_parameters = [
+       ],
+       tmpl_parameters = [
+       ],
+       extensions = [
+       ],
+)
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/include/my_hwa0.h b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/include/my_hwa0.h
new file mode 100644
index 0000000000000000000000000000000000000000..4e1d1a14edfe70bcf0d587f7fece6007271f23b0
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/include/my_hwa0.h
@@ -0,0 +1,25 @@
+#ifndef _HWA0_H
+#define _HWA0_H
+
+#include <systemc>
+
+#include "fifo_virtual_copro_wrapper.h"
+
+namespace dsx { namespace caba {
+
+class MyHWA0
+    : public dsx::caba::FifoVirtualCoprocessorWrapper
+{
+
+    public:
+    ~MyHWA0();
+    MyHWA0(sc_core::sc_module_name insname);
+
+
+    private:
+    void * task_func(); // Task code
+
+};
+
+}}
+#endif
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/anoc_copro_wrapper.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/anoc_copro_wrapper.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b4c4efdd6e200e1b778cf95e66b0dc903e1cc817
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/anoc_copro_wrapper.cpp
@@ -0,0 +1,658 @@
+/* -*- c++ -*-
+ *
+ * SOCLIB_LGPL_HEADER_BEGIN
+ * 
+ * This file is part of SoCLib, GNU LGPLv2.1.
+ * 
+ * SoCLib is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 of the License.
+ * 
+ * SoCLib is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with SoCLib; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ * 
+ * SOCLIB_LGPL_HEADER_END
+ *
+ *
+ * Copyright (c) CEA-LETI, MINATEC, 2008
+ *
+ * Authors :
+ * 
+ * History :
+ *
+ * Comment :
+ *
+ */
+
+#include  "anoc_copro_wrapper.h"
+namespace soclib { namespace caba {
+using soclib::common::alloc_elems;
+using soclib::common::dealloc_elems;
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Constructor
+anoc_copro_wrapper::anoc_copro_wrapper(sc_module_name module_name_,
+                           t_uint16 nb_cores_,
+                           t_uint16 nb_fifo_in_,
+                           t_uint16 nb_fifo_out_,
+                           t_uint16 n_config_,
+                           t_uint16 n_status_,
+                           t_uint32 clk_period_) :
+                             sc_module(module_name_),
+                             p_from_MWMR(alloc_elems<FifoInput<uint32_t> >("p_from_MWMR", nb_fifo_in_)),
+                             p_to_MWMR(alloc_elems<FifoOutput<uint32_t> >("p_to_MWMR", nb_fifo_out_ )),
+                             p_config(alloc_elems<sc_in<uint32_t> >("p_config", n_config_)),
+                             p_status(alloc_elems<sc_out<uint32_t> >("p_status", n_status_)),
+                             nb_cores(nb_cores_),
+                             nb_fifo_in(nb_fifo_in_),
+                             nb_fifo_out(nb_fifo_out_),
+                             clk_period(clk_period_)
+{
+  core_fifo_in = new t_uint16[nb_fifo_in];
+  for(int i=0; i<nb_fifo_in; i++) {
+    if(nb_cores>1) {
+//      core_fifo_in[i] = core_fifo_in_[i];
+    } else {
+      core_fifo_in[i] = 0; // monocore, core_fifo_in_=NULL
+    }
+  }
+  core_fifo_out = new t_uint16[nb_fifo_out];
+  for(int i=0; i<nb_fifo_out; i++) {
+    if(nb_cores>1) {
+//      core_fifo_out[i] = core_fifo_out_[i];
+    } else {
+      core_fifo_out[i] = 0; // monocore, core_fifo_out_=NULL
+    }
+  }
+
+  cfg_flag_core_finished = new bool [nb_cores];
+  for(int i = 0; i < nb_cores; i++) {
+    cfg_flag_core_finished[i]=true;
+  }
+
+
+  // create ni => core ports
+#ifdef TLM_TRANS_RECORD
+  char port_in[80];
+  char port_out[80];
+  char port_debug[80];
+#endif
+  char port_out_name[80];
+  char port_in_name[80];
+
+#ifdef TLM_TRANS_RECORD
+  sprintf(port_in,"%s_IN", basename());
+  sprintf(port_out,"%s_OUT", basename());
+  sprintf(port_debug,"%s_DEBUG", basename());
+#endif // TLM_TRANS_RECORD
+  
+  ni_exec_out = new ni_exec_out_port*[nb_cores];
+  for(int i=0;i<nb_cores;i++) {
+    sprintf(port_out_name,"ni_exec_out_port_%i", i);
+    ni_exec_out[i] = new ni_exec_out_port((char *) port_out_name, "exec", "eoc");
+    ni_exec_out[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_cfg_dump_out = new ni_cfg_dump_out_port("ni_cfg_dump_out_port", "cfg_dump", "dump_data");
+  ni_cfg_dump_out->put_if_bind(*this);       // for the status target sub-port
+
+
+  t_uint16 fifo_id[nb_cores];
+  for (int i=0; i<nb_cores; i++) {
+    fifo_id[i]=0;
+  }
+  ni_input_fifo_out = new ni_data_out_port*[nb_fifo_in];
+  for(int i=0;i<nb_fifo_in;i++) {
+    sprintf(port_out_name,"ni_input_fifo_out_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_out,"%s_input_fifo_out_%i", basename(), i);
+    ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, (char *)port_out, fifo_id[core_fifo_in[i]]);  
+#else
+    ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, fifo_id[core_fifo_in[i]]);
+#endif // TLM_TRANS_RECORD
+    fifo_id[core_fifo_in[i]]++;
+    ni_input_fifo_out[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  // create core => ni ports
+  for (int i=0; i<nb_cores; i++) {
+    fifo_id[i]=0;
+  }
+  ni_output_fifo_in = new ni_data_in_port*[nb_fifo_out];
+  for(int i=0;i<nb_fifo_out;i++) {
+    sprintf(port_in_name,"ni_output_fifo_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_output_fifo_in_%i", basename(), i);
+    ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, (char *)port_in, fifo_id[core_fifo_out[i]]);
+#else
+    ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, fifo_id[core_fifo_out[i]]);
+#endif // TLM_TRANS_RECORD
+    fifo_id[core_fifo_out[i]]++;
+    ni_output_fifo_in[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_released_in = new ni_released_in_port*[nb_fifo_in];  
+  for(int i=0;i<nb_fifo_in;i++) {
+    sprintf(port_in_name,"ni_released_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_released_in_%i", basename(), i);
+    ni_released_in[i] = new  ni_released_in_port((char *) port_in_name, (char *)port_in);
+#else
+    ni_released_in[i] = new  ni_released_in_port((char *) port_in_name);
+#endif // TLM_TRANS_RECORD
+    ni_released_in[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_available_in = new ni_available_in_port*[nb_fifo_out];   
+  for(int i=0;i<nb_fifo_out;i++) {
+    sprintf(port_in_name,"ni_available_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_available_in_%i", basename(), i);
+    ni_available_in[i] = new ni_available_in_port((char *) port_in_name, (char *)port_in);
+#else
+    ni_available_in[i] = new ni_available_in_port((char *) port_in_name);
+#endif // TLM_TRANS_RECORD
+    ni_available_in[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_status_in = new ni_status_in_port*[nb_cores];   
+  for(int i=0;i<nb_cores;i++) {
+    sprintf(port_in_name,"ni_status_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_status_in_%i", basename(), i);
+    ni_status_in[i] = new ni_status_in_port((char *) port_in_name, (char *)port_in);
+#else
+    ni_status_in[i] = new ni_status_in_port((char *) port_in_name);
+#endif // TLM_TRANS_RECORD
+    ni_status_in[i]->put_if_bind(*this);       // for the status target sub-port 
+  }
+
+
+  /***********************************************/
+  // internal programmation
+
+  /***********************************************/
+  // internal state variables
+
+  last_status = new t_uint32[nb_cores];
+  for(int i=0; i<nb_cores; i++) {
+    last_status[i] = 0;
+  }
+
+  tab_out_data_fifo_out = new t_uint32[nb_fifo_out];
+  flag_tab_out_data_fifo_out = new bool[nb_fifo_out];
+  tab_available_data_fifo_out = new t_uint32[nb_fifo_out];
+  for (int i = 0; i < nb_fifo_out; i++) {
+    tab_out_data_fifo_out[i] = 0;    
+    flag_tab_out_data_fifo_out[i] = false;
+    tab_available_data_fifo_out[i]=0;
+  }
+  tab_fifo_in_accept = new bool[nb_fifo_in];
+  for (int i = 0; i < nb_fifo_in; i++) {
+    // fifo accept is initialised to true: ready to accept a new value
+    tab_fifo_in_accept[i] = true;
+  }
+
+  
+  /***********************************************/
+  // threads & methods
+  SC_METHOD(rtl_to_tlm);
+  sensitive << rtl_to_tlm_event;
+  dont_initialize();
+
+  SC_METHOD(tlm_to_rtl);
+  sensitive << p_clk.neg();  
+  dont_initialize();
+
+  EXPRINT(ni, 2,"anoc_copro_wrapper CREATED");
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Destructor
+anoc_copro_wrapper::~anoc_copro_wrapper() {
+
+  cout << "-------------- DELETE " << name() << " -------------- " << endl;
+
+
+
+  delete core_fifo_in;
+  delete core_fifo_out;
+  for(int i=0;i<nb_cores;i++) {
+    delete ni_exec_out[i];
+  }
+  delete ni_exec_out;
+  delete ni_cfg_dump_out;
+  for(int i=0;i<nb_fifo_in;i++) {
+    delete ni_input_fifo_out[i];
+  }
+  delete ni_input_fifo_out;
+  for(int i=0;i<nb_fifo_out;i++) {
+    delete ni_output_fifo_in[i];
+  }
+  delete ni_output_fifo_in;
+  for(int i=0;i<nb_fifo_in;i++) {
+    delete ni_released_in[i];
+  }
+  delete ni_released_in;
+  for(int i=0;i<nb_fifo_out;i++) {
+    delete ni_available_in[i];
+  }
+  delete ni_available_in;
+  for(int i=0;i<nb_cores;i++) {
+    delete ni_status_in[i];
+  }
+  delete ni_status_in;
+
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive DUMP DATA transaction (remote call)
+void anoc_copro_wrapper::put(const ni_dump_data_transaction &transaction) {
+  //Not yet implemented
+#ifdef _ANOC_COPRO_DEBUG
+  printf("DUMP DATA transaction\n");
+#endif
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive RELEASED transaction (remote call)
+void anoc_copro_wrapper::put(const ni_released_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("RELEASED transaction\n");
+#endif
+  t_uint16 fifo_id = 0;
+  t_uint16 source_id;
+  t_uint16 core_id;
+  t_uint32 size_released;
+  bool fifo_ok = false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+  size_released = transaction.get_data();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_in; i++) {
+    if(core_fifo_in[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive released ("<< size_released  <<") from fifo: " << fifo_id);
+//    tab_available_size_fifo_in[fifo_id]+=size_released;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for released from CORE " << core_id);
+    exit(0);
+  }
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive AVAILABLE transaction (remote call)
+void anoc_copro_wrapper::put(const ni_available_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("AVAILABLE transaction\n");
+#endif
+  t_uint16 fifo_id = 0;
+  t_uint16 source_id;
+  t_uint16 core_id;
+  t_uint32 available_data;
+  bool fifo_ok = false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+  available_data = transaction.get_data();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_out; i++) {
+    if(core_fifo_out[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive available (" << available_data << ") from fifo: " << fifo_id);
+    tab_available_data_fifo_out[fifo_id] = available_data;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for avaivable from CORE " << core_id);
+    exit(0);
+  }
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive WRITE DATA transaction (remote call)
+void anoc_copro_wrapper::put(const ni_write_data_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("Received DATA transaction\n");
+#endif
+
+  t_uint16 fifo_id = 0;
+  t_uint16 source_id;
+  t_uint16 core_id;
+  t_uint32 data;
+  bool fifo_ok = false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+  data = transaction.get_data();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_out; i++) {
+    if(core_fifo_out[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive write data: " << data << " from fifo: " << fifo_id);
+    tab_out_data_fifo_out[fifo_id] = data;
+    flag_tab_out_data_fifo_out[fifo_id] = true;
+    //Requires a data update on the RTL ports
+    write_data_update = true;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for write data from CORE " << core_id);
+    exit(0);
+  }
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Write DATA ACCEPT transaction for fifo out
+void anoc_copro_wrapper::write_data_accept_fifo_out(int num_fifo) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("DATA ACCEPT transaction\n");
+#endif
+  ni_accept_data_transaction accept_trans;
+  ni_output_fifo_in[num_fifo]->put(&accept_trans);
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive ACCEPT DATA transaction (remote call)
+void anoc_copro_wrapper::put(const ni_accept_data_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("ACCEPT DATA transaction\n");
+#endif
+  t_uint16 source_id;
+  t_uint16 fifo_id = 0;
+  t_uint16 core_id;
+  bool fifo_ok=false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_in; i++) {
+    if(core_fifo_in[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive accept data from fifo: " << fifo_id); //FIXPRINT
+    tab_fifo_in_accept[fifo_id] = true;
+    //Requires to update the accept_data (Ivan) 
+    accept_data_update = true;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for accept data from CORE " << core_id );
+    exit(0);
+  }
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Write WRITE DATA transaction for fifo in
+void anoc_copro_wrapper::write_data_fifo_in(int num_fifo, t_uint32 data) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("WRITE DATA transaction\n");
+#endif
+
+  ni_write_data_transaction data_trans;
+  data_trans.set_data(data);
+  EXPRINT(ni, 1,"Write data " << data << " in fifo_in[" << num_fifo << "]"); //FIXPRINT
+  ni_input_fifo_out[num_fifo]->put(&data_trans);
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive STATUS transaction (remote call)
+void anoc_copro_wrapper::put(const ni_status_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("STATUS transaction\n");
+#endif
+
+  t_uint16 core_id;
+  core_id = transaction.get_core_id();
+  if(core_id>=nb_cores) {
+    EXPRINT(ni, 0,"ERROR : Invalid core id for status");
+    exit(0);
+  }
+
+  last_status[core_id] = transaction.get_status();
+  //Requires to update the status port
+  status_update = true;
+
+  EXPRINT(ni, 0,"New status from CORE " << core_id  <<" : " << last_status[core_id]); //FIXPRINT
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive EOC transaction (remote call)
+void anoc_copro_wrapper::put(const ni_eoc_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("EOC transaction\n");
+#endif
+
+  t_uint16 core_id;
+  core_id = transaction.get_core_id();
+  if(core_id>=nb_cores) {
+    EXPRINT(ni, 0,"ERROR : Invalid core_id for eoc");
+    exit(0);
+  }
+
+  EXPRINT(ni, 0,"CORE " << core_id << " has finished"); //FIXPRINT
+  cfg_flag_core_finished[core_id] = true;
+  //Requires to update the eoc
+  eoc_update = true;
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+// Update the RTL signals when a TLM transcation arrive 
+/// Sensitive_neg << p_clk
+void anoc_copro_wrapper::tlm_to_rtl() {
+  //Output FIFOs
+  //////////////
+  // The Data port need to be updated ?
+//  if (write_data_update == true) {
+//    printf("write_data_update, %i\n",(int)flag_tab_out_data_fifo_out[0]);
+//    for(int i=0; i<nb_fifo_out; i++) {
+//      p_to_MWMR[i].w    = flag_tab_out_data_fifo_out[i];
+//      p_to_MWMR[i].data =      tab_out_data_fifo_out[i];
+//    }
+//    //the Data is correctly updated
+//    write_data_update = false;
+//  }
+  //Input FIFOs
+  /////////////
+  // The Accept port need to be updated ?
+//  if (accept_data_update == true) {
+//    for(int i=0; i<nb_fifo_in; i++) {
+//      p_from_MWMR[i].r = tab_fifo_in_accept[i];
+//    }
+//    //the Data is correctly updated
+//    accept_data_update = false;
+//  }
+  //Status port
+  /////////////
+  // The Accept port need to be updated ?
+  if (status_update == true) {
+    for (int i=0; i<nb_cores; i++) {
+      p_status[i+1] = last_status[i];
+    }
+    status_update = false;
+  }
+  //EOC port
+  /////////////
+  if (eoc_update == true) {
+    uint32_t value = 0;
+    for (int i=0; i<nb_cores; i++) {
+      if (cfg_flag_core_finished[i] == true) {
+        value += 1 << i;
+      }
+    }
+    p_status[0] = value;
+    eoc_update = false;
+  }
+
+  //Core configuration
+  ////////////////////
+  p_core_config.r = true;
+
+  //Start the rtl_to_tlm process
+  rtl_to_tlm_event.notify(clk_period/4,SC_PS);
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+// Generate a TLM transaction when the RTL signals change
+/// Sensitive_pos << 3/4*p_clk
+void anoc_copro_wrapper::rtl_to_tlm() {
+
+  //Output FIFOs
+  //////////////
+  //Test if a Send signal is active
+  for(int i=0; i<nb_fifo_out; i++) {
+    //A FIFO was ready to send data ?
+    p_to_MWMR[i].w    = false;
+    if (flag_tab_out_data_fifo_out[i]) {
+      //Chech if the accept signal is High
+      if (p_to_MWMR[i].wok.read() == true) {
+        //The FIFO data is correcly transfered
+        p_to_MWMR[i].w    = true;
+        p_to_MWMR[i].data = tab_out_data_fifo_out[i];
+
+        //Invalidate the send signal
+        flag_tab_out_data_fifo_out[i] = false;
+        //Requires to update the Data port
+        write_data_update = true;
+        //Send the TLM Accept transaction to the Core
+        if (tab_available_data_fifo_out[i] > 1 )
+          write_data_accept_fifo_out(i);
+      }
+    } else if (tab_available_data_fifo_out[i] > 0 ) {
+      //New data can be read?
+      //Send the TLM Accept transaction to the Core
+      write_data_accept_fifo_out(i);
+    }
+  }
+
+  //Input FIFOs
+  /////////////
+  //Test if a new Data is present on the Input FIFOs
+  for(int i=0; i<nb_fifo_in; i++) {
+    p_from_MWMR[i].r = tab_fifo_in_accept[i];
+    if (p_from_MWMR[i].rok.read() == true) {
+      //I am ready to accept this new data?
+      if (tab_fifo_in_accept[i] == true) {
+        //Read the data and send a TLM transcation
+        p_from_MWMR[i].r = true;
+        t_uint32 data = (t_uint32)p_from_MWMR[i].data.read();
+        write_data_fifo_in(i, data);
+        //Lower the ROK signal
+        tab_fifo_in_accept[i] = false;
+        //Requires a Accept RTL port update
+        accept_data_update = true;
+      }
+    }
+  }
+
+  //Exec port
+  ///////////////
+  //RTL signals changed?
+  if (exec_last != p_config[0].read()) {
+    ni_exec_transaction exec_trans;
+    //Test bit by bit to identify the source
+    for(int i=0; i<nb_cores; i++) {
+      if (((exec_last & (1<<i)) == 0) && ((p_config[0].read() & (1<<i)) == 1)) {
+        //A new lot_id is ready to be executed on core 'i'
+        EXPRINT(ni, 1,"CORE configuration event");
+        //Get the slot_id
+        t_uint16 slot_id = (t_uint16)p_config[i+1].read();
+	EXPRINT(ni, 0,"CORE " << i << " execute configuration on slot id " << slot_id);
+	// write exec config
+	exec_trans.set_slot_id(slot_id);
+	ni_exec_out[i]->put(&exec_trans);
+        //The CORE is nolonger finished
+        cfg_flag_core_finished[i] = false;
+        //Requires a RTL signal update
+        eoc_update = true;
+      }
+    }
+    exec_last = p_config[0].read();
+  }
+
+  //Core config address
+  /////////////////////
+  if (last_address != p_config[5].read()) {
+    //The address have been changed
+    current_address = p_config[5].read();
+    last_address = p_config[5].read();
+  }
+
+        
+  //Core configuration
+  ////////////////////
+  if (p_core_config.rok.read() == true) {
+    //A new configuration data is ready
+    ni_cfg_transaction cfg_trans;
+    t_uint32 data = p_core_config.data.read();
+    cfg_trans.set_data(data);
+    cfg_trans.set_address(current_address);
+#ifdef _ANOC_COPRO_DEBUG
+    printf("Ivan: Config data: %.8x on address %.8x\n", data, current_address);
+#endif
+    ni_cfg_dump_out->put(&cfg_trans);
+    current_address++;
+  }
+
+}
+}}
+
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/my_hwa0.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/my_hwa0.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..20c731c9d5a4204e2ff491696edde752f4e5637b
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/my_hwa0.cpp
@@ -0,0 +1,32 @@
+
+namespace dsx { namespace caba {
+
+
+#define tmpl(...) __VA_ARGS__ MyHWA0
+
+tmpl(/**/)::~MyHWA0()
+{
+}
+
+    //intArray(1,1) there is one element (here an integer) of size 4 OCTETs/Quentin: attention cela a change c'est un MOT dans la version VM
+tmpl(/**/)::MyHWA0(sc_core::sc_module_name insname)
+           :dsx::caba::FifoVirtualCoprocessorWrapper(insname, stringArray("output", NULL), intArray(1,4), stringArray(NULL), NULL)
+{
+}
+
+tmpl(void *)::task_func() {
+  struct mwmr_s *output;
+//  mwmr_t output = SRL_GET_MWMR(output);
+   uint32_t data;
+ 
+   while (true) {   
+      for (int32_t i = 0; i < 8; i++) {
+	out=i;
+	mwmr_write(output, &data, 4; // Write integers 0 to 7 to output
+      }
+     
+   }
+}
+
+}}
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa0.sd b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa0.sd
new file mode 100644
index 0000000000000000000000000000000000000000..dfcbdc2e048dad01e42f015fa79f863158fe305b
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa0.sd
@@ -0,0 +1,25 @@
+Module('caba:MyHWA0',
+       classname = 'dsx::caba::MyHWA0',
+       header_files = [
+               "my_hwa0.h",
+
+       ],
+       interface_files = [
+       ],
+       implementation_files = [
+               "my_hwa0.cpp",
+
+       ],
+       ports = [
+       ],
+       uses = [
+           Uses('caba:fifo_virtual_copro_wrapper'),
+       ],
+       instance_parameters = [
+       ],
+       tmpl_parameters = [
+       ],
+       extensions = [
+       ],
+)
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa1.sd b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa1.sd
new file mode 100644
index 0000000000000000000000000000000000000000..b0b32c5d02b89461309026540679146eb791a8d9
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa1.sd
@@ -0,0 +1,25 @@
+Module('caba:MyHWA1',
+       classname = 'dsx::caba::MyHWA1',
+       header_files = [
+               "my_hwa1.h",
+
+       ],
+       interface_files = [
+       ],
+       implementation_files = [
+               "my_hwa1.cpp",
+
+       ],
+       ports = [
+       ],
+       uses = [
+           Uses('caba:fifo_virtual_copro_wrapper'),
+       ],
+       instance_parameters = [
+       ],
+       tmpl_parameters = [
+       ],
+       extensions = [
+       ],
+)
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa0.h b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa0.h
new file mode 100644
index 0000000000000000000000000000000000000000..4e1d1a14edfe70bcf0d587f7fece6007271f23b0
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa0.h
@@ -0,0 +1,25 @@
+#ifndef _HWA0_H
+#define _HWA0_H
+
+#include <systemc>
+
+#include "fifo_virtual_copro_wrapper.h"
+
+namespace dsx { namespace caba {
+
+class MyHWA0
+    : public dsx::caba::FifoVirtualCoprocessorWrapper
+{
+
+    public:
+    ~MyHWA0();
+    MyHWA0(sc_core::sc_module_name insname);
+
+
+    private:
+    void * task_func(); // Task code
+
+};
+
+}}
+#endif
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa1.h b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa1.h
new file mode 100644
index 0000000000000000000000000000000000000000..785ede2fc51a0a70da87f81a178122b7dd8f50f4
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa1.h
@@ -0,0 +1,26 @@
+#ifndef _HWA1_H
+#define _HWA1_H
+
+#include <systemc>
+
+#include "fifo_virtual_copro_wrapper.h"
+
+namespace dsx { namespace caba {
+
+class MyHWA1
+    : public dsx::caba::FifoVirtualCoprocessorWrapper
+{
+
+    public:
+    ~MyHWA1();
+    MyHWA1(sc_core::sc_module_name insname);
+
+
+    private:
+    void * task_func(); // Task code
+
+};
+
+}}
+#endif
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/anoc_copro_wrapper.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/anoc_copro_wrapper.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b4c4efdd6e200e1b778cf95e66b0dc903e1cc817
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/anoc_copro_wrapper.cpp
@@ -0,0 +1,658 @@
+/* -*- c++ -*-
+ *
+ * SOCLIB_LGPL_HEADER_BEGIN
+ * 
+ * This file is part of SoCLib, GNU LGPLv2.1.
+ * 
+ * SoCLib is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 of the License.
+ * 
+ * SoCLib is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with SoCLib; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ * 
+ * SOCLIB_LGPL_HEADER_END
+ *
+ *
+ * Copyright (c) CEA-LETI, MINATEC, 2008
+ *
+ * Authors :
+ * 
+ * History :
+ *
+ * Comment :
+ *
+ */
+
+#include  "anoc_copro_wrapper.h"
+namespace soclib { namespace caba {
+using soclib::common::alloc_elems;
+using soclib::common::dealloc_elems;
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Constructor
+anoc_copro_wrapper::anoc_copro_wrapper(sc_module_name module_name_,
+                           t_uint16 nb_cores_,
+                           t_uint16 nb_fifo_in_,
+                           t_uint16 nb_fifo_out_,
+                           t_uint16 n_config_,
+                           t_uint16 n_status_,
+                           t_uint32 clk_period_) :
+                             sc_module(module_name_),
+                             p_from_MWMR(alloc_elems<FifoInput<uint32_t> >("p_from_MWMR", nb_fifo_in_)),
+                             p_to_MWMR(alloc_elems<FifoOutput<uint32_t> >("p_to_MWMR", nb_fifo_out_ )),
+                             p_config(alloc_elems<sc_in<uint32_t> >("p_config", n_config_)),
+                             p_status(alloc_elems<sc_out<uint32_t> >("p_status", n_status_)),
+                             nb_cores(nb_cores_),
+                             nb_fifo_in(nb_fifo_in_),
+                             nb_fifo_out(nb_fifo_out_),
+                             clk_period(clk_period_)
+{
+  core_fifo_in = new t_uint16[nb_fifo_in];
+  for(int i=0; i<nb_fifo_in; i++) {
+    if(nb_cores>1) {
+//      core_fifo_in[i] = core_fifo_in_[i];
+    } else {
+      core_fifo_in[i] = 0; // monocore, core_fifo_in_=NULL
+    }
+  }
+  core_fifo_out = new t_uint16[nb_fifo_out];
+  for(int i=0; i<nb_fifo_out; i++) {
+    if(nb_cores>1) {
+//      core_fifo_out[i] = core_fifo_out_[i];
+    } else {
+      core_fifo_out[i] = 0; // monocore, core_fifo_out_=NULL
+    }
+  }
+
+  cfg_flag_core_finished = new bool [nb_cores];
+  for(int i = 0; i < nb_cores; i++) {
+    cfg_flag_core_finished[i]=true;
+  }
+
+
+  // create ni => core ports
+#ifdef TLM_TRANS_RECORD
+  char port_in[80];
+  char port_out[80];
+  char port_debug[80];
+#endif
+  char port_out_name[80];
+  char port_in_name[80];
+
+#ifdef TLM_TRANS_RECORD
+  sprintf(port_in,"%s_IN", basename());
+  sprintf(port_out,"%s_OUT", basename());
+  sprintf(port_debug,"%s_DEBUG", basename());
+#endif // TLM_TRANS_RECORD
+  
+  ni_exec_out = new ni_exec_out_port*[nb_cores];
+  for(int i=0;i<nb_cores;i++) {
+    sprintf(port_out_name,"ni_exec_out_port_%i", i);
+    ni_exec_out[i] = new ni_exec_out_port((char *) port_out_name, "exec", "eoc");
+    ni_exec_out[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_cfg_dump_out = new ni_cfg_dump_out_port("ni_cfg_dump_out_port", "cfg_dump", "dump_data");
+  ni_cfg_dump_out->put_if_bind(*this);       // for the status target sub-port
+
+
+  t_uint16 fifo_id[nb_cores];
+  for (int i=0; i<nb_cores; i++) {
+    fifo_id[i]=0;
+  }
+  ni_input_fifo_out = new ni_data_out_port*[nb_fifo_in];
+  for(int i=0;i<nb_fifo_in;i++) {
+    sprintf(port_out_name,"ni_input_fifo_out_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_out,"%s_input_fifo_out_%i", basename(), i);
+    ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, (char *)port_out, fifo_id[core_fifo_in[i]]);  
+#else
+    ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, fifo_id[core_fifo_in[i]]);
+#endif // TLM_TRANS_RECORD
+    fifo_id[core_fifo_in[i]]++;
+    ni_input_fifo_out[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  // create core => ni ports
+  for (int i=0; i<nb_cores; i++) {
+    fifo_id[i]=0;
+  }
+  ni_output_fifo_in = new ni_data_in_port*[nb_fifo_out];
+  for(int i=0;i<nb_fifo_out;i++) {
+    sprintf(port_in_name,"ni_output_fifo_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_output_fifo_in_%i", basename(), i);
+    ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, (char *)port_in, fifo_id[core_fifo_out[i]]);
+#else
+    ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, fifo_id[core_fifo_out[i]]);
+#endif // TLM_TRANS_RECORD
+    fifo_id[core_fifo_out[i]]++;
+    ni_output_fifo_in[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_released_in = new ni_released_in_port*[nb_fifo_in];  
+  for(int i=0;i<nb_fifo_in;i++) {
+    sprintf(port_in_name,"ni_released_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_released_in_%i", basename(), i);
+    ni_released_in[i] = new  ni_released_in_port((char *) port_in_name, (char *)port_in);
+#else
+    ni_released_in[i] = new  ni_released_in_port((char *) port_in_name);
+#endif // TLM_TRANS_RECORD
+    ni_released_in[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_available_in = new ni_available_in_port*[nb_fifo_out];   
+  for(int i=0;i<nb_fifo_out;i++) {
+    sprintf(port_in_name,"ni_available_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_available_in_%i", basename(), i);
+    ni_available_in[i] = new ni_available_in_port((char *) port_in_name, (char *)port_in);
+#else
+    ni_available_in[i] = new ni_available_in_port((char *) port_in_name);
+#endif // TLM_TRANS_RECORD
+    ni_available_in[i]->put_if_bind(*this);       // for the status target sub-port
+  }
+
+  ni_status_in = new ni_status_in_port*[nb_cores];   
+  for(int i=0;i<nb_cores;i++) {
+    sprintf(port_in_name,"ni_status_in_port_%i", i);
+#ifdef TLM_TRANS_RECORD
+    sprintf(port_in,"%s_status_in_%i", basename(), i);
+    ni_status_in[i] = new ni_status_in_port((char *) port_in_name, (char *)port_in);
+#else
+    ni_status_in[i] = new ni_status_in_port((char *) port_in_name);
+#endif // TLM_TRANS_RECORD
+    ni_status_in[i]->put_if_bind(*this);       // for the status target sub-port 
+  }
+
+
+  /***********************************************/
+  // internal programmation
+
+  /***********************************************/
+  // internal state variables
+
+  last_status = new t_uint32[nb_cores];
+  for(int i=0; i<nb_cores; i++) {
+    last_status[i] = 0;
+  }
+
+  tab_out_data_fifo_out = new t_uint32[nb_fifo_out];
+  flag_tab_out_data_fifo_out = new bool[nb_fifo_out];
+  tab_available_data_fifo_out = new t_uint32[nb_fifo_out];
+  for (int i = 0; i < nb_fifo_out; i++) {
+    tab_out_data_fifo_out[i] = 0;    
+    flag_tab_out_data_fifo_out[i] = false;
+    tab_available_data_fifo_out[i]=0;
+  }
+  tab_fifo_in_accept = new bool[nb_fifo_in];
+  for (int i = 0; i < nb_fifo_in; i++) {
+    // fifo accept is initialised to true: ready to accept a new value
+    tab_fifo_in_accept[i] = true;
+  }
+
+  
+  /***********************************************/
+  // threads & methods
+  SC_METHOD(rtl_to_tlm);
+  sensitive << rtl_to_tlm_event;
+  dont_initialize();
+
+  SC_METHOD(tlm_to_rtl);
+  sensitive << p_clk.neg();  
+  dont_initialize();
+
+  EXPRINT(ni, 2,"anoc_copro_wrapper CREATED");
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Destructor
+anoc_copro_wrapper::~anoc_copro_wrapper() {
+
+  cout << "-------------- DELETE " << name() << " -------------- " << endl;
+
+
+
+  delete core_fifo_in;
+  delete core_fifo_out;
+  for(int i=0;i<nb_cores;i++) {
+    delete ni_exec_out[i];
+  }
+  delete ni_exec_out;
+  delete ni_cfg_dump_out;
+  for(int i=0;i<nb_fifo_in;i++) {
+    delete ni_input_fifo_out[i];
+  }
+  delete ni_input_fifo_out;
+  for(int i=0;i<nb_fifo_out;i++) {
+    delete ni_output_fifo_in[i];
+  }
+  delete ni_output_fifo_in;
+  for(int i=0;i<nb_fifo_in;i++) {
+    delete ni_released_in[i];
+  }
+  delete ni_released_in;
+  for(int i=0;i<nb_fifo_out;i++) {
+    delete ni_available_in[i];
+  }
+  delete ni_available_in;
+  for(int i=0;i<nb_cores;i++) {
+    delete ni_status_in[i];
+  }
+  delete ni_status_in;
+
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive DUMP DATA transaction (remote call)
+void anoc_copro_wrapper::put(const ni_dump_data_transaction &transaction) {
+  //Not yet implemented
+#ifdef _ANOC_COPRO_DEBUG
+  printf("DUMP DATA transaction\n");
+#endif
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive RELEASED transaction (remote call)
+void anoc_copro_wrapper::put(const ni_released_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("RELEASED transaction\n");
+#endif
+  t_uint16 fifo_id = 0;
+  t_uint16 source_id;
+  t_uint16 core_id;
+  t_uint32 size_released;
+  bool fifo_ok = false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+  size_released = transaction.get_data();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_in; i++) {
+    if(core_fifo_in[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive released ("<< size_released  <<") from fifo: " << fifo_id);
+//    tab_available_size_fifo_in[fifo_id]+=size_released;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for released from CORE " << core_id);
+    exit(0);
+  }
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive AVAILABLE transaction (remote call)
+void anoc_copro_wrapper::put(const ni_available_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("AVAILABLE transaction\n");
+#endif
+  t_uint16 fifo_id = 0;
+  t_uint16 source_id;
+  t_uint16 core_id;
+  t_uint32 available_data;
+  bool fifo_ok = false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+  available_data = transaction.get_data();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_out; i++) {
+    if(core_fifo_out[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive available (" << available_data << ") from fifo: " << fifo_id);
+    tab_available_data_fifo_out[fifo_id] = available_data;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for avaivable from CORE " << core_id);
+    exit(0);
+  }
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive WRITE DATA transaction (remote call)
+void anoc_copro_wrapper::put(const ni_write_data_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("Received DATA transaction\n");
+#endif
+
+  t_uint16 fifo_id = 0;
+  t_uint16 source_id;
+  t_uint16 core_id;
+  t_uint32 data;
+  bool fifo_ok = false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+  data = transaction.get_data();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_out; i++) {
+    if(core_fifo_out[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive write data: " << data << " from fifo: " << fifo_id);
+    tab_out_data_fifo_out[fifo_id] = data;
+    flag_tab_out_data_fifo_out[fifo_id] = true;
+    //Requires a data update on the RTL ports
+    write_data_update = true;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for write data from CORE " << core_id);
+    exit(0);
+  }
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Write DATA ACCEPT transaction for fifo out
+void anoc_copro_wrapper::write_data_accept_fifo_out(int num_fifo) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("DATA ACCEPT transaction\n");
+#endif
+  ni_accept_data_transaction accept_trans;
+  ni_output_fifo_in[num_fifo]->put(&accept_trans);
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive ACCEPT DATA transaction (remote call)
+void anoc_copro_wrapper::put(const ni_accept_data_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("ACCEPT DATA transaction\n");
+#endif
+  t_uint16 source_id;
+  t_uint16 fifo_id = 0;
+  t_uint16 core_id;
+  bool fifo_ok=false;
+
+  source_id = transaction.get_source_id();
+  core_id = transaction.get_core_id();
+
+  int j=0;
+  for(int i=0; i<nb_fifo_in; i++) {
+    if(core_fifo_in[i]==core_id) {
+      if(j==source_id) {
+        fifo_id = i;
+        fifo_ok=true;
+      }
+      j++;
+    }
+  }
+
+  if(fifo_ok) {
+    EXPRINT(ni, 1,"Receive accept data from fifo: " << fifo_id); //FIXPRINT
+    tab_fifo_in_accept[fifo_id] = true;
+    //Requires to update the accept_data (Ivan) 
+    accept_data_update = true;
+  } else {
+    EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for accept data from CORE " << core_id );
+    exit(0);
+  }
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Write WRITE DATA transaction for fifo in
+void anoc_copro_wrapper::write_data_fifo_in(int num_fifo, t_uint32 data) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("WRITE DATA transaction\n");
+#endif
+
+  ni_write_data_transaction data_trans;
+  data_trans.set_data(data);
+  EXPRINT(ni, 1,"Write data " << data << " in fifo_in[" << num_fifo << "]"); //FIXPRINT
+  ni_input_fifo_out[num_fifo]->put(&data_trans);
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive STATUS transaction (remote call)
+void anoc_copro_wrapper::put(const ni_status_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("STATUS transaction\n");
+#endif
+
+  t_uint16 core_id;
+  core_id = transaction.get_core_id();
+  if(core_id>=nb_cores) {
+    EXPRINT(ni, 0,"ERROR : Invalid core id for status");
+    exit(0);
+  }
+
+  last_status[core_id] = transaction.get_status();
+  //Requires to update the status port
+  status_update = true;
+
+  EXPRINT(ni, 0,"New status from CORE " << core_id  <<" : " << last_status[core_id]); //FIXPRINT
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+/// Receive EOC transaction (remote call)
+void anoc_copro_wrapper::put(const ni_eoc_transaction &transaction) {
+#ifdef _ANOC_COPRO_DEBUG
+  printf("EOC transaction\n");
+#endif
+
+  t_uint16 core_id;
+  core_id = transaction.get_core_id();
+  if(core_id>=nb_cores) {
+    EXPRINT(ni, 0,"ERROR : Invalid core_id for eoc");
+    exit(0);
+  }
+
+  EXPRINT(ni, 0,"CORE " << core_id << " has finished"); //FIXPRINT
+  cfg_flag_core_finished[core_id] = true;
+  //Requires to update the eoc
+  eoc_update = true;
+
+}
+
+/*******************************************************************************/
+/*******************************************************************************/
+// Update the RTL signals when a TLM transcation arrive 
+/// Sensitive_neg << p_clk
+void anoc_copro_wrapper::tlm_to_rtl() {
+  //Output FIFOs
+  //////////////
+  // The Data port need to be updated ?
+//  if (write_data_update == true) {
+//    printf("write_data_update, %i\n",(int)flag_tab_out_data_fifo_out[0]);
+//    for(int i=0; i<nb_fifo_out; i++) {
+//      p_to_MWMR[i].w    = flag_tab_out_data_fifo_out[i];
+//      p_to_MWMR[i].data =      tab_out_data_fifo_out[i];
+//    }
+//    //the Data is correctly updated
+//    write_data_update = false;
+//  }
+  //Input FIFOs
+  /////////////
+  // The Accept port need to be updated ?
+//  if (accept_data_update == true) {
+//    for(int i=0; i<nb_fifo_in; i++) {
+//      p_from_MWMR[i].r = tab_fifo_in_accept[i];
+//    }
+//    //the Data is correctly updated
+//    accept_data_update = false;
+//  }
+  //Status port
+  /////////////
+  // The Accept port need to be updated ?
+  if (status_update == true) {
+    for (int i=0; i<nb_cores; i++) {
+      p_status[i+1] = last_status[i];
+    }
+    status_update = false;
+  }
+  //EOC port
+  /////////////
+  if (eoc_update == true) {
+    uint32_t value = 0;
+    for (int i=0; i<nb_cores; i++) {
+      if (cfg_flag_core_finished[i] == true) {
+        value += 1 << i;
+      }
+    }
+    p_status[0] = value;
+    eoc_update = false;
+  }
+
+  //Core configuration
+  ////////////////////
+  p_core_config.r = true;
+
+  //Start the rtl_to_tlm process
+  rtl_to_tlm_event.notify(clk_period/4,SC_PS);
+}
+
+
+/*******************************************************************************/
+/*******************************************************************************/
+// Generate a TLM transaction when the RTL signals change
+/// Sensitive_pos << 3/4*p_clk
+void anoc_copro_wrapper::rtl_to_tlm() {
+
+  //Output FIFOs
+  //////////////
+  //Test if a Send signal is active
+  for(int i=0; i<nb_fifo_out; i++) {
+    //A FIFO was ready to send data ?
+    p_to_MWMR[i].w    = false;
+    if (flag_tab_out_data_fifo_out[i]) {
+      //Chech if the accept signal is High
+      if (p_to_MWMR[i].wok.read() == true) {
+        //The FIFO data is correcly transfered
+        p_to_MWMR[i].w    = true;
+        p_to_MWMR[i].data = tab_out_data_fifo_out[i];
+
+        //Invalidate the send signal
+        flag_tab_out_data_fifo_out[i] = false;
+        //Requires to update the Data port
+        write_data_update = true;
+        //Send the TLM Accept transaction to the Core
+        if (tab_available_data_fifo_out[i] > 1 )
+          write_data_accept_fifo_out(i);
+      }
+    } else if (tab_available_data_fifo_out[i] > 0 ) {
+      //New data can be read?
+      //Send the TLM Accept transaction to the Core
+      write_data_accept_fifo_out(i);
+    }
+  }
+
+  //Input FIFOs
+  /////////////
+  //Test if a new Data is present on the Input FIFOs
+  for(int i=0; i<nb_fifo_in; i++) {
+    p_from_MWMR[i].r = tab_fifo_in_accept[i];
+    if (p_from_MWMR[i].rok.read() == true) {
+      //I am ready to accept this new data?
+      if (tab_fifo_in_accept[i] == true) {
+        //Read the data and send a TLM transcation
+        p_from_MWMR[i].r = true;
+        t_uint32 data = (t_uint32)p_from_MWMR[i].data.read();
+        write_data_fifo_in(i, data);
+        //Lower the ROK signal
+        tab_fifo_in_accept[i] = false;
+        //Requires a Accept RTL port update
+        accept_data_update = true;
+      }
+    }
+  }
+
+  //Exec port
+  ///////////////
+  //RTL signals changed?
+  if (exec_last != p_config[0].read()) {
+    ni_exec_transaction exec_trans;
+    //Test bit by bit to identify the source
+    for(int i=0; i<nb_cores; i++) {
+      if (((exec_last & (1<<i)) == 0) && ((p_config[0].read() & (1<<i)) == 1)) {
+        //A new lot_id is ready to be executed on core 'i'
+        EXPRINT(ni, 1,"CORE configuration event");
+        //Get the slot_id
+        t_uint16 slot_id = (t_uint16)p_config[i+1].read();
+	EXPRINT(ni, 0,"CORE " << i << " execute configuration on slot id " << slot_id);
+	// write exec config
+	exec_trans.set_slot_id(slot_id);
+	ni_exec_out[i]->put(&exec_trans);
+        //The CORE is nolonger finished
+        cfg_flag_core_finished[i] = false;
+        //Requires a RTL signal update
+        eoc_update = true;
+      }
+    }
+    exec_last = p_config[0].read();
+  }
+
+  //Core config address
+  /////////////////////
+  if (last_address != p_config[5].read()) {
+    //The address have been changed
+    current_address = p_config[5].read();
+    last_address = p_config[5].read();
+  }
+
+        
+  //Core configuration
+  ////////////////////
+  if (p_core_config.rok.read() == true) {
+    //A new configuration data is ready
+    ni_cfg_transaction cfg_trans;
+    t_uint32 data = p_core_config.data.read();
+    cfg_trans.set_data(data);
+    cfg_trans.set_address(current_address);
+#ifdef _ANOC_COPRO_DEBUG
+    printf("Ivan: Config data: %.8x on address %.8x\n", data, current_address);
+#endif
+    ni_cfg_dump_out->put(&cfg_trans);
+    current_address++;
+  }
+
+}
+}}
+
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa0.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa0.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..20c731c9d5a4204e2ff491696edde752f4e5637b
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa0.cpp
@@ -0,0 +1,32 @@
+
+namespace dsx { namespace caba {
+
+
+#define tmpl(...) __VA_ARGS__ MyHWA0
+
+tmpl(/**/)::~MyHWA0()
+{
+}
+
+    //intArray(1,1) there is one element (here an integer) of size 4 OCTETs/Quentin: attention cela a change c'est un MOT dans la version VM
+tmpl(/**/)::MyHWA0(sc_core::sc_module_name insname)
+           :dsx::caba::FifoVirtualCoprocessorWrapper(insname, stringArray("output", NULL), intArray(1,4), stringArray(NULL), NULL)
+{
+}
+
+tmpl(void *)::task_func() {
+  struct mwmr_s *output;
+//  mwmr_t output = SRL_GET_MWMR(output);
+   uint32_t data;
+ 
+   while (true) {   
+      for (int32_t i = 0; i < 8; i++) {
+	out=i;
+	mwmr_write(output, &data, 4; // Write integers 0 to 7 to output
+      }
+     
+   }
+}
+
+}}
+
diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa1.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa1.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b6ba89a325d62f5c2009f176d3cea9831392cfd9
--- /dev/null
+++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa1.cpp
@@ -0,0 +1,31 @@
+
+namespace dsx { namespace caba {
+
+
+#define tmpl(...) __VA_ARGS__ MyHWA1
+
+tmpl(/**/)::~MyHWA1()
+{
+}
+
+    //intArray(1,1) there is one element (here an integer) of size 4 OCTETs/Quentin: attention cela a change c'est un MOT dans la version VM
+
+tmpl(/**/)::MyHWA1(sc_core::sc_module_name insname)
+           :dsx::caba::FifoVirtualCoprocessorWrapper(insname, stringArray(NULL), NULL, stringArray("input", NULL), intArray(1,4))
+{
+}
+
+tmpl(void *)::task_func() {
+  struct mwmr_s *input;
+   uint32_t data;
+ 
+   while (true) {   
+      for (int32_t i = 0; i < 8; i++) {
+	mwmr_read(input, &data, 1); // read 8 integers wich have been modified by the intermediate software task
+      }
+     
+   }
+}
+
+}}
+
diff --git a/build.txt b/build.txt
index 70aa78a348c94ed74732bc4e9371f11cde2878dc..f283b3d48342e9c0b6d235fe41abe6e5a3cac3a4 100644
--- a/build.txt
+++ b/build.txt
@@ -1 +1 @@
-12340
\ No newline at end of file
+12357
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java
index f4119dcb17b453990c736abac19f76551fc4ba03..0053bc1dd849167e8926ecb0735bc1ac5d59e212 100644
--- a/src/main/java/avatartranslator/AvatarBlock.java
+++ b/src/main/java/avatartranslator/AvatarBlock.java
@@ -133,12 +133,11 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
     }
 
     public AvatarSignal getSignalByName(String _name) {
-	for(AvatarSignal sig: signals) {
-		System.out.println("finding " +sig.getName() + " " + _name);
-	    if (sig.getName().compareTo(_name) == 0) {
-		return sig;
-	    }
-	}
+		for(AvatarSignal sig: signals) {
+		    if (sig.getName().compareTo(_name) == 0) {
+				return sig;
+		    }
+		}
 
 	if (father != null) {
 	    return father.getSignalByName(_name);
diff --git a/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java b/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java
index 0850154bc4b493c68a75d35174e62bc109f4be13..c578f610e4a26018be7587e23cf7aceb815abb67 100755
--- a/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java
+++ b/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java
@@ -53,7 +53,7 @@ public class AvatarCoproMWMR extends AvatarComponent{
     private int tgtid ;
     private int plaps ;
     private int fifoToCoprocDepth;
-    private int fifoFromCoproDepth;
+    private int fifoFromCoprocDepth;
     private int nToCopro;
     private int nFromCopro;
     private int nConfig;
@@ -63,14 +63,14 @@ public class AvatarCoproMWMR extends AvatarComponent{
     private AvatarConnectingPoint[] connectingsPoints;
     private int nbConnectingPoint = 16 ;
 
-    public AvatarCoproMWMR(String _coprocName,int srcid, int _srcid, int _tgtid, int _plaps, int _fifoToCoprocDepth,int _fifoFromCoproDepth, int _nToCopro, int _nFromCopro, int _nConfig, int _nStatus, boolean _useLLSC)
+    public AvatarCoproMWMR(String _coprocName,int srcid, int _srcid, int _tgtid, int _plaps, int _fifoToCoprocDepth,int _fifoFromCoprocDepth, int _nToCopro, int _nFromCopro, int _nConfig, int _nStatus, boolean _useLLSC)
     {
       coprocName = _coprocName;
       srcid =  _srcid;
       tgtid = _tgtid;
 	plaps = _plaps ;
       fifoToCoprocDepth = _fifoToCoprocDepth;
-      fifoFromCoproDepth = _fifoFromCoproDepth;
+      fifoFromCoprocDepth = _fifoFromCoprocDepth;
       nToCopro = _nToCopro;
       nFromCopro = _nFromCopro;
       nConfig = _nConfig;
@@ -109,10 +109,14 @@ public class AvatarCoproMWMR extends AvatarComponent{
 	return plaps;
 	}
 
-	public int getFifoToCoProcDepth(){
+	public int getFifoToCoprocDepth(){
 	return fifoToCoprocDepth;
 	}
 
+	public int getFifoFromCoprocDepth(){
+	return fifoFromCoprocDepth;
+	}
+
 	public int getNToCopro(){
 	return nToCopro;
 	}
diff --git a/src/main/java/ddtranslatorSoclib/AvatarTask.java b/src/main/java/ddtranslatorSoclib/AvatarTask.java
index 0740aec7c5ef47ad6207522b11962cb5cf068b6b..8da5799e9738e6273aa1dd85a3907949e6c3f781 100755
--- a/src/main/java/ddtranslatorSoclib/AvatarTask.java
+++ b/src/main/java/ddtranslatorSoclib/AvatarTask.java
@@ -52,8 +52,8 @@ package ddtranslatorSoclib;
 public class AvatarTask extends AvatarMappedObject{
 
     private AvatarCPU avatarCPUReference;
-     private String taskName ;
-	 private String referenceTaskName;
+    private String taskName ;
+    private String referenceTaskName;
 
     public AvatarTask(String _taskName , String _referenceTaskName, AvatarCPU _avatarCPUReference ){
 
diff --git a/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java b/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java
index 9da15a45d50b487a7223eb12a7d289ee21eb98db..05d1bf870ea61d2af4e3a0949b887f7fc66d5e24 100755
--- a/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java
+++ b/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java
@@ -49,9 +49,8 @@ package ddtranslatorSoclib;
 
 import java.util.LinkedList;
 import java.util.List;
-
+import ui.tmldd.TMLArchiHWANode;//DG 23.08.
 public class AvatarddSpecification{
-	
     private List<AvatarComponent> components;
     private List<AvatarConnector> connectors;
     private List<AvatarMappedObject> mappedObjects;
@@ -195,7 +194,7 @@ There always is a RAM0, a TTY and an interconnect (Bus or VGMN or crossbar) othe
       return crossbars;
     }
 
-    /*    public LinkedList<AvatarBridge> getAllBridge(){
+    /*     public LinkedList<AvatarBridge> getAllBridge(){
       LinkedList<AvatarBridge> bridges = new LinkedList<AvatarBridge>();   
       for (AvatarComponent bridge : components )
         {
@@ -212,16 +211,37 @@ There always is a RAM0, a TTY and an interconnect (Bus or VGMN or crossbar) othe
        return getAllCrossbar().size();
     }
 
-    public List<AvatarCoproMWMR> getAllCoproMWMR(){
+    /* DG 23.08. les hardware accelerators proviennent en fait de la specification DIPLODOCUS */
+
+    //	    copro= new AvatarCoproMWMR("test",0,0,0,10,8,8,1,1,1,1,false);
+     
+      public List<AvatarCoproMWMR> getAllCoproMWMR(){
       List<AvatarCoproMWMR> copros = new LinkedList<AvatarCoproMWMR>();
       for (AvatarComponent copro : components )
         {
-          if (copro instanceof AvatarCoproMWMR)
-            copros.add((AvatarCoproMWMR)copro);
+	    if (copro instanceof AvatarCoproMWMR){
+			System.out.println("Coproc added to specification");
 
+            copros.add((AvatarCoproMWMR)copro);
+	    }
         }
       return copros;
-    }
+      }
+
+    /* to do, actuellement c'est un hwa generique */
+    /* the hardware accelerators must be taken from DIPLODOCUS specification */
+    /* public List<DiploHWA> getAllHWA(){
+      List<DiploHWA> hwas = new LinkedList<DiploHWA>();
+      for (DiploComponent hwa : diplocomponents )
+        {
+	    if (hwa instanceof DiploHWA){
+			System.out.println("Hardware accelerator added to specification");
+
+            hwas.add((DiploHWA)hwa);
+	    }
+        }
+      return hwas;
+      }*/
 
     public int getNbCPU(){
       return (getAllCPU()).size();
diff --git a/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java b/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java
index 965c8c8daaad94a26b3d3132f6c3acda437e1ca6..b4f2edf4d80629425e12956a75eed7be4fbe62a0 100755
--- a/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java
+++ b/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java
@@ -1033,6 +1033,26 @@ public class TasksAndMainGenerator {
         mainFile.appendToMainCode("/* Activating randomness */" + CR);
         mainFile.appendToMainCode("initRandom();" + CR);
 
+	/* DG 7.9.2017 additions for use of hardware MWMR controller */
+
+
+	/*void mwmr_hw_init( void *coproc, enum SoclibMwmrWay way,
+	  size_t no, const struct mwmr_s* mwmr );*/
+
+	/*uint32_t *fifo_data_in    = (uint32_t*)(base(MWMRd)+0x000); //0x20200000;*/
+	/* uint32_t *lock_in     = (uint32_t*)(base(LOCKS)+0x00);*/
+	/* mwmr_t *p_mwmr_in    = (mwmr_t*)(base(MWMRd)+0x1000);*/
+
+
+/*mwmr_initialize_pointer(p_mwmr_in,    WIDTH, DEPTH, fifo_data_in,    lock_in   );*/
+
+/* mwmr_hw_init(base(MWMR), MWMR_TO_COPROC, 0 , p_mwmr_in);*/
+
+/*for all coproc 
+  uint32_t *fifo =  (uint32_t*) + i*4096;*/
+
+/* end ajoute 7.9. */
+
 	mainFile.appendToMainCode("/* Initializing the main mutex */" + CR);
 	mainFile.appendToMainCode("if (pthread_mutex_init(&__mainMutex, NULL) < 0) { exit(-1);}" + CR + CR);
 
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java b/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java
index a0c186bbb826455d9538b92f0432f4159f23dd7a..682a8098a3fa20f99306db0cfbdc830cc56ef1cd 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java
@@ -114,22 +114,25 @@ public class Declaration {
 	    declaration +=  "caba::VciFdtRom<vci_param> vcifdtrom(\"vci_fdt_rom\", IntTab(0,6), maptab);" + CR;
 	}
 
-	if(nb_clusters==0){
-	    declaration +=  "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab("+(TopCellGenerator.avatardd.getNb_target()+3)+"), maptab);" + CR;
-	}	
-	else{
-	    declaration +=  "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab(0,8), maptab);" + CR;
-	}
-	   			    	
+	int last_tty=0;	   			    	
 	if(nb_clusters==0){
 	    int i=0;
 	    for (AvatarTTY tty : TopCellGenerator.avatardd.getAllTTY()){
 		declaration += "caba::VciMultiTty<vci_param> " + tty.getTTYName()+ "(\"" + tty.getTTYName()+ "\", IntTab(" + tty.getNo_target()+ "), maptab, \"vci_multi_tty"+i+"\", NULL);"+ CR;
 		i++;
+		last_tty=tty.getNo_target()+1;
 	    }
 
 	 //target address depends on number of TTYs and RAMs
 	
+	if(nb_clusters==0){
+	    // declaration +=  "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab("+(TopCellGenerator.avatardd.getNb_target()+3)+"), maptab);" + CR;
+ declaration +=  "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab("+(last_tty+3)+"), maptab);" + CR;
+	}	
+	else{
+	    declaration +=  "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab(0,8), maptab);" + CR;
+	}
+
 	for (AvatarRAM ram : TopCellGenerator.avatardd.getAllRAM()) 
 	     if(ram.getIndex()==0){
 		 declaration += "soclib::caba::VciRam<vci_param>" + ram.getMemoryName()+ "(\"" + ram.getMemoryName()+ "\"" + ", IntTab(2), maptab);" + CR; 
@@ -150,9 +153,35 @@ public class Declaration {
 		    + ram.getNo_target() + "), maptab);" + CR2; 
 	}
 	if(nb_clusters==0){
-	declaration +=  "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(cpus.size()+1), IntTab("+(TopCellGenerator.avatardd.getNb_target())+"));" + CR;
+	    /*declaration +=  "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(cpus.size()+1), IntTab("+(TopCellGenerator.avatardd.getNb_target())+"));" + CR;
 	declaration +=  "caba::VciEthernet<vci_param> vcieth(\"vcieth\", maptab, IntTab(cpus.size()+2), IntTab("+(TopCellGenerator.avatardd.getNb_target()+1)+"), \"soclib0\");" + CR;
-	declaration +=  "caba::VciBlockDevice<vci_param> vcibd(\"vcibd\", maptab, IntTab(cpus.size()), IntTab("+(TopCellGenerator.avatardd.getNb_target()+2)+"),\"block0.iso\", 2048);" + CR;	
+	declaration +=  "caba::VciBlockDevice<vci_param> vcibd(\"vcibd\", maptab, IntTab(cpus.size()), IntTab("+(TopCellGenerator.avatardd.getNb_target()+2)+"),\"block0.iso\", 2048);" + CR;*/
+
+declaration +=  "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(cpus.size()+1), IntTab("+last_tty +"));" + CR;
+	declaration +=  "caba::VciEthernet<vci_param> vcieth(\"vcieth\", maptab, IntTab(cpus.size()+2), IntTab("+(last_tty +1)+"), \"soclib0\");" + CR;
+	declaration +=  "caba::VciBlockDevice<vci_param> vcibd(\"vcibd\", maptab, IntTab(cpus.size()), IntTab("+(last_tty +2)+"),\"block0.iso\", 2048);" + CR;
+
+	  //only non-clustered version
+         int hwa_no=0;
+	 //int target_no = TopCellGenerator.avatardd.getNb_target();
+	 int target_no = (last_tty +4);//DG 5.9.
+	 int init_no = TopCellGenerator.avatardd.getNb_init();
+	  for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){
+	      //	      declaration += "caba::VciMwmrController<vci_param> " + copro.getCoprocName()+ "(\"" + copro.getCoprocName()+ "\", maptab, IntTab("+copro.getSrcid() + "), IntTab("+copro.getTgtid() + "),copro.getPlaps(),copro.getFifoToCoProcDepth(),copro.getNToCopro(),copro.getNFromCopro(),copro.getNConfig(),copro.getNStatus(), copro.getUseLLSC());"+ CR;
+	
+	      declaration += "caba::VciMwmrController<vci_param> " + copro.getCoprocName()+ "(\"" + copro.getCoprocName()+ "\", maptab, IntTab("+(init_no-1)+"), IntTab("+target_no+ "),"+copro.getPlaps()+","+copro.getFifoToCoprocDepth()+","+copro.getFifoFromCoprocDepth()+","+copro.getNToCopro()+","+copro.getNFromCopro()+","+copro.getNConfig()+","+copro.getNStatus()+","+ copro.getUseLLSC()+");"+ CR2;
+
+//one virtual component for each hardware accellerator, info from diplodocus (not yet implemented)
+
+//DG 28.08. 
+	      //   declaration += "soclib::caba::FifoVirtualCoprocessorWrapper hwa"+hwa_no+"(\"hwa"+hwa_no+"\",1,1,1,1);"+ CR2;
+
+declaration += "dsx::caba::MyHWA"+hwa_no+" hwa"+hwa_no+"(\"hwa"+hwa_no+"\");"+ CR2;
+	      target_no++;
+	      init_no++;
+	      hwa_no++;
+	  }
+	
   }else{
 	declaration +=  "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(0,cpus.size()+1), IntTab(0,7));" + CR;
 	declaration +=  "caba::VciEthernet<vci_param> vcieth(\"vcieth\", maptab, IntTab(0,cpus.size()+2), IntTab(0,8), \"soclib0\");" + CR;
@@ -160,12 +189,15 @@ public class Declaration {
   }
 
 if(nb_clusters==0){
+
 	  for  (AvatarBus bus : TopCellGenerator.avatardd.getAllBus()) {
           System.out.println("initiators: "+TopCellGenerator.avatardd.getNb_init());	
           System.out.println("targets: "+TopCellGenerator.avatardd.getNb_target());
 	  
 	  //declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+");" + CR2;
-	  declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+ ");" + CR2;
+	  //	  declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+ ");" + CR2;
+
+	  declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab,"+(3+TopCellGenerator.avatardd.getNb_init())+"," + (TopCellGenerator.avatardd.getNb_target()+4)+ ");" + CR2;//DG 28.08.
 	  int i=0;
 
           //if BUS was not last in input file, update here
@@ -185,7 +217,10 @@ if(nb_clusters==0){
           vgmn.setFifoDepth(8); //default value; must be > 2
 
 
-	  declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+  "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;
+	  //	  declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+  "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;
+	  //	  declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, " +(3+TopCellGenerator.avatardd.getNb_init())+"," + (TopCellGenerator.avatardd.getNb_target()+4)+  "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;//DG 28.08.
+
+	  declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, " +(3+TopCellGenerator.avatardd.getNb_init())+"," + (TopCellGenerator.avatardd.getNb_target()+3)+  "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;//DG 5.9.
 
 	  // declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNbRAM()+TopCellGenerator.avatardd.getNbTTY()+4)+  "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;
 
@@ -212,11 +247,7 @@ if(nb_clusters==0){
 		const bool use_llsc );
 	  */
 
-	  //only non-clustered version
-	  for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){
-		      declaration += "caba::VciMwmrController<vci_param> " + copro.getCoprocName()+ "(\"" + copro.getCoprocName()+ "\", maptab, IntTab("+copro.getSrcid() + "), IntTab("+copro.getTgtid() + "),copro.getPlaps(),copro.getFifoToCoProcDepth(),copro.getNToCopro(),copro.getNFromCopro(),copro.getNConfig(),copro.getNStatus(), copro.getUseLLSC());"+ CR;
-	
-	  }
+
 }
 else {
 
@@ -266,7 +297,6 @@ else {
 	
 	  declaration += "soclib::caba::VciLocalCrossbar<vci_param> crossbar"+crossbar.getClusterIndex()+"(\"" + crossbar.getCrossbarName() + "\"" + " , maptab, IntTab("+ crossbar.getClusterIndex()+"),IntTab("+crossbar.getClusterIndex()+"), "+crossbar.getNbOfAttachedInitiators()+", "+crossbar.getNbOfAttachedTargets()+");" + CR2;
 
-
           //if CROSSBAR was not last in input file, update here 
           crossbar.setNbOfAttachedInitiators(TopCellGenerator.avatardd.getNb_init()); 
           crossbar.setNbOfAttachedTargets(TopCellGenerator.avatardd.getNb_target());	 
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java b/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java
index 9c55b3fd3a937c958939dbcf5e24f759cb9c4102..42871f9d6a8582d7a46fcef32e4053161948329e 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java
@@ -174,6 +174,16 @@ public class Deployinfo {
 
 	    i++;
 	}
+	//Calculate Adresses of MWMR segments, one for each hardware accellerator
+	i=0;
+
+	for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()) {
+	    deployinfo = deployinfo + "#define MWMR_RAM" + i  + "_NAME mwmr_ram" + i + CR; 
+	    deployinfo = deployinfo + "#define MWMR_RAM" + i  + "_ADDR 0xA02" + Integer.toHexString(i*4096) + CR; 
+	    deployinfo = deployinfo + "#define MWMR_RAM" + i  + "_SIZE 0x1000"+ CR;
+	    i++;
+	}
+
 	return deployinfo;	
     }
     
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Header.java b/src/main/java/ddtranslatorSoclib/toTopCell/Header.java
index 18cb9813c130afdfd1bfe8e41bba2c8424c31663..58f799ce3caba235c97e9ba3a4a4cf6a6e322d50 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/Header.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/Header.java
@@ -48,6 +48,8 @@
 
 package ddtranslatorSoclib.toTopCell;
 
+import ddtranslatorSoclib.*; //DG 23.08.
+
 public class Header {
 	
     static private String header;
@@ -89,7 +91,32 @@ int nb_clusters=5;
 	    else{
 		header +="#include \"vci_vgmn.h\""+ CR;
 	    }
-	    
+	   int with_hw_accellerator = 1; //DG 23.08. a la main
+	   if (with_hw_accellerator>0){  
+	       header +="#include \"vci_mwmr_controller.h\""+ CR;
+	   }
+	   //include statements for all coprocessors found
+	   //The user must ensure that there is a SoCLib component corresponding to this coprocessor
+	   // if (with_hw_accellerator>0){  
+	   //DG 23.08. actuellement il ne les trouve pas!
+	   int hwas=0;
+	   header +="#include \"fifo_virtual_copro_wrapper.h\""+ CR;
+
+	   for (AvatarCoproMWMR HWAccelerator : TopCellGenerator.avatardd.getAllCoproMWMR()) {
+	       //	   String name = HWAccelerator.getCoprocName();
+	       //	   header +="#include \""+name+"\""+ CR;
+
+	       //Per default for testing
+	       //  header +="#include \"input_coproc.h\""+ CR;
+	       //header +="#include \"output_coproc.hh\""+ CR;
+
+	       /* can be found in /users/outil/soc/soclib/soclib/module/internal_component/fifo* */
+	       //header +="#include \"fifo_virtual_copro_wrapper.h\""+ CR;
+	       header +="#include \"my_hwa"+hwas+".h\""+ CR;
+	       hwas++;
+	   }
+	   //  }
+	   
 	    header+= "#include \"vci_block_device.h\"" + CR
 		+ "#include \"vci_simhelper.h\"" + CR + "#include \"vci_fd_access.h\"" + CR
 		+ "#include \"vci_ethernet.h\"" + CR
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java b/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java
index eed6d66c70151e0b0ea8f604a13a00fffac3f180..871c0b60449c6d65f119965bbd5a17b24dc5eba5 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java
@@ -51,6 +51,7 @@ package ddtranslatorSoclib.toTopCell;
 
 import ddtranslatorSoclib.AvatarRAM;
 import ddtranslatorSoclib.AvatarTTY;
+import ddtranslatorSoclib.*;
 
 public class MappingTable {
 	
@@ -117,7 +118,7 @@ public class MappingTable {
 		    size = 1073741824;
 		}
 		else {//dimension segments to be smaller
-		    size = 268435456; 
+		    size = 268435456;		          
 		}
 	    }
 	    else{
@@ -167,6 +168,25 @@ public class MappingTable {
       mapping = mapping + "maptab.add(Segment(\"vci_block_device\", 0xd1200000, 0x00000020, IntTab("+(l+3)+"), false));" + CR2;
       mapping = mapping + "maptab.add(Segment(\"vci_locks\", 0xC0200000, 0x00000100, IntTab("+(l+4)+"), false));" + CR2;
     
+
+      /* Instanciation of the MWMR wrappers for hardware accellerators */
+      /* The accelerators themselves are specifies on DIPLODOCUS level */
+
+      int hwa_count=0;
+      int MWMR_SIZE=4096;
+      // int MWMR_BASE=0xA0200000;
+      i=0;
+        for (AvatarCoproMWMR MWMRwrapper : TopCellGenerator.avatardd.getAllCoproMWMR()) {   
+	    mapping += "maptab.add(Segment(\"mwmr_ram"+hwa_count+"\", 0xA0"+  Integer.toHexString(2097152+MWMR_SIZE*i)+",  0x00001000, IntTab("+(l+5+hwa_count)+"), false));" + CR; 	 
+     hwa_count++;
+      } 
+ hwa_count=0; 
+ /*
+   for (AvatarCoproMWMR MWMRwrapper : TopCellGenerator.avatardd.getAllCoproMWMR()) {
+	  mapping += "maptab.add(Segment(\"mwmr_ram"+hwa_count+"\", 0x"+(Integer.toHexString(MWMRd_BASE+i*4096))+", 0x"+Integer.toHexString(MWMRd_SIZE)+", IntTab("+(l+5+hwa_count)+"), false));" + CR2; 
+	  hwa_count++;   	     
+	  }	  */
+
       return mapping;   
     }
 
@@ -262,7 +282,11 @@ mapping += "maptab.add(Segment(\"vci_rttimer\", 0x"+ Integer.toHexString(SEG_TIM
 	      tty.setNo_target(nb_ram);
 	  }	 	     
 	  mapping += "maptab.add(Segment(\"vci_multi_tty"+tty.getIndex()+"\" , 0x"+Integer.toHexString(SEG_TTY_BASE +  tty.getNo_cluster()* CLUSTER_SIZE)+", 0x00000010, IntTab("+tty.getNo_cluster()+","+(tty.getNo_target())+"), false));" + CR; 	  
-      }	  
+      }
+      /* Add as manin mwmr controllers as there are hardware accelerators */
+      //int with_hw_accelerator = 0; //DG 23.08.
+ 
+// }
     }
     return mapping;   
     }
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java b/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java
index 74870d23ee8af377e4bed015477f95024caafd69..5299c2125def2d1157fdf37d45d25b4d8313a73f 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java
@@ -341,16 +341,23 @@ public class NetList {
 	//	if(nb_cluster == 0){
 	    i=0;
 	    for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){
-		//a coprocessor with FIFO interface
-		netlist = netlist +copro.getCoprocName()+".p_clk(signal_clk);" + CR;
-		netlist = netlist +copro.getCoprocName()+".p_resetn(signal_resetn);" + CR;	      	
-                netlist = netlist + copro.getCoprocName()+".p_"+i+"_ctrl(signal_fifo_"+i+"_ctrl);" + CR;
-		//and its mwmr controller
-		netlist = netlist + "mwmr"+i+".p_clk(signal_clk);" + CR;
-		netlist = netlist + "mwmr"+i+".p_resetn(signal_resetn);" + CR;
-		netlist = netlist + "mwmr"+i+".p_vci_initiator(signal_mwmr_"+i+"initiator);" + CR;
-		netlist = netlist + "mwmr"+i+".p_vci_target(signal_mwmr_"+i+"_target);" + CR;	
-                netlist = netlist + copro.getCoprocName()+".p_"+i+"_ctrl(signal_fifo_"+i+"_ctrl);" + CR;
+		//a coprocessor with its FIFO interface built from HWA 
+		netlist = netlist +"hwa"+i+".p_clk(signal_clk);" + CR;
+		netlist = netlist +"hwa"+i+".p_resetn(signal_resetn);" + CR;	      	
+                netlist = netlist +"hwa"+i+".p_from_ctrl["+i+"](signal_fifo_"+i+"_from_ctrl);" + CR;
+		netlist = netlist +"hwa"+i+".p_to_ctrl["+i+"](signal_fifo_"+i+"_to_ctrl);" + CR2;
+	
+		//MWMR controller of the HWA
+		netlist = netlist +copro.getCoprocName() +".p_clk(signal_clk);" + CR;
+		netlist = netlist +copro.getCoprocName() +".p_resetn(signal_resetn);" + CR;
+		netlist = netlist +copro.getCoprocName() +".p_vci_initiator(signal_mwmr_"+i+"_initiator);" + CR;
+		netlist = netlist + copro.getCoprocName()+".p_vci_target(signal_mwmr_"+i+"_target);" + CR2;
+		netlist = netlist +copro.getCoprocName() +".p_from_coproc["+i+"](signal_fifo_"+i+"_from_ctrl);" + CR;
+netlist = netlist +copro.getCoprocName() +".p_to_coproc["+i+"](signal_fifo_"+i+"_to_ctrl);" + CR;
+//DG 5.9.
+//	netlist = netlist +copro.getCoprocName() +".status();" + CR;
+//	netlist = netlist +copro.getCoprocName() +".config();" + CR;
+i++;
           }
 	   
 	
@@ -389,6 +396,27 @@ public class NetList {
 		}	 		
 	    }	   	   
 	}
+
+	//if (with_hw_accellerator>0){  
+
+	int p=0;
+	//for testing:   vci_synthetic_initiator.h and vci_synthetic_target.h    
+	//for (AvatarCoproMWMR HWAccelerator : TopCellGenerator.avatardd.getAllCoproMWMR()) {
+    /*    netlist += "mwmr"+HWAccelerator.getNo()+".p_clk(signal_clk);" + CR;
+    netlist += "mwmr"+HWAccelerator.getNo()+".p_resetn(signal_resetn);" + CR;
+    netlist += "mwmr"+HWAccelerator.getNo()+".p_vci_initiator(signal_mwmr"+HWAccelerator.getNo()+"_initiator);" + CR;
+    netlist += "	mwmr"+HWAccelerator.getNo()+".p_vci_target(signal_mwmr"+HWAccelerator.getNo()+"_target);" + CR;
+    netlist += "	mwmr"+HWAccelerator.getNo()+".p_from_coproc["+HWAccelerator.getNo()+"](signal_fifo_to_ctrl);" + CR;
+    netlist += "	mwmr"+HWAccelerator.getNo()+".p_to_coproc["+HWAccelerator.getNo()+"](signal_fifo_from_ctrl);" + CR;*/
+
+	/*  netlist += "mwmr"+p+".p_clk(signal_clk);" + CR;
+    netlist += "mwmr"+p+".p_resetn(signal_resetn);" + CR;
+    netlist += "mwmr"+p+".p_vci_initiator(signal_mwmr"+p+"_initiator);" + CR;
+    netlist += "	mwmr"+p+".p_vci_target(signal_mwmr"+p+"_target);" + CR;
+    netlist += "	mwmr"+p+".p_from_coproc["+p+"](signal_fifo_"+p+"_to_ctrl);" + CR;
+    netlist += "	mwmr"+p+".p_to_coproc["+p+"](signal_fifo_"+p+"_from_ctrl);" + CR;
+    }	 */   
+//	   }
 		
 	//generate trace file if marked trace option 
 	
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java b/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java
index d76c8bdffc751d8beb1f245d979a9179b2dd5630..29a8d45b409a58c974a47189176d2fd7da18d249 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java
@@ -56,6 +56,8 @@ public class Platforminfo {
     public static String getPlatformInfo() {
 	//determine if the platform is vgsb or vgmn based (mutually exclusive)
     int with_vgsb=TopCellGenerator.avatardd.getAllBus().size();
+    int nb_hwa=TopCellGenerator.avatardd.getAllCoproMWMR().size();
+
     //bus can be other than VGSB (CAN...), for the moment restricted to VGSB
         String platforminfo = CR;
         platforminfo +="use =  ["+CR
@@ -78,10 +80,17 @@ public class Platforminfo {
 	    platforminfo+="Uses('caba:vci_vgmn'),"+CR;
 	}
 
+	//DG 23.08. added virtual coprocessor
         platforminfo+="Uses('caba:vci_mwmr_stats'),"+CR
         +"Uses('caba:vci_logger'),"+CR
-        +"Uses('caba:vci_local_crossbar'),"+CR     
-        +"Uses('common:elf_file_loader'),"+CR
+        +"Uses('caba:vci_local_crossbar'),"+CR  
+	    +"Uses('caba:fifo_virtual_copro_wrapper'),"+CR ;
+	    //DG 28.08. example coprocessors
+	int i=0;					      
+	for(i=0;i<nb_hwa;i++){
+	    platforminfo+="Uses('caba:my_hwa"+i+"'),"+CR; 
+		}
+        platforminfo+="Uses('common:elf_file_loader'),"+CR
 	+"Uses('common:plain_file_loader'),"+CR
         +"Uses('caba:vci_xcache_wrapper', iss_t = 'common:gdb_iss', gdb_iss_t = 'common:iss_memchecker', iss_memchecker_t = 'common:ppc405'),"+CR
         +"Uses('caba:vci_xcache_wrapper', iss_t = 'common:gdb_iss', gdb_iss_t = 'common:iss_memchecker', iss_memchecker_t = 'common:arm'),"+CR
diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java b/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java
index 73ecb81e10452be786ef97ad04e5a0191b506473..f447924aed04d48f1e440403cf10db655e5a462e 100755
--- a/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java
+++ b/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java
@@ -88,7 +88,9 @@ signal = signal +"caba::VciSignals<vci_param> signal_vci_vcilocks(\"signal_vci_v
   for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){
 	signal = signal +"caba::VciSignals<vci_param> signal_mwmr_"+i+"_initiator;"+ CR;
 	signal = signal +"caba::VciSignals<vci_param> signal_mwmr_"+i+"_target;"+ CR;	
-	signal = signal +"caba::VciSignals<vci_param> signal_fifo_"+i+"_ctrl;"+ CR;	
+	signal = signal +" soclib::caba::FifoSignals<uint32_t> signal_fifo_"+i+"_from_ctrl;"+ CR;
+	signal = signal +" soclib::caba::FifoSignals<uint32_t> signal_fifo_"+i+"_to_ctrl;"+ CR;	
+	i++;
   }
 
 if(TopCellGenerator.avatardd.getAllCrossbar().size()==0){
@@ -116,8 +118,26 @@ else{
 signal = signal + "soclib::caba::VciSignals<vci_param> signal_vci_tty"+i+"(\"signal_vci_tty"+i+"\");" + CR2;
 		i++;
     }
-				
-		signal = signal + " sc_core::sc_signal<bool> signal_xicu_irq[xicu_n_irq];" + CR2;
+    int p=0;
+    // if (with_hw_accellerator>0){ //DG 23.08.	
+for (AvatarCoproMWMR HWAccelerator : TopCellGenerator.avatardd.getAllCoproMWMR()) {
+//les accellerateurs sont caches car apparaissent uniquement au niveau DIPLODOCUS
+//signal = signal + "	soclib::caba::VciSignals<vci_param> signal_mwmr"+HWAccelerator.getNo()+"_target(\"signal_mwmr"+HWAccelerator.getNo()+"_target\""+CR;
+//signal = signal + "	soclib::caba::VciSignals<vci_param> signal_mwmr"+HWAccelerator.getNo()+"_initiator(\"signal_mwmr"+HWAccelerator.getNo()+"_initiator\""  +CR;
+
+//signal = signal + "	soclib::caba::FifoSignals<uint32_t> signal_fifo_to_ctrl"+HWAccelerator.getNo()+"(\"signal_fifo_to_ctrl"+HWAccelerator.getNo()+"\");"+CR;
+    //signal = signal + "       soclib::caba::FifoSignals<uint32_t> signal_fifo_from_ctrl"+HWAccelerator.getNo()+"(\"signal_fifo_from_ctrl"+HWAccelerator.getNo()+"\");"+CR;
+
+
+signal = signal + "	soclib::caba::VciSignals<vci_param> signal_mwmr"+p+"_target(\"signal_mwmr"+p+"_target\""+CR;
+signal = signal + "	soclib::caba::VciSignals<vci_param> signal_mwmr"+p+"_initiator(\"signal_mwmr"+p+"_initiator\""  +CR;
+
+signal = signal + "	soclib::caba::FifoSignals<uint32_t> signal_fifo_to_ctrl"+p+"(\"signal_fifo_to_ctrl"+p+"\");"+CR;
+    signal = signal + "       soclib::caba::FifoSignals<uint32_t> signal_fifo_from_ctrl"+p+"(\"signal_fifo_from_ctrl"+p+"\");"+CR;
+    p++;
+}
+			
+    signal = signal + " sc_core::sc_signal<bool> signal_xicu_irq[xicu_n_irq];" + CR2;
 		//System.out.print("number of processors : " + TopCellGenerator.avatardd.getNbCPU()+"\n");
 		System.out.print("number of clusters : " + TopCellGenerator.avatardd.getNbClusters()+"\n");
 
diff --git a/src/main/java/dseengine/DSEConfiguration.java b/src/main/java/dseengine/DSEConfiguration.java
index dab16ba7eb69356cfba5395db6e73bba5288e043..045662e0b184fd282e4723183d2619ac2cb5775e 100755
--- a/src/main/java/dseengine/DSEConfiguration.java
+++ b/src/main/java/dseengine/DSEConfiguration.java
@@ -1392,10 +1392,10 @@ public class DSEConfiguration implements Runnable  {
 		     TMLArchiPanel newArch = drawMapping(tmla, "securedMapping"+(cpt-1));
 		     GTMLModeling gtml =new GTMLModeling(newArch, true);
 		     tmla = gtml.translateToTMLMapping();
-		     tmla.tmlap = tmlap;
-			tmlcdp = (TMLComponentDesignPanel) mainGUI.tabs.get(0);
-		     tmla.setTMLDesignPanel(tmlcdp);
-			 System.out.println("tmlcdp " + tmlcdp);
+//		     tmla.tmlap = tmlap;
+	//		tmlcdp = (TMLComponentDesignPanel) mainGUI.tabs.get(0);
+		//     tmla.setTMLDesignPanel(tmlcdp);
+			// System.out.println("tmlcdp " + tmlcdp);
 		     //
 		     //Repeat for secured mapping
 		     TMLMapping<TGComponent> secMapping = mainGUI.gtm.autoSecure(mainGUI, "mapping" +(cpt-1),tmla, newArch, encComp, overhead, decComp,true,false,false);
diff --git a/src/main/java/tmltranslator/TMLActivity.java b/src/main/java/tmltranslator/TMLActivity.java
index 19228fb812314dad1e3e3ec610fa21c62cf4acfc..e1fa1378e72668a0417a43339089d70b198d473d 100755
--- a/src/main/java/tmltranslator/TMLActivity.java
+++ b/src/main/java/tmltranslator/TMLActivity.java
@@ -155,6 +155,13 @@ public class TMLActivity extends TMLElement {
         return null;
     }
 
+	public void replaceElement(TMLActivityElement _oldE, TMLActivityElement _newE) {
+		_newE.setNexts(_oldE.getNexts());
+		replaceAllNext(_oldE, _newE);
+		elements.add(_newE);
+		elements.remove(_oldE);
+	}
+
     public void removeAllRandomSequences(TMLTask _task) {
         int idRandomSequence = 0;
         TMLRandomSequence tmlrs = findTMLRandomSequence();
diff --git a/src/main/java/tmltranslator/TMLActivityElementChannel.java b/src/main/java/tmltranslator/TMLActivityElementChannel.java
index d9bc2be18d7620f670c4b93c92efe35fc9fafe8c..e7a93f9bbc2f3d37e831bf91a619d6efbd48a1db 100755
--- a/src/main/java/tmltranslator/TMLActivityElementChannel.java
+++ b/src/main/java/tmltranslator/TMLActivityElementChannel.java
@@ -53,10 +53,12 @@ import java.util.ArrayList;
 public class TMLActivityElementChannel extends TMLActivityElement {
     protected ArrayList<TMLChannel> channels;
     protected String nbOfSamples;
+	private boolean isAttacker;
 
     public TMLActivityElementChannel(String _name, Object _referenceObject) {
         super(_name, _referenceObject);
         channels = new ArrayList<TMLChannel>();
+		isAttacker=false;
     }
 
     public void addChannel(TMLChannel _channel) {
@@ -71,6 +73,14 @@ public class TMLActivityElementChannel extends TMLActivityElement {
         return channels.get(_index);
     }
 
+	public boolean isAttacker(){
+		return isAttacker;
+	}
+
+	public void setAttacker(boolean attacker){
+		isAttacker=attacker;
+	}
+
     public void setNbOfSamples(String _nbOfSamples) {
         nbOfSamples = _nbOfSamples;
     }
diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java
index f813e8286896ff67a750a5ab0007b856166263cb..25f6c86a405a8c4071a75f58f8c2562b310a8c68 100755
--- a/src/main/java/tmltranslator/TMLChannel.java
+++ b/src/main/java/tmltranslator/TMLChannel.java
@@ -320,6 +320,25 @@ public class TMLChannel extends TMLCommunicationElement {
         return destinationTask;
     }
 
+	public TMLTask getSystemOriginTask() {
+		for (TMLTask task: originTasks){
+			if (!task.isAttacker()){
+				return task;
+			}
+		}
+        return originTask;
+    }
+
+    public TMLTask getSystemDestinationTask() {
+		for (TMLTask task: destinationTasks){
+			if (!task.isAttacker()){
+				return task;
+			}
+		}
+        return destinationTask;
+    }
+
+
     public TMLPort getOriginPort() {
         return originPort;
     }
diff --git a/src/main/java/tmltranslator/TMLMapping.java b/src/main/java/tmltranslator/TMLMapping.java
index 6577db688eefa58b072d452c5e9b2e66a58b109b..db47137686b5d4ea3abb3e6c2872219955853eb8 100755
--- a/src/main/java/tmltranslator/TMLMapping.java
+++ b/src/main/java/tmltranslator/TMLMapping.java
@@ -47,7 +47,7 @@ import myutil.*;
 import tmltranslator.toproverif.TML2ProVerif;
 import ui.TMLArchiPanel;
 import ui.TMLComponentDesignPanel;
-import ui.util.CorrespondanceElement;
+import ui.CorrespondanceTGElement;
 
 import java.util.*;
 
@@ -71,7 +71,7 @@ public class TMLMapping<E> {
     private List<HwCommunicationNode> oncommnodes;
     private List<TMLElement> mappedcommelts;
 
-    public CorrespondanceElement<E> listE;
+	private CorrespondanceTGElement listE;
 
     // Security
     public boolean firewall = false;
@@ -90,9 +90,9 @@ public class TMLMapping<E> {
 
 
 
-    // REFERENCES TO BE REMOVED!!!!
-    private TMLComponentDesignPanel tmldp;
-    public TMLArchiPanel tmlap;
+    // REFERENCES TO BE REMOVED!!!! :(
+    //private TMLComponentDesignPanel tmldp;
+    //public TMLArchiPanel tmlap;
 
 
     public TMLMapping(TMLModeling<E> _tmlm, TMLArchitecture _tmla, boolean reset) {
@@ -149,6 +149,15 @@ public class TMLMapping<E> {
         return null;
     }
 
+	public CorrespondanceTGElement getCorrespondanceList(){
+		return listE;
+	}
+
+	public void setCorrespondanceList(CorrespondanceTGElement cl){
+		listE=cl;
+	}
+
+
     public void addCustomValue(String custom) {
         customValues.add(custom);
     }
@@ -1492,14 +1501,95 @@ public class TMLMapping<E> {
         }
     }
 
-    public void setTMLDesignPanel(TMLComponentDesignPanel _tmldp){
-        tmldp = _tmldp;
+	public boolean channelAllowed(TMLChannel chan){
+		TMLTask orig = chan.getOriginTask();
+        TMLTask dest = chan.getDestinationTask();
+        List<HwNode> path = getPath(orig, dest);
+        for (HwNode node:path){
+            if (node instanceof HwBridge){
+                for (String rule:((HwBridge) node).firewallRules){
+                    String t1 = rule.split("->")[0];
+                    String t2 = rule.split("->")[1];
+                    if (t1.equals(orig.getName().replaceAll("__","::")) || t1.equals("*")){
+                        if (t2.equals(dest.getName().replaceAll("__","::")) || t2.equals("*")){
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+	}
+
+
+	public List<HwNode> getPath(TMLTask t1, TMLTask t2){
+        HwNode node1 = getHwNodeOf(t1);
+        HwNode node2 = getHwNodeOf(t2);
+        List<HwNode> path = new ArrayList<HwNode>();
+        if (node1==node2){
+            return path;
+        }
+        if (node1!=node2){
+            //Navigate architecture for node
+            List<HwLink> links = getTMLArchitecture().getHwLinks();
+            //  HwNode last = node1;
+            List<HwNode> found = new ArrayList<HwNode>();
+            List<HwNode> done = new ArrayList<HwNode>();
+            Map<HwNode, List<HwNode>> pathMap = new HashMap<HwNode, List<HwNode>>();
+            for (HwLink link: links){
+                if (link.hwnode == node1){
+                    found.add(link.bus);
+                    List<HwNode> tmp = new ArrayList<HwNode>();
+                    tmp.add(link.bus);
+                    pathMap.put(link.bus, tmp);
+                }
+            }
+            outerloop:
+            while (found.size()>0){
+                HwNode curr = found.remove(0);
+                for (HwLink link: links){
+                    if (curr == link.bus){
+                        if (link.hwnode == node2){
+                            path = pathMap.get(curr);
+                            break outerloop;
+                        }
+                        if (!done.contains(link.hwnode) && !found.contains(link.hwnode) && link.hwnode instanceof HwBridge){
+                            found.add(link.hwnode);
+                            List<HwNode> tmp = new ArrayList<HwNode>(pathMap.get(curr));
+                            tmp.add(link.hwnode);
+                            pathMap.put(link.hwnode, tmp);
+                        }
+                    }
+                    else if (curr == link.hwnode){
+                        if (!done.contains(link.bus) && !found.contains(link.bus)){
+                            found.add(link.bus);
+                            List<HwNode> tmp = new ArrayList<HwNode>(pathMap.get(curr));
+                            tmp.add(link.bus);
+                            pathMap.put(link.bus, tmp);
+                        }
+                    }
+                }
+                done.add(curr);
+            }
+        }
+        return path;
     }
 
-    public TMLComponentDesignPanel getTMLCDesignPanel(){
-        return tmldp;
-    }
 
+	public boolean isAttackerAccessible(TMLChannel chan){
+		TMLTask orig = chan.getSystemOriginTask();
+        TMLTask dest = chan.getSystemDestinationTask();
+        List<HwNode> path = getPath(orig, dest);
+        for (HwNode node:path){
+			if (node instanceof HwBus){
+				HwBus bus = (HwBus) node;
+				if (bus.privacy==HwCommunicationNode.BUS_PUBLIC){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 
     public String toXML() {
         String s = "<TMLMAPPING>\n";
diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java
index 9307d14f8d3fc05d39d50ec65f481dc9d312f4e3..26fb4ed6695db61e5a773452e6225998acd7ba26 100755
--- a/src/main/java/tmltranslator/TMLModeling.java
+++ b/src/main/java/tmltranslator/TMLModeling.java
@@ -52,6 +52,7 @@ import proverifspec.ProVerifQueryResult;
 import ui.TAttribute;
 import ui.tmlcompd.TMLCPrimitiveComponent;
 import ui.tmlcompd.TMLCPrimitivePort;
+import ui.TGComponent;
 
 import java.util.*;
 
@@ -682,6 +683,17 @@ public class TMLModeling<E> {
     public List<TMLTask> getTasks() {
         return tasks;
     }
+
+	public List<TMLTask> getAttackerTasks(){
+		List<TMLTask> attackers = new ArrayList<TMLTask>();
+		for (TMLTask task: tasks){
+			if (task.isAttacker()){
+				attackers.add(task);
+			}
+		}
+		return attackers;
+	}
+	
     public List<String[]> getPragmas(){
         return pragmas;
     }
@@ -812,6 +824,10 @@ public class TMLModeling<E> {
             }
         }
     }
+	public TGComponent getTGComponent(){
+		return (TGComponent) getTasks().get(0).getReferenceObject();
+	}
+
 
     public void backtraceAuthenticity(HashMap<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authenticityResults, String mappingName) {
         //        System.out.println("Backtracing Authenticity");
diff --git a/src/main/java/tmltranslator/toavatar/TML2Avatar.java b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
index 0e54f143d2a9ba1117da7cb033151cd1ef6a976d..0653a1a880a9843fe4cc5e1b15b257af3b98a04f 100644
--- a/src/main/java/tmltranslator/toavatar/TML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
@@ -1360,12 +1360,8 @@ public class TML2Avatar {
 	//TODO: Make state names readable
 	//TODO: Put back numeric guards
 	//TODO: Calcuate for temp variable
+	this.avspec = new AvatarSpecification("spec", tmlmap.getTMLModeling().getTGComponent().getTDiagramPanel().tp);
 
-	this.avspec = new AvatarSpecification("spec", tmlmap.getTMLCDesignPanel());
-	if (tmlmap.getTMLCDesignPanel()==null){
-		//System.out.println("Failed to generate specification");
-	//	return avspec;
-	}
 	attrsToCheck.clear();
 	//tmlmodel.removeForksAndJoins();
 	//Only set the loop limit if it's a number
diff --git a/src/main/java/ui/AvatarDeploymentPanelTranslator.java b/src/main/java/ui/AvatarDeploymentPanelTranslator.java
index 1e76d0760a10e0085eb7c7a27e79810b06d142f7..30fec965222a15704b8a7df791e127c3ac471e54 100644
--- a/src/main/java/ui/AvatarDeploymentPanelTranslator.java
+++ b/src/main/java/ui/AvatarDeploymentPanelTranslator.java
@@ -242,10 +242,12 @@ public class AvatarDeploymentPanelTranslator {
 				int nConfig = addCoproMWMRNode.getNConfig(); // Nb of configuration registers
 				int nStatus = addCoproMWMRNode.getNStatus(); // nb of status registers
 				boolean useLLSC = addCoproMWMRNode.getUseLLSC(); // more efficient protocol. 0: not used. 1 or more -> used
-
+				nb_init++;
+				nb_target+=2;//DG 28.08. two targets as two segments of memory are created mwmr and mwmrd
 				AvatarCoproMWMR acpMWMR;
 				acpMWMR = new AvatarCoproMWMR(timerName, srcid, srcid, tgtid, plaps, fifoToCoprocDepth, fifoFromCoprocDepth, nToCopro, nFromCopro, nConfig, nStatus, useLLSC);
 				avatarMap.put(dp, acpMWMR);
+				avatarComponents.add(acpMWMR);
 
 			} else if (dp instanceof ADDMemoryNode) {
 
@@ -255,7 +257,7 @@ public class AvatarDeploymentPanelTranslator {
 					String name = addRamNode.getNodeName();
 					int index = addRamNode.getIndex();
 					int byteDataSize = addRamNode.getDataSize();
-
+					System.out.println("ADD RAM Data Size" + byteDataSize);
 					//int monitored = addRamNode.getMonitored();
   System.out.println("ADD RAM  monitored "+ addRamNode.getMonitored());
   AvatarRAM avram = new AvatarRAM(name, index, byteDataSize, index, index, addRamNode.getMonitored());//DG 3.7.
diff --git a/src/main/java/ui/GTMLModeling.java b/src/main/java/ui/GTMLModeling.java
index 94cd22a6387f7d7b54436bc0d902904097eb8b05..2962737ca1255d9ea30782dd5279cb99ef6c4d96 100755
--- a/src/main/java/ui/GTMLModeling.java
+++ b/src/main/java/ui/GTMLModeling.java
@@ -63,6 +63,7 @@ import ui.tmlcd.TMLTaskOperator;
 import ui.tmlcompd.TMLCPath;
 import ui.tmlcompd.TMLCPrimitiveComponent;
 import ui.tmlcompd.TMLCPrimitivePort;
+import ui.tmlcompd.*;
 import ui.tmlcompd.TMLCRecordComponent;
 import ui.tmldd.*;
 import ui.tmlsd.TGConnectorMessageTMLSD;
@@ -71,7 +72,7 @@ import ui.tmlsd.TMLSDStorageInstance;
 import ui.tmlsd.TMLSDTransferInstance;
 
 import java.util.*;
-
+import java.awt.Point;
 
 /**
  * Class GTMLModeling
@@ -153,6 +154,124 @@ public class GTMLModeling  {
         putPrefixName = _b;
     }
 
+	public void processAttacker(){
+		//System.out.println("processing...");
+		//System.out.println(tmlm.getAttackerTasks());
+		if (tmlm==null){
+			return;
+		}
+		List<TMLTask> attackers = tmlm.getAttackerTasks();
+		for (TMLTask attacker: attackers){
+			//System.out.println(attacker.getName());
+			TMLCPrimitiveComponent atcomp = tmlcdp.getPrimitiveComponentByName(attacker.getName().split("__")[1]);
+			//System.out.println("comp " + attacker.getName().split("__")[1]);
+			if (atcomp !=null){
+				//Find activity diagram
+				TMLActivityDiagramPanel tadp = tmlcdp.getTMLActivityDiagramPanel(attacker.getName().split("__")[1]);
+				List<TGComponent> list = tadp.getComponentList();
+				//System.out.println("list " + list);
+				for (TGComponent tgc: list){
+					if (tgc instanceof TMLADWriteChannel){
+						TMLADWriteChannel wr = (TMLADWriteChannel) tgc;
+						if (wr.isAttacker()){
+							//System.out.println("channel " + wr.getChannelName());
+							String channelToAdd = wr.getChannelName();
+
+                            
+							//Find ports to attach
+							List<TMLCPrimitivePort> ports = tmlcdp.tmlctdp.getPortsByName(channelToAdd);
+							//System.out.println("orts " + ports);
+							if (ports.size()!=2){	
+								//throw error
+								//System.out.println("ERROR");
+								continue;
+							}
+
+							//Remove Port Connector
+							tmlcdp.tmlctdp.removeOneConnector(ports.get(0).getTGConnectingPointAtIndex(0));
+
+
+							//Add write port to attacker component
+							TMLCChannelOutPort originPort = new TMLCChannelOutPort(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, atcomp, tmlcdp.tmlctdp);
+                            originPort.commName=channelToAdd;
+							tmlcdp.tmlctdp.addComponent(originPort, atcomp.getX(), atcomp.getY(),true,true);
+
+							//Add fork/join to Component Diagram 
+							TMLCJoin join = new TMLCJoin(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp);
+							tmlcdp.tmlctdp.addComponent(join, atcomp.getX(), atcomp.getY(),false,true);
+					
+							//Add 3 connectors, from each port to the join
+							TMLCPortConnector conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, originPort.getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(1), new Vector<Point>());
+	                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+							if (!ports.get(0).isOrigin()){
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(6), new Vector<Point>());
+                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+							}
+							else {
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(6), new Vector<Point>());
+                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+							}
+
+						}
+					}
+					else if (tgc instanceof TMLADReadChannel){
+						TMLADReadChannel rd = (TMLADReadChannel) tgc;
+						if (rd.isAttacker()){
+							//System.out.println("channel " + rd.getChannelName());
+							String channelToAdd = rd.getChannelName();
+
+                            
+							//Find ports to attach
+							List<TMLCPrimitivePort> ports = tmlcdp.tmlctdp.getPortsByName(channelToAdd);
+							//System.out.println("orts " + ports);
+							if (ports.size()!=2){	
+								//throw error
+								//System.out.println("ERROR");
+								continue;
+							}
+
+							//Remove Port Connector
+							tmlcdp.tmlctdp.removeOneConnector(ports.get(0).getTGConnectingPointAtIndex(0));
+
+
+							//Add write port to attacker component
+							TMLCChannelOutPort destPort = new TMLCChannelOutPort(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, atcomp, tmlcdp.tmlctdp);
+                            destPort.commName=channelToAdd;
+							destPort.isOrigin=false;
+							tmlcdp.tmlctdp.addComponent(destPort, atcomp.getX(), atcomp.getY(),true,true);
+
+							//Add fork/join to Component Diagram 
+							TMLCFork fork = new TMLCFork(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp);
+							tmlcdp.tmlctdp.addComponent(fork, atcomp.getX(), atcomp.getY(),false,true);
+					
+							//Add 3 connectors, from each port to the join
+							TMLCPortConnector conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, destPort.getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(1), new Vector<Point>());
+	                        tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+							if (ports.get(0).isOrigin()){
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(6), new Vector<Point>());
+                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+							}
+							else {
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(6), new Vector<Point>());
+                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+								conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(0), new Vector<Point>());
+                        		tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true);
+							}
+
+						}
+					}
+				}
+			}
+		}
+
+	}
+
     public TMLModeling<TGComponent> translateToTMLModeling(boolean onlyTakenIntoAccount, boolean _resetID) {
         tmlm = new TMLModeling<>(_resetID);
         checkingErrors = new LinkedList<CheckingError> ();
@@ -253,6 +372,9 @@ public class GTMLModeling  {
                 }
 
                 addTMLComponents();
+				//Adapt for attacker
+				TraceManager.addDev("Processing attacker");
+				processAttacker();
                 TraceManager.addDev("Adding channels");
                 addTMLCChannels();
                 TraceManager.addDev("Adding events");
@@ -1818,9 +1940,12 @@ public class GTMLModeling  {
                 listE.addCor(tmlrsequence, tgc);
 
             } else if (tgc instanceof TMLADReadChannel) {
-				if (!tmltask.isAttacker()){
                 // Get the channel
+				TMLADReadChannel rd = (TMLADReadChannel) tgc;
                 channel = tmlm.getChannelByName(getFromTable(tmltask, ((TMLADReadChannel)tgc).getChannelName()));
+				/*if (rd.isAttacker()){
+					channel = tmlm.getChannelByName(getAttackerChannel(((TMLADReadChannel)tgc).getChannelName()));
+				}*/
                 if (channel == null) {
                     if (Conversion.containsStringInList(removedChannels, ((TMLADReadChannel)tgc).getChannelName())) {
                         UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADReadChannel)tgc).getChannelName() + " has been removed because the corresponding channel is not taken into account");
@@ -1836,13 +1961,14 @@ public class GTMLModeling  {
                         ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN);
                         checkingErrors.add(ce);
                     }
+	
                 } else {
                     tmlreadchannel = new TMLReadChannel("read channel", tgc);
                     tmlreadchannel.setNbOfSamples(modifyString(((TMLADReadChannel)tgc).getSamplesValue()));
                     tmlreadchannel.addChannel(channel);
                     //security pattern
-                    if (securityPatterns.get(((TMLADReadChannel)tgc).securityContext)!=null){
-                        tmlreadchannel.securityPattern= securityPatterns.get(((TMLADReadChannel)tgc).securityContext);
+                    if (securityPatterns.get(((TMLADReadChannel)tgc).getSecurityContext())!=null){
+                        tmlreadchannel.securityPattern= securityPatterns.get(((TMLADReadChannel)tgc).getSecurityContext());
                         //NbOfSamples will increase due to extra overhead from MAC
                         int cur=1;
                         try {
@@ -1860,24 +1986,19 @@ public class GTMLModeling  {
                         cur = cur+ add;
                         tmlreadchannel.setNbOfSamples(Integer.toString(cur));
                     }
-                    else if (!((TMLADReadChannel)tgc).securityContext.isEmpty()){
+                    else if (!((TMLADReadChannel)tgc).getSecurityContext().isEmpty()){
                         //Throw error for missing security pattern
-                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADReadChannel)tgc).securityContext + " not found");
+                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADReadChannel)tgc).getSecurityContext() + " not found");
                         ce.setTDiagramPanel(tadp);
                         ce.setTGComponent(tgc);
                         checkingErrors.add(ce);
                     }
+					if (tmltask.isAttacker()){
+						tmlreadchannel.setAttacker(true);						
+					}
                     activity.addElement(tmlreadchannel);
                     ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                     listE.addCor(tmlreadchannel, tgc);
-					}
-                } else {
-					tmlexecc = new TMLExecC("execc", tgc);
-					tmlexecc.setValue("100");
-					tmlexecc.setAction("100");
-					activity.addElement(tmlexecc);
-					((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
-					listE.addCor(tmlexecc, tgc);
 				}
             } else if (tgc instanceof TMLADSendEvent) {
                 event = tmlm.getEventByName(getFromTable(tmltask, ((TMLADSendEvent)tgc).getEventName()));
@@ -2127,7 +2248,7 @@ public class GTMLModeling  {
 
             } else if (tgc instanceof TMLADWriteChannel) {
                 // Get channels
-				if (!tmltask.isAttacker()){
+				TMLADWriteChannel wr = (TMLADWriteChannel) tgc;
                 channels = ((TMLADWriteChannel)tgc).getChannelsByName();
                 boolean error = false;
                 for(int i=0; i<channels.length; i++) {
@@ -2149,7 +2270,8 @@ public class GTMLModeling  {
                             checkingErrors.add(ce);
                         }
                         error = true;
-                    }
+                    
+					}
                 }
                 if (!error) {
                     tmlwritechannel = new TMLWriteChannel("write channel", tgc);
@@ -2158,9 +2280,13 @@ public class GTMLModeling  {
                         channel = tmlm.getChannelByName(getFromTable(tmltask, channels[i]));
                         tmlwritechannel.addChannel(channel);
                     }
+					//if (wr.isAttacker()){
+						//channel = tmlm.getChannelByName(getAttackerChannel(channels[0]));
+                        //tmlwritechannel.addChannel(channel);
+					//}
                     //add sec pattern
-                    if (securityPatterns.get(((TMLADWriteChannel)tgc).securityContext)!=null){
-                        tmlwritechannel.securityPattern= securityPatterns.get(((TMLADWriteChannel)tgc).securityContext);
+                    if (securityPatterns.get(((TMLADWriteChannel)tgc).getSecurityContext())!=null){
+                        tmlwritechannel.securityPattern= securityPatterns.get(((TMLADWriteChannel)tgc).getSecurityContext());
                         int cur = Integer.valueOf(modifyString(((TMLADWriteChannel)tgc).getSamplesValue()));
                         int add = Integer.valueOf(tmlwritechannel.securityPattern.overhead);
                         if (!tmlwritechannel.securityPattern.nonce.equals("")){
@@ -2172,30 +2298,21 @@ public class GTMLModeling  {
                         cur = cur+ add;
                         tmlwritechannel.setNbOfSamples(Integer.toString(cur));
                     }
-                    else if (!((TMLADWriteChannel)tgc).securityContext.isEmpty()){
+                    else if (!((TMLADWriteChannel)tgc).getSecurityContext().isEmpty()){
                         //Throw error for missing security pattern
-                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADWriteChannel)tgc).securityContext + " not found");
+                        UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADWriteChannel)tgc).getSecurityContext() + " not found");
                         ce.setTDiagramPanel(tadp);
                         ce.setTGComponent(tgc);
                         checkingErrors.add(ce);
                     }
+					if (tmltask.isAttacker()){
+						tmlwritechannel.setAttacker(true);
+					}
                     activity.addElement(tmlwritechannel);
                     ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
                     listE.addCor(tmlwritechannel, tgc);
                 }
-			} else {
-					System.out.println("removing write channel");
-					tmlexecc = new TMLExecC("execc", tgc);
-					tmlexecc.setValue("100");
-					tmlexecc.setAction("100");
-					activity.addElement(tmlexecc);
-					((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK);
-					listE.addCor(tmlexecc, tgc);
-				}
-            }    
-			
-
-
+			}
         }
 
         // Interconnection between elements
@@ -2369,7 +2486,6 @@ public class GTMLModeling  {
         tmlm = new TMLModeling<>(true);
         archi = new TMLArchitecture();  //filled by makeArchitecture
         map = new TMLMapping<>(tmlm, archi, false);
-        map.tmlap = tmlap;
         checkingErrors = new LinkedList<CheckingError> ();
         warnings = new LinkedList<CheckingError> ();
         //listE = new CorrespondanceTGElement();
@@ -2382,7 +2498,8 @@ public class GTMLModeling  {
         }
         //TraceManager.addDev("Making mapping");
         makeMapping();  //fills map
-        map.listE = listE;
+		processAttackerScenario();
+        map.setCorrespondanceList(listE);
         //  map.securityPatterns.addAll(securityPatterns.keySet());
         //TraceManager.addDev("Making TMLCPLib");
         makeTMLCPLib();
@@ -2395,13 +2512,41 @@ public class GTMLModeling  {
           }
           autoMapKeys();*/
         removeActionsWithRecords();
-        map.setTMLDesignPanel(this.tmlcdp);
         if (map.firewall){
             tmlap.getMainGUI().gtm.drawFirewall(map);
         }
         return map;     // the data structure map is returned to CheckSyntaxTMLMapping in GTURTLEModeling
     }
 
+	public void processAttackerScenario(){
+		//Scan tasks and activity diagrams for attacker read/write channels
+		for (TMLTask task: tmlm.getTasks()){
+			if (task.isAttacker()){
+				TMLActivity act=task.getActivityDiagram();
+				List<TMLActivityElement> toRemove= new ArrayList<TMLActivityElement>();
+				for (TMLActivityElement elem: act.getElements()){
+					if (elem instanceof TMLActivityElementChannel){
+						TMLActivityElementChannel elemChannel = (TMLActivityElementChannel) elem;
+						if (elemChannel.isAttacker()){
+							TMLChannel chan = elemChannel.getChannel(0);
+							if (!map.isAttackerAccessible(chan)){
+								toRemove.add(elem);
+								//Remove read/writechannel
+							}
+						}
+					}
+				}
+				for (TMLActivityElement elem: toRemove){
+					TMLExecI exec= new TMLExecI("100",elem.getReferenceObject());
+ 					exec.setAction("100");
+                	exec.setValue("100");
+					act.replaceElement(elem, exec);
+				}
+				//System.out.println("activity " +  act.toXML());
+			}
+		}
+
+	}
 
     public TMLCP translateToTMLCPDataStructure( String _cpName )        {
 
@@ -3595,6 +3740,15 @@ public class GTMLModeling  {
         table.put(s1, s2);
     }
 
+	public String getAttackerChannel(String s){
+		for (String channelName: table.keySet()){
+			if (channelName.split("/")[1].equals(s)){
+				return table.get(channelName);
+			}
+		}
+		return "";
+	}
+
     public String getFromTable(TMLTask task, String s) {
         //TraceManager.addDev("TABLE GET: Getting from task=" + task.getName() + " element=" + s);
 
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index ce9792f900900919cec52a788793999e6ce319bf..02140d94dd873c250f5ae58ddaf4b76e0e77f763 100755
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -734,13 +734,18 @@ public class GTURTLEModeling {
     }
     public TMLMapping<TGComponent> drawFirewall(TMLMapping<TGComponent> map){
         System.out.println("DRAWING FIREWALL");
-        TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel();
+		TGComponent comp= map.getTMLModeling().getTGComponent();
+		TMLComponentDesignPanel tmlcdp = (TMLComponentDesignPanel) comp.getTDiagramPanel().tp;
+       // TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel();
         TMLModeling<TGComponent> tmlm = map.getTMLModeling();
+		TMLArchitecture archi = map.getArch();
+		TURTLEPanel tmlap = map.getCorrespondanceList().getTG(archi.getFirstCPU()).getTDiagramPanel().tp;
         TMLActivityDiagramPanel firewallADP = null;
         TMLComponentTaskDiagramPanel tcdp = tmlcdp.tmlctdp;
         if (TraceManager.devPolicy == TraceManager.TO_CONSOLE){
             MainGUI gui = tmlcdp.getMainGUI();
-            int arch = mgui.tabs.indexOf(map.tmlap);
+
+            int arch = mgui.tabs.indexOf(tmlap);
             gui.cloneRenameTab(arch,"firewallArch");
             TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1);
             int ind = gui.tabs.indexOf(tmlcdp);
@@ -813,8 +818,8 @@ public class GTURTLEModeling {
                     outChans.put(chan,rd);
                     toAdd.add(rd);
                     toAdd.add(wr);
-                    map.listE.addCor(rd, (TGComponent) rd.getReferenceObject());
-                    map.listE.addCor(wr, (TGComponent) wr.getReferenceObject());
+                    map.getCorrespondanceList().addCor(rd, (TGComponent) rd.getReferenceObject());
+                    map.getCorrespondanceList().addCor(wr, (TGComponent) wr.getReferenceObject());
                 }
                 tmlm.removeAllChannels();
                 for (TMLChannel c:toAdd){
@@ -930,7 +935,7 @@ public class GTURTLEModeling {
 
                 TMLStartState start = new TMLStartState("start", adStart);
                 act.setFirst(start);
-                map.listE.addCor(start,adStart);
+                map.getCorrespondanceList().addCor(start,adStart);
 
                 //Add infinite loop
 
@@ -946,7 +951,7 @@ public class GTURTLEModeling {
                 TMLChoice choice = new TMLChoice("chooseChannel", adChoice);
                 act.addElement(choice);
                 loop.addNext(choice);
-                map.listE.addCor(choice,adChoice);
+                map.getCorrespondanceList().addCor(choice,adChoice);
 
 
 
@@ -1000,7 +1005,7 @@ public class GTURTLEModeling {
         }
         //Redo all reference objects
 
-        map.listE.useDIPLOIDs();
+        map.getCorrespondanceList().useDIPLOIDs();
         return map;
     }
 
@@ -1059,12 +1064,15 @@ public class GTURTLEModeling {
             return;
         }
         //Clone diagrams
-
-        int arch = gui.tabs.indexOf(tmap.tmlap);
+		TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp;
+        int arch = gui.tabs.indexOf(tmlap);
         gui.cloneRenameTab(arch,"hsm");
         TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1);
 
-        TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel();
+		TGComponent tgcomp= tmap.getTMLModeling().getTGComponent();
+		TMLComponentDesignPanel tmlcdp= (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp;
+
+//        TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel();
         int ind = gui.tabs.indexOf(tmlcdp);
         String tabName = gui.getTitleAt(tmlcdp);
         gui.cloneRenameTab(ind, name);
@@ -1137,7 +1145,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADWriteChannel){
                         TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
-                        if (writeChannel.securityContext.equals("")){
+                        if (writeChannel.getSecurityContext().equals("")){
                             String nonceName="";
                             int type=-1;
                             if (nonSecChans.contains(compName+"__"+writeChannel.getChannelName()+"_chData")){
@@ -1165,7 +1173,7 @@ public class GTURTLEModeling {
                             fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                             if (fromStart!=null){
                                 channelInstances.add(tg);
-                                SecurityPattern sp = tmap.getSecurityPatternByName(writeChannel.securityContext);
+                                SecurityPattern sp = tmap.getSecurityPatternByName(writeChannel.getSecurityContext());
                                 int type=-1;
                                 if (sp.type.equals("Symmetric Encryption")){
                                     type=HSMChannel.SENC;
@@ -1180,7 +1188,7 @@ public class GTURTLEModeling {
                                     type=HSMChannel.NONCE;
                                 }
                                 HSMChannel ch = new HSMChannel(writeChannel.getChannelName(), compName, type);
-                                ch.securityContext=writeChannel.securityContext;
+                                ch.securityContext=writeChannel.getSecurityContext();
                                 compChannels.put(writeChannel.getChannelName(),ch);
                                 //chanNames.add(writeChannel.getChannelName()+compName);
                             }
@@ -1188,7 +1196,7 @@ public class GTURTLEModeling {
                     }
                     if (tg instanceof TMLADReadChannel){
                         TMLADReadChannel readChannel = (TMLADReadChannel) tg;
-                        if (readChannel.securityContext.equals("")){
+                        if (readChannel.getSecurityContext().equals("")){
                             fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                             if (fromStart!=null){
                                 if(nonSecChans.contains(compName+"__"+readChannel.getChannelName()+"_chData") || nonAuthChans.contains(compName+"__"+readChannel.getChannelName())){
@@ -1207,7 +1215,7 @@ public class GTURTLEModeling {
                             if (fromStart!=null){
                                 channelInstances.add(tg);
                                 HSMChannel ch = new HSMChannel(readChannel.getChannelName(), compName, HSMChannel.DEC);
-                                ch.securityContext=readChannel.securityContext;
+                                ch.securityContext=readChannel.getSecurityContext();
                                 compChannels.put(readChannel.getChannelName(),ch);
                             }
                         }
@@ -1279,7 +1287,7 @@ public class GTURTLEModeling {
                     TMLADWriteChannel writeChannel = (TMLADWriteChannel) chan;
                     chanName=writeChannel.getChannelName();
                     HSMChannel ch = hsmChannels.get(chanName);
-                    writeChannel.securityContext = ch.securityContext;
+                    writeChannel.setSecurityContext(ch.securityContext);
                     xpos = chan.getX();
                     ypos = chan.getY();
                     fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0));
@@ -1305,7 +1313,7 @@ public class GTURTLEModeling {
                     //Add write channel operator
                     wr = new TMLADWriteChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     wr.setChannelName("data_"+chanName+"_"+compName);
-                    wr.securityContext = ch.securityContext;
+                    wr.setSecurityContext(ch.securityContext);
                     tad.addComponent(wr, xpos, ypos+yShift, false,true);
 
 
@@ -1327,7 +1335,7 @@ public class GTURTLEModeling {
                     yShift+=60;
                     TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     rd.setChannelName("retData_"+chanName+"_"+compName);
-                    rd.securityContext = ch.securityContext;
+                    rd.setSecurityContext(ch.securityContext);
                     tad.addComponent(rd, xpos, ypos+yShift, false,true);
 
                     fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
@@ -1362,7 +1370,7 @@ public class GTURTLEModeling {
                     TMLADReadChannel readChannel = (TMLADReadChannel) chan;
                     chanName=readChannel.getChannelName();
                     HSMChannel ch= hsmChannels.get(chanName);
-                    readChannel.securityContext = ch.securityContext;
+                    readChannel.setSecurityContext(ch.securityContext);
                     xpos = chan.getX()+10;
                     ypos = chan.getY();
                     fromStart = tad.findTGConnectorStartingAt(chan.getTGConnectingPointAtIndex(1));
@@ -1404,7 +1412,7 @@ public class GTURTLEModeling {
                     //Add write channel operator
                     TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     wr.setChannelName("data_"+chanName+"_"+compName);
-                    wr.securityContext = ch.securityContext;
+                    wr.setSecurityContext(ch.securityContext);
                     tad.addComponent(wr, xpos, ypos+yShift, false,true);
 
 
@@ -1419,7 +1427,7 @@ public class GTURTLEModeling {
                     yShift+=60;
                     TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     rd.setChannelName("retData_"+chanName+"_"+compName);
-                    rd.securityContext = ch.securityContext;
+                    rd.setSecurityContext(ch.securityContext);
                     tad.addComponent(rd, xpos, ypos+yShift, false,true);
 
                     fromStart=new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
@@ -1509,7 +1517,7 @@ public class GTURTLEModeling {
                     }
                     TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     rd.setChannelName("data_"+chan+"_"+hsmChannels.get(chan).task);
-                    rd.securityContext = ch.securityContext;
+                    rd.setSecurityContext(ch.securityContext);
                     tad.addComponent(rd, xc,300,false,true);
                     //Connect choice and readchannel
                     fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
@@ -1520,7 +1528,7 @@ public class GTURTLEModeling {
                     TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     wr.setChannelName("retData_"+chan+"_"+hsmChannels.get(chan).task);
                     tad.addComponent(wr, xc, 600,false,true);
-                    wr.securityContext = ch.securityContext;
+                    wr.setSecurityContext(ch.securityContext);
 
 
                     if (hsmChannels.get(chan).secType==HSMChannel.DEC){
@@ -1590,7 +1598,7 @@ public class GTURTLEModeling {
                     HSMChannel ch = hsmChannels.get(chan);
                     TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     rd.setChannelName("data_"+chan+"_"+hsmChannels.get(chan).task);
-                    rd.securityContext = ch.securityContext;
+                    rd.setSecurityContext(ch.securityContext);
                     tad.addComponent(rd, xc,300,false,true);
                     //Connect choice and readchannel
 
@@ -1603,7 +1611,7 @@ public class GTURTLEModeling {
                     TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                     wr.setChannelName("retData_"+chan+"_"+hsmChannels.get(chan).task);
                     tad.addComponent(wr, xc, 600,false,true);
-                    wr.securityContext = ch.securityContext;
+                    wr.setSecurityContext(ch.securityContext);
 
 
                     if (hsmChannels.get(chan).secType==HSMChannel.DEC){
@@ -1739,7 +1747,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADReadChannel){
                         TMLADReadChannel readChannel = (TMLADReadChannel) tg;
-                        if (readChannel.getChannelName().equals(chan) && readChannel.securityContext.equals("")){
+                        if (readChannel.getChannelName().equals(chan) && readChannel.getSecurityContext().equals("")){
                             fromStart = tad.findTGConnectorStartingAt(tg.getTGConnectingPointAtIndex(1));
                             if (fromStart!=null){
                                 channelInstances.add(tg);
@@ -1749,7 +1757,7 @@ public class GTURTLEModeling {
                 }
                 for (TGComponent chI: channelInstances){
                     TMLADReadChannel readChannel = (TMLADReadChannel) chI;
-                    readChannel.securityContext=ch.securityContext;
+                    readChannel.setSecurityContext(ch.securityContext);
                     xpos = chI.getX();
                     ypos = chI.getY()+10;
                     fromStart = tad.findTGConnectorStartingAt(chI.getTGConnectingPointAtIndex(1));
@@ -1794,7 +1802,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADWriteChannel){
                         TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
-                        if (writeChannel.getChannelName().equals(chan) && writeChannel.securityContext.equals("")){
+                        if (writeChannel.getChannelName().equals(chan) && writeChannel.getSecurityContext().equals("")){
                             fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                             if (fromStart!=null){
                                 channelInstances.add(tg);
@@ -1804,7 +1812,7 @@ public class GTURTLEModeling {
                 }
                 for (TGComponent chI: channelInstances){
                     TMLADWriteChannel writeChannel = (TMLADWriteChannel) chI;
-                    writeChannel.securityContext=ch.securityContext;
+                    writeChannel.setSecurityContext(ch.securityContext);
                     xpos = chI.getX();
                     ypos = chI.getY()-10;
                     fromStart = tad.findTGConnectorEndingAt(chI.getTGConnectingPointAtIndex(0));
@@ -1927,13 +1935,16 @@ public class GTURTLEModeling {
 
     }
 
+
+
     public TMLMapping<TGComponent> autoSecure(MainGUI gui, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth){
         //TODO add more options
         //
         if (tmap==null){
             return null;
         }
-        int arch = gui.tabs.indexOf(tmap.tmlap);
+		TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp;
+        int arch = gui.tabs.indexOf(tmlap);
         gui.cloneRenameTab(arch,"enc");
         TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1);
         
@@ -1952,7 +1963,8 @@ public class GTURTLEModeling {
         if (tmap==null){
             return null;
         }
-        int arch = gui.tabs.indexOf(tmap.tmlap);
+		TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp;
+        int arch = gui.tabs.indexOf(tmlap);
         gui.cloneRenameTab(arch,"enc");
         TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1);
         return autoSecure(gui,"enc", tmap,newarch,encComp, overhead,decComp,true,false,false);
@@ -1962,7 +1974,8 @@ public class GTURTLEModeling {
         if (tmap==null){
             return null;
         }
-        int arch = gui.tabs.indexOf(tmap.tmlap);
+		TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp;
+        int arch = gui.tabs.indexOf(tmlap);
         gui.cloneRenameTab(arch,"enc");
         TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1);
         return autoSecure(gui,"enc", tmap,newarch,encComp, overhead,decComp,autoConf,autoWeakAuth, autoStrongAuth);
@@ -2056,8 +2069,9 @@ public class GTURTLEModeling {
         }
 
         //Create clone of Component Diagram + Activity diagrams to secure
-
-        TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel();
+		TGComponent tgcomp= map.getTMLModeling().getTGComponent();
+		TMLComponentDesignPanel tmlcdp= (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp;
+//        TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel();
         int ind = gui.tabs.indexOf(tmlcdp);
         if (ind==-1){
             TraceManager.addDev("No Component Design Panel");
@@ -2066,7 +2080,7 @@ public class GTURTLEModeling {
         String tabName = gui.getTitleAt(tmlcdp);
         gui.cloneRenameTab(ind, name);
         TMLComponentDesignPanel t = (TMLComponentDesignPanel) gui.tabs.get(gui.tabs.size()-1);
-        map.setTMLDesignPanel(t);
+
         TMLComponentTaskDiagramPanel tcdp = t.tmlctdp;
         //Create clone of architecture panel and map tasks to it
         newarch.renameMapping(tabName, tabName+"_"+name);
@@ -2100,7 +2114,7 @@ public class GTURTLEModeling {
             for (TGComponent tg:tad.getComponentList()){
                 if (tg instanceof TMLADWriteChannel){
                     TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
-                    if (writeChannel.securityContext.equals("")){
+                    if (writeChannel.getSecurityContext().equals("")){
 
                         TMLChannel chan = tmlmodel.getChannelByName(tabName+"__"+writeChannel.getChannelName());
                         //System.out.println("channel " + chan);
@@ -2209,7 +2223,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADWriteChannel){
                         TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
-                        if (writeChannel.getChannelName().equals(channel) && writeChannel.securityContext.equals("")){
+                        if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")){
 
                             if (fromStart!=null){
                                 channelInstances.add(tg);
@@ -2237,7 +2251,7 @@ public class GTURTLEModeling {
                         else {
                             rd.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         }
-                        rd.securityContext = "nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1];
+                        rd.setSecurityContext("nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         tad.addComponent(rd, xpos, ypos+yShift, false,true);
                         fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
                         fromStart=new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
@@ -2271,9 +2285,9 @@ public class GTURTLEModeling {
                         if (tg instanceof TMLADWriteChannel){
                             TMLADWriteChannel wChannel = (TMLADWriteChannel) tg;
                             TraceManager.addDev("Inspecting write channel " + wChannel.getChannelName());
-                            if (channel.equals(wChannel.getChannelName()) && wChannel.securityContext.equals("")){
+                            if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")){
                                 TraceManager.addDev("Securing write channel " + wChannel.getChannelName());
-                                wChannel.securityContext = "autoEncrypt_"+wChannel.getChannelName();
+                                wChannel.setSecurityContext("autoEncrypt_"+wChannel.getChannelName());
 
                             }
                         }
@@ -2295,7 +2309,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADWriteChannel){
                         TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
-                        if (writeChannel.getChannelName().equals(channel) && writeChannel.securityContext.equals("")){
+                        if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")){
                             xpos = tg.getX();
                             ypos = tg.getY();
                             fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
@@ -2327,7 +2341,7 @@ public class GTURTLEModeling {
                         else {
                             rd.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         }
-                        rd.securityContext = "nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1];
+                        rd.setSecurityContext("nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         tad.addComponent(rd, xpos, ypos+yShift, false,true);
                         fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
                         fromStart=new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
@@ -2364,9 +2378,9 @@ public class GTURTLEModeling {
                         if (tg instanceof TMLADWriteChannel){
                             TMLADWriteChannel wChannel = (TMLADWriteChannel) tg;
                             TraceManager.addDev("Inspecting write channel " + wChannel.getChannelName());
-                            if (channel.equals(wChannel.getChannelName()) && wChannel.securityContext.equals("")){
+                            if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")){
                                 TraceManager.addDev("Securing write channel " + wChannel.getChannelName());
-                                wChannel.securityContext = "autoEncrypt_"+wChannel.getChannelName();
+                                wChannel.setSecurityContext("autoEncrypt_"+wChannel.getChannelName());
                                 tad.repaint();
                             }
                         }
@@ -2388,7 +2402,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADReadChannel){
                         TMLADReadChannel readChannel = (TMLADReadChannel) tg;
-                        if (readChannel.getChannelName().equals(channel) && readChannel.securityContext.equals("")){
+                        if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")){
                             fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                             if (fromStart!=null){
                                 channelInstances.add(tg);
@@ -2410,7 +2424,7 @@ public class GTURTLEModeling {
 
                     TMLADReadChannel readChannel = (TMLADReadChannel) comp;
                     TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                    readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName();
+                    readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName());
                     tad.repaint();
 
                     TMLADWriteChannel wr = new TMLADWriteChannel(0, 0, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
@@ -2439,7 +2453,7 @@ public class GTURTLEModeling {
                             wr.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         }
                         //send the nonce along the channel
-                        wr.securityContext = "nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1];
+                        wr.setSecurityContext("nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         tad.addComponent(wr,xpos,ypos+yShift,false,true);
                         wr.makeValue();
                         TGConnector tmp =new TGConnectorTMLAD(wr.getX(), wr.getY()+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null,tad,nonce.getTGConnectingPointAtIndex(1), wr.getTGConnectingPointAtIndex(0), new Vector<Point>());
@@ -2475,9 +2489,9 @@ public class GTURTLEModeling {
                         if (tg instanceof TMLADReadChannel){
                             readChannel = (TMLADReadChannel) tg;
                             TraceManager.addDev("Inspecting read channel " + readChannel.getChannelName());
-                            if (channel.equals(readChannel.getChannelName()) && readChannel.securityContext.equals("")){
+                            if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")){
                                 TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                                readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName();
+                                readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName());
 
                             }
                         }
@@ -2505,7 +2519,7 @@ public class GTURTLEModeling {
                 for (TGComponent tg: tad.getComponentList()){
                     if (tg instanceof TMLADReadChannel){
                         readChannel = (TMLADReadChannel) tg;
-                        if (readChannel.getChannelName().equals(channel) && readChannel.securityContext.equals("")){
+                        if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")){
                             fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                             if (fromStart!=null){
                                 channelInstances.add(tg);
@@ -2546,7 +2560,7 @@ public class GTURTLEModeling {
                             wr.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         }
                         //send the nonce along the channel
-                        wr.securityContext = "nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1];
+                        wr.setSecurityContext("nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]);
                         tad.addComponent(wr,xpos,ypos+yShift,false,true);
                         wr.makeValue();
                         TGConnector tmp =new TGConnectorTMLAD(wr.getX(), wr.getY()+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null,tad,nonce.getTGConnectingPointAtIndex(1), wr.getTGConnectingPointAtIndex(0), new Vector<Point>());
@@ -2568,7 +2582,7 @@ public class GTURTLEModeling {
                     //Now add the decrypt operator
                     yShift=40;
                     TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                    readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName();
+                    readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName());
                     tad.repaint();
                     //Add decryption operator if it does not already exist
                     xpos = readChannel.getX();
@@ -2588,9 +2602,9 @@ public class GTURTLEModeling {
                         if (tg instanceof TMLADReadChannel){
                             readChannel = (TMLADReadChannel) tg;
                             TraceManager.addDev("Inspecting read channel " + readChannel.getChannelName());
-                            if (channel.equals(readChannel.getChannelName()) && readChannel.securityContext.equals("")){
+                            if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")){
                                 TraceManager.addDev("Securing read channel " + readChannel.getChannelName());
-                                readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName();
+                                readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName());
 
                             }
                         }
@@ -2627,6 +2641,8 @@ public class GTURTLEModeling {
         map.setTMLModeling(newmodel);
         return map;
     }
+
+
     public boolean securePath(TMLMapping<TGComponent> map, TMLTask t1, TMLTask t2){
         //Check if a path between two tasks is secure
         boolean secure=true;
@@ -2772,7 +2788,7 @@ public class GTURTLEModeling {
                         else {
                             System.out.println("Can't map key to memory for " + sp.name + " on task " + t.getName());
                             UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Cannot map key in memory for " + sp.name + " on task " + t.getName());
-                            ce.setTDiagramPanel(tmap.tmlap.tmlap);
+                            ce.setTDiagramPanel(tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel());
                             ce.setTGComponent(null);
                             checkingErrors.add(ce);
                         }
@@ -2813,7 +2829,7 @@ public class GTURTLEModeling {
         else if (tmlm!=null){
             //Generate default mapping
             tmap = tmlm.getDefaultMapping();
-            tmap.setTMLDesignPanel((TMLComponentDesignPanel)mgui.getCurrentTURTLEPanel());
+          
             t2a=new TML2Avatar(tmap,false,true);
             avatarspec = t2a.generateAvatarSpec(loopLimit);
         }
diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java
index 54cb74a400525e6cd35b5a394a1f26ef4d9aa95c..fe7f83a8485c0dc0d8bb649348d563edf8db4094 100644
--- a/src/main/java/ui/MainGUI.java
+++ b/src/main/java/ui/MainGUI.java
@@ -3601,9 +3601,29 @@ public  class MainGUI implements ActionListener, WindowListener, KeyListener, Pe
         if (!(tp instanceof TMLComponentDesignPanel)) { return null;}
         TMLComponentDesignPanel tmlcomp = (TMLComponentDesignPanel)tp;
         String name =  getCurrentTDiagramPanel().getName();
+		System.out.println("Name " + name);
         return tmlcomp.getAllOutChannels(name);
     }
 
+
+    public String[] getAllCompOutChannels() {   //this routine can be called only from a TMLComponentDesignPanel
+		List<String> chans = new ArrayList<String>();
+        TURTLEPanel tp = getCurrentTURTLEPanel();
+        if (tp == null) { return null;}
+        if (!(tp instanceof TMLComponentDesignPanel)) { return null;}
+        TMLComponentDesignPanel tmlcomp = (TMLComponentDesignPanel)tp;
+		return tmlcomp.getCompOutChannels();
+    }
+
+    public String[] getAllCompInChannels() {   //this routine can be called only from a TMLComponentDesignPanel
+        TURTLEPanel tp = getCurrentTURTLEPanel();
+        if (tp == null) { return null;}
+        if (!(tp instanceof TMLComponentDesignPanel)) { return null;}
+        TMLComponentDesignPanel tmlcomp = (TMLComponentDesignPanel)tp;
+		return tmlcomp.getCompInChannels();		
+    }
+
+
     public String[] getAllInChannels() {    //this routine can be called only from a TMLComponentDesignPanel
         TURTLEPanel tp = getCurrentTURTLEPanel();
         if (tp == null) {return null;}
diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java
index e3bae696c2d6f08d4f91c3d3f571ea18bdd4f82c..6243f0997d1d861c684930dec30c32831dd7f4d3 100755
--- a/src/main/java/ui/TDiagramPanel.java
+++ b/src/main/java/ui/TDiagramPanel.java
@@ -2147,6 +2147,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
                     actionOnRemove(t);
                     tgcon.getTGConnectingPointP1().setFree(true);
                     tgcon.getTGConnectingPointP2().setFree(true);
+					System.out.println("removing...");
                     TraceManager.addDev("Removed one connector!");
                     for(int k=0; k<tgcon.getNbConnectingPoint(); k++)
                         removeOneConnector(tgcon.tgconnectingPointAtIndex(k));
diff --git a/src/main/java/ui/TMLComponentDesignPanel.java b/src/main/java/ui/TMLComponentDesignPanel.java
index dc16ff5937c9c3d17f1775dc95049d5a9d01cb44..28b63c05cdd61ce955eb91a0c32c8e3bd7763c9a 100755
--- a/src/main/java/ui/TMLComponentDesignPanel.java
+++ b/src/main/java/ui/TMLComponentDesignPanel.java
@@ -94,6 +94,8 @@ public class TMLComponentDesignPanel extends TURTLEPanel {
         tabbedPane.setTabLayoutPolicy( JTabbedPane.SCROLL_TAB_LAYOUT );
     }
 
+	
+
     public TMLActivityDiagramPanel getTMLActivityDiagramPanel(String _name) {
         TMLActivityDiagramPanel tmladp;
         for(int i=1; i<panels.size(); i++) {
@@ -193,6 +195,14 @@ public class TMLComponentDesignPanel extends TURTLEPanel {
         return tmlctdp.getPrimitiveComponentByName(_name);
     }
 
+	public String[] getCompOutChannels(){
+		return tmlctdp.getCompOutChannels();
+	}
+
+	public String[] getCompInChannels(){
+		return tmlctdp.getCompInChannels();
+	}
+
     public java.util.List<String> getAllTMLCommunicationNames(String _name) {
         return tmlctdp.getAllTMLCommunicationNames(_name);
     }
diff --git a/src/main/java/ui/tmlad/TMLADReadChannel.java b/src/main/java/ui/tmlad/TMLADReadChannel.java
index 3bedd32867fdcafbfe1b594c9f86659c221ca2c3..c3d37e110701516b909406a98abb031b424931d7 100755
--- a/src/main/java/ui/tmlad/TMLADReadChannel.java
+++ b/src/main/java/ui/tmlad/TMLADReadChannel.java
@@ -79,7 +79,9 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
 
     protected String channelName = "ch";
     protected String nbOfSamples= "1";
-    public String securityContext ="";
+    protected String securityContext ="";
+	protected boolean isAttacker=false;
+
     protected int stateOfError = 0; // Not yet checked
 
     public final static int NOT_VERIFIED = 0;
@@ -169,8 +171,12 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
         g.drawLine(x, y+height, x+width, y+height);
         g.drawLine(x, y, x+linebreak, y+height/2);
         g.drawLine(x, y+height, x+linebreak, y+height/2);
-
-        g.drawString("chl", x+(width-w) / 2, y+textY0);
+		if (isAttacker){
+	        g.drawString("attack", x+(width-w) / 2, y+textY0);	
+		}
+		else {
+	        g.drawString("chl", x+(width-w) / 2, y+textY0);
+		}
         g.drawString(value, x + linebreak + textX0, y + textY1);
 	
 	if (!securityContext.equals("")){
@@ -258,25 +264,32 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
 
     public boolean editOndoubleClick(JFrame frame) {
 
-	String [] labels = new String[3];
-        String [] values = new String[3];
+		String [] labels = new String[4];
+        String [] values = new String[4];
         labels[0] = "Channel name";
         values[0] = channelName;
-	labels[1] = "Nb of samples";
+		labels[1] = "Nb of samples";
         values[1] = nbOfSamples;
         labels[2] = "Security Pattern";
-	values[2] = securityContext;
+		values[2] = securityContext;
+		labels[3] = "Attacker?";
+		values[3] = isAttacker ? "Yes" : "No";
 	
         ArrayList<String []> help = new ArrayList<String []>();
-	String[] allInChannels = tdp.getMGUI().getAllInChannels();
-	help.add(allInChannels);
-	help.add(null);
-	help.add(tdp.getMGUI().getCurrentCryptoConfig());
-
+		String[] allInChannels = tdp.getMGUI().getAllInChannels();
+		System.out.println("isAttacker "+ isAttacker);
+		if (isAttacker){
+			allInChannels = tdp.getMGUI().getAllCompInChannels();
 
+		}
+		help.add(allInChannels);
+		help.add(null);
+		help.add(tdp.getMGUI().getCurrentCryptoConfig());
+		String[] choice = new String[]{"Yes", "No"};
+		help.add(choice);
        // JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples);
 
-	JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 3, labels, values, help);
+	JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 4, labels, values, help);
         //jdms.setSize(600, 300);
         GraphicLib.centerOnParent(jdms, 600, 300);
         jdms.setVisible( true ); // blocked until dialog has been closed
@@ -284,7 +297,8 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
         if (jdms.hasBeenSet() && (jdms.hasValidString(0))) {
             channelName = jdms.getString(0);
             nbOfSamples = jdms.getString(1);
-	    securityContext = jdms.getString(2);
+		    securityContext = jdms.getString(2);
+			isAttacker=jdms.getString(3).equals("Yes");
             makeValue();
             return true;
         }
@@ -316,6 +330,8 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
         sb.append(getSamplesValue());
         sb.append("\" secPattern=\"");
         sb.append(securityContext);
+		sb.append("\" isAttacker=\"");
+        sb.append(isAttacker ? "Yes": "No");
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -347,6 +363,7 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
                                 channelName = elt.getAttribute("channelName");
                                 nbOfSamples = elt.getAttribute("nbOfSamples");
                                 securityContext = elt.getAttribute("secPattern");
+								isAttacker = elt.getAttribute("isAttacker").equals("Yes");
                             }
                         }
                     }
@@ -360,6 +377,18 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che
     }
 
 
+	public String getSecurityContext(){
+		return securityContext;
+	}
+
+	public void setSecurityContext(String sc){
+		securityContext=sc;
+	}
+
+	public boolean isAttacker(){
+		return isAttacker;
+	}
+
     public int getType() {
         return TGComponentManager.TMLAD_READ_CHANNEL;
     }
diff --git a/src/main/java/ui/tmlad/TMLADWriteChannel.java b/src/main/java/ui/tmlad/TMLADWriteChannel.java
index 6bd275a8387cb2ce7d1244e7bdd48a043c108d18..a15f95ec63e7fb7d3d6a224397d45d65f8684b83 100755
--- a/src/main/java/ui/tmlad/TMLADWriteChannel.java
+++ b/src/main/java/ui/tmlad/TMLADWriteChannel.java
@@ -83,7 +83,9 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
 
     protected String channelName = "ch";
     protected String nbOfSamples= "1";
-    public String securityContext = "";
+    protected String securityContext = "";
+	protected boolean isAttacker = false; 
+
     protected int stateOfError = 0; // Not yet checked
     
     public final static int NOT_VERIFIED = 0;
@@ -168,8 +170,12 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
         g.drawLine(x, y, x, y+height);
         g.drawLine(x+width-linebreak, y, x+width, y+height/2);
         g.drawLine(x+width-linebreak, y+height, x+width, y+height/2);
-
-        g.drawString("chl", x+(width-w) / 2, y);
+		if (isAttacker){
+	        g.drawString("attack", x+(width-w) / 2, y);
+		}
+		else {
+	        g.drawString("chl", x+(width-w) / 2, y);
+		}
         g.drawString(value, x + (width - w) / 2 , y + textY);
 	if (!securityContext.equals("")){
 	    g.drawString("sec:"+securityContext, x+3*width/4, y+height+textY);
@@ -271,23 +277,30 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
     }
 
     public boolean editOndoubleClick(JFrame frame) {
-    	String [] labels = new String[3];
-        String [] values = new String[3];
+    	String [] labels = new String[4];
+        String [] values = new String[4];
         labels[0] = "Channel name";
         values[0] = channelName;
         labels[1] = "Nb of samples";
         values[1] = nbOfSamples;
         labels[2] = "Security Pattern";
         values[2] = securityContext;
-	
+		labels[3] = "Attacker?";
+		values[3] = isAttacker ? "Yes" : "No";
         ArrayList<String []> help = new ArrayList<String []>();
 		String[] allOutChannels = tdp.getMGUI().getAllOutChannels();
+		System.out.println("isAttacker "+ isAttacker);
+		if (isAttacker){
+			allOutChannels =tdp.getMGUI().getAllCompOutChannels();
+		}
+		String[] choice = new String[]{"Yes", "No"};
 		help.add(allOutChannels);
 		help.add(null);
 		help.add(tdp.getMGUI().getCurrentCryptoConfig());
+		help.add(choice);
 
         //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples);
-		JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 3, labels, values, help);
+		JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 4, labels, values, help);
         //jdms.setSize(600, 300);
         GraphicLib.centerOnParent(jdms, 600, 300);
         jdms.setVisible( true ); // blocked until dialog has been closed
@@ -295,8 +308,8 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
         if (jdms.hasBeenSet() && (jdms.hasValidString(0))) {
             channelName = jdms.getString(0);
             nbOfSamples = jdms.getString(1);
-	    securityContext = jdms.getString(2);
-
+		    securityContext = jdms.getString(2);
+			isAttacker=jdms.getString(3).equals("Yes");
             makeValue();
             return true;
         }
@@ -313,6 +326,8 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
         sb.append(getSamplesValue());
         sb.append("\" secPattern=\"");
         sb.append(securityContext);
+		sb.append("\" isAttacker=\"");
+        sb.append(isAttacker ? "Yes": "No");
         sb.append("\" />\n");
         sb.append("</extraparam>\n");
         return new String(sb);
@@ -344,6 +359,7 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
                                 channelName = elt.getAttribute("channelName");
                                 nbOfSamples = elt.getAttribute("nbOfSamples");
                                 securityContext = elt.getAttribute("secPattern");
+								isAttacker = elt.getAttribute("isAttacker").equals("Yes");
                             }
                         }
                     }
@@ -375,6 +391,20 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch
 	nbOfSamples=sp;
 	makeValue();
     }
+
+	public String getSecurityContext(){
+		return securityContext;
+	}
+
+	public void setSecurityContext(String sc){
+		securityContext=sc;
+	}
+
+
+	public boolean isAttacker(){
+		return isAttacker;
+	}
+
     public void setStateAction(int _stateAction) {
         stateOfError = _stateAction;
     }
diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java b/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java
index 5694e357c1e93fd23cfdae2d0a2920f65eaf8a5c..2ad6c2408ebea30c19867518afe0efbd90d76046 100755
--- a/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java
+++ b/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java
@@ -201,7 +201,7 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
             iconIsDrawn = false;
         }
 		if (isAttacker){
-			g.drawImage(IconManager.imgic8.getImage(), x + width - iconSize - textX, y + 2*textX, null);
+			g.drawImage(IconManager.imgic7008.getImage(), x + width - iconSize - textX, y + 2*textX, null);
 		}
 
         // Attributes
@@ -497,6 +497,9 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
         //TraceManager.addDev("Loading extra params of " + value);
         //value = "";
         StringBuffer sb = new StringBuffer("<extraparam>\n");
+			sb.append("<Data isAttacker=\"");
+            sb.append(isAttacker() ? "Yes": "No");
+	        sb.append("\" />\n");
         for(int i=0; i<myAttributes.size(); i++) {
             //TraceManager.addDev("Attribute:" + i);
             a = myAttributes.get (i);
@@ -541,6 +544,9 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp
                         //TraceManager.addDev(n2);
                         if (n2.getNodeType() == Node.ELEMENT_NODE) {
                             elt = (Element) n2;
+							if (elt.getTagName().equals("Data")) {
+                                isAttacker = elt.getAttribute("isAttacker").equals("Yes");
+							}
                             if (elt.getTagName().equals("Attribute")) {
                                 //TraceManager.addDev("Analyzing attribute");
                                 access = Integer.decode(elt.getAttribute("access")).intValue();
diff --git a/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java b/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java
index cf009a9a305ef17efeccfca9bf4797c66940c1a1..5e367a054b60a5ccc8ca606e2eb82eca4d4744da 100755
--- a/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java
+++ b/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java
@@ -145,6 +145,29 @@ public class TMLComponentTaskDiagramPanel extends TDiagramPanel implements TDPWi
         return true;
     }
 
+	public List<TMLCPrimitivePort> getPortsByName(String name){
+		List<TMLCPrimitivePort> ports = new ArrayList<TMLCPrimitivePort>();
+		for (TGComponent tgc : componentList){
+		
+			if (tgc instanceof TMLCPrimitiveComponent){
+				TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) tgc;
+				List<TMLCPrimitivePort> cps = comp.getAllChannelsOriginPorts();
+				for (TMLCPrimitivePort port : cps){
+					if (port.commName.equals(name)){
+						ports.add(port);
+					}
+				}
+				cps = comp.getAllChannelsDestinationPorts();
+				for (TMLCPrimitivePort port : cps){
+					if (port.commName.equals(name)){
+						ports.add(port);
+					}
+				}
+			}
+		}
+		return ports;
+	}
+
     public boolean actionOnValueChanged(TGComponent tgc) {
         //System.out.println("Action on value changed on component:" + tgc);
         if (tgc instanceof TMLCPrimitiveComponent) {
@@ -445,6 +468,8 @@ public class TMLComponentTaskDiagramPanel extends TDiagramPanel implements TDPWi
         return al;
     }
 
+
+
     public void getAllPortsConnectedTo( List<TGComponent> ll, TMLCPrimitivePort _port) {
         List<TGComponent> components = getMGUI().getAllTMLComponents();
         Iterator<TGComponent> iterator = components.listIterator();
@@ -618,6 +643,55 @@ public class TMLComponentTaskDiagramPanel extends TDiagramPanel implements TDPWi
         }
     }
 
+	public String[] getCompOutChannels(){
+		List<String> chls = new ArrayList<String>();
+		TGComponent tgc;
+        Iterator<TGComponent> iterator = componentList.listIterator();
+        // List<String> list = new ArrayList<String>();
+        TMLCPrimitiveComponent tmp;
+
+        while(iterator.hasNext()) {
+            tgc = iterator.next();
+            if (tgc instanceof TMLCPrimitiveComponent) {
+				TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) tgc;
+        		List<TMLCPrimitivePort> ll = comp.getAllChannelsOriginPorts();
+				Iterator<TMLCPrimitivePort> ite = ll.listIterator();
+				while(ite.hasNext()) {
+					TMLCPrimitivePort port = ite.next();
+            		chls.add(port.getPortName());
+        		}
+            }
+        }
+		String[] chlArray = new String[chls.size()];
+		chlArray = chls.toArray(chlArray);
+		return chlArray;
+	}
+
+	public String[] getCompInChannels(){
+		List<String> chls = new ArrayList<String>();
+		TGComponent tgc;
+        Iterator<TGComponent> iterator = componentList.listIterator();
+        // List<String> list = new ArrayList<String>();
+        TMLCPrimitiveComponent tmp;
+
+        while(iterator.hasNext()) {
+            tgc = iterator.next();
+            if (tgc instanceof TMLCPrimitiveComponent) {
+				TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) tgc;
+        		List<TMLCPrimitivePort> ll = comp.getAllChannelsDestinationPorts();
+				Iterator<TMLCPrimitivePort> ite = ll.listIterator();
+				while(ite.hasNext()) {
+					TMLCPrimitivePort port = ite.next();
+            		chls.add(port.getPortName());
+        		}
+            }
+        }
+		String[] chlArray = new String[chls.size()];
+		chlArray = chls.toArray(chlArray);
+		return chlArray;
+	}
+
+
     public TMLCPrimitiveComponent getPrimitiveComponentByName(String _name) {
         TGComponent tgc;
         Iterator<TGComponent> iterator = componentList.listIterator();
diff --git a/src/main/java/ui/util/DefaultText.java b/src/main/java/ui/util/DefaultText.java
index dd50e2284bfefc7d7829136cca08bcaedec62f7b..6cb3c07d5e636ccd5f531a9305087ffd744d878c 100755
--- a/src/main/java/ui/util/DefaultText.java
+++ b/src/main/java/ui/util/DefaultText.java
@@ -51,8 +51,8 @@ package ui.util;
  */
 public class DefaultText  {
 
-    public static String BUILD = "12339";
-    public static String DATE = "2017/08/21 13:41:47 CET";
+    public static String BUILD = "12356";
+    public static String DATE = "2017/09/07 02:01:14 CET";
     
     
     public static StringBuffer sbAbout = makeAbout();
diff --git a/src/main/java/ui/util/IconManager.java b/src/main/java/ui/util/IconManager.java
index 1c3f9a88e14c5af8b28ba983572c305a981f98e6..2af58c41e42580c510d0e746ee91215d07711c73 100755
--- a/src/main/java/ui/util/IconManager.java
+++ b/src/main/java/ui/util/IconManager.java
@@ -158,6 +158,8 @@ public class IconManager {
     public static ImageIcon imgic7002, imgic7003, imgic7004, imgic7005, imgic7006;
 	//Show traces
     public static ImageIcon imgic7007;
+	//Attacker Scenarios
+    public static ImageIcon imgic7008;
     // Delegate ports image removed, by Solange
     //public static ImageIcon imgic2102;
 
@@ -605,6 +607,10 @@ public class IconManager {
     private static String icon7006 = "imply.gif";	
 	//Show traces
     private static String icon7007 = "toolbarButtonGraphics/general/showTrace.gif";
+
+	//Attacker Scenarios
+    private static String icon7008 = "attacker.gif";
+
     public IconManager() {
 
 
@@ -1026,6 +1032,7 @@ public class IconManager {
 	imgic7005 = getIcon(icon7005);
 	imgic7006 = getIcon(icon7006);
 	imgic7007 = getIcon(icon7007);
+	imgic7008 = getIcon(icon7008);
     }
 
 } // Class
diff --git a/src/main/resources/ui/util/attacker.gif b/src/main/resources/ui/util/attacker.gif
new file mode 100755
index 0000000000000000000000000000000000000000..63df12723915609815223e04b0f5e4fd0d53ed04
Binary files /dev/null and b/src/main/resources/ui/util/attacker.gif differ