diff --git a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRegisteringEndpoint.java b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRegisteringEndpoint.java
index e1f8dd1..7396914 100644
--- a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRegisteringEndpoint.java
+++ b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRegisteringEndpoint.java
@@ -11,8 +11,10 @@
 package org.eclipse.sensinact.gateway.nthbnd.rest.internal.http;
 
 import java.io.IOException;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.annotation.WebServlet;
@@ -22,6 +24,7 @@
 
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundMediator;
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequest;
+import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper.QueryKey;
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.RegisteringResponse;
 import org.eclipse.sensinact.gateway.nthbnd.rest.internal.RestAccessConstants;
 import org.eclipse.sensinact.gateway.util.IOUtils;
@@ -62,17 +65,31 @@
             if(queryString == null) {
             	response.sendError(400, "'create' or 'renew' request parameter expected");
             }
-            Map<String,List<String>> map = NorthboundRequest.processRequestQuery(queryString);
             String query = null;
-            List<String> list = map.get("request");
-            if(list!= null){
-            	query = list.get(list.size()-1);
-            }else {
-            	query = map.get("create")!=null?"create":(map.get("renew")!=null?"renew":null);
+            Map<QueryKey,List<String>> map = NorthboundRequest.processRequestQuery(queryString);
+            Set<QueryKey> queryKeys = map.keySet();
+            Iterator<QueryKey> iterator = queryKeys.iterator();
+            while(iterator.hasNext()) {
+            	QueryKey queryKey = iterator.next();
+            	switch(queryKey.name) {
+            	  case "request":
+            		List<String> list = map.get(queryKey);
+	                if(list != null)
+	                	query = list.get(list.size()-1);
+	                break;
+            	  case "create":
+            	  case "renew":
+            		  query = queryKey.name;
+            		  break;
+            	  default:
+            		  break;
+            	}
+            	if(query!=null)
+            		break;
             }
-            if(query == null) {
+            if(query == null) 
             	response.sendError(400, "'create' or 'renew' request parameter expected");
-            }                    
+                              
             byte[] content = IOUtils.read(request.getInputStream(),false);
             JSONObject jcontent = new JSONObject(new String(content));          
 
diff --git a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccess.java b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccess.java
index dd1e58f..9536552 100644
--- a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccess.java
+++ b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccess.java
@@ -20,12 +20,15 @@
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundMediator;
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequest;
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestBuilder;
+import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper.QueryKey;
 import org.eclipse.sensinact.gateway.nthbnd.rest.internal.RestAccessConstants;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponseWrapper;
 import java.io.IOException;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author <a href="mailto:cmunilla@kentyou.com">Christophe Munilla</a>
@@ -90,8 +93,16 @@
             return false;
         }
         String result = null;
-        List<String> rawList = super.request.getQueryMap().get("rawDescribe");
-
+        List<String> rawList = null;
+        Map<QueryKey, List<String>> queryMap = super.request.getQueryMap();
+        Iterator<QueryKey> iterator = queryMap.keySet().iterator();
+        while(iterator.hasNext()) {
+        	QueryKey queryKey = iterator.next();
+        	if("rawDescribe".equals(queryKey.name)) {
+        		rawList = queryMap.get(queryKey);
+        		break;
+        	}
+        }
         if (rawList != null && (rawList.contains("true") || rawList.contains("True") || rawList.contains("yes") || rawList.contains("Yes")) && DescribeResponse.class.isAssignableFrom(cap.getClass()))
             result = ((DescribeResponse<?>) cap).getJSON(true);
         else
diff --git a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccessRequest.java b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccessRequest.java
index 82844f9..3a73407 100644
--- a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccessRequest.java
+++ b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/http/HttpRestAccessRequest.java
@@ -33,7 +33,7 @@
 
 public class HttpRestAccessRequest extends HttpServletRequestWrapper implements NorthboundRequestWrapper {
     private NorthboundMediator mediator;
-    private Map<String, List<String>> queryMap;
+    private Map<QueryKey, List<String>> queryMap;
     private Authentication<?> authentication;
     private String content;
 
@@ -57,13 +57,13 @@
     }
     
     @Override
-    public Map<String, List<String>> getQueryMap() {
+    public Map<QueryKey, List<String>> getQueryMap() {
         if (this.queryMap == null) {
             try {
                 this.queryMap = NorthboundRequest.processRequestQuery(super.getQueryString());
             } catch (UnsupportedEncodingException e) {
                 mediator.error(e.getMessage(), e);
-                this.queryMap = Collections.<String, List<String>>emptyMap();
+                this.queryMap = Collections.<QueryKey, List<String>>emptyMap();
             }
         }
         return queryMap;
diff --git a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccess.java b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccess.java
index 51053a1..665a391 100644
--- a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccess.java
+++ b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccess.java
@@ -17,11 +17,14 @@
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundMediator;
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequest;
 import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestBuilder;
+import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper.QueryKey;
 import org.json.JSONObject;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Extended {@link NorthboundAccess} dedicated to websocket connections
@@ -64,15 +67,24 @@
             return false;
         }
         String result = null;
-        List<String> rawList = super.request.getQueryMap().get("rawDescribe");
-
+        List<String> rawList = null;
+        List<String> acceptEncoding = null;
+        
+        Map<QueryKey, List<String>> queryMap = super.request.getQueryMap();
+        Iterator<QueryKey> iterator = queryMap.keySet().iterator();
+        while(iterator.hasNext()) {
+        	QueryKey queryKey = iterator.next();
+        	if("rawDescribe".equals(queryKey.name)) 
+        		rawList = queryMap.get(queryKey);        	
+        	if("Accept-Encoding".equals(queryKey.name)) 
+        		acceptEncoding= queryMap.get(queryKey);        	
+        }
         if (rawList != null && (rawList.contains("true") || rawList.contains("True") || rawList.contains("yes") || rawList.contains("Yes")) && DescribeResponse.class.isAssignableFrom(cap.getClass())) {
             result = ((DescribeResponse<?>) cap).getJSON(true);
         } else {
             result = cap.getJSON();
         }
         byte[] resultBytes;
-        List<String> acceptEncoding = super.request.getQueryMap().get("Accept-Encoding");
         try {
 	        if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
 	            resultBytes = NorthboundAccess.compress(result);
diff --git a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccessRequest.java b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccessRequest.java
index f9d5462..ada8b5e 100644
--- a/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccessRequest.java
+++ b/platform/northbound/rest-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/rest/internal/ws/WsRestAccessRequest.java
@@ -35,34 +35,22 @@
         this.mediator = mediator;
         this.wsConnection = wsConnection;
     }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getMediator()
-     */
+    
     @Override
     public NorthboundMediator getMediator() {
         return this.mediator;
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getRequestID()
-     */
     @Override
     public String getRequestIdProperty() {
        return "rid";
     }
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getRequestID()
-	 */
 	@Override
 	public String getRequestId() {
 		return (String) this.request.opt(getRequestIdProperty());
 	}
 
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getRequestURI()
-     */
     @Override
     public String getRequestURI() {
         String uri = request.optString("uri");
@@ -70,11 +58,8 @@
         return uriElements[0];
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getQueryMap()
-     */
     @Override
-    public Map<String, List<String>> getQueryMap() {
+    public Map<QueryKey, List<String>> getQueryMap() {
         String uri = request.optString("uri");
         String[] uriElements = uri.split("\\?");
         if (uriElements.length == 2) {
@@ -84,12 +69,9 @@
                 this.mediator.error(e);
             }
         }
-        return Collections.<String, List<String>>emptyMap();
+        return Collections.<QueryKey, List<String>>emptyMap();
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getContent()
-     */
     @Override
     public String getContent() {
         if (this.content == null) {
@@ -102,17 +84,11 @@
         return this.content;
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#getAuthentication()
-     */
     @Override
     public Authentication<?> getAuthentication() {
         return null;
     }
 
-    /* (non-Javadoc)
-     * @see org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper#createRecipient(org.eclipse.sensinact.gateway.core.api.method.Parameter[])
-     */
     @Override
     public NorthboundRecipient createRecipient(List<Parameter> parameters) {
         return new WebSocketRecipient(mediator, wsConnection);
diff --git a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/Argument.java b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/Argument.java
index b3bac26..5616c43 100644
--- a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/Argument.java
+++ b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/Argument.java
@@ -18,14 +18,11 @@
     public static Object[] getParameters(Argument[] arguments) {
         int index = 0;
         int length = arguments == null ? 0 : arguments.length;
-
-        if (length == 0) {
+        if (length == 0) 
             return null;
-        }
-        Object[] parameters = new Object[length];
-        for (; index < length; index++) {
+        Object[] parameters = new Object[length];        
+        for (; index < length; index++) 
             parameters[index] = arguments[index].value;
-        }
         return parameters;
     }
 
diff --git a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/DefaultNorthboundRequestHandler.java b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/DefaultNorthboundRequestHandler.java
index 79dab68..225f6b5 100644
--- a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/DefaultNorthboundRequestHandler.java
+++ b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/DefaultNorthboundRequestHandler.java
@@ -31,6 +31,7 @@
 import org.eclipse.sensinact.gateway.core.message.SnaMessage;
 import org.eclipse.sensinact.gateway.core.method.AccessMethod;
 import org.eclipse.sensinact.gateway.core.method.Parameter;
+import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper.QueryKey;
 import org.eclipse.sensinact.gateway.util.CastUtils;
 import org.eclipse.sensinact.gateway.util.UriUtils;
 import org.json.JSONArray;
@@ -74,7 +75,7 @@
     protected String rid;
     protected String method = null;
 
-    private Map<String, List<String>> query;
+    private Map<NorthboundRequestWrapper.QueryKey, List<String>> query;
     private NorthboundRequestWrapper request;
     private NorthboundResponseBuildError buildError;
     private Set<String> methods;
@@ -217,13 +218,17 @@
             }
             parametersList.add(parameter);
         }
-        Iterator<Map.Entry<String, List<String>>> iterator = this.query.entrySet().iterator();
+        Iterator<Map.Entry<QueryKey, List<String>>> iterator = this.query.entrySet().iterator();
 
         while (iterator.hasNext()) {
-            Map.Entry<String, List<String>> entry = iterator.next();
+            Map.Entry<QueryKey, List<String>> entry = iterator.next();
             Parameter parameter = null;
             try {
-                parameter = new Parameter(mediator, entry.getKey(), entry.getValue().size() > 1 ? JSONArray.class : String.class, entry.getValue().size() == 0 ? "true" : (entry.getValue().size() == 1 ? entry.getValue().get(0) : new JSONArray(entry.getValue())));
+                parameter = new Parameter(mediator, 
+                	entry.getKey().name, 
+                	entry.getValue().size() > 1 ? JSONArray.class : String.class, 
+                	entry.getValue().size() == 0 ? "true" : (entry.getValue().size() == 1 ? entry.getValue().get(0) : new JSONArray(entry.getValue()))
+                );
             } catch (InvalidValueException e) {
                 throw new JSONException(e);
             }
diff --git a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundEndpoint.java b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundEndpoint.java
index 273bc43..cb0ef1c 100644
--- a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundEndpoint.java
+++ b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundEndpoint.java
@@ -93,11 +93,15 @@
 			if(!m.getName().equals(meth))
 				return false;
 			Class<?>[] types = m.getParameterTypes();
-			if(types.length > (parameterTypes.length +1) || types.length < parameterTypes.length)
+			if(types.length < parameterTypes.length && !m.isVarArgs())
 				return false;
 			if(types.length == (parameterTypes.length +1) && !m.isVarArgs())
 				return false;
-			for(int i=0;i<parameterTypes.length;i++) {
+			if(types.length > (parameterTypes.length +1))
+				return false;
+			for(int i=0;i<types.length;i++) {
+				if(i == (types.length-1) && (types.length == (parameterTypes.length +1)||types.length < parameterTypes.length))
+					continue;
 				if(!types[i].isAssignableFrom(parameterTypes[i]))
 					return false;
 			}
@@ -107,15 +111,29 @@
         	Method[] methods = getClass().getDeclaredMethods();
         	Optional<Method> opt = Arrays.stream(methods).filter(predicate).findFirst();        	
             Method method = opt.isPresent()?opt.get():null;
-            Object[] args = Argument.getParameters(arguments);
             
-            if(method.isVarArgs() && method.getParameterTypes().length == parameterTypes.length+1) {
-            	Object[] _args = new Object[parameterTypes.length+1];
-            	System.arraycopy(args, 0, _args, 0, parameterTypes.length);
-            	_args[parameterTypes.length] = (Object[])null;
-            	args = _args;
+            if(method != null) {       
+            	Object[] args = Argument.getParameters(arguments);                
+	            if(method.isVarArgs()) {
+	            	if(method.getParameterTypes().length == parameterTypes.length+1) {	            
+		            	Object[] _args = new Object[parameterTypes.length+1];
+		            	System.arraycopy(args, 0, _args, 0, parameterTypes.length);
+		            	_args[parameterTypes.length] = (Object[])null;
+		            	args = _args;
+	            	} else if(method.getParameterTypes().length < parameterTypes.length) {
+	            		Object[] _args = new Object[method.getParameterTypes().length];
+	            		Object[] _var = new Object[(parameterTypes.length - method.getParameterTypes().length) + 1];
+	            		if(method.getParameterTypes().length>1)
+	            			System.arraycopy(args, 0, _args, 0, method.getParameterTypes().length-1);
+	            		int n=0;
+	            		for(int i=method.getParameterTypes().length - 1; i < parameterTypes.length; i++)
+	            			_var[n++]=args[i];
+	            		_args[method.getParameterTypes().length-1] = _var;
+	            		args = _args;
+	            	}	            	
+	            }
+	            result = (AccessMethodResponse<?>) method.invoke(this, args);
             }
-            result = (AccessMethodResponse<?>) method.invoke(this, args);
         } catch (Exception e) {
         	e.printStackTrace();
             this.mediator.error(e);
diff --git a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequest.java b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequest.java
index caef646..faab27d 100644
--- a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequest.java
+++ b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequest.java
@@ -23,7 +23,8 @@
 import java.util.Map;
 
 public abstract class NorthboundRequest implements PathElement, Nameable {
-    public static final String ROOT = "/sensinact";
+    
+	public static final String ROOT = "/sensinact";
 
     /**
      * Builds a map of parameters according to the query String
@@ -34,14 +35,15 @@
      *                    into a map of parameters
      * @throws UnsupportedEncodingException
      */
-    public static Map<String, List<String>> processRequestQuery(String queryString) throws UnsupportedEncodingException {
-        if (queryString == null) {
-            return Collections.<String, List<String>>emptyMap();
-        }
-        Map<String, List<String>> queryMap = new HashMap<String, List<String>>();
+    public static Map<NorthboundRequestWrapper.QueryKey, List<String>> processRequestQuery(String queryString) throws UnsupportedEncodingException {
+        if (queryString == null) 
+            return Collections.<NorthboundRequestWrapper.QueryKey, List<String>>emptyMap();
+        
+        Map<NorthboundRequestWrapper.QueryKey, List<String>> queryMap = new HashMap<NorthboundRequestWrapper.QueryKey, List<String>>();
 
         char[] characters = queryString.toCharArray();
         int index = 0;
+        int pos = 0;
         int length = characters.length;
 
         boolean escape = false;
@@ -71,7 +73,7 @@
                     break;
                 case '&':
                     value = element.toString();
-                    addQueryParameter(queryMap, name, value);
+                    addQueryParameter(queryMap, pos++, name, value);
                     name = null;
                     value = null;
                     element = new StringBuilder();
@@ -82,11 +84,11 @@
         }
         if(name == null && element.length()>0) {
         	name = element.toString();
-            addQueryParameter(queryMap, name, Boolean.TRUE.toString());
+            addQueryParameter(queryMap, pos++, name, Boolean.TRUE.toString());
             return queryMap;
         }
         value = element.toString();
-        addQueryParameter(queryMap, name, value);
+        addQueryParameter(queryMap, pos++, name, value);
         return queryMap;
     }
 
@@ -103,17 +105,18 @@
      *                 added to the map argument
      * @throws UnsupportedEncodingException
      */
-    private static void addQueryParameter(Map<String, List<String>> queryMap, String name, String value) throws UnsupportedEncodingException {
-        if (name == null || name.length() == 0) {
+    private static void addQueryParameter(Map<NorthboundRequestWrapper.QueryKey, List<String>> queryMap, int pos, String name, String value) throws UnsupportedEncodingException {
+        if (name == null || name.length() == 0) 
             name = DefaultNorthboundRequestHandler.RAW_QUERY_PARAMETER;
-
-        } else {
+        else 
             name = URLDecoder.decode(name, "UTF-8");
-        }
-        List<String> values = queryMap.get(name);
+        NorthboundRequestWrapper.QueryKey key = new NorthboundRequestWrapper.QueryKey();
+        key.index = pos;
+        key.name = name;
+        List<String> values = queryMap.get(key);
         if (values == null) {
             values = new ArrayList<String>();
-            queryMap.put(name, values);
+            queryMap.put(key, values);
         }
         values.add(URLDecoder.decode(value, "UTF-8"));
     }
diff --git a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequestWrapper.java b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequestWrapper.java
index 4e7cd08..5f2768e 100644
--- a/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequestWrapper.java
+++ b/platform/northbound/sensinact-access/src/main/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/NorthboundRequestWrapper.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.sensinact.gateway.core.method.Parameter;
 import org.eclipse.sensinact.gateway.core.security.Authentication;
+import org.eclipse.sensinact.gateway.nthbnd.endpoint.NorthboundRequestWrapper.QueryKey;
 
 /**
  * Northbound request wrapper service.
@@ -23,7 +24,17 @@
  * characteristics of the request, allowing to treat it
  */
 public interface NorthboundRequestWrapper {
-    /**
+	
+    class QueryKey {
+		public int index;
+		public String name;
+		
+		public int hashCode() {
+			return index;
+		}
+	}
+
+	/**
      * Returns the {@link NorthboundMediator} of this
      * NorthboundAccessWrapper, allowing to interact with
      * the OSGi host environment
@@ -65,7 +76,7 @@
      * @return the query String of the wrapped request as a
      * map
      */
-    Map<String, List<String>> getQueryMap();
+    Map<NorthboundRequestWrapper.QueryKey, List<String>> getQueryMap();
 
     /**
      * Returns the String content the wrapped request
diff --git a/platform/northbound/sensinact-access/src/test/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/test/NorthboundRequestHandlerTest.java b/platform/northbound/sensinact-access/src/test/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/test/NorthboundRequestHandlerTest.java
index 4972638..64e8695 100644
--- a/platform/northbound/sensinact-access/src/test/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/test/NorthboundRequestHandlerTest.java
+++ b/platform/northbound/sensinact-access/src/test/java/org/eclipse/sensinact/gateway/nthbnd/endpoint/test/NorthboundRequestHandlerTest.java
@@ -193,10 +193,16 @@
             }
 
             @Override
-            public Map<String, List<String>> getQueryMap() {
-                return new HashMap<String, List<String>>() {{
-                    put("yfilter."+ranky, yfilter);
-                    put("xfilter."+rankx, xfilter);
+            public Map<QueryKey, List<String>> getQueryMap() {
+                return new HashMap<QueryKey, List<String>>() {{
+                	QueryKey k0 = new QueryKey();
+                	k0.index = 0;
+                	k0.name = "yfilter."+ranky;
+                    put(k0 , yfilter);
+                	QueryKey k1 = new QueryKey();
+                	k1.index = 1;
+                	k1.name = "xfilter."+rankx;
+                    put(k1, xfilter);
                     /*put("hideFilter",Arrays.asList("true"));	*/
                 }};
             }
