diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java
index 8de1d32..2935903 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstance.java
@@ -479,34 +479,16 @@
 		return this.registered;
 	}
 
-	/**
-	 * Returns the root {@link ServiceProviderImpl} of this instance of the
-	 * sensiNact resource model
-	 * 
-	 * @return this resource model instance's root {@link ServiceProviderImpl}
-	 * 
-	 * @see SensiNactResourceModel#getRootElement()
-	 */
 	@Override
 	public ServiceProviderImpl getRootElement() {
 		return this.provider;
 	}
 
-	/**
-	 * @inheritedDoc
-	 *
-	 * @see Nameable#getName()
-	 */
 	@Override
 	public String getName() {
 		return this.getRootElement().getName();
 	}
 
-	/**
-	 * @inheritedDoc
-	 *
-	 * @see SensiNactResourceModel#getIdentifier()
-	 */
 	@Override
 	public String getIdentifier() {
 		return this.identifier;
@@ -544,21 +526,11 @@
 		return this.profileId;
 	}
 
-	/**
-	 * @inheritDoc
-	 *
-	 * @see LifecycleStatusListener# update(ServiceProvider.LifecycleStatus)
-	 */
 	@Override
 	public void update(LifecycleStatus status) {
 		this.registration.updateLifecycle(status);
 	}
 
-	/**
-	 * @inheritDoc
-	 *
-	 * @see SensiNactResourceModel#getProperties()
-	 */
 	@Override
 	public Dictionary<String, String> getProperties() {
 		Dictionary<String, String> props = new Hashtable<String, String>();
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstanceRegistration.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstanceRegistration.java
index 427191e..45727f3 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstanceRegistration.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/ModelInstanceRegistration.java
@@ -29,7 +29,6 @@
 import org.eclipse.sensinact.gateway.core.message.SnaMessage;
 import org.eclipse.sensinact.gateway.core.message.SnaMessageSubType;
 import org.eclipse.sensinact.gateway.core.message.SnaUpdateMessage;
-import org.eclipse.sensinact.gateway.core.message.SnaUpdateMessage.Update;
 import org.eclipse.sensinact.gateway.core.method.AccessMethod;
 import org.eclipse.sensinact.gateway.core.security.AccessLevelOption;
 import org.eclipse.sensinact.gateway.core.security.MutableAccessNode;
@@ -185,11 +184,7 @@
 		return properties;
 	}
 
-	/**
-	 * @param uri
-	 * @param location
-	 */
-	public void updateLifecycle(LifecycleStatus status) {
+	protected void updateLifecycle(LifecycleStatus status) {
 		if (!registered) {
 			return;
 		}
@@ -397,7 +392,7 @@
 	}
 
 	@Override
-	public void doCallback(SnaMessage<?> message) {
+	public synchronized void doCallback(SnaMessage<?> message) {
 
 		String uri = message.getPath();
 		String[] uriElements = UriUtils.getUriElements(uri);
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java
index 5b602f1..f3534b3 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/SensiNact.java
@@ -125,17 +125,7 @@
 		 */
 		public SensiNactSession(String identifier) {
 			super(identifier);
-		}
-		
-		protected final SessionKey getSessionKeyFromToken() {
-			SessionKey sessionKey;
-			synchronized(SensiNact.this.sessions) {
-				sessionKey = SensiNact.this.sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, getSessionId()));
-			}	
-			if(sessionKey == null)
-				throw new IllegalArgumentException("Invalid session token");
-			return sessionKey;
-		}
+		}		
 
 		@Override
 		public Set<ServiceProvider> serviceProviders(final String filter) {
@@ -161,7 +151,7 @@
 		@Override
 		public SubscribeResponse registerSessionAgent(String requestId, final MidAgentCallback callback, final SnaFilter filter) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			boolean registered = AccessController.<Boolean>doPrivileged(new PrivilegedAction<Boolean>() {
 				@Override public Boolean run() {return sessionKey.registerAgent(callback, filter);}});
@@ -187,7 +177,7 @@
 		@Override
 		public UnsubscribeResponse unregisterSessionAgent(String requestId, final String agentId) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			boolean unregistered = AccessController.<Boolean>doPrivileged(new PrivilegedAction<Boolean>() {
 				@Override
@@ -213,7 +203,7 @@
 		@Override
 		public SubscribeResponse registerSessionIntent(String requestId, Executable<Boolean, Void> callback, String... resourcePath) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			final ResourceIntent intent = new ResourceIntent(mediator, sessionKey.getPublicKey(), callback, resourcePath) {
 				@Override
 				public boolean isAccessible(String path) {	
@@ -245,7 +235,7 @@
 		@Override
 		public UnsubscribeResponse unregisterSessionIntent(String requestId, final String intentId) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			boolean unregistered = AccessController.<Boolean>doPrivileged(new PrivilegedAction<Boolean>() {
 				@Override
@@ -272,7 +262,7 @@
 		public GetResponse get(String requestId, final String serviceProviderId, final String serviceId,
 				final String resourceId, final String attributeId, Object... args) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId, resourceId);
 
@@ -316,7 +306,7 @@
 		public SetResponse set(String requestId, final String serviceProviderId, final String serviceId,
 				final String resourceId, final String attributeId, final Object parameter, Object... args) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId,
 					resourceId);
@@ -362,7 +352,7 @@
 		public ActResponse act(String requestId, final String serviceProviderId, final String serviceId,
 				final String resourceId, final Object[] parameters) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			ActResponse response = null;
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId,
@@ -410,7 +400,7 @@
 				final String resourceId, final Recipient recipient, final JSONArray conditions, final String policy,
 				Object... args) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			SubscribeResponse response = null;	
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, 
@@ -485,7 +475,7 @@
 		public UnsubscribeResponse unsubscribe(String requestId, final String serviceProviderId, final String serviceId,
 				final String resourceId, final String subscriptionId, Object... args) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			UnsubscribeResponse response = null;	
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId,
@@ -535,7 +525,7 @@
 		@Override
 		public DescribeResponse<String> getAll(String requestId, String filter, FilteringCollection filterCollection) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			DescribeResponse<String> response = null;
 			DescribeMethod<String> method = new DescribeMethod<String>(mediator, UriUtils.PATH_SEPARATOR, null,
@@ -585,7 +575,7 @@
 		@Override
 		public DescribeResponse<String> getProviders(String requestId, FilteringCollection filterCollection) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			DescribeResponse<String> response = null;
 			DescribeMethod<String> method = new DescribeMethod<String>(mediator, UriUtils.PATH_SEPARATOR, null,
@@ -633,7 +623,7 @@
 		@Override
 		public DescribeResponse<JSONObject> getProvider(String requestId, final String serviceProviderId) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId);
 
@@ -672,7 +662,7 @@
 		public DescribeResponse<String> getServices(String requestId, final String serviceProviderId,
 				FilteringCollection filterCollection) {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId);
 			DescribeResponse<String> response = null;
@@ -728,8 +718,7 @@
 		@Override
 		public DescribeResponse<JSONObject> getService(String requestId, final String serviceProviderId,
 				final String serviceId) {
-
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId);
 
@@ -765,8 +754,7 @@
 		@Override
 		public DescribeResponse<String> getResources(String requestId, final String serviceProviderId,
 				final String serviceId, FilteringCollection filterCollection) {
-
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId);
 
@@ -828,8 +816,7 @@
 		@Override
 		public DescribeResponse<JSONObject> getResource(final String requestId, final String serviceProviderId,
 				final String serviceId, final String resourceId) {
-
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			String uri = getUri((sessionKey.localID() != 0), SensiNact.this.namespace(), serviceProviderId, serviceId,
 					resourceId);
@@ -880,8 +867,7 @@
 		 * </ul>
 		 */
 		private final boolean isAccessible(final String path) {
-
-			final SessionKey sessionKey=getSessionKeyFromToken();
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			
 			Boolean accessible = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
 				@Override
@@ -1032,7 +1018,7 @@
 		@Override
 		public final void changePassword(final String oldPassword, final String newPassword) throws SecuredAccessException {
 
-			final SessionKey sessionKey=getSessionKeyFromToken();	
+			final SessionKey sessionKey= SensiNact.this.getSessionKeyFromToken(this.getSessionId());
 			final String publicKey = sessionKey.getPublicKey();
 			
 			SecuredAccessException exception = SensiNact.this.mediator.callService(
@@ -1650,10 +1636,7 @@
 	 *         specified filter and for the specified {@link Session}
 	 */
 	protected Set<ServiceProvider> serviceProviders(String identifier, String filter) {
-		SessionKey sessionKey;
-		synchronized(this.sessions) {
-			sessionKey = this.sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN,identifier));
-		}	
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		Set<ServiceProvider> set = new HashSet<ServiceProvider>();
 		set.addAll(this.registry.serviceProviders(sessionKey, filter));
 		return set;
@@ -1668,10 +1651,7 @@
 	 * @return the {@link ServiceProvider}
 	 */
 	protected ServiceProvider serviceProvider(String identifier, String serviceProviderId) {
-		SessionKey sessionKey;
-		synchronized(this.sessions) {
-			sessionKey = this.sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN,identifier));
-		}	
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		return this.registry.serviceProvider(sessionKey, serviceProviderId);
 	}
 
@@ -1689,10 +1669,7 @@
 	 * @return the {@link Service}
 	 */
 	protected Service service(String identifier, String serviceProviderId, String serviceId) {
-		SessionKey sessionKey;
-		synchronized(this.sessions) {
-			sessionKey = this.sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN,identifier));
-		}	
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		return this.registry.service(sessionKey, serviceProviderId, serviceId);
 	}
 
@@ -1840,10 +1817,7 @@
 	 */
 	private JSONObject act(String identifier, final String serviceProviderId, final String serviceId,
 			final String resourceId, final Object[] parameters) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		String response = remoteCoreInvocation(serviceProviderId, new RemoteAccessMethodExecutable(
 			mediator,
 			AccessMethod.Type.valueOf(AccessMethod.ACT), sessionKey.getPublicKey(
@@ -1881,10 +1855,7 @@
 	 */
 	private JSONObject set(String identifier, final String serviceProviderId, final String serviceId,
 			final String resourceId, final String attributeId, final Object parameter, Object...args) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		String response = remoteCoreInvocation(serviceProviderId, 
 			new RemoteAccessMethodExecutable(mediator, AccessMethod.Type.valueOf(AccessMethod.SET
 				), sessionKey.getPublicKey()
@@ -1961,10 +1932,7 @@
 	 */
 	private JSONObject get(String identifier, final String serviceProviderId, final String serviceId,
 	final String resourceId, final String attributeId, Object...args) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}		
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		if(serviceProviderId.indexOf('(') < 0) {			
 			String response = remoteCoreInvocation(serviceProviderId, 
 				new RemoteAccessMethodExecutable(mediator, AccessMethod.Type.valueOf(AccessMethod.GET
@@ -2095,10 +2063,7 @@
 	 * @return the JSON formated description of the specified resource
 	 */
 	private JSONObject getResource(String identifier, final String serviceProviderId, final String serviceId, final String resourceId) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		final String localNamespace = this.namespace();
 		JSONObject object = remoteCoreInvocation(serviceProviderId, new Executable<SensinactCoreBaseIface, JSONObject>() {
 			@Override
@@ -2130,10 +2095,7 @@
 	 *         service and service provider
 	 */
 	private String getResources(String identifier, final String serviceProviderId, final String serviceId) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		final String localNamespace = this.namespace();
 		String object = remoteCoreInvocation(serviceProviderId, new Executable<SensinactCoreBaseIface, String>() {
 			@Override
@@ -2163,10 +2125,7 @@
 	 * @return the JSON formated description of the specified service
 	 */
 	private JSONObject getService(String identifier, final String serviceProviderId, final String serviceId) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		final String localNamespace = this.namespace();
 		JSONObject object = remoteCoreInvocation(serviceProviderId, new Executable<SensinactCoreBaseIface, JSONObject>() {
 			@Override
@@ -2195,10 +2154,7 @@
 	 *         service provider
 	 */
 	private String getServices(String identifier, final String serviceProviderId) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		final String localNamespace = this.namespace();
 		String object = remoteCoreInvocation(serviceProviderId, new Executable<SensinactCoreBaseIface, String>() {
 			@Override
@@ -2227,10 +2183,7 @@
 	 * @return the JSON formated description of the specified service provider
 	 */
 	private JSONObject getProvider(String identifier, final String serviceProviderId) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		final String localNamespace = this.namespace();
 		JSONObject object = remoteCoreInvocation(serviceProviderId, new Executable<SensinactCoreBaseIface, JSONObject>() {
 			@Override
@@ -2258,10 +2211,8 @@
 	 * @return the JSON formated list of available service providers
 	 */
 	private String getProviders(String identifier, final String filter) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
 		String effectiveFilter = null;
 		if (filter != null && filter.length() > 0) {
 			try {
@@ -2320,10 +2271,9 @@
 	 *         specified {@link Session} and compliant to the specified filter.
 	 */
 	protected String getAll(String identifier, final String filter) {
-		final SessionKey sessionKey;
-		synchronized(this.sessions){
-			sessionKey = sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, identifier));
-		}
+		
+		final SessionKey sessionKey = this.getSessionKeyFromToken(identifier);
+		
 		String effectiveFilter = null;
 		if (filter != null && filter.length() > 0) {
 			try {
@@ -2404,6 +2354,16 @@
 		});
 	}
 
+	final SessionKey getSessionKeyFromToken(String sessionId) {
+		SessionKey sessionKey;
+		synchronized(this.sessions) {
+			sessionKey = this.sessions.get(new KeyExtractor<KeyExtractorType>(KeyExtractorType.TOKEN, sessionId));
+		}	
+		if(sessionKey == null)
+			throw new IllegalArgumentException("Invalid session token");
+		return sessionKey;
+	}
+	
 	String nextToken() {
 		boolean exists = false;
 		String token = null;
diff --git a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/message/SnaMessageListener.java b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/message/SnaMessageListener.java
index f05fd92..821bea4 100644
--- a/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/message/SnaMessageListener.java
+++ b/platform/sensinact-core/src/main/java/org/eclipse/sensinact/gateway/core/message/SnaMessageListener.java
@@ -74,13 +74,6 @@
 		this.agentsAccessibility = new HashMap<String, List<MethodAccessibility>>();
 	}
 
-	/**
-	 * @inheritDoc
-	 *
-	 * @see org.eclipse.sensinact.gateway.core.message.MessageRouter#
-	 *      addCallback(org.eclipse.sensinact.gateway.core.message.SnaFilter,
-	 *      org.eclipse.sensinact.gateway.core.message.MidCallback)
-	 */
 	@Override
 	public void addCallback(SnaFilter filter, MidCallback callback) {
 		if (filter == null || callback == null ||!callback.isActive()) {
@@ -96,12 +89,6 @@
 		}
 	}
 
-	/**
-	 * @inheritDoc
-	 *
-	 * @see org.eclipse.sensinact.gateway.core.message.MessageRouter#
-	 *      deleteCallback(java.lang.String)
-	 */
 	@Override
 	public void deleteCallback(String callback) {
 		synchronized (this.callbacks) {
@@ -155,23 +142,11 @@
 		}
 	}
 
-	/**
-	 * @inheritDoc
-	 * 
-	 * @see org.eclipse.sensinact.gateway.core.message.MessageRouter#
-	 *      handle(org.eclipse.sensinact.gateway.core.message.SnaMessage)
-	 */
 	@Override
 	public void handle(SnaMessage message) {
 		super.eventEngine.push(message);
 	}
 
-	/**
-	 * @inheritDoc
-	 * 
-	 * @see org.eclipse.sensinact.gateway.util.stack.StackEngineHandler#
-	 *      doHandle(java.lang.Object)
-	 */
 	@Override
 	public void doHandle(SnaMessage<?> message) {
 		String messageMethod = null;
@@ -261,43 +236,38 @@
 	 */
 	private void doHandleAgents(final SnaMessage<?> message, final String method) {
 		final String path = message.getPath();
-		
-		AccessController.doPrivileged(new PrivilegedAction<Void>() {
-			@Override
-			public Void run() {
-				mediator.callServices(SnaAgent.class, new Executable<SnaAgent, Void>() {
-					@Override
-					public Void execute(SnaAgent agent) throws Exception {	
-						String agentKey = agent.getPublicKey();						
-						List<MethodAccessibility> methodAccessibilities = SnaMessageListener.this.agentsAccessibility.get(agentKey);
-						int index = -1;
-						if (methodAccessibilities == null) {
-							AccessLevelOption option = SnaMessageListener.this.configuration.getAuthenticatedAccessLevelOption(path, agentKey);
-							if (option == null) {
-								option = AccessLevelOption.ANONYMOUS;
+		synchronized(this) {
+		    AccessController.doPrivileged(new PrivilegedAction<Void>() {
+				@Override
+				public Void run() {
+					mediator.callServices(SnaAgent.class, new Executable<SnaAgent, Void>() {
+						@Override
+						public Void execute(SnaAgent agent) throws Exception {	
+							String agentKey = agent.getPublicKey();						
+							List<MethodAccessibility> methodAccessibilities = SnaMessageListener.this.agentsAccessibility.get(agentKey);
+							int index = -1;
+							if (methodAccessibilities == null) {
+								AccessLevelOption option = SnaMessageListener.this.configuration.getAuthenticatedAccessLevelOption(path, agentKey);
+								if (option == null) {
+									option = AccessLevelOption.ANONYMOUS;
+								}
+								methodAccessibilities = SnaMessageListener.this.configuration.getAccessibleMethods(path, option);
+								SnaMessageListener.this.agentsAccessibility.put(agentKey, methodAccessibilities);
+							}						
+							if ((index = methodAccessibilities.indexOf(new Name<MethodAccessibility>(method))) > -1
+									&& methodAccessibilities.get(index).isAccessible()) {
+								agent.register(message);
 							}
-							methodAccessibilities = SnaMessageListener.this.configuration.getAccessibleMethods(path, option);
-							SnaMessageListener.this.agentsAccessibility.put(agentKey, methodAccessibilities);
-						}						
-						if ((index = methodAccessibilities.indexOf(new Name<MethodAccessibility>(method))) > -1
-								&& methodAccessibilities.get(index).isAccessible()) {
-							agent.register(message);
+							return null;
 						}
-						return null;
+					});
+					return null;
 					}
-				});
-				return null;
 				}
-			});
-		
-		
+		    );
+		}
 	}
 
-	/**
-	 * @inheritDoc
-	 * 
-	 * @see MessageRouter#close(boolean)
-	 */
 	@Override
 	public void close(boolean wait) {
 		if (wait) {
