From 09d4071d872cf9f9e7bf0482187be707c54cc00d Mon Sep 17 00:00:00 2001
From: Claudio Bisegni <Claudio.Bisegni@lnf.infn.it>
Date: Sun, 13 Jan 2013 22:34:31 +0100
Subject: [PATCH] modified the xcode workspace and new project addition.

The workspace update is for isolate all project, now the developer need to compile by hand
all the referenced library for the project (ex CUTest ned chaos common and cu_toolkit that need to be
compiled by hand). This permit to imporve speed during xcode development debug sessione for compilation.
New project is the Benchtest simulation cod to test chaos installation

Change-Id: I2ad191b4e5c6b68b62ce07c163841ddfa2228b08
---
 .gitignore                                    |  2 +-
 CMakeLists.txt                                |  3 +
 ChaosMDSLite/.classpath                       | 11 ++-
 ....eclipse.wst.common.project.facet.core.xml |  1 +
 .../org.eclipse.wst.ws.service.policy.prefs   |  2 +
 chaos/common/data/CDataWrapper.h              |  4 +-
 .../dispatcher/DefaultEventDispatcher.cpp     |  5 +-
 chaos/common/global.h                         |  7 +-
 chaos/common/log/LogManager.h                 |  3 +-
 chaos/common/message/DeviceMessageChannel.cpp |  2 +-
 chaos/common/message/DeviceMessageChannel.h   |  2 +-
 chaos/common/message/MessageChannel.cpp       |  2 -
 .../ControlManager/AbstractControlUnit.cpp    |  9 +-
 .../DSAttributeHandlerExecutionEngine.cpp     | 26 -----
 .../HighLevelApi/DeviceController.cpp         |  4 +-
 .../HighLevelApi/DeviceController.h           |  2 +-
 example/BenchTest/Batch_Controller.cpp        | 22 +++--
 example/BenchTest/Batch_Controller.h          |  7 +-
 example/BenchTest/Batch_Reactor.cpp           | 25 ++++-
 example/BenchTest/Batch_Reactor.h             | 17 ++--
 .../BenchTest.xcodeproj/project.pbxproj       |  9 +-
 example/BenchTest/BenchTestCU.cpp             | 26 +++--
 example/BenchTest/BenchTestCU.h               |  2 +-
 example/BenchTest/CMakeLists.txt              | 12 ++-
 example/BenchTest/MainOrkestrator.cpp         | 50 ++++++++++
 example/BenchTest/MainOrkestrator.h           | 39 ++++++++
 example/BenchTest/ReactorController.cpp       | 55 +++++++++--
 example/BenchTest/ReactorController.h         |  6 +-
 example/BenchTest/config.h                    |  6 +-
 example/BenchTest/main_controller.cpp         | 36 +++++--
 example/BenchTest/main_reactor.cpp            | 94 ++++++++++---------
 .../ControlUnitTest.xcodeproj/project.pbxproj | 18 ++--
 .../project.pbxproj                           |  4 +-
 .../project.pbxproj                           |  8 +-
 test/BSONTestPerf/BSONTestPerf/main.cpp       |  6 +-
 35 files changed, 355 insertions(+), 172 deletions(-)
 create mode 100644 ChaosMDSLite/.settings/org.eclipse.wst.ws.service.policy.prefs
 create mode 100644 example/BenchTest/MainOrkestrator.cpp
 create mode 100644 example/BenchTest/MainOrkestrator.h

diff --git a/.gitignore b/.gitignore
index 84bb38b87..65cde25ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
 CMakeCache.txt
 CMakeFiles
 Makefile
-bin_*
+bin
 cmake_install.cmake
 install_manifest.txt
 ChaosMDSLite/target/*-0.jar
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f5b873e05..b058e3d6b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -109,3 +109,6 @@ ADD_SUBDIRECTORY(example/UIToolkitCMDLineExample bin/bin_example_uicmdline_test)
 
 message(STATUS "Configure UIToolkit c-wrapper command line example")
 ADD_SUBDIRECTORY(example/UIToolkitCMDLineCWrapperExample bin/bin_example_uicmdline_cwrapper_test)
+
+message(STATUS "Configure BenchTest simulation excutable")
+ADD_SUBDIRECTORY(example/BenchTest bin/bench_test)
diff --git a/ChaosMDSLite/.classpath b/ChaosMDSLite/.classpath
index 042eef37c..495ce3556 100644
--- a/ChaosMDSLite/.classpath
+++ b/ChaosMDSLite/.classpath
@@ -1,11 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v7.0">
+		<attributes>
+			<attribute name="owner.project.facets" value="jst.web"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/Java SE 7 (MacOS X Default)">
+		<attributes>
+			<attribute name="owner.project.facets" value="java"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/ChaosMDSLite/.settings/org.eclipse.wst.common.project.facet.core.xml b/ChaosMDSLite/.settings/org.eclipse.wst.common.project.facet.core.xml
index 7ff7048ad..efbeb56d4 100644
--- a/ChaosMDSLite/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/ChaosMDSLite/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <faceted-project>
+  <runtime name="Apache Tomcat v7.0"/>
   <fixed facet="wst.jsdt.web"/>
   <installed facet="java" version="1.5"/>
   <installed facet="wst.jsdt.web" version="1.0"/>
diff --git a/ChaosMDSLite/.settings/org.eclipse.wst.ws.service.policy.prefs b/ChaosMDSLite/.settings/org.eclipse.wst.ws.service.policy.prefs
new file mode 100644
index 000000000..9cfcabe16
--- /dev/null
+++ b/ChaosMDSLite/.settings/org.eclipse.wst.ws.service.policy.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.wst.ws.service.policy.projectEnabled=false
diff --git a/chaos/common/data/CDataWrapper.h b/chaos/common/data/CDataWrapper.h
index 06a80d57b..1ce8ee628 100644
--- a/chaos/common/data/CDataWrapper.h
+++ b/chaos/common/data/CDataWrapper.h
@@ -81,10 +81,10 @@ namespace chaos {
      Class that wrap the serializaiton system for data storage
      */
     class CDataWrapper/*: public CPoolMemoryObject<CDataWrapper> */{
-        scoped_ptr<BSONArrayBuilder> bsonArrayBuilder;
+        auto_ptr<BSONArrayBuilder> bsonArrayBuilder;
         
     protected:
-        scoped_ptr<BSONObjBuilder> bsonBuilder;
+        auto_ptr<BSONObjBuilder> bsonBuilder;
         
     public:
         
diff --git a/chaos/common/dispatcher/DefaultEventDispatcher.cpp b/chaos/common/dispatcher/DefaultEventDispatcher.cpp
index c5515a00e..2d22baa2a 100644
--- a/chaos/common/dispatcher/DefaultEventDispatcher.cpp
+++ b/chaos/common/dispatcher/DefaultEventDispatcher.cpp
@@ -111,7 +111,6 @@ void DefaultEventDispatcher::deregisterEventAction(EventAction *eventAction)  th
  by dispatcher
  */
 void DefaultEventDispatcher::executeAlertHandler(alert::AlertEventDescriptor *eventDescription)  throw(CException) {
-    EVTDISPAPP_ << "Received and alert event";
     alertEventScheduler->push(eventDescription);
 }
 
@@ -121,7 +120,6 @@ void DefaultEventDispatcher::executeAlertHandler(alert::AlertEventDescriptor *ev
  by dispatcher
  */
 void DefaultEventDispatcher::executeInstrumentHandler(instrument::InstrumentEventDescriptor *eventDescription)  throw(CException) {
-     EVTDISPAPP_ << "Received an instrument event";
     alertEventScheduler->push(eventDescription);
 }
 
@@ -131,7 +129,6 @@ void DefaultEventDispatcher::executeInstrumentHandler(instrument::InstrumentEven
  by dispatcher
  */
 void DefaultEventDispatcher::executeCommandHandler(command::CommandEventDescriptor *eventDescription)  throw(CException) {
-     EVTDISPAPP_ << "executeCommandHandler";
 }
 
     //!Handler execution method
@@ -140,5 +137,5 @@ void DefaultEventDispatcher::executeCommandHandler(command::CommandEventDescript
  by dispatcher
  */
 void DefaultEventDispatcher::executeCustomHandler(custom::CustomEventDescriptor* eventDescription)  throw(CException) {
-     EVTDISPAPP_ << "executeCustomHandler";
+
 }
diff --git a/chaos/common/global.h b/chaos/common/global.h
index e2fdfb499..2bb01d5c7 100644
--- a/chaos/common/global.h
+++ b/chaos/common/global.h
@@ -52,7 +52,12 @@ using namespace boost;
 
 
 
-
+enum severity_level
+{
+    normal,
+    error,
+    debug
+};
 
     //src::logger chaosLogger;
 BOOST_LOG_DECLARE_GLOBAL_LOGGER(chaosLogger, boost::log::sources::logger)
diff --git a/chaos/common/log/LogManager.h b/chaos/common/log/LogManager.h
index 3c8af3f2a..14fd52214 100644
--- a/chaos/common/log/LogManager.h
+++ b/chaos/common/log/LogManager.h
@@ -23,11 +23,12 @@
 
 #include <iostream>
 #include <chaos/common/exception/CException.h>
-
+#include <boost/log/sources/severity_logger.hpp>
 namespace chaos {
     class LogManager {
         template<class T>
         friend class ChaosCommon;
+        boost::log::sources::severity_logger< severity_level > slg;
         
         LogManager(){}
     public:
diff --git a/chaos/common/message/DeviceMessageChannel.cpp b/chaos/common/message/DeviceMessageChannel.cpp
index a748c2f8f..776e22db8 100644
--- a/chaos/common/message/DeviceMessageChannel.cpp
+++ b/chaos/common/message/DeviceMessageChannel.cpp
@@ -124,7 +124,7 @@ int DeviceMessageChannel::setAttributeValue(CDataWrapper& attributesValues, uint
 }
 
     //------------------------------------
-int DeviceMessageChannel::setScheduleDelay(uint32_t scheduledDealy, uint32_t millisecToWait){
+int DeviceMessageChannel::setScheduleDelay(int32_t scheduledDealy, uint32_t millisecToWait){
     int err = ErrorCode::EC_NO_ERROR;
     CDataWrapper startDeviceParam;
     startDeviceParam.addStringValue(DatasetDefinitionkey::CS_CM_DATASET_DEVICE_ID, deviceNetworkAddress->deviceID);
diff --git a/chaos/common/message/DeviceMessageChannel.h b/chaos/common/message/DeviceMessageChannel.h
index d1705c81c..56b83e217 100644
--- a/chaos/common/message/DeviceMessageChannel.h
+++ b/chaos/common/message/DeviceMessageChannel.h
@@ -89,7 +89,7 @@ namespace chaos {
         /*!
          Set the delay between a schedule and the next
          */
-        int setScheduleDelay(uint32_t scheduledDealy, uint32_t millisecToWait = 0);
+        int setScheduleDelay(int32_t scheduledDealy, uint32_t millisecToWait = 0);
         
         /*! 
          \brief send a message to a custom action
diff --git a/chaos/common/message/MessageChannel.cpp b/chaos/common/message/MessageChannel.cpp
index 4493347f3..264745656 100644
--- a/chaos/common/message/MessageChannel.cpp
+++ b/chaos/common/message/MessageChannel.cpp
@@ -75,7 +75,6 @@ CDataWrapper *MessageChannel::response(CDataWrapper *responseData, bool& detachD
         
             //lock lk(waith_asnwer_mutex);
         atomic_int_type requestID = responseData->getInt32Value(RpcActionDefinitionKey::CS_CMDM_MESSAGE_ID);
-        LDBG_ << "new requestd id arrived:" << requestID;
             //call the handler
         if(responsIdHandlerMap.count(requestID)>0){
             responsIdHandlerMap[requestID](responseData);
@@ -94,7 +93,6 @@ atomic_int_type MessageChannel::prepareRequestPackAndSend(const char * const nod
     CHAOS_ASSERT(nodeID && actionName && requestPack)
         //get new reqeust id
     atomic_int_type currentRequestID = atomic_increment(&channelRequestIDCounter);
-    LDBG_ << "new requestd id to send:" << currentRequestID;
 
     requestPack->addStringValue(RpcActionDefinitionKey::CS_CMDM_ACTION_DOMAIN, nodeID);
     requestPack->addStringValue(RpcActionDefinitionKey::CS_CMDM_ACTION_NAME, actionName);
diff --git a/chaos/cu_toolkit/ControlManager/AbstractControlUnit.cpp b/chaos/cu_toolkit/ControlManager/AbstractControlUnit.cpp
index 0861da266..d0e949ae1 100644
--- a/chaos/cu_toolkit/ControlManager/AbstractControlUnit.cpp
+++ b/chaos/cu_toolkit/ControlManager/AbstractControlUnit.cpp
@@ -523,13 +523,7 @@ CDataWrapper* AbstractControlUnit::_setDatasetAttribute(CDataWrapper *datasetAtt
             //send dataset attribute change pack to control unit implementation
         executionResult = setDatasetAttribute(datasetAttributeValues, detachParam);
         if(attributeHandlerEngineForDeviceIDMap.count(deviceID) > 0) {
-#if DEBUG
-            LAPP_ << "pre attributeHandlerEngineForDeviceIDMap[deviceID]->executeHandler(datasetAttributeValues);";
-#endif
             attributeHandlerEngineForDeviceIDMap[deviceID]->executeHandler(datasetAttributeValues);
-#if DEBUG
-            LAPP_ << "post attributeHandlerEngineForDeviceIDMap[deviceID]->executeHandler(datasetAttributeValues);";
-#endif
         }
             //at this time notify the wel gone setting of comand
         if(deviceEventChannel) deviceEventChannel->notifyForAttributeSetting(deviceID.c_str(), 0);
@@ -579,7 +573,6 @@ CDataWrapper*  AbstractControlUnit::updateConfiguration(CDataWrapper* updatePack
         throw CException(-3, "Device Not Initilized", "AbstractControlUnit::updateConfiguration");
     }
     
-    
         //check to see if the device can ben initialized
     if(keyDataStorageMap.count(deviceID)!=0) {
         keyDataStorageMap[deviceID]->updateConfiguration(updatePack);
@@ -587,7 +580,7 @@ CDataWrapper*  AbstractControlUnit::updateConfiguration(CDataWrapper* updatePack
     
     if(updatePack->hasKey(CUDefinitionKey::CS_CM_THREAD_SCHEDULE_DELAY)){
             //we need to configure the delay  from a run() call and the next
-        int32_t uSecdelay = updatePack->getInt32Value(CUDefinitionKey::CS_CM_THREAD_SCHEDULE_DELAY);
+        int64_t uSecdelay = updatePack->getInt32Value(CUDefinitionKey::CS_CM_THREAD_SCHEDULE_DELAY);
             //check if we need to update the scehdule time
         CThread *taskThread = schedulerDeviceMap[deviceID];
         if(uSecdelay != taskThread->getDelayBeetwenTask()){
diff --git a/chaos/cu_toolkit/ControlManager/DSAttributeHandlerExecutionEngine.cpp b/chaos/cu_toolkit/ControlManager/DSAttributeHandlerExecutionEngine.cpp
index 467669e0d..0154b78f9 100644
--- a/chaos/cu_toolkit/ControlManager/DSAttributeHandlerExecutionEngine.cpp
+++ b/chaos/cu_toolkit/ControlManager/DSAttributeHandlerExecutionEngine.cpp
@@ -134,71 +134,48 @@ bool DSAttributeHandlerExecutionEngine::executeHandler(CDataWrapper *message) th
         
             //compare the message device id and the local
         if(!_messageDeiveID.compare(deviceID)) {
-            LDSAHEE_ << "the message is for this device->" << deviceID;
             for (std::set<std::string>::iterator iter = managedAttributesName.begin();
                  iter != managedAttributesName.end();
                  iter++) {
                     //execute attribute handler
                 const char * cAttrName = iter->c_str();
-                LDSAHEE_ << "get the type of the attribute " << cAttrName;
 
                 if(message->hasKey(cAttrName)) {
-                    LDSAHEE_ << "The attribute " << cAttrName << " has been found in message";
                         //get attribute info
                     referenceCUSchemeDB->getDeviceAttributeRangeValueInfo(deviceID, *iter, attributeInfo);
-                    
-                    LDSAHEE_ << "The information for attribute " << cAttrName << " has been found";
-                    
                         //call handler
                     switch (attributeInfo.valueType) {
                         case DataType::TYPE_INT32: {
-                            LDSAHEE_ << "get int32 value for " << cAttrName;
                             i32v = message->getInt32Value(cAttrName);
-                            LDSAHEE_ << "The attribute " << cAttrName << " is an int32 =" << i32v;
                             abstractValuePtr = &i32v;
                             break;
                         }
                         case DataType::TYPE_INT64: {
-                            LDSAHEE_ << "get int64 value for " << cAttrName;
                             i64v = message->getInt64Value(cAttrName);
-                            LDSAHEE_ << "The attribute " << cAttrName << " is an int64 =" << i64v;
                             abstractValuePtr = &i64v;
                             break;
                         }
                         case DataType::TYPE_STRING: {
-                            LDSAHEE_ << "get string value for " << cAttrName;
                             sv = message->getStringValue(cAttrName);
-                            LDSAHEE_ << "The attribute " << cAttrName << " is a string =" << sv;
                             abstractValuePtr = &sv;
                             break;
                         }
                         case DataType::TYPE_DOUBLE: {
-                            LDSAHEE_ << "get double value for " << cAttrName;
                             dv = message->getDoubleValue(cAttrName);
-                            LDSAHEE_ << "The attribute " << cAttrName << " is an double =" << dv;
                             abstractValuePtr = &dv;
                             break;
                         }
                         case DataType::TYPE_BYTEARRAY: {
-                            LDSAHEE_ << "get bitearray value for " << cAttrName;
                             binv = message->getBinaryValue(cAttrName, binv_dim);
-                            LDSAHEE_ << "The attribute " << cAttrName << " is a binary";
                             abstractValuePtr = &binv;
                             break;
                         }
                         case DataType::TYPE_STRUCT: {
-                            LDSAHEE_ << "get struct value for " << cAttrName;
                             cdatv = message->getCSDataValue(cAttrName);
-                            LDSAHEE_ << "The attribute " << cAttrName << " is a struct";
                             abstractValuePtr = &cdatv;
                             break;
                         }
                     }
-                    
-                        //call every handler for the current attribute
-
-                    LDSAHEE_ << "Pre call all handler";
-
 
                     std::vector< handler::DSAttributeHandler* > *tmpVector = attrNameHandlerMap[*iter];
                     for (std::vector< handler::DSAttributeHandler* >::iterator iter = tmpVector->begin();
@@ -207,9 +184,6 @@ bool DSAttributeHandlerExecutionEngine::executeHandler(CDataWrapper *message) th
                         handler::DSAttributeHandler *handlerPtr = *iter;
                         handlerPtr->handle(abstractValuePtr);
                     }
-                    LDSAHEE_ << "Post call all handler";
-                } else {
-                    LDSAHEE_ << "The attribute " << cAttrName << " is NOT FOUND in message";
                 }
             }
         }
diff --git a/chaos/ui_toolkit/HighLevelApi/DeviceController.cpp b/chaos/ui_toolkit/HighLevelApi/DeviceController.cpp
index 70072302d..41caf355b 100644
--- a/chaos/ui_toolkit/HighLevelApi/DeviceController.cpp
+++ b/chaos/ui_toolkit/HighLevelApi/DeviceController.cpp
@@ -105,9 +105,9 @@ void DeviceController::updateChannel() throw(CException) {
     }
 }
 
-int DeviceController::setScheduleDelay(int32_t millisecDelay) {
+int DeviceController::setScheduleDelay(int32_t microseconds) {
     CHAOS_ASSERT(deviceChannel)
-    return deviceChannel->setScheduleDelay(millisecDelay, millisecToWait);
+    return deviceChannel->setScheduleDelay(microseconds, millisecToWait);
 }
 
 
diff --git a/chaos/ui_toolkit/HighLevelApi/DeviceController.h b/chaos/ui_toolkit/HighLevelApi/DeviceController.h
index 17f94981f..685fc4f19 100644
--- a/chaos/ui_toolkit/HighLevelApi/DeviceController.h
+++ b/chaos/ui_toolkit/HighLevelApi/DeviceController.h
@@ -142,7 +142,7 @@ namespace chaos {
             /*!
              Set the control unit run method scheduling delay
              */
-            int setScheduleDelay(int32_t millisecDelay);
+            int setScheduleDelay(int32_t microsecondsDelay);
             /*!
              Get attribute name filtered by direction type
              */
diff --git a/example/BenchTest/Batch_Controller.cpp b/example/BenchTest/Batch_Controller.cpp
index d5413274a..b13a33982 100644
--- a/example/BenchTest/Batch_Controller.cpp
+++ b/example/BenchTest/Batch_Controller.cpp
@@ -9,25 +9,27 @@
  
  */
 
+#include <string>
 #include "Batch_Controller.h"
 
 
 Batch_Controller::Batch_Controller()
 {
-	for(int i=0;i<Q;i++)
-    {rif[i]=0.0;
-  	    e_precedente[i]=0.0;
-	    u_precedente[i]=0.0;
-    }
-    
-	//scrivi sul MDS come valore di default per il controllo 0;
-    
+
+    memset(rif, 0, Q * sizeof(double));
+    memset(y, 0, Q * sizeof(double));
+    memset(u, 0, P * sizeof(double));
+    memset(e_precedente, 0, Q * sizeof(double));
+    memset(u_precedente, 0, Q * sizeof(double));
+    memset(e_precedente, 0, Q * sizeof(double));
 }
 
+Batch_Controller::~Batch_Controller() {
+    
+}
 
 
-void Batch_Controller::compute_controllo()
-{
+void Batch_Controller::compute_controllo() {
     
 	e[0] = rif[0] - y[0];
 	e[1] = rif[1] - y[1];
diff --git a/example/BenchTest/Batch_Controller.h b/example/BenchTest/Batch_Controller.h
index e9a513713..9ab6a218b 100644
--- a/example/BenchTest/Batch_Controller.h
+++ b/example/BenchTest/Batch_Controller.h
@@ -15,17 +15,18 @@ class Batch_Controller {
 	
 	
 	double e[Q]; //variabile ausiliaria per il calcolo del valore del controllo;
-	double rif[Q]; //variabile per impostare un riferimento da far inseguire all'impianto;
 	
 	double e_precedente[Q]; // variabile ausiliaria;
 	double u_precedente[Q]; // vairabile ausiliaria;
-	
+protected:
+    double rif[Q]; //variabile per impostare un riferimento da far inseguire all'impianto;
+
 public:
     double u[P]; //variabile contenente il valore del controllo
 	double y[Q]; //variabile contenente il valore dell'uscita misurata dell'impianto
 
 	Batch_Controller();
-	~Batch_Controller();
+	virtual ~Batch_Controller();
 	
 	void read();
 	void compute_controllo();
diff --git a/example/BenchTest/Batch_Reactor.cpp b/example/BenchTest/Batch_Reactor.cpp
index 6c0a97d25..5d0be0510 100644
--- a/example/BenchTest/Batch_Reactor.cpp
+++ b/example/BenchTest/Batch_Reactor.cpp
@@ -17,13 +17,23 @@
 #include <math.h>
 #include "Batch_Reactor.h"
 
+Batch_Reactor::Batch_Reactor() {
+    memset(x, 0, N * sizeof(double));
+    memset(y, 0, Q * sizeof(double));
+    memset(u, 0, P * sizeof(double));
+    memset(y_trasmessa, 0, Q * sizeof(double));
+    memset(perturbation, 0, N * sizeof(double));
+}
 
 void Batch_Reactor::compute_state() {
 	
-	x[0] =  1.0142*x[0]-0.0018*x[1]+0.0651*x[2]-0.0546*x[3]+0.0000*u[0]-0.0010*u[1];
-	x[1] = -0.0057*x[0]+0.9582*x[1]-0.0001*x[2]+0.0067*x[3]+0.0556*u[0]+0.0000*u[1];
-	x[2] =  0.0103*x[0]+0.0417*x[1]+0.9363*x[2]+0.0563*x[3]+0.0125*u[0]-0.0304*u[1];
-	x[3] =  0.0004*x[0]+0.0417*x[1]+0.0129*x[2]+0.9797*x[3]+0.0125*u[0]-0.0002*u[1];
+	x[0] =  1.0142*x[0]-0.0018*x[1]+0.0651*x[2]-0.0546*x[3]+0.0000*u[0]-0.0010*u[1] + perturbation[0];
+	x[1] = -0.0057*x[0]+0.9582*x[1]-0.0001*x[2]+0.0067*x[3]+0.0556*u[0]+0.0000*u[1] + perturbation[1];
+	x[2] =  0.0103*x[0]+0.0417*x[1]+0.9363*x[2]+0.0563*x[3]+0.0125*u[0]-0.0304*u[1] + perturbation[2];
+	x[3] =  0.0004*x[0]+0.0417*x[1]+0.0129*x[2]+0.9797*x[3]+0.0125*u[0]-0.0002*u[1] + perturbation[3];
+    
+    // clean the perturbation if any
+    memset(perturbation, 0, N * sizeof(double));
 }
 
 
@@ -48,4 +58,11 @@ void Batch_Reactor::update_output() {
     }
 }
 
+void Batch_Reactor::perturbateState(double seed) {
+    boost::variate_generator<boost::mt19937, boost::normal_distribution<> > generator(boost::mt19937(time(0)), boost::normal_distribution<>(-seed, seed));
+    for (int idx = 0; idx < N; idx++) {
+        double r = generator();
+        perturbation[0] = r;
+    }
+}
 
diff --git a/example/BenchTest/Batch_Reactor.h b/example/BenchTest/Batch_Reactor.h
index f3ada8778..4feb73726 100644
--- a/example/BenchTest/Batch_Reactor.h
+++ b/example/BenchTest/Batch_Reactor.h
@@ -14,23 +14,28 @@
  */
 #ifndef ChaosFramework_reactor
 #define ChaosFramework_reactor
-
+#include <boost/random.hpp>
 #include <math.h>
 #include "config.h"
 
-class Batch_Reactor {
 
+using namespace boost;
+
+class Batch_Reactor {
+    double error;
 	double y_trasmessa[Q];
-	
+	double perturbation[N]; // initial condition
+    
 	public:
-    double x[N]; //initial condition
-	double y[Q]; //reactor output
+    double x[N]; // initial condition
+	double y[Q]; // reactor output
 	double u[P]; // control value
 	
+    Batch_Reactor();
 	void compute_output();
 	void compute_state(); //non modificare il tempo di campionamente DeltaT!!!
 	void update_output();
-	
+	void perturbateState(double seed);
 };
 #endif
 
diff --git a/example/BenchTest/BenchTest.xcodeproj/project.pbxproj b/example/BenchTest/BenchTest.xcodeproj/project.pbxproj
index 9c846559e..9396f384b 100644
--- a/example/BenchTest/BenchTest.xcodeproj/project.pbxproj
+++ b/example/BenchTest/BenchTest.xcodeproj/project.pbxproj
@@ -13,6 +13,7 @@
 		322F363716A1E9C500731C3F /* Batch_Reactor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 322F363516A1E9C000731C3F /* Batch_Reactor.cpp */; };
 		322F363916A1EA9400731C3F /* Batch_Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 322F363816A1EA9400731C3F /* Batch_Controller.cpp */; };
 		322F363C16A1EB8B00731C3F /* ReactorController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 322F363A16A1EB8B00731C3F /* ReactorController.cpp */; };
+		32B928B516A2DD32004064E4 /* MainOrkestrator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32B928B116A2D7B8004064E4 /* MainOrkestrator.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -40,6 +41,8 @@
 		322F363816A1EA9400731C3F /* Batch_Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Batch_Controller.cpp; sourceTree = "<group>"; };
 		322F363A16A1EB8B00731C3F /* ReactorController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReactorController.cpp; sourceTree = "<group>"; };
 		322F363B16A1EB8B00731C3F /* ReactorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReactorController.h; sourceTree = "<group>"; };
+		32B928B116A2D7B8004064E4 /* MainOrkestrator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MainOrkestrator.cpp; sourceTree = "<group>"; };
+		32B928B216A2D7B8004064E4 /* MainOrkestrator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainOrkestrator.h; sourceTree = "<group>"; };
 		32BE864A15A0E3C500818C39 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = SOURCE_ROOT; };
 		32F7448F14B49CCB0025638B /* BenchTestReactor */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BenchTestReactor; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
@@ -69,6 +72,8 @@
 				322F363816A1EA9400731C3F /* Batch_Controller.cpp */,
 				322F363B16A1EB8B00731C3F /* ReactorController.h */,
 				322F363A16A1EB8B00731C3F /* ReactorController.cpp */,
+				32B928B216A2D7B8004064E4 /* MainOrkestrator.h */,
+				32B928B116A2D7B8004064E4 /* MainOrkestrator.cpp */,
 				322F362016A1D1F500731C3F /* main_controller.cpp */,
 			);
 			name = src_controller;
@@ -99,8 +104,8 @@
 			children = (
 				322F363016A1DBA600731C3F /* Batch_Reactor.h */,
 				322F363516A1E9C000731C3F /* Batch_Reactor.cpp */,
-				322F360916A1CEE000731C3F /* BenchTestCU.cpp */,
 				322F360A16A1CEE000731C3F /* BenchTestCU.h */,
+				322F360916A1CEE000731C3F /* BenchTestCU.cpp */,
 				322F360B16A1CEE000731C3F /* main_reactor.cpp */,
 			);
 			name = src_reactor;
@@ -178,6 +183,7 @@
 				322F362116A1D1F500731C3F /* main_controller.cpp in Sources */,
 				322F363916A1EA9400731C3F /* Batch_Controller.cpp in Sources */,
 				322F363C16A1EB8B00731C3F /* ReactorController.cpp in Sources */,
+				32B928B516A2DD32004064E4 /* MainOrkestrator.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -428,6 +434,7 @@
 				322F361F16A1D1C200731C3F /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
 		};
 		326027A214B309ED00C906CE /* Build configuration list for PBXProject "BenchTest" */ = {
 			isa = XCConfigurationList;
diff --git a/example/BenchTest/BenchTestCU.cpp b/example/BenchTest/BenchTestCU.cpp
index 932585d28..afed066f8 100644
--- a/example/BenchTest/BenchTestCU.cpp
+++ b/example/BenchTest/BenchTestCU.cpp
@@ -20,6 +20,7 @@
 #include <boost/thread.hpp>
 
 #include "BenchTestCU.h"
+#include "config.h"
 #include <chaos/common/global.h>
 #include <chaos/common/cconstants.h>
 #include <chaos/common/bson/bson.h>
@@ -37,16 +38,12 @@
 using namespace chaos;
 
 
-#define CU_DELAY_FROM_TASKS     20000 //20msec
-
 /*
  Construct a new CU with an identifier
  */
 BenchTestCU::BenchTestCU(std::string& rName, Batch_Reactor *rInstance) {
     reactorName = rName;
     reactorInstance = rInstance;
-    lastInputControl[0] = 0;
-    lastInputControl[1] = 0;
 }
 
 /*
@@ -95,6 +92,12 @@ void BenchTestCU::defineActionAndDataset(CDataWrapper& cuSetup) throw(CException
                                                   "Reactor Output B",
                                                   this,
                                                   &BenchTestCU::setControlB);
+    
+    addInputDoubleAttributeToDataSet<BenchTestCU>(devIDInChar,
+                                                  "pseed",
+                                                  "Pertubastion seed applied to reactor state",
+                                                  this,
+                                                  &BenchTestCU::perturbateState);
 }
 
 /*
@@ -122,9 +125,11 @@ void BenchTestCU::run(const string& deviceID) throw(CException) {
     
     acquiredData->addDoubleValue("output_a", reactorInstance->y[0]);
     acquiredData->addDoubleValue("output_b", reactorInstance->y[1]);
+    LAPP_ << "Output_A=" << reactorInstance->y[0] << " reactor Output_B="<< reactorInstance->y[1];
+    pushDataSetForKey(devIDInChar, acquiredData);
     
     reactorInstance->compute_state();
-    
+
 }
 
 /*
@@ -143,12 +148,19 @@ void BenchTestCU::deinit(const string& deviceID) throw(CException) {
  */
 void BenchTestCU::setControlA(const std::string& deviceID, const double& dValue) {
     boost::unique_lock< boost::shared_mutex > lock(_setControlValueMutext);
-    lastInputControl[0] = dValue;
+    reactorInstance->u[0] = dValue;
 }
 
 /*
  */
 void BenchTestCU::setControlB(const std::string& deviceID, const double& dValue) {
     boost::unique_lock< boost::shared_mutex > lock(_setControlValueMutext);
-    lastInputControl[1] = dValue;
+    reactorInstance->u[1] = dValue;
+}
+
+/*
+ */
+void BenchTestCU::perturbateState(const std::string& deviceID, const double& dValue) {
+    boost::unique_lock< boost::shared_mutex > lock(_setControlValueMutext);
+    reactorInstance->perturbateState(dValue);
 }
\ No newline at end of file
diff --git a/example/BenchTest/BenchTestCU.h b/example/BenchTest/BenchTestCU.h
index 15a6e37fa..bde10bc4d 100644
--- a/example/BenchTest/BenchTestCU.h
+++ b/example/BenchTest/BenchTestCU.h
@@ -34,7 +34,6 @@ using namespace boost;
 class BenchTestCU : public AbstractControlUnit {
     string reactorName;
     Batch_Reactor *reactorInstance;
-    double lastInputControl[P];
     boost::shared_mutex _setControlValueMutext;
 public:
 
@@ -49,6 +48,7 @@ public:
 
     inline void setControlA(const std::string& deviceID, const double& dValue);
     inline void setControlB(const std::string& deviceID, const double& dValue);
+    inline void perturbateState(const std::string& deviceID, const double& dValue);
 protected:
     /*
      Define the Control Unit Dataset and Actions
diff --git a/example/BenchTest/CMakeLists.txt b/example/BenchTest/CMakeLists.txt
index 51fcee7e5..011570c3c 100644
--- a/example/BenchTest/CMakeLists.txt
+++ b/example/BenchTest/CMakeLists.txt
@@ -8,8 +8,14 @@ IF( ($ENV{CHAOS32}) OR (BUILD_FORCE_32) )
     set (CMAKE_LINK_FLAGS "-m32")
 ENDIF()
 
-SET(cutest_exe_src ControlUnitExample.cpp WorkerCU.cpp)
+SET(reactor_device_exe_src main_reactor.cpp Batch_Reactor.cpp BenchTestCU.cpp)
+SET(reactor_controller_exe_src main_controller.cpp Batch_Controller.cpp ReactorController.cpp MainOrkestrator.cpp)
+
 INCLUDE_DIRECTORIES(. ${PROJECT_SOURCE_DIR}/../../usr/local/include /usr/local/include /usr/include) 
 LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/../../usr/local/lib /usr/local/lib)
-ADD_EXECUTABLE(ControlUnitTest ${cutest_exe_src})
-TARGET_LINK_LIBRARIES(ControlUnitTest chaos_cutoolkit chaos_common boost_program_options boost_system boost_thread boost_chrono boost_regex boost_log boost_log_setup memcached msgpack msgpack-rpc mpio) 
+
+ADD_EXECUTABLE(BenchTestReactor ${reactor_device_exe_src})
+ADD_EXECUTABLE(BenchTestController ${reactor_controller_exe_src})
+
+TARGET_LINK_LIBRARIES(BenchTestReactor chaos_cutoolkit chaos_common boost_program_options boost_system boost_thread boost_chrono boost_regex boost_log boost_log_setup memcached msgpack msgpack-rpc mpio) 
+TARGET_LINK_LIBRARIES(BenchTestController chaos_uitoolkit chaos_common boost_program_options boost_system boost_thread boost_chrono boost_regex boost_log boost_log_setup memcached msgpack msgpack-rpc mpio) 
diff --git a/example/BenchTest/MainOrkestrator.cpp b/example/BenchTest/MainOrkestrator.cpp
new file mode 100644
index 000000000..98d2e8ea2
--- /dev/null
+++ b/example/BenchTest/MainOrkestrator.cpp
@@ -0,0 +1,50 @@
+//
+//  MainOrkestrator.cpp
+//  BenchTest
+//
+//  Created by Claudio Bisegni on 1/13/13.
+//  Copyright (c) 2013 INFN. All rights reserved.
+//
+
+#include "MainOrkestrator.h"
+
+chaos::WaitSemaphore MainOrkestrator::waitCloseSemaphore;
+
+MainOrkestrator::MainOrkestrator(std::vector< std::string > *_reactordeviceIDs, std::vector< double > *_reactorsReferements) {
+    waithUntilEnd = true;
+    reactordeviceIDs = _reactordeviceIDs;
+    reactorsReferements = _reactorsReferements;
+    
+    if (signal((int) SIGINT, MainOrkestrator::signalHanlder) == SIG_ERR){
+        LERR_ << "SIGINT Signal handler registraiton error";
+    }
+    
+    if (signal((int) SIGINT, MainOrkestrator::signalHanlder) == SIG_ERR){
+        LERR_ << "SIGINT Signal handler registraiton error";
+    }
+}
+
+MainOrkestrator::~MainOrkestrator() {
+    
+}
+
+void MainOrkestrator::init() {
+    for(int idx = 0, refIdx = 0; idx < reactordeviceIDs->size(); idx++, refIdx+=Q) {
+        ReactorController *ctrl = new ReactorController((*reactordeviceIDs)[idx], reactorsReferements, refIdx);
+        if(ctrl) ctrl->init();
+        reactorControllerList.add(ctrl);
+    }
+}
+
+void MainOrkestrator::join() {
+    waitCloseSemaphore.wait();
+    
+    //shutdown all controller
+    for(int i=0; i < reactorControllerList.size(); i++) {
+        reactorControllerList[i]->deinit();
+    }
+}
+
+void MainOrkestrator::signalHanlder(int signalNumber) {
+    waitCloseSemaphore.unlock();
+}
diff --git a/example/BenchTest/MainOrkestrator.h b/example/BenchTest/MainOrkestrator.h
new file mode 100644
index 000000000..0117e8940
--- /dev/null
+++ b/example/BenchTest/MainOrkestrator.h
@@ -0,0 +1,39 @@
+//
+//  MainOrkestrator.h
+//  BenchTest
+//
+//  Created by Claudio Bisegni on 1/13/13.
+//  Copyright (c) 2013 INFN. All rights reserved.
+//
+
+#ifndef __BenchTest__MainOrkestrator__
+#define __BenchTest__MainOrkestrator__
+
+#include <vector>
+#include <string>
+#include <chaos/common/thread/WaitSemaphore.h>
+#include <chaos/common/utility/ArrayPointer.h>
+#include "ReactorController.h"
+
+class MainOrkestrator {
+    bool waithUntilEnd;
+    std::vector< std::string > *reactordeviceIDs;
+    std::vector< double > *reactorsReferements;
+    chaos::ArrayPointer< ReactorController > reactorControllerList;
+    
+    static chaos::WaitSemaphore waitCloseSemaphore;
+    
+
+    static void signalHanlder(int);
+    
+public:
+    typedef boost::mutex::scoped_lock lock;
+ 
+    MainOrkestrator(std::vector< std::string > *_reactordeviceIDs, std::vector< double > *_reactorsReferements);
+    ~MainOrkestrator();
+    void init();
+    void join();
+};
+
+
+#endif /* defined(__BenchTest__MainOrkestrator__) */
diff --git a/example/BenchTest/ReactorController.cpp b/example/BenchTest/ReactorController.cpp
index e7b082c30..ead59f78b 100644
--- a/example/BenchTest/ReactorController.cpp
+++ b/example/BenchTest/ReactorController.cpp
@@ -6,11 +6,18 @@
 //  Copyright (c) 2013 INFN. All rights reserved.
 //
 
+#include <chaos/common/global.h>
 #include "ReactorController.h"
 
 
-ReactorController::ReactorController(string& _rName):reactorID(_rName) {
+ReactorController::ReactorController(string& _rName, vector<double> *refVec, int refIdx):reactorID(_rName) {
     chaosThread.reset(new chaos::CThread(this));
+    chaosThread->setDelayBeetwenTask(CU_DELAY_FROM_TASKS);
+    
+    //set the referement for this reactor controller
+    for(int idx = 0; idx < Q; idx++) {
+        rif[idx] = (*refVec)[refIdx + idx];
+    }
 }
 
 ReactorController::~ReactorController() {
@@ -18,13 +25,35 @@ ReactorController::~ReactorController() {
 }
 
 void ReactorController::init() {
+    int err = 0;
     state = INIT;
+    
+    CUStateKey::ControlUnitState deviceState;
     chaosReactorController = chaos::ui::HLDataApi::getInstance()->getControllerForDeviceID(reactorID);
+    CHAOS_ASSERT(chaosReactorController)
     
+    //start the reactor
+    err = chaosReactorController->getState(deviceState);
+    if(deviceState != CUStateKey::START) {
+        if(deviceState == CUStateKey::DEINIT) {
+            err = chaosReactorController->initDevice();
+            err = chaosReactorController->startDevice();
+        } else if(deviceState == CUStateKey::STOP) {
+            err = chaosReactorController->startDevice();
+        }
+    }
+    
+    chaosReactorController->setScheduleDelay(CU_DELAY_FROM_TASKS);
+    //start the controller
     chaosThread->start();
 }
 
 void ReactorController::deinit() {
+    int err = 0;
+    if(chaosReactorController) {
+        err = chaosReactorController->stopDevice();
+        err = chaosReactorController->deinitDevice();
+    }
     chaosThread->stop();
     chaosThread->join();
 }
@@ -39,13 +68,23 @@ void ReactorController::joinThread(){
                       
 void ReactorController::executeOnThread(const string&) throw(CException) {
     //state of the reactor
-    int err = ErrorCode::EC_NO_ERROR;
-    CUStateKey::ControlUnitState deviceState;
-    switch(state) {
-        case INIT:
-            err = chaosReactorController->getState(deviceState);
-            break;
-    }
+
+    //execute the control of the reactor
+    
+    chaosReactorController->fetchCurrentDeviceValue();
+    
+    chaos::CDataWrapper *reactorCurrentState = chaosReactorController->getCurrentData();
+    
+    if(!reactorCurrentState) return; // no data found
+    //fill the array 
+    Batch_Controller::y[0] = reactorCurrentState->getDoubleValue("output_a");
+    Batch_Controller::y[1] = reactorCurrentState->getDoubleValue("output_b");
+    
+    Batch_Controller::compute_controllo();
+    
+    LAPP_ << "Control_A=" << Batch_Controller::u[0] << " reactor Control_B="<< Batch_Controller::u[1];
     
+    chaosReactorController->setDoubleAttributeValue("input_a", Batch_Controller::u[0]);
+    chaosReactorController->setDoubleAttributeValue("input_b", Batch_Controller::u[1]);
 }
 
diff --git a/example/BenchTest/ReactorController.h b/example/BenchTest/ReactorController.h
index 76821e26c..acdfdefef 100644
--- a/example/BenchTest/ReactorController.h
+++ b/example/BenchTest/ReactorController.h
@@ -15,7 +15,7 @@
 #include <chaos/common/thread/ChaosThread.h>
 #include <chaos/ui_toolkit/LowLevelApi/LLRpcApi.h>
 #include <chaos/ui_toolkit/HighLevelApi/HLDataApi.h>
-
+#include "Batch_Controller.h"
 using namespace chaos;
 using namespace std;
 
@@ -25,7 +25,7 @@ typedef enum ControllerState {
     DEINIT
 } ControllerState;
 
-class ReactorController : public chaos::CThreadExecutionTask {
+class ReactorController : public chaos::CThreadExecutionTask, private Batch_Controller{
     string reactorID;
     boost::shared_ptr<CThread> chaosThread;
     chaos::ui::DeviceController *chaosReactorController;
@@ -34,7 +34,7 @@ protected:
     virtual void executeOnThread(const string&) throw(CException);
     
 public:
-    ReactorController(string& _rName);
+    ReactorController(string& _rName, vector<double> *refVec, int refIdx);
     ~ReactorController();
     void init();
     void deinit();
diff --git a/example/BenchTest/config.h b/example/BenchTest/config.h
index 38ee0bd55..ece8a14fa 100644
--- a/example/BenchTest/config.h
+++ b/example/BenchTest/config.h
@@ -13,7 +13,9 @@ const int N = 4; //Dimensione stato del sistema Reattore;
 const int P = 2; //Numero ingressi di controllo;
 const int Q = 2; //Numero uscite sistema Reattore;
 
-#define REACTOR_NAMES    "reactor_names"
-#define OPT_START_STATE  "state_initial_condition"
+#define REACTOR_NAMES               "reactor_names"
+#define OPT_START_STATE             "state_initial_condition"
+#define REACTOR_REFEREMENT_VALUE    "referement_value"
+#define CU_DELAY_FROM_TASKS         20000 //20msec
 
 #endif
diff --git a/example/BenchTest/main_controller.cpp b/example/BenchTest/main_controller.cpp
index 007df7881..f7a92efb3 100644
--- a/example/BenchTest/main_controller.cpp
+++ b/example/BenchTest/main_controller.cpp
@@ -69,7 +69,7 @@ using namespace boost::date_time;
 #include <vector>
 #include <string>
 #include "config.h"
-
+#include "MainOrkestrator.h"
 inline ptime utcToLocalPTime(ptime utcPTime){
 	c_local_adjustor<ptime> utcToLocalAdjustor;
 	ptime t11 = utcToLocalAdjustor.utc_to_local(utcPTime);
@@ -79,8 +79,8 @@ inline ptime utcToLocalPTime(ptime utcPTime){
 int main (int argc, char* argv[] )
 {
     try {
-        int64_t reactorsNumber = 1;
         std::vector< std::string > names;
+        std::vector< double > referements;
         string tmpDeviceID("bench_reactor");
         
         //initial state value
@@ -88,9 +88,8 @@ int main (int argc, char* argv[] )
         posix_time::time_duration currentTime;
         
         //! [UIToolkit Attribute Init]
-        ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(REACTOR_NAMES, po::value< std::vector< std::string > >()->multitoken(), "The name (and implicit the number) of the rectors");
-
-
+        ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(REACTOR_NAMES, po::value< std::vector< std::string > >()->multitoken(), "The id (and implicit the number) of the rectors");
+        ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(REACTOR_REFEREMENT_VALUE, po::value< std::vector< double > >()->multitoken(), "The name (and implicit the number) of the rectors");
         //! [UIToolkit Attribute Init]
         
         //! [UIToolkit Init]
@@ -98,14 +97,31 @@ int main (int argc, char* argv[] )
         
         if(ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(REACTOR_NAMES)){
             names = ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< std::string > >(REACTOR_NAMES);
-            reactorsNumber = names.size();
+        } else {
+            names.push_back(tmpDeviceID);
         }
-
         
-        //! [UIToolkit ChannelCreation]
-        CDeviceNetworkAddress deviceNetworkAddress;
-        //! [Datapack sent]
+        if(ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(REACTOR_REFEREMENT_VALUE)){
+            referements = ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< double > >(REACTOR_REFEREMENT_VALUE);
+        } else {
+            for(int idx = 0; idx < Q; idx++) {
+                referements.push_back(1.0);
+            }
+        }
+        
+        if(referements.size() != names.size() * Q) {
+            char error[128];
+            sprintf ( error, "every reactor identified need to have %d referement", Q );
+            throw chaos::CException(0, error, "main");
+        }
+        
+        //! [UIToolkit Init]
         
+        //! [Allocate the main orkestrator]
+        auto_ptr<MainOrkestrator> ork(new MainOrkestrator(&names, &referements));
+        ork->init();
+        ork->join();
+        //! [Allocate the main orkestrator]
         
         //! [UIToolkit Deinit]
         ChaosUIToolkit::getInstance()->deinit();
diff --git a/example/BenchTest/main_reactor.cpp b/example/BenchTest/main_reactor.cpp
index 7cf9f241c..a0b906a5c 100644
--- a/example/BenchTest/main_reactor.cpp
+++ b/example/BenchTest/main_reactor.cpp
@@ -56,60 +56,64 @@ using namespace chaos;
 
 int main (int argc, char* argv[] )
 {
-    int64_t reactorsNumber = 1;
+    int64_t reactorsNumber = 0;
     std::vector< std::string > names;
     string tmpDeviceID("bench_reactor");
     
     //initial state value
     vector<double> stateOption;
-    
-    //! [Custom Option]
-    ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(REACTOR_NAMES, po::value< std::vector< std::string > >()->multitoken(), "The name (and implicit the number) of the rectors");
-    ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(OPT_START_STATE, po::value< std::vector<double> >()->multitoken(), "Initila condition for the Rector internal state");
-    //! [Custom Option]
-    
-    //! [CUTOOLKIT Init]
-    ChaosCUToolkit::getInstance()->init(argc, argv);
-    //! [CUTOOLKIT Init]
-    
-    
-    
-    
-    //! [Adding the CustomControlUnit]
-    if(ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(REACTOR_NAMES)){
-        names = ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< std::string > >(REACTOR_NAMES);
-        reactorsNumber = names.size();
-    }
-    
-    if(ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(OPT_START_STATE)){
-        stateOption =  ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< double > >(OPT_START_STATE);
-    } else {
-        for (int i = 0; i < N; i++) {
-            stateOption[i] = 0.0;
+    try {
+        //! [Custom Option]
+        ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(REACTOR_NAMES, po::value< std::vector< std::string > >()->multitoken(), "The name (and implicit the number) of the rectors");
+        ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->addOption(OPT_START_STATE, po::value< std::vector<double> >()->multitoken(), "Initila condition for the Rector internal state");
+        //! [Custom Option]
+        
+        //! [CUTOOLKIT Init]
+        ChaosCUToolkit::getInstance()->init(argc, argv);
+        //! [CUTOOLKIT Init]
+        
+        
+        
+        
+        //! [Adding the CustomControlUnit]
+        if(ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(REACTOR_NAMES)){
+            names = ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< std::string > >(REACTOR_NAMES);
+            reactorsNumber = names.size();
         }
-    }
-    
-    //allocate the reactor isnstance
-    if(reactorsNumber >= 1) {
-        for (int idx1 = 0; idx1 < reactorsNumber; idx1++) {
-            Batch_Reactor *rInstance = new Batch_Reactor();
-            for (int idx2 = 0; idx2 < N; idx2++) {
-                rInstance->x[idx2] = stateOption[idx2];
+        
+        if(ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(OPT_START_STATE)){
+            stateOption =  ChaosCUToolkit::getInstance()->getGlobalConfigurationInstance()->getOption< std::vector< double > >(OPT_START_STATE);
+        } else {
+            for (int i = 0; i < N; i++) {
+                stateOption.push_back(0.0);
             }
-            ChaosCUToolkit::getInstance()->addControlUnit(new BenchTestCU(names[idx1], rInstance));
         }
-    } else {
-        Batch_Reactor *rInstance = new Batch_Reactor();
-        for (int idx = 0; idx < N; idx++) {
-            rInstance->x[idx] = stateOption[idx];
+        
+        //allocate the reactor isnstance
+        if(reactorsNumber >= 1) {
+            for (int idx1 = 0; idx1 < reactorsNumber; idx1++) {
+                Batch_Reactor *rInstance = new Batch_Reactor();
+                for (int idx2 = 0; idx2 < N; idx2++) {
+                    rInstance->x[idx2] = stateOption[idx2];
+                }
+                ChaosCUToolkit::getInstance()->addControlUnit(new BenchTestCU(names[idx1], rInstance));
+            }
+        } else {
+            Batch_Reactor *rInstance = new Batch_Reactor();
+            for (int idx = 0; idx < N; idx++) {
+                rInstance->x[idx] = stateOption[idx];
+            }
+            ChaosCUToolkit::getInstance()->addControlUnit(new BenchTestCU(tmpDeviceID, rInstance));
         }
-        ChaosCUToolkit::getInstance()->addControlUnit(new BenchTestCU(tmpDeviceID, rInstance));
+        
+        //! [Adding the CustomControlUnit]
+        
+        //! [Starting the Framework]
+        ChaosCUToolkit::getInstance()->start();
+        //! [Starting the Framework]
+    } catch (CException& e) {
+        std::cerr<< e.errorDomain << std::endl;
+        std::cerr<< e.errorMessage << std::endl;
     }
-    
-    //! [Adding the CustomControlUnit]
-    
-    //! [Starting the Framework]
-    ChaosCUToolkit::getInstance()->start();
-    //! [Starting the Framework]
     return 0;
 }
diff --git a/example/ControlUnitTest/ControlUnitTest.xcodeproj/project.pbxproj b/example/ControlUnitTest/ControlUnitTest.xcodeproj/project.pbxproj
index f0c007904..5a59063c8 100644
--- a/example/ControlUnitTest/ControlUnitTest.xcodeproj/project.pbxproj
+++ b/example/ControlUnitTest/ControlUnitTest.xcodeproj/project.pbxproj
@@ -7,8 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		32D078DB159A504D0053BB3A /* libchaos_common.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 32D078D9159A504D0053BB3A /* libchaos_common.dylib */; };
-		32D078DC159A504D0053BB3A /* libchaos_cutoolkit.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 32D078DA159A504D0053BB3A /* libchaos_cutoolkit.dylib */; };
 		32F7449C14B49CFA0025638B /* ControlUnitExample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32F7449914B49CFA0025638B /* ControlUnitExample.cpp */; };
 		32F7449D14B49CFA0025638B /* WorkerCU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32F7449A14B49CFA0025638B /* WorkerCU.cpp */; };
 /* End PBXBuildFile section */
@@ -28,8 +26,6 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				32D078DB159A504D0053BB3A /* libchaos_common.dylib in Frameworks */,
-				32D078DC159A504D0053BB3A /* libchaos_cutoolkit.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -161,10 +157,9 @@
 					/usr/local/include,
 				);
 				LIBRARY_SEARCH_PATHS = (
-					"$(inherited)",
-					"\"$(SRCROOT)/../../DerivedData/CHAOSWorkspace/Build/Products/Debug\"",
+					"$(SRCROOT)/../../DerivedData/CHAOSWorkspace/Build/Products/Debug",
 					/usr/local/lib,
-					"\"$(SRCROOT)/../../usr/local/lib",
+					"$(SRCROOT)/../../usr/local/lib",
 				);
 				MACOSX_DEPLOYMENT_TARGET = 10.7;
 				ONLY_ACTIVE_ARCH = YES;
@@ -181,6 +176,8 @@
 					"-lmsgpack-rpc",
 					"-lboost_log",
 					"-lboost_log_setup",
+					"-lchaos_cutoolkit",
+					"-lchaos_common",
 				);
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
@@ -207,10 +204,9 @@
 					/usr/local/include,
 				);
 				LIBRARY_SEARCH_PATHS = (
-					"$(inherited)",
-					"\"$(SRCROOT)/../../DerivedData/CHAOSWorkspace/Build/Products/Debug\"",
+					"$(SRCROOT)/../../DerivedData/CHAOSWorkspace/Build/Products/Debug",
 					/usr/local/lib,
-					"\"$(SRCROOT)/../../usr/local/lib",
+					"$(SRCROOT)/../../usr/local/lib",
 				);
 				MACOSX_DEPLOYMENT_TARGET = 10.7;
 				OTHER_LDFLAGS = (
@@ -226,6 +222,8 @@
 					"-lmsgpack-rpc",
 					"-lboost_log",
 					"-lboost_log_setup",
+					"-lchaos_cutoolkit",
+					"-lchaos_common",
 				);
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
diff --git a/example/UIToolkitCMDLineCWrapperExample/UIToolkitCMDLineCWrapperExample.xcodeproj/project.pbxproj b/example/UIToolkitCMDLineCWrapperExample/UIToolkitCMDLineCWrapperExample.xcodeproj/project.pbxproj
index 4d6f343f6..f43c8dc28 100644
--- a/example/UIToolkitCMDLineCWrapperExample/UIToolkitCMDLineCWrapperExample.xcodeproj/project.pbxproj
+++ b/example/UIToolkitCMDLineCWrapperExample/UIToolkitCMDLineCWrapperExample.xcodeproj/project.pbxproj
@@ -7,7 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		324D67DC15DA58A300D60BC0 /* libchaos_uitoolkit.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 324D67DB15DA58A300D60BC0 /* libchaos_uitoolkit.dylib */; };
 		324D67E615DA5AE100D60BC0 /* UIToolkitCMDLineCWapperExample.c in Sources */ = {isa = PBXBuildFile; fileRef = 324D67E515DA5AE100D60BC0 /* UIToolkitCMDLineCWapperExample.c */; };
 /* End PBXBuildFile section */
 
@@ -35,7 +34,6 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				324D67DC15DA58A300D60BC0 /* libchaos_uitoolkit.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -191,6 +189,7 @@
 					/usr/local/lib,
 					"$(SRCROOT)/usr/local/lib",
 				);
+				OTHER_LDFLAGS = "-lchaos_uitoolkit";
 				PRODUCT_NAME = UIToolkitCMDLineCWrapperExample;
 			};
 			name = Debug;
@@ -209,6 +208,7 @@
 					/usr/local/lib,
 					"$(SRCROOT)/usr/local/lib",
 				);
+				OTHER_LDFLAGS = "-lchaos_uitoolkit";
 				PRODUCT_NAME = UIToolkitCMDLineCWrapperExample;
 			};
 			name = Release;
diff --git a/example/UIToolkitCMDLineExample/UIToolkitCMDLineExample.xcodeproj/project.pbxproj b/example/UIToolkitCMDLineExample/UIToolkitCMDLineExample.xcodeproj/project.pbxproj
index 33398df1d..a682632f7 100644
--- a/example/UIToolkitCMDLineExample/UIToolkitCMDLineExample.xcodeproj/project.pbxproj
+++ b/example/UIToolkitCMDLineExample/UIToolkitCMDLineExample.xcodeproj/project.pbxproj
@@ -7,8 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		328E76B314CEE4F500A3EA95 /* libchaos_common.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 328E76B114CEE4F500A3EA95 /* libchaos_common.dylib */; };
-		328E76B414CEE4F500A3EA95 /* libchaos_uitoolkit.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 328E76B214CEE4F500A3EA95 /* libchaos_uitoolkit.dylib */; };
 		328E76B614CEE92D00A3EA95 /* UIToolkitCMDLineExample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 328E76B514CEE92D00A3EA95 /* UIToolkitCMDLineExample.cpp */; };
 /* End PBXBuildFile section */
 
@@ -37,8 +35,6 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				328E76B314CEE4F500A3EA95 /* libchaos_common.dylib in Frameworks */,
-				328E76B414CEE4F500A3EA95 /* libchaos_uitoolkit.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -203,6 +199,8 @@
 					"-lmsgpack-rpc",
 					"-lboost_log",
 					"-lboost_log_setup",
+					"-lchaos_uitoolkit",
+					"-lchaos_common",
 				);
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
@@ -236,6 +234,8 @@
 					"-lmsgpack-rpc",
 					"-lboost_log",
 					"-lboost_log_setup",
+					"-lchaos_uitoolkit",
+					"-lchaos_common",
 				);
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
diff --git a/test/BSONTestPerf/BSONTestPerf/main.cpp b/test/BSONTestPerf/BSONTestPerf/main.cpp
index 773a2a6b4..bee3dfaec 100644
--- a/test/BSONTestPerf/BSONTestPerf/main.cpp
+++ b/test/BSONTestPerf/BSONTestPerf/main.cpp
@@ -45,14 +45,16 @@ int main(int argc, const char * argv[])
     // insert code here...
     timespec prevTS = {0,0};
     timespec ts = {0,0};
-
+    int64_t i64 = 20000;
+    int64_t i64N = 20000;
     current_utc_time(&prevTS);
     
     for (int i = 0; i < 10000; i++) {
         bson::BSONObjBuilder b;
         b.append("name", "Joe");
-        b.append("age", 33);
+        b.append("age", i64);
         bson::BSONObj p = b.obj();
+        i64N = p.getField("age").Long();
     }
     current_utc_time(&ts);
     int d = diff(&prevTS, &ts);
-- 
GitLab