Merge branch 'master' of ssh://git.eclipse.org:29418/sensinact/org.eclipse.sensinact.gateway
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) {