diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index ef49cded3fc36028bfde24612ed0c2b8cabeddf0..eb8322c4e03fb9ed5d3b04a971684dbd48840788 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -720,6 +720,23 @@ public class Controller implements IFloodlightProviderService, IStorageSourceLis
         }
         log.info("Number of worker threads set to {}", this.workerThreads);
         
+        
+        /**
+         * Tulio Ribeiro
+         */
+        String controllerId = configParams.get("controllerId");
+        if (!Strings.isNullOrEmpty(controllerId)) {
+            try {
+            	this.controllerId = controllerId;
+            } catch (Exception e) {
+                log.error("Invalid controlelrId {}, {}", controllerId, e);
+                throw new FloodlightModuleException("Invalid controllerId of " + controllerId + " in config");
+            }
+        }        
+        log.info("ControllerId set to {}", this.controllerId);
+        
+        
+        
         String addresses = configParams.get("openFlowAddresses");
         if (!Strings.isNullOrEmpty(addresses)) {
             try {
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
index 0611648a5252cd623f1ade599777b3a9151c0067..41b63c45d5eb2cf10a8c65a695321de71a7b2708 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java
@@ -39,6 +39,7 @@ import org.projectfloodlight.openflow.protocol.OFHelloElem;
 import org.projectfloodlight.openflow.protocol.OFHelloElemVersionbitmap;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFPortStatus;
+import org.projectfloodlight.openflow.protocol.OFRoleStatus;
 import org.projectfloodlight.openflow.protocol.OFType;
 import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.projectfloodlight.openflow.protocol.ver13.OFHelloElemTypeSerializerVer13;
@@ -831,7 +832,7 @@ class OFChannelHandler extends SimpleChannelInboundHandler<Iterable<OFMessage>>
 				.build();
 		write(reply);
 	}
-	
+
 	private void write(OFMessage m) {
 		channel.writeAndFlush(Collections.singletonList(m));
 	}
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java
index 47671f5cedd4b502bfc8aa69a7354943568d62c2..aa9322d6442b5baec6863399decf5025d3cd2cf2 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java
@@ -55,6 +55,7 @@ import org.projectfloodlight.openflow.protocol.OFPortStatus;
 import org.projectfloodlight.openflow.protocol.OFQueueGetConfigReply;
 import org.projectfloodlight.openflow.protocol.OFRoleReply;
 import org.projectfloodlight.openflow.protocol.OFRoleRequest;
+import org.projectfloodlight.openflow.protocol.OFRoleStatus;
 import org.projectfloodlight.openflow.protocol.OFSetConfig;
 import org.projectfloodlight.openflow.protocol.OFStatsReply;
 import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags;
@@ -617,6 +618,13 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener {
 		void processOFRoleRequest(OFRoleRequest m) {
 			unhandledMessageWritten(m);
 		}
+		
+		/**
+		 *  Tulio Ribeiro
+		 */
+		void processOFRoleStatus(OFRoleStatus m){
+			unhandledMessageReceived(m);
+		}
 
 		void processOFNiciraControllerRoleRequest(OFNiciraControllerRoleRequest m) {
 			unhandledMessageWritten(m);
@@ -863,6 +871,9 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener {
 			case EXPERIMENTER:
 				processOFExperimenter((OFExperimenter) m);
 				break;
+			case ROLE_STATUS:
+				processOFRoleStatus((OFRoleStatus) m);
+				break;
 			default:
 				illegalMessageReceived(m);
 				break;
@@ -1313,7 +1324,20 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener {
 
 		@Override
 		void enterState(){
-			sendRoleRequest(roleManager.getOFControllerRole());
+			//sendRoleRequest(roleManager.getOFControllerRole());//original
+			/**
+			 * Tulio Ribeiro
+			 * Retrieve role from floodlightdefault.properties configuration file
+			 * swId;Role 00:00:00:00:00:00:00:01;ROLE_SLAVE
+			 * If not defined there, the role will be set as MASTER
+			 */
+			OFControllerRole role = OFControllerRole.ROLE_MASTER;
+			if(OFSwitchManager.switchInitialRole != null)
+				if(OFSwitchManager.switchInitialRole.containsKey(mainConnection.getDatapathId())){
+					role = OFSwitchManager.switchInitialRole.get(mainConnection.getDatapathId());
+					log.info("Defining switch role from config file: {}", role);				
+				}	
+			sendRoleRequest(role);			
 		}
 	}
 
@@ -1413,6 +1437,35 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener {
 		void processOFRoleRequest(OFRoleRequest m) {
 			sendRoleRequest(m);
 		}
+		
+		@Override
+		void processOFRoleStatus(OFRoleStatus m) {
+			/**
+			 *  Tulio Ribeiro
+			 *  
+			 *  Controller roles. 
+			 *  enum ofp_controller_role { 
+			 *  OFPCR_ROLE_NOCHANGE = 	0, Don’t change current role. 
+			 *  OFPCR_ROLE_EQUAL = 		1, Default role, full access. 
+			 *  OFPCR_ROLE_MASTER = 	2, Full access, at most one master. 
+			 *  OFPCR_ROLE_SLAVE = 		3, Read-only access. 
+			 *  };
+			 */
+			//log.info("Processing roleStatus from MasterState...");
+			long role = m.getRole();
+			if(role==3){
+				sendRoleRequest(OFControllerRole.ROLE_SLAVE);
+				/*OFSwitchManager.switchInitialRole.remove(mainConnection.getDatapathId());
+				OFSwitchManager.switchInitialRole.put(mainConnection.getDatapathId(), 
+						OFControllerRole.ROLE_SLAVE);*/
+			}
+			else if (role==2)
+				sendRoleRequest(OFControllerRole.ROLE_MASTER);
+			else if (role==1)
+				sendRoleRequest(OFControllerRole.ROLE_EQUAL);
+			else
+				sendRoleRequest(OFControllerRole.ROLE_NOCHANGE);
+		}
 
 		@Override
 		void processOFNiciraControllerRoleRequest(OFNiciraControllerRoleRequest m) {
@@ -1530,6 +1583,30 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener {
 		void processOFRoleRequest(OFRoleRequest m) {
 			sendRoleRequest(m);
 		}
+		
+		@Override
+		void processOFRoleStatus(OFRoleStatus m) {
+			/**
+			 *  Tulio Ribeiro
+			 *  
+			 *  Controller roles. 
+			 *  enum ofp_controller_role { 
+			 *  OFPCR_ROLE_NOCHANGE = 	0, Don’t change current role. 
+			 *  OFPCR_ROLE_EQUAL = 		1, Default role, full access. 
+			 *  OFPCR_ROLE_MASTER = 	2, Full access, at most one master. 
+			 *  OFPCR_ROLE_SLAVE = 		3, Read-only access. 
+			 *  };
+			 */
+			long role = m.getRole();
+			if(role==3)
+				sendRoleRequest(OFControllerRole.ROLE_SLAVE);
+			else if (role==2)
+				sendRoleRequest(OFControllerRole.ROLE_MASTER);
+			else if (role==1)
+				sendRoleRequest(OFControllerRole.ROLE_EQUAL);
+			else
+				sendRoleRequest(OFControllerRole.ROLE_NOCHANGE);
+		}
 
 		@Override
 		void processOFNiciraControllerRoleRequest(OFNiciraControllerRoleRequest m) {
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java
index 9b22851539d7f2e344514bcc9583a7ea23544145..789fe686876da4a06992be22073e9b2d373608b6 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java
@@ -92,7 +92,8 @@ import io.netty.util.concurrent.GlobalEventExecutor;
  * @author gregor, capveg, sovietaced
  *
  */
-public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListener, IHAListener, IFloodlightModule, IOFSwitchService, IStoreListener<DatapathId> {
+public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListener, 
+IHAListener, IFloodlightModule, IOFSwitchService, IStoreListener<DatapathId> {
 	private static final Logger log = LoggerFactory.getLogger(OFSwitchManager.class);
 
 	private volatile OFControllerRole role;
@@ -117,6 +118,8 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen
 	private ConcurrentHashMap<DatapathId, OFSwitchHandshakeHandler> switchHandlers;
 	private ConcurrentHashMap<DatapathId, IOFSwitchBackend> switches;
 	private ConcurrentHashMap<DatapathId, IOFSwitch> syncedSwitches;
+	
+	protected static Map<DatapathId, OFControllerRole> switchInitialRole;
 
 	private ISwitchDriverRegistry driverRegistry;
 
@@ -631,7 +634,8 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen
 	@Override
 	public Collection<Class<? extends IFloodlightService>>
 	getModuleDependencies() {
-		Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>();
+		Collection<Class<? extends IFloodlightService>> l = 
+				new ArrayList<Class<? extends IFloodlightService>>();
 
 		l.add(IFloodlightProviderService.class);
 		l.add(IDebugEventService.class);
@@ -728,6 +732,12 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen
 			log.info("Clear switch flow tables on each transition to master: TRUE");
 			OFSwitchManager.clearTablesOnEachTransitionToMaster = true;
 		}
+		
+		
+		//Define initial role per switch		
+		String switchesInitialState = configParams.get("switchesInitialState");
+		switchInitialRole = jsonToSwitchInitialRoleMap(switchesInitialState);
+		log.debug("SwitchInitialRole: {}", switchInitialRole.entrySet());
 
 		/*
 		 * Get default max table for forward to controller flows. 
@@ -1169,4 +1179,63 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen
             addUpdateToQueue(update);
         }*/
 	}
+	
+	
+	/**
+	 * Tulio Ribeiro
+	 * @param String json
+	 * @return Map<DatapathId, OFControllerRole>
+	 */
+	private static Map<DatapathId, OFControllerRole> jsonToSwitchInitialRoleMap(String json) {
+		MappingJsonFactory f = new MappingJsonFactory();
+		JsonParser jp;
+		Map<DatapathId, OFControllerRole> retValue = new HashMap<DatapathId, OFControllerRole>();
+
+		if (json == null || json.isEmpty()) {
+			return retValue;
+		}
+
+		try {
+			try {
+				jp = f.createParser(json);
+			} catch (JsonParseException e) {
+				throw new IOException(e);
+			}
+
+			jp.nextToken();
+			if (jp.getCurrentToken() != JsonToken.START_OBJECT) {
+				throw new IOException("Expected START_OBJECT");
+			}
+
+			while (jp.nextToken() != JsonToken.END_OBJECT) {
+				if (jp.getCurrentToken() != JsonToken.FIELD_NAME) {
+					throw new IOException("Expected FIELD_NAME");
+				}
+
+				String n = jp.getCurrentName();
+				jp.nextToken();
+				if (jp.getText().equals("")) {
+					continue;
+				}
+
+				DatapathId dpid;
+				OFControllerRole ofcr=OFControllerRole.ROLE_NOCHANGE;
+
+				try {
+					n = n.trim();
+					dpid = DatapathId.of(n);
+					ofcr = OFControllerRole.valueOf(jp.getText());
+					retValue.put(dpid, ofcr);
+
+				} catch (NumberFormatException e) {
+					log.error("Invalid DPID format: {}, or OFControllerRole: {}", n, ofcr);
+				}
+			}
+		} catch (IOException e) {
+			log.error("Problem: {}", e);
+		}
+		return retValue;
+	}
+	
+	
 }
diff --git a/src/main/java/net/floodlightcontroller/simpleft/FT.java b/src/main/java/net/floodlightcontroller/simpleft/FT.java
new file mode 100644
index 0000000000000000000000000000000000000000..f725ecf3cf493bd0784cdd8c59f78a1af9af7ba0
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/simpleft/FT.java
@@ -0,0 +1,299 @@
+/**
+ * Tulio Alberton Ribeiro
+ * 
+ * LaSIGE - Large-Scale Informatics Systems Laboratory
+ * 
+ * 03/2016
+ * 
+ * Without warrant
+ * 
+ *    Licensed under the Apache License, Version 2.0 (the "License"); you may
+ *    not use this file except in compliance with the License. You may obtain
+ *    a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+package net.floodlightcontroller.simpleft;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import net.floodlightcontroller.core.FloodlightContext;
+import net.floodlightcontroller.core.IOFMessageListener;
+import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.IOFSwitchListener;
+import net.floodlightcontroller.core.PortChangeType;
+import net.floodlightcontroller.core.internal.FloodlightProvider;
+import net.floodlightcontroller.core.internal.IOFSwitchService;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.core.module.FloodlightModuleException;
+import net.floodlightcontroller.core.module.IFloodlightModule;
+import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.storage.IStorageSourceService;
+import net.floodlightcontroller.threadpool.IThreadPoolService;
+
+import org.projectfloodlight.openflow.protocol.OFControllerRole;
+import org.projectfloodlight.openflow.protocol.OFMessage;
+import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFRoleReply;
+import org.projectfloodlight.openflow.protocol.OFType;
+import org.projectfloodlight.openflow.types.DatapathId;
+import org.sdnplatform.sync.IStoreClient;
+import org.sdnplatform.sync.IStoreListener;
+import org.sdnplatform.sync.ISyncService;
+import org.sdnplatform.sync.ISyncService.Scope;
+import org.sdnplatform.sync.error.SyncException;
+import org.sdnplatform.sync.internal.rpc.IRPCListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FT implements 
+IOFMessageListener, 
+IFloodlightModule,
+IStoreListener<String>,
+IOFSwitchListener,
+IRPCListener
+{
+
+	private ISyncService syncService;
+	private IStoreClient<String, String> storeFT;
+	
+	protected static Logger logger = LoggerFactory.getLogger(FT.class);
+	
+	protected static IOFSwitchService switchService;
+	private static UtilDurable utilDurable;
+			
+	private String controllerId;
+
+	@Override
+	public String getName() {
+		// TODO Auto-generated method stub
+		return FT.class.getSimpleName();
+	}
+
+	@Override
+	public boolean isCallbackOrderingPrereq(OFType type, String name) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public boolean isCallbackOrderingPostreq(OFType type, String name) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public Collection<Class<? extends IFloodlightService>> getModuleServices() {
+		// TODO Auto-generated method stub
+		return null;
+
+	}
+
+	@Override
+	public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
+		// TODO Auto-generated method stub
+		return null;
+
+	}
+
+	@Override
+	public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
+		// TODO Auto-generated method stub
+		Collection<Class<? extends IFloodlightService>> l =
+				new ArrayList<Class<? extends IFloodlightService>>();
+		l.add(IStorageSourceService.class);
+		l.add(ISyncService.class);
+		l.add(IOFSwitchService.class);
+		return l;
+	}
+
+	@Override
+	public void init(FloodlightModuleContext context)
+			throws FloodlightModuleException {
+		// TODO Auto-generated method stub
+		
+		this.syncService = context.getServiceImpl(ISyncService.class);
+		switchService = context.getServiceImpl(IOFSwitchService.class);
+		utilDurable = new UtilDurable();
+
+		Map<String, String> configParams = context.getConfigParams(FloodlightProvider.class);
+		controllerId = configParams.get("controllerId");
+	}
+
+	@Override
+	public void startUp(FloodlightModuleContext context)
+			throws FloodlightModuleException {
+		
+		switchService.addOFSwitchListener(this);
+		syncService.addRPCListener(this);
+		
+		try {
+			this.syncService.registerStore("FT_Switches", Scope.GLOBAL);
+			this.storeFT = this.syncService
+					.getStoreClient("FT_Switches",
+							String.class,
+							String.class);
+			this.storeFT.addStoreListener(this);
+		} catch (SyncException e) {
+			throw new FloodlightModuleException("Error while setting up sync service", e);
+		}
+		
+	}
+
+	@Override
+	public net.floodlightcontroller.core.IListener.Command receive(
+			IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void keysModified(Iterator<String> keys,
+			org.sdnplatform.sync.IStoreListener.UpdateType type) {
+		// TODO Auto-generated method stub
+		while(keys.hasNext()){
+			String k = keys.next();
+			try {
+				/*logger.debug("keysModified: Key:{}, Value:{}, Type: {}", 
+						new Object[] {
+							k, 
+							storeClient.get(k).getValue().toString(), 
+							type.name()}
+						);*/
+				if(type.name().equals("REMOTE")){
+					String swIds = storeFT.get(k).getValue();
+					logger.debug("REMOTE: NodeId:{}, Switches:{}", k, swIds);
+				}
+			} catch (SyncException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+	@Override
+	public void switchAdded(DatapathId switchId) {
+		// TODO Auto-generated method stub
+	}
+
+	@Override
+	public void switchRemoved(DatapathId switchId) {
+		// TODO Auto-generated method stub
+		try {
+			this.storeFT.put(controllerId, getActiveSwitches());
+		} catch (SyncException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void switchActivated(DatapathId switchId) {
+		// TODO Auto-generated method stub
+		String switches = getActiveSwitches();
+		if(switches==null)return;
+		try {
+			this.storeFT.put(controllerId, switches);
+		} catch (SyncException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void switchPortChanged(DatapathId switchId, OFPortDesc port,
+			PortChangeType type) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void switchChanged(DatapathId switchId) {
+		// TODO Auto-generated method stub
+		String switches = getActiveSwitches();
+		if(switches==null)return;
+		try {
+			this.storeFT.put(controllerId, switches);
+		} catch (SyncException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+
+	public String getActiveSwitches(){
+		if(switchService == null)return null;
+		String activeSwitches = "";
+		Iterator<DatapathId> itDpid = switchService.getAllSwitchDpids().iterator();
+		while (itDpid.hasNext()) {
+			DatapathId dpid = itDpid.next();
+			try{
+				if(switchService.getActiveSwitch(dpid).isActive()){
+					activeSwitches += dpid;
+					if(itDpid.hasNext())
+						activeSwitches += ",";	
+				}
+			}
+			catch(NullPointerException npe){
+				return null;
+			}
+		}
+		return activeSwitches;
+	}
+
+	public void setSwitchRole(OFControllerRole role, String swId){
+
+		IOFSwitch sw = switchService.getActiveSwitch(DatapathId.of(swId));
+		OFRoleReply reply=null;
+		UtilDurable utilDurable = new UtilDurable();
+		reply = utilDurable.setSwitchRole(sw, role);
+		
+		if(reply!=null){
+			logger.info("DEFINED {} as {}, reply.getRole:{}!", 
+					new Object[]{
+					sw.getId(), 
+					role,
+					reply.getRole()});
+		}
+		else
+			logger.info("Reply NULL!");
+	}
+
+	@Override
+	public void disconnectedNode(Short nodeId) {
+		// TODO Auto-generated method stub
+		String swIds=null; 
+		try {
+			swIds = storeFT.get(""+nodeId).getValue();
+			logger.debug("Switches managed by nodeId:{}, Switches:{}", nodeId, swIds);							
+		} catch (SyncException e) {
+			e.printStackTrace();
+		}
+		
+		if(!swIds.equals("")){
+			String swId[] = swIds.split(",");
+			for (int i = 0; i < swId.length; i++) {
+				setSwitchRole(OFControllerRole.ROLE_MASTER, swId[i]);	
+			}	
+		}
+	}
+
+	@Override
+	public void connectedNode(Short nodeId) {
+		// TODO Auto-generated method stub
+		String activeSwicthes = getActiveSwitches();
+		logger.debug("NodeID: {} connected, my switches: {}", nodeId, activeSwicthes);
+		try {
+			storeFT.put(controllerId, activeSwicthes);
+		} catch (SyncException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+}
diff --git a/src/main/java/net/floodlightcontroller/simpleft/UtilDurable.java b/src/main/java/net/floodlightcontroller/simpleft/UtilDurable.java
new file mode 100644
index 0000000000000000000000000000000000000000..bdd5a9f27ca150f1bcaeaeec2523f44534a64c2e
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/simpleft/UtilDurable.java
@@ -0,0 +1,37 @@
+package net.floodlightcontroller.simpleft;
+
+import java.util.concurrent.TimeUnit;
+
+import net.floodlightcontroller.core.IOFSwitch;
+
+import org.projectfloodlight.openflow.protocol.OFControllerRole;
+import org.projectfloodlight.openflow.protocol.OFRoleReply;
+import org.projectfloodlight.openflow.types.U64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class UtilDurable {
+	private static Logger logger;
+	
+	public UtilDurable(){
+		logger = LoggerFactory.getLogger(UtilDurable.class);
+	}
+	
+	public OFRoleReply setSwitchRole(IOFSwitch sw, OFControllerRole role) {
+		try {	
+			ListenableFuture<OFRoleReply> future = sw.writeRequest(sw.getOFFactory().buildRoleRequest()
+					.setGenerationId(U64.ZERO)
+					.setRole(role)
+					.build());
+			return future.get(10, TimeUnit.SECONDS);
+
+		} catch (Exception e) {
+			logger.error("Failure setting switch {} role to {}.", sw.toString(), role.toString());
+			logger.error(e.getMessage());
+		}
+		return null;
+	}
+
+}
diff --git a/src/main/java/org/sdnplatform/sync/ISyncService.java b/src/main/java/org/sdnplatform/sync/ISyncService.java
index 48feead4a3c378e61147292203db3ccaa6435900..6598952829ec4c9751c80a1c9995a1bde844ac35 100644
--- a/src/main/java/org/sdnplatform/sync/ISyncService.java
+++ b/src/main/java/org/sdnplatform/sync/ISyncService.java
@@ -1,13 +1,13 @@
 package org.sdnplatform.sync;
 
+import net.floodlightcontroller.core.module.IFloodlightService;
+
 import org.sdnplatform.sync.error.SyncException;
 import org.sdnplatform.sync.error.UnknownStoreException;
+import org.sdnplatform.sync.internal.rpc.IRPCListener;
 
-import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.core.type.TypeReference;
-
-
-import net.floodlightcontroller.core.module.IFloodlightService;
+import com.fasterxml.jackson.databind.JsonNode;
 
 /**
  * The sync service provides a high-performance in-memory database for
@@ -133,4 +133,18 @@ public interface ISyncService extends IFloodlightService {
                        IInconsistencyResolver<Versioned<V>> resolver)
                                throws UnknownStoreException;
 
+
+    
+    
+   
+    /**
+     * Listener to RPC connections, used in simple Fault tolerance module,
+     * or other modules that need cluster monitor nodes (connect and disconnect).
+     * The listener is dispatched at connected or disconnected events.
+     * The listener inform the node id of connected or disconnected nodes on cluster.
+     * @param listener
+     */
+	public void addRPCListener(IRPCListener listener);
+	public void removeRPCListener(IRPCListener listener);
+    
 }
diff --git a/src/main/java/org/sdnplatform/sync/internal/SyncManager.java b/src/main/java/org/sdnplatform/sync/internal/SyncManager.java
index 540fa42b1c1155ee49869caf8403c937e4d83052..92e57e09990bdf52f54d718cf80aed2988d5335f 100644
--- a/src/main/java/org/sdnplatform/sync/internal/SyncManager.java
+++ b/src/main/java/org/sdnplatform/sync/internal/SyncManager.java
@@ -18,13 +18,19 @@ import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.core.type.TypeReference;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.core.module.FloodlightModuleException;
+import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.core.util.SingletonTask;
+import net.floodlightcontroller.debugcounter.IDebugCounter;
+import net.floodlightcontroller.debugcounter.IDebugCounterService;
+import net.floodlightcontroller.storage.IStorageSourceService;
+import net.floodlightcontroller.threadpool.IThreadPoolService;
 
 import org.sdnplatform.sync.IClosableIterator;
 import org.sdnplatform.sync.ISyncService;
-import org.sdnplatform.sync.Versioned;
 import org.sdnplatform.sync.IVersion.Occurred;
+import org.sdnplatform.sync.Versioned;
 import org.sdnplatform.sync.error.PersistException;
 import org.sdnplatform.sync.error.SyncException;
 import org.sdnplatform.sync.error.SyncRuntimeException;
@@ -38,6 +44,7 @@ import org.sdnplatform.sync.internal.config.Node;
 import org.sdnplatform.sync.internal.config.PropertyCCProvider;
 import org.sdnplatform.sync.internal.config.StorageCCProvider;
 import org.sdnplatform.sync.internal.config.SyncStoreCCProvider;
+import org.sdnplatform.sync.internal.rpc.IRPCListener;
 import org.sdnplatform.sync.internal.rpc.RPCService;
 import org.sdnplatform.sync.internal.rpc.TProtocolUtil;
 import org.sdnplatform.sync.internal.store.IStorageEngine;
@@ -46,22 +53,16 @@ import org.sdnplatform.sync.internal.store.MappingStoreListener;
 import org.sdnplatform.sync.internal.store.SynchronizingStorageEngine;
 import org.sdnplatform.sync.internal.util.ByteArray;
 import org.sdnplatform.sync.internal.version.VectorClock;
-import org.sdnplatform.sync.thrift.SyncMessage;
 import org.sdnplatform.sync.thrift.KeyedValues;
 import org.sdnplatform.sync.thrift.KeyedVersions;
+import org.sdnplatform.sync.thrift.SyncMessage;
 import org.sdnplatform.sync.thrift.SyncOfferMessage;
 import org.sdnplatform.sync.thrift.SyncValueMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.floodlightcontroller.core.module.FloodlightModuleException;
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.floodlightcontroller.core.util.SingletonTask;
-import net.floodlightcontroller.debugcounter.IDebugCounter;
-import net.floodlightcontroller.debugcounter.IDebugCounterService;
-import net.floodlightcontroller.storage.IStorageSourceService;
-import net.floodlightcontroller.threadpool.IThreadPoolService;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 
 /**
@@ -71,6 +72,7 @@ import net.floodlightcontroller.threadpool.IThreadPoolService;
  * @see ISyncService
  */
 public class SyncManager extends AbstractSyncManager {
+	
 	protected static final Logger logger =
 			LoggerFactory.getLogger(SyncManager.class.getName());
 
@@ -812,4 +814,29 @@ public class SyncManager extends AbstractSyncManager {
 			return bsm;
 		}
 	}
+
+	
+	/**
+	 * Add a listener to RPC connections on cluster.
+	 * The listener is dispatched at connect or disconnect events. 
+	 * Can be used to monitor connections or disconnections on cluster configs.
+	 */
+	@Override
+	public void addRPCListener(IRPCListener listener) {
+		// TODO Auto-generated method stub
+		rpcService.addRPCListener(listener);
+		
+	}
+	/**
+	 * Remove the listener to RPC connections on cluster.
+	 * The listener is dispatched at connect or disconnect events. 
+	 * Can be used to monitor connections or disconnections on cluster configs.
+	 */
+	@Override
+	public void removeRPCListener(IRPCListener listener) {
+		// TODO Auto-generated method stub
+		rpcService.removeRPCListener(listener);
+	}
+
+	
 }
diff --git a/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java b/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java
index c78218c206be2ca0a7a54ac0971e828c407806c2..113f3a33a47a4210d27db001fdf90c58e523467d 100644
--- a/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java
+++ b/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java
@@ -21,7 +21,7 @@ public class PropertyCCProvider implements IClusterConfigProvider {
 
     @Override
     public ClusterConfig getConfig() throws SyncException {
-        if (!config.containsKey("nodes") || !config.containsKey("thisNode"))
+    	if (!config.containsKey("nodes") || !config.containsKey("thisNodeId"))
             throw new SyncException("Configuration properties nodes or " +
                     "thisNode not set");
 
@@ -34,10 +34,10 @@ public class PropertyCCProvider implements IClusterConfigProvider {
         
         Short thisNodeId;
         try {
-            thisNodeId = Short.parseShort(config.get("thisNode"));
+            thisNodeId = Short.parseShort(config.get("thisNodeId"));
         } catch (NumberFormatException e) {
             throw new SyncException("Failed to parse thisNode " +
-                    "node ID: " + config.get("thisNode"), e);
+                    "node ID: " + config.get("thisNodeId"), e);
         }
         try {
             ObjectMapper mapper = new ObjectMapper();
@@ -49,6 +49,7 @@ public class PropertyCCProvider implements IClusterConfigProvider {
                                      keyStorePath, 
                                      keyStorePassword);
         } catch (Exception e) {
+        	e.printStackTrace();
             throw new SyncException("Could not update " +
                     "configuration", e);
         }
diff --git a/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java b/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java
index 23b8e7bc24b93d37d565081c5da17252be97a95f..fbe81c5b81ecd970a60ca6817f36417b9205d5b7 100644
--- a/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java
+++ b/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java
@@ -3,6 +3,7 @@ package org.sdnplatform.sync.internal.remote;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Future;
@@ -28,6 +29,8 @@ import org.sdnplatform.sync.error.SyncRuntimeException;
 import org.sdnplatform.sync.error.UnknownStoreException;
 import org.sdnplatform.sync.internal.AbstractSyncManager;
 import org.sdnplatform.sync.internal.config.AuthScheme;
+import org.sdnplatform.sync.internal.config.ClusterConfig;
+import org.sdnplatform.sync.internal.rpc.IRPCListener;
 import org.sdnplatform.sync.internal.rpc.RPCService;
 import org.sdnplatform.sync.internal.rpc.TProtocolUtil;
 import org.sdnplatform.sync.internal.store.IStore;
@@ -370,4 +373,17 @@ public class RemoteSyncManager extends AbstractSyncManager {
             throw new RemoteStoreException("Error while waiting for reply", e);
         }        
     }
+
+	
+	@Override
+	public void addRPCListener(IRPCListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void removeRPCListener(IRPCListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
 }
diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java b/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java
index 9d0f2b447908b3b413a2e837a5a4a71dddd38448..9c0077a9dd3ba8767617f03fed074c2a0bc47511 100644
--- a/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java
+++ b/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java
@@ -335,6 +335,7 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda
             throw new AuthException("No authentication data in " + 
                     "handshake message");
         }
+        
         if (cr.isSetResponse()) {
             authenticateResponse(currentChallenge, cr.getResponse());
             currentChallenge = null;
@@ -348,8 +349,7 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda
             header.setTransactionId(getTransactionId());
             m.setHeader(header);
             SyncMessage bsm = new SyncMessage(MessageType.HELLO);
-            bsm.setHello(m);
-
+            bsm.setHello(m); 
             AuthChallengeResponse reply = new AuthChallengeResponse();
             reply.setResponse(generateResponse(cr.getChallenge()));
             m.setAuthChallengeResponse(reply);
@@ -622,7 +622,7 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda
     }
     
     private String generateResponse(String challenge) throws AuthException {
-        byte[] secretBytes = getSharedSecret();
+    	byte[] secretBytes = getSharedSecret();
         if (secretBytes == null) return null;
 
         SecretKeySpec signingKey = 
@@ -631,9 +631,9 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda
         try {
             mac = Mac.getInstance("HmacSHA1");
         } catch (NoSuchAlgorithmException e) {
-            throw new AuthException("Could not initialize HmacSHA1 algorithm", 
-                                    e);
+            throw new AuthException("Could not initialize HmacSHA1 algorithm", e);
         }
+        
         try {
             mac.init(signingKey);
             byte[] output = 
diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/IRPCListener.java b/src/main/java/org/sdnplatform/sync/internal/rpc/IRPCListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..a124e341f2f09c6fb9c4697d6bc743f5f003cc80
--- /dev/null
+++ b/src/main/java/org/sdnplatform/sync/internal/rpc/IRPCListener.java
@@ -0,0 +1,32 @@
+/**
+ * Tulio Alberton Ribeiro
+ * 
+ * LaSIGE - Large-Scale Informatics Systems Laboratory
+ * 
+ * 03/2016
+ * 
+ * Without warrant
+ * 
+ *    Licensed under the Apache License, Version 2.0 (the "License"); you may
+ *    not use this file except in compliance with the License. You may obtain
+ *    a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+package org.sdnplatform.sync.internal.rpc;
+
+public interface IRPCListener {
+	
+	/**
+	 * Inform to listeners when a node is disconnected.
+	 * @param nodeId
+	 */
+	public void disconnectedNode(Short nodeId);
+	
+	/**
+	 * Inform to listeners when a node is connected.
+	 * @param nodeId
+	 */
+	public void connectedNode(Short nodeId);
+}
diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java
index a1c4fd7af7e73f9f97f5d165866adff4cca9fd10..aca15d1f6bf6e15d9f4effd0fe90f310924b28f1 100644
--- a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java
+++ b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java
@@ -556,14 +556,14 @@ public class RPCChannelHandler extends AbstractRPCChannelHandler {
 
     @Override
     protected byte[] getSharedSecret() throws AuthException {
-        String path = syncManager.getClusterConfig().getKeyStorePath();
-        String pass = syncManager.getClusterConfig().getKeyStorePassword();
-        try {
-            return CryptoUtil.getSharedSecret(path, pass);
-        } catch (Exception e) {
-            throw new AuthException("Could not read challenge/response " +
-                    "shared secret from key store " + path, e);
-        }
+    	 String path = syncManager.getClusterConfig().getKeyStorePath();
+         String pass = syncManager.getClusterConfig().getKeyStorePassword();
+         try {
+             return CryptoUtil.getSharedSecret(path, pass);
+         } catch (Exception e) {
+             throw new AuthException("Could not read challenge/response " +
+                     "shared secret from key store " + path, e);
+         }
     }
 
     @Override
diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java
index 962e355437fd946335f5f56c7a2c95977ca75670..824d1717f14869d8f9014d73eb71b49b240f35f7 100644
--- a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java
+++ b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java
@@ -1,12 +1,30 @@
 package org.sdnplatform.sync.internal.rpc;
 
+import io.netty.bootstrap.Bootstrap;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.group.ChannelGroup;
+import io.netty.channel.group.DefaultChannelGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.Timer;
+import io.netty.util.concurrent.GlobalEventExecutor;
+
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.EnumSet;
 import java.util.HashMap;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedTransferQueue;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
@@ -14,30 +32,15 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.LinkedTransferQueue;
 
 import net.floodlightcontroller.core.util.SingletonTask;
 import net.floodlightcontroller.debugcounter.IDebugCounterService;
-import io.netty.bootstrap.Bootstrap;
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelFutureListener;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.group.ChannelGroup;
-import io.netty.channel.group.DefaultChannelGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.util.Timer;
-import io.netty.util.concurrent.GlobalEventExecutor;
 
 import org.sdnplatform.sync.internal.SyncManager;
 import org.sdnplatform.sync.internal.config.Node;
 import org.sdnplatform.sync.internal.util.Pair;
-import org.sdnplatform.sync.thrift.SyncMessage;
 import org.sdnplatform.sync.thrift.MessageType;
+import org.sdnplatform.sync.thrift.SyncMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +48,7 @@ import org.slf4j.LoggerFactory;
  * A lightweight RPC mechanism built on netty.
  * @author readams
  */
-public class RPCService {
+public class RPCService{
     protected static final Logger logger =
             LoggerFactory.getLogger(RPCService.class);
 
@@ -54,6 +57,11 @@ public class RPCService {
      */
     protected SyncManager syncManager;
 
+    /**
+     *Tulio Ribeiro
+     */
+ 	protected Set<IRPCListener> rpcListeners;
+ 	
     /**
      * Debug counter service
      */
@@ -172,6 +180,7 @@ public class RPCService {
         this.syncManager = syncManager;
         this.debugCounter = debugCounter;
         this.timer = timer;
+        this.rpcListeners = new CopyOnWriteArraySet<IRPCListener>();
 
         messageWindows = new ConcurrentHashMap<Short, MessageWindow>();
     }
@@ -299,6 +308,16 @@ public class RPCService {
                 nc.nuke();
             }
             connections.remove(nodeId);
+           
+            /**
+             * Tulio Ribeiro
+             * Inform all registered modules about disconnected node
+             */
+            if (rpcListeners != null) {
+				for (IRPCListener listener : rpcListeners) {
+					listener.disconnectedNode(nodeId);
+				}
+			}
         }
     }
     
@@ -502,6 +521,16 @@ public class RPCService {
             }
             c.nodeChannel = channel;
             c.state = NodeConnectionState.CONNECTED;
+            
+            /**
+             * Tulio Ribeiro
+             * Inform all registered modules about connected node
+             */
+            if (rpcListeners != null) {
+				for (IRPCListener listener : rpcListeners) {
+					listener.connectedNode(nodeId);
+				}
+			}
         }
     }
 
@@ -674,4 +703,16 @@ public class RPCService {
             }
         }
     }
+    
+    
+	//@Override
+	public void addRPCListener(IRPCListener listener) {
+		this.rpcListeners.add(listener);
+	}
+
+	//@Override
+	public void removeRPCListener(IRPCListener listener) {
+		this.rpcListeners.remove(listener);
+	}
+
 }
\ No newline at end of file
diff --git a/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java b/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java
index 73998477a51eb01658af19fe9f65935559e8db76..3cbece71242d654e85e0f6ad21b33ffd201b8e21 100644
--- a/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java
+++ b/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java
@@ -1,8 +1,11 @@
 package org.sdnplatform.sync.internal.util;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.security.Key;
 import java.security.KeyStore;
+import java.security.KeyStore.Entry;
 import java.security.SecureRandom;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
@@ -12,9 +15,7 @@ import org.sdnplatform.sync.ISyncService;
 public class CryptoUtil {
     private static SecureRandom secureRandom = new SecureRandom();
 
-    public static final String CHALLENGE_RESPONSE_SECRET = 
-            ISyncService.class.getPackage().getName() + 
-            ".ChallengeResponseSecret";
+    public static final String CHALLENGE_RESPONSE_SECRET = "AliasChallengeResponse";
     
     public static byte[] secureRandom(int bytes) {
         byte[] r = new byte[bytes];
@@ -43,16 +44,12 @@ public class CryptoUtil {
                                          String keyStorePassword) 
                                                     throws Exception {
         if (keyStorePath == null) return null;
-        char[] password = keyStorePassword.toCharArray();
-        KeyStore.ProtectionParameter protParam =
-                new KeyStore.PasswordProtection(password);
-
-        KeyStore ks = readKeyStore(keyStorePath, password);
-
-        KeyStore.SecretKeyEntry entry = (KeyStore.SecretKeyEntry)
-                ks.getEntry(CHALLENGE_RESPONSE_SECRET, protParam);
-        SecretKey secretKey = entry.getSecretKey();
-        return secretKey.getEncoded();
+       
+        KeyStore keyStore = KeyStore.getInstance("JCEKS");
+        keyStore.load(new FileInputStream(keyStorePath), keyStorePassword.toCharArray());
+        Key key = keyStore.getKey(CHALLENGE_RESPONSE_SECRET, keyStorePassword.toCharArray());
+        
+        return key.getEncoded();
     }
     
     public static void writeSharedSecret(String keyStorePath,
diff --git a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
index b7dfe953e276c4fea382bdb2bd1ff63851d52f74..4aa8eb12eb21ecfd0cc84558d493e12930aec27c 100644
--- a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
+++ b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
@@ -16,6 +16,7 @@ net.floodlightcontroller.threadpool.ThreadPool
 net.floodlightcontroller.core.internal.ShutdownServiceImpl
 org.sdnplatform.sync.internal.SyncManager
 org.sdnplatform.sync.internal.SyncTorture
+net.floodlightcontroller.simpleft.FT
 net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher
 net.floodlightcontroller.testmodule.TestModule
 net.floodlightcontroller.topology.TopologyManager
diff --git a/src/main/resources/floodlightNodeBackup.properties b/src/main/resources/floodlightNodeBackup.properties
new file mode 100644
index 0000000000000000000000000000000000000000..fe982dec77c928dbacb225e237ec91e23ab31b6b
--- /dev/null
+++ b/src/main/resources/floodlightNodeBackup.properties
@@ -0,0 +1,48 @@
+floodlight.modules=\
+net.floodlightcontroller.storage.memory.MemoryStorageSource,\
+net.floodlightcontroller.core.internal.FloodlightProvider,\
+net.floodlightcontroller.threadpool.ThreadPool,\
+net.floodlightcontroller.debugcounter.DebugCounterServiceImpl,\
+net.floodlightcontroller.perfmon.PktInProcessingTime,\
+net.floodlightcontroller.debugevent.DebugEventService,\
+net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,\
+net.floodlightcontroller.topology.TopologyManager,\
+net.floodlightcontroller.forwarding.Forwarding,\
+net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager,\
+net.floodlightcontroller.ui.web.StaticWebRoutable,\
+net.floodlightcontroller.loadbalancer.LoadBalancer,\
+net.floodlightcontroller.firewall.Firewall,\
+net.floodlightcontroller.simpleft.FT,\
+net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,\
+net.floodlightcontroller.accesscontrollist.ACL,\
+net.floodlightcontroller.statistics.StatisticsCollector
+org.sdnplatform.sync.internal.SyncManager.authScheme=CHALLENGE_RESPONSE
+org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/key2.jceks
+org.sdnplatform.sync.internal.SyncManager.dbPath=/var/lib/floodlight2/
+org.sdnplatform.sync.internal.SyncManager.keyStorePassword=PassWord
+org.sdnplatform.sync.internal.SyncManager.port=6643
+org.sdnplatform.sync.internal.SyncManager.thisNodeId=2
+org.sdnplatform.sync.internal.SyncManager.persistenceEnabled=FALSE
+org.sdnplatform.sync.internal.SyncManager.nodes=[\
+{"nodeId": 1, "domainId": 1, "hostname": "192.168.1.100", "port": 6642},\
+{"nodeId": 2, "domainId": 1, "hostname": "192.168.1.100", "port": 6643}\
+]
+net.floodlightcontroller.forwarding.Forwarding.match=vlan, mac, ip, transport
+net.floodlightcontroller.forwarding.Forwarding.flood-arp=NO
+net.floodlightcontroller.core.internal.FloodlightProvider.openFlowPort=7753
+net.floodlightcontroller.core.internal.FloodlightProvider.role=ACTIVE
+net.floodlightcontroller.core.internal.FloodlightProvider.workerThreads=8
+net.floodlightcontroller.core.internal.FloodlightProvider.controllerId=2
+net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-history-size=10
+net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-update-threshold=0.5
+net.floodlightcontroller.core.internal.OFSwitchManager.defaultMaxTablesToReceiveTableMissFlow=1
+net.floodlightcontroller.core.internal.OFSwitchManager.maxTablesToReceiveTableMissFlowPerDpid={"00:00:00:00:00:00:00:01":"1","2":"1"}
+net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnInitialHandshakeAsMaster=NO
+net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnEachTransitionToMaster=NO
+net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePath=/path/to/file.jceks
+net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePassword=Password
+net.floodlightcontroller.core.internal.OFSwitchManager.useSsl=NO
+net.floodlightcontroller.core.internal.OFSwitchManager.supportedOpenFlowVersions=1.0, 1.1, 1.2, 1.3, 1.4
+net.floodlightcontroller.core.internal.OFSwitchManager.switchesInitialState={"00:00:00:00:00:00:00:01":"ROLE_SLAVE","00:00:00:00:00:00:00:02":"ROLE_SLAVE", "00:00:00:00:00:00:00:03":"ROLE_SLAVE", "00:00:00:00:00:00:00:04":"ROLE_SLAVE","00:00:00:00:00:00:00:05":"ROLE_SLAVE"}
+net.floodlightcontroller.statistics.StatisticsCollector.enable=FALSE
+net.floodlightcontroller.statistics.StatisticsCollector.collectionIntervalPortStatsSeconds=10
\ No newline at end of file
diff --git a/src/main/resources/floodlightdefault.properties b/src/main/resources/floodlightdefault.properties
index 89bf32381355331dd93a011d0e59d2a2581d4d5d..451528d3eaa8668af31baa46c594591080d763a7 100644
--- a/src/main/resources/floodlightdefault.properties
+++ b/src/main/resources/floodlightdefault.properties
@@ -14,29 +14,40 @@ net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager,\
 net.floodlightcontroller.ui.web.StaticWebRoutable,\
 net.floodlightcontroller.loadbalancer.LoadBalancer,\
 net.floodlightcontroller.firewall.Firewall,\
+net.floodlightcontroller.simpleft.FT,\
 net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,\
 net.floodlightcontroller.accesscontrollist.ACL,\
 net.floodlightcontroller.statistics.StatisticsCollector
 org.sdnplatform.sync.internal.SyncManager.authScheme=CHALLENGE_RESPONSE
-org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/auth_credentials.jceks
+org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/key2.jceks
 org.sdnplatform.sync.internal.SyncManager.dbPath=/var/lib/floodlight/
+org.sdnplatform.sync.internal.SyncManager.keyStorePassword=PassWord
 org.sdnplatform.sync.internal.SyncManager.port=6642
+org.sdnplatform.sync.internal.SyncManager.thisNodeId=1
+org.sdnplatform.sync.internal.SyncManager.persistenceEnabled=FALSE
+org.sdnplatform.sync.internal.SyncManager.nodes=[\
+{"nodeId": 1, "domainId": 1, "hostname": "192.168.1.100", "port": 6642},\
+{"nodeId": 2, "domainId": 1, "hostname": "192.168.1.100", "port": 6643}\
+]
 net.floodlightcontroller.forwarding.Forwarding.match=vlan, mac, ip, transport
 net.floodlightcontroller.forwarding.Forwarding.flood-arp=NO
 net.floodlightcontroller.core.internal.FloodlightProvider.openFlowPort=6653
 net.floodlightcontroller.core.internal.FloodlightProvider.role=ACTIVE
+net.floodlightcontroller.core.internal.FloodlightProvider.workerThreads=8
+net.floodlightcontroller.core.internal.FloodlightProvider.controllerId=1
 net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-history-size=10
 net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-update-threshold=0.5
 net.floodlightcontroller.core.internal.OFSwitchManager.defaultMaxTablesToReceiveTableMissFlow=1
 net.floodlightcontroller.core.internal.OFSwitchManager.maxTablesToReceiveTableMissFlowPerDpid={"00:00:00:00:00:00:00:01":"1","2":"1"}
-net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnInitialHandshakeAsMaster=YES
-net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnEachTransitionToMaster=YES
-net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePath=/path/to/your/keystore-file.jks
-net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePassword=your-keystore-password
+net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnInitialHandshakeAsMaster=NO
+net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnEachTransitionToMaster=NO
+net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePath=/path/to.jecks
+net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePassword=PassFL
 net.floodlightcontroller.core.internal.OFSwitchManager.useSsl=NO
 net.floodlightcontroller.core.internal.OFSwitchManager.supportedOpenFlowVersions=1.0, 1.1, 1.2, 1.3, 1.4
-net.floodlightcontroller.restserver.RestApiServer.keyStorePath=/path/to/your/keystore-file.jks
-net.floodlightcontroller.restserver.RestApiServer.keyStorePassword=your-keystore-password
+net.floodlightcontroller.core.internal.OFSwitchManager.switchesInitialState={"00:00:00:00:00:00:00:01":"ROLE_MASTER","00:00:00:00:00:00:00:02":"ROLE_MASTER", "00:00:00:00:00:00:00:03":"ROLE_MASTER", "00:00:00:00:00:00:00:04":"ROLE_MASTER","00:00:00:00:00:00:00:05":"ROLE_MASTER"}
+net.floodlightcontroller.restserver.RestApiServer.keyStorePath=/path/to.jceks
+net.floodlightcontroller.restserver.RestApiServer.keyStorePassword=Password
 net.floodlightcontroller.restserver.RestApiServer.httpsNeedClientAuthentication=NO
 net.floodlightcontroller.restserver.RestApiServer.useHttps=NO
 net.floodlightcontroller.restserver.RestApiServer.useHttp=YES
diff --git a/src/main/resources/logback-test.xml b/src/main/resources/logback-test.xml
index 8fa1e8f86065f20fa51ea0b42336af21b4e15cdc..932abba8d8a168ae18f677f43a6eef994d8ee17d 100644
--- a/src/main/resources/logback-test.xml
+++ b/src/main/resources/logback-test.xml
@@ -10,15 +10,25 @@
     <appender-ref ref="STDOUT" />
     <appender-ref ref="EV_WARN_ERR" />
   </root>
-  <logger name="org" level="WARN"/>
+  <logger name="org" level="INFO"/>
   <logger name="io" level="INFO"></logger> <!-- Netty logging -->
   <logger name="LogService" level="DEBUG"></logger> <!-- Restlet access logging -->
   <logger name="net.floodlightcontroller" level="INFO"/>
   <logger name="org.sdnplatform" level="INFO"></logger>
+  <logger name="org.sdnplatform.sync.internal.SyncManager" level="INFO"></logger>
+  <logger name="org.sdnplatform.sync.internal.config.StorageCCProvider" level="INFO"></logger>
+  <logger name="org.sdnplatform.sync.internal.config.PropertyCCProvider" level="INFO"></logger>
+  <logger name="org.sdnplatform.sync.internal.rpc.RPCService" level="INFO"></logger>
   <logger name="net.floodlightcontroller.devicemanager" level="INFO"></logger>
   <logger name="net.floodlightcontroller.linkdiscovery" level="INFO"></logger>
   <logger name="net.floodlightcontroller.forwarding" level="INFO"></logger>
+  <logger name="net.floodlightcontroller.simpleft.FT" level="INFO"></logger>
   <logger name="net.floodlightcontroller.core" level="INFO"></logger>
   <logger name="net.floodlightcontroller.topology" level="INFO" ></logger>
   <logger name="org.projectfloodlight.openflow" level="INFO" ></logger>
+  <logger name="net.floodlightcontroller.core.internal.OFSwitchManager" level="INFO"></logger>
+  <logger name="net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler" level="INFO"></logger>
+  <logger name="net.floodlightcontroller.core.internal.OFChannelHandler" level="INFO"></logger>
+  <logger name="net.floodlightcontroller.core.internal.OFSwitchManager" level="INFO"></logger>
+
 </configuration>
diff --git a/src/test/java/org/sdnplatform/sync/client/ClientTest.java b/src/test/java/org/sdnplatform/sync/client/ClientTest.java
index bd64765778508d395db61f1f3e230ece844120a8..0ba68ebe6f6eb407277be5dca77def354c5cc2a5 100644
--- a/src/test/java/org/sdnplatform/sync/client/ClientTest.java
+++ b/src/test/java/org/sdnplatform/sync/client/ClientTest.java
@@ -47,8 +47,7 @@ public class ClientTest {
     
     @Before
     public void setUp() throws Exception {
-        keyStoreFile = new File(keyStoreFolder.getRoot(), 
-                "keystore.jceks");
+        keyStoreFile = new File(keyStoreFolder.getRoot(), "keystore.jceks");
         CryptoUtil.writeSharedSecret(keyStoreFile.getAbsolutePath(), 
                                      keyStorePassword, 
                                      CryptoUtil.secureRandom(16));
@@ -68,7 +67,7 @@ public class ClientTest {
         fmc.addService(IDebugEventService.class, new MockDebugEventService());
         
         fmc.addConfigParam(syncManager, "nodes", nodeString);
-        fmc.addConfigParam(syncManager, "thisNode", ""+1);
+        fmc.addConfigParam(syncManager, "thisNodeId", ""+1);
         fmc.addConfigParam(syncManager, "persistenceEnabled", "false");
         fmc.addConfigParam(syncManager, "authScheme", "CHALLENGE_RESPONSE");
         fmc.addConfigParam(syncManager, "keyStorePath", 
diff --git a/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java b/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java
index 0bd1764f7290728602cf430c2d15fbe9733687f6..72e3a5bf73f0bd838c378b4c8fd8a400d7109c23 100644
--- a/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java
+++ b/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java
@@ -51,8 +51,7 @@ public class BootstrapTest {
 
         int curPort = 6699;
         
-        String keyStorePath = new File(dbFolder.getRoot(), 
-                                       "keystore.jceks").getAbsolutePath();
+        String keyStorePath = new File(dbFolder.getRoot(), "keystore.jceks").getAbsolutePath();
         String keyStorePassword = "bootstrapping is fun!";
         CryptoUtil.writeSharedSecret(keyStorePath, 
                                      keyStorePassword, 
diff --git a/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java b/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java
index 5bb874c269cf8e7b540180e661896d0797f4be9f..418fbfdf321957808e3e732da5973cfa6d4067c5 100644
--- a/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java
+++ b/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java
@@ -78,7 +78,7 @@ public class SyncManagerTest {
         fmc.addConfigParam(syncManager, "configProviders", 
                            PropertyCCProvider.class.getName());
         fmc.addConfigParam(syncManager, "nodes", nodeString);
-        fmc.addConfigParam(syncManager, "thisNode", ""+thisNode.getNodeId());
+        fmc.addConfigParam(syncManager, "thisNodeId", ""+thisNode.getNodeId());
         fmc.addConfigParam(syncManager, "persistenceEnabled", "false");
         fmc.addConfigParam(syncManager, "authScheme", "CHALLENGE_RESPONSE");
         fmc.addConfigParam(syncManager, "keyStorePath", 
diff --git a/src/test/java/org/sdnplatform/sync/test/MockSyncService.java b/src/test/java/org/sdnplatform/sync/test/MockSyncService.java
index e4f1c63261b897bc55875d5db0c8bdfb4a51c5e9..325892b772fe75dfb8c2aa3aa4bbedfd20430070 100644
--- a/src/test/java/org/sdnplatform/sync/test/MockSyncService.java
+++ b/src/test/java/org/sdnplatform/sync/test/MockSyncService.java
@@ -7,6 +7,8 @@ import org.sdnplatform.sync.ISyncService;
 import org.sdnplatform.sync.error.SyncException;
 import org.sdnplatform.sync.error.UnknownStoreException;
 import org.sdnplatform.sync.internal.AbstractSyncManager;
+import org.sdnplatform.sync.internal.config.ClusterConfig;
+import org.sdnplatform.sync.internal.rpc.IRPCListener;
 import org.sdnplatform.sync.internal.store.IStorageEngine;
 import org.sdnplatform.sync.internal.store.IStore;
 import org.sdnplatform.sync.internal.store.InMemoryStorageEngine;
@@ -119,4 +121,22 @@ public class MockSyncService extends AbstractSyncManager {
     public void reset() {
         localStores = new HashMap<String, ListenerStorageEngine>();
     }
+
+
+    /**
+     * Tulio Ribeiro
+     */
+	@Override
+	public void addRPCListener(IRPCListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+	/**
+     * Tulio Ribeiro
+     */
+	@Override
+	public void removeRPCListener(IRPCListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
 }