Repository: eclipse/leshan
Pull request #218 (2016-12-14 16:16:32)

Rename Client in Registration (so clientUpdate, clientSerDes, ...)
This is just a renaming PR.


Patch:
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mBootstrapRequestSender.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mBootstrapRequestSender.java
index c7211b62..08efbe33 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mBootstrapRequestSender.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mBootstrapRequestSender.java
@@ -30,7 +30,7 @@ import org.eclipse.leshan.core.response.ErrorCallback;
 import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ResponseCallback;
 import org.eclipse.leshan.server.bootstrap.LwM2mBootstrapRequestSender;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,12 +65,12 @@ public class CaliforniumLwM2mBootstrapRequestSender implements LwM2mBootstrapReq
             public T buildResponse(final Response coapResponse) {
                 // TODO we need to fix that by removing the Client dependency from LwM2MResponseBuilder or by creating a
                 // LwM2mBootstrapResponseBuilder
-                Client client = new Client.Builder("fakeregistrationid", endpointName, clientAddress.getAddress(),
+                Registration registration = new Registration.Builder("fakeregistrationid", endpointName, clientAddress.getAddress(),
                         clientAddress.getPort(), secure ? secureEndpoint.getAddress() : nonSecureEndpoint.getAddress())
                                 .build();
                 // Build LwM2m response
                 final LwM2mResponseBuilder<T> lwm2mResponseBuilder = new LwM2mResponseBuilder<T>(coapRequest,
-                        coapResponse, client, model, null, decoder);
+                        coapResponse, registration, model, null, decoder);
                 request.accept(lwm2mResponseBuilder);
                 return lwm2mResponseBuilder.getResponse();
             }
@@ -103,13 +103,13 @@ public class CaliforniumLwM2mBootstrapRequestSender implements LwM2mBootstrapReq
             public T buildResponse(final Response coapResponse) {
                 // TODO we need to fix that by removing the Client dependency from LwM2MResponseBuilder or by creating a
                 // LwM2mBootstrapResponseBuilder
-                Client client = new Client.Builder("fakeregistrationid", endpointName, clientAddress.getAddress(),
+                Registration registration = new Registration.Builder("fakeregistrationid", endpointName, clientAddress.getAddress(),
                         clientAddress.getPort(), secure ? secureEndpoint.getAddress() : nonSecureEndpoint.getAddress())
                                 .build();
 
                 // Build LwM2m response
                 final LwM2mResponseBuilder<T> lwm2mResponseBuilder = new LwM2mResponseBuilder<T>(coapRequest,
-                        coapResponse, client, model, null, decoder);
+                        coapResponse, registration, model, null, decoder);
                 request.accept(lwm2mResponseBuilder);
                 return lwm2mResponseBuilder.getResponse();
             }
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java
index 4585c1c2..426f66e6 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java
@@ -36,7 +36,7 @@ import org.eclipse.leshan.core.request.DownlinkRequest;
 import org.eclipse.leshan.core.response.ErrorCallback;
 import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ResponseCallback;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.model.LwM2mModelProvider;
 import org.eclipse.leshan.server.observation.ObservationRegistry;
 import org.eclipse.leshan.server.request.LwM2mRequestSender;
@@ -77,7 +77,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
     }
 
     @Override
-    public <T extends LwM2mResponse> T send(final Client destination, final DownlinkRequest<T> request, Long timeout)
+    public <T extends LwM2mResponse> T send(final Registration destination, final DownlinkRequest<T> request, Long timeout)
             throws InterruptedException {
 
         // Retrieve the objects definition
@@ -86,7 +86,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
         // Create the CoAP request from LwM2m request
         final CoapRequestBuilder coapRequestBuilder = new CoapRequestBuilder(
                 new InetSocketAddress(destination.getAddress(), destination.getPort()), destination.getRootPath(),
-                destination.getRegistrationId(), destination.getEndpoint(), model, encoder);
+                destination.getId(), destination.getEndpoint(), model, encoder);
         request.accept(coapRequestBuilder);
         final Request coapRequest = coapRequestBuilder.getRequest();
 
@@ -104,7 +104,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
         coapRequest.addMessageObserver(syncMessageObserver);
 
         // Store pending request to cancel it on de-registration
-        addPendingRequest(destination.getRegistrationId(), coapRequest);
+        addPendingRequest(destination.getId(), coapRequest);
 
         // Send CoAP request asynchronously
         final Endpoint endpoint = getEndpointForClient(destination);
@@ -115,7 +115,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(final Client destination, final DownlinkRequest<T> request,
+    public <T extends LwM2mResponse> void send(final Registration destination, final DownlinkRequest<T> request,
             final ResponseCallback<T> responseCallback, final ErrorCallback errorCallback) {
         // Retrieve the objects definition
         final LwM2mModel model = modelProvider.getObjectModel(destination);
@@ -123,7 +123,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
         // Create the CoAP request from LwM2m request
         final CoapRequestBuilder coapRequestBuilder = new CoapRequestBuilder(
                 new InetSocketAddress(destination.getAddress(), destination.getPort()), destination.getRootPath(),
-                destination.getRegistrationId(), destination.getEndpoint(), model, encoder);
+                destination.getId(), destination.getEndpoint(), model, encoder);
         request.accept(coapRequestBuilder);
         final Request coapRequest = coapRequestBuilder.getRequest();
 
@@ -140,7 +140,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
         });
 
         // Store pending request to cancel it on de-registration
-        addPendingRequest(destination.getRegistrationId(), coapRequest);
+        addPendingRequest(destination.getId(), coapRequest);
 
         // Send CoAP request asynchronously
         final Endpoint endpoint = getEndpointForClient(destination);
@@ -149,7 +149,7 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
 
     @SuppressWarnings("unchecked") // Java generic usage and strict type has to be removed from Leshan
     @Override
-    public <T extends LwM2mResponse> void send(final Client destination, final String requestTicket,
+    public <T extends LwM2mResponse> void send(final Registration destination, final String requestTicket,
             final DownlinkRequest<T> request) {
         send(destination, request, (ResponseCallback<T>) getResponseCallback(destination, requestTicket),
                 getErrorCallback(destination, requestTicket));
@@ -161,13 +161,13 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
      * @parm requestTicket to correlate the response to a request.
      * @return callback which is invoked on getting a response from LWM2M Client.
      */
-    private <T extends LwM2mResponse> ResponseCallback<T> getResponseCallback(final Client client,
+    private <T extends LwM2mResponse> ResponseCallback<T> getResponseCallback(final Registration registration,
             final String requestTicket) {
         return new ResponseCallback<T>() {
             @Override
             public void onResponse(T response) {
                 processingExecutor
-                        .execute(new ResponseProcessingTask(client, requestTicket, responseListeners, response));
+                        .execute(new ResponseProcessingTask(registration, requestTicket, responseListeners, response));
             }
         };
     }
@@ -178,11 +178,11 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
      * @param requestTicket to correlate the error to a request.
      * @return
      */
-    private ErrorCallback getErrorCallback(final Client client, final String requestTicket) {
+    private ErrorCallback getErrorCallback(final Registration registration, final String requestTicket) {
         return new ErrorCallback() {
             @Override
             public void onError(Exception e) {
-                processingExecutor.execute(new ResponseProcessingTask(client, requestTicket, responseListeners, e));
+                processingExecutor.execute(new ResponseProcessingTask(registration, requestTicket, responseListeners, e));
             }
         };
     }
@@ -211,9 +211,9 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
     }
 
     @Override
-    public void cancelPendingRequests(Client client) {
-        Validate.notNull(client);
-        String registrationId = client.getRegistrationId();
+    public void cancelPendingRequests(Registration registration) {
+        Validate.notNull(registration);
+        String registrationId = registration.getId();
         SortedMap<String, Request> requests = pendingRequests.subMap(getFloorKey(registrationId),
                 getCeilingKey(registrationId));
         for (Request coapRequest : requests.values()) {
@@ -297,19 +297,19 @@ public class CaliforniumLwM2mRequestSender implements LwM2mRequestSender {
     /**
      * Gets the CoAP endpoint that should be used to communicate with a given client.
      *
-     * @param client the client
+     * @param registration the client
      * @return the CoAP endpoint bound to the same network address and port that the client connected to during
      *         registration. If no such CoAP endpoint is available, the first CoAP endpoint from the list of registered
      *         endpoints is returned
      */
-    private Endpoint getEndpointForClient(final Client client) {
+    private Endpoint getEndpointForClient(final Registration registration) {
         for (final Endpoint ep : endpoints) {
             final InetSocketAddress endpointAddress = ep.getAddress();
-            if (endpointAddress.equals(client.getRegistrationEndpointAddress())) {
+            if (endpointAddress.equals(registration.getRegistrationEndpointAddress())) {
                 return ep;
             }
         }
         throw new IllegalStateException(
-                "can't find the client endpoint for address : " + client.getRegistrationEndpointAddress());
+                "can't find the client endpoint for address : " + registration.getRegistrationEndpointAddress());
     }
 }
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationRegistryImpl.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationRegistryImpl.java
index 1e51395e..a93d4a17 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationRegistryImpl.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationRegistryImpl.java
@@ -41,7 +41,7 @@ import org.eclipse.leshan.core.request.ContentFormat;
 import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.server.californium.CaliforniumObservationRegistry;
 import org.eclipse.leshan.server.californium.CaliforniumRegistrationStore;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.model.LwM2mModelProvider;
 import org.eclipse.leshan.server.observation.ObservationRegistryListener;
 import org.slf4j.Logger;
@@ -107,9 +107,9 @@ public class CaliforniumObservationRegistryImpl implements CaliforniumObservatio
     }
 
     @Override
-    public int cancelObservations(Client client) {
+    public int cancelObservations(Registration registration) {
         // check registration id
-        String registrationId = client.getRegistrationId();
+        String registrationId = registration.getId();
         if (registrationId == null)
             return 0;
 
@@ -133,11 +133,11 @@ public class CaliforniumObservationRegistryImpl implements CaliforniumObservatio
     }
 
     @Override
-    public int cancelObservations(Client client, String resourcepath) {
-        if (client == null || client.getRegistrationId() == null || resourcepath == null || resourcepath.isEmpty())
+    public int cancelObservations(Registration registration, String resourcepath) {
+        if (registration == null || registration.getId() == null || resourcepath == null || resourcepath.isEmpty())
             return 0;
 
-        Set<Observation> observations = getObservations(client.getRegistrationId(), resourcepath);
+        Set<Observation> observations = getObservations(registration.getId(), resourcepath);
         for (Observation observation : observations) {
             cancelObservation(observation);
         }
@@ -161,8 +161,8 @@ public class CaliforniumObservationRegistryImpl implements CaliforniumObservatio
     }
 
     @Override
-    public Set<Observation> getObservations(Client client) {
-        return getObservations(client.getRegistrationId());
+    public Set<Observation> getObservations(Registration registration) {
+        return getObservations(registration.getId());
     }
 
     private Set<Observation> getObservations(String registrationId) {
@@ -221,14 +221,14 @@ public class CaliforniumObservationRegistryImpl implements CaliforniumObservatio
                 if (observation == null)
                     return;
 
-                // get client for this registration ID
-                Client client = registrationStore.getRegistration(observation.getRegistrationId());
-                if (client == null)
+                // get registration
+                Registration registration = registrationStore.getRegistration(observation.getRegistrationId());
+                if (registration == null)
                     // TODO Should we clean registrationIDs maps ?
                     return;
 
-                // get model for this client
-                LwM2mModel model = modelProvider.getObjectModel(client);
+                // get model for this registration
+                LwM2mModel model = modelProvider.getObjectModel(registration);
 
                 // get content format
                 ContentFormat contentFormat = null;
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/InMemoryRegistrationStore.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/InMemoryRegistrationStore.java
index de833311..f45dab2d 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/InMemoryRegistrationStore.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/InMemoryRegistrationStore.java
@@ -44,8 +44,8 @@ import org.eclipse.leshan.core.observation.Observation;
 import org.eclipse.leshan.server.Startable;
 import org.eclipse.leshan.server.Stoppable;
 import org.eclipse.leshan.server.californium.CaliforniumRegistrationStore;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.registration.Deregistration;
 import org.eclipse.leshan.server.registration.ExpirationListener;
 import org.slf4j.Logger;
@@ -58,7 +58,7 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
     private final Logger LOG = LoggerFactory.getLogger(InMemoryRegistrationStore.class);
 
     // Data structure
-    private final Map<String /* end-point */, Client> regsByEp = new HashMap<>();
+    private final Map<String /* end-point */, Registration> regsByEp = new HashMap<>();
     private Map<KeyToken, org.eclipse.californium.core.observe.Observation> obsByToken = new HashMap<>();
     private Map<String, List<KeyToken>> tokensByRegId = new HashMap<>();
 
@@ -73,13 +73,13 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
     /* *************** Leshan Registration API **************** */
 
     @Override
-    public Deregistration addRegistration(Client registration) {
+    public Deregistration addRegistration(Registration registration) {
         try {
             lock.writeLock().lock();
 
-            Client registrationRemoved = regsByEp.put(registration.getEndpoint(), registration);
+            Registration registrationRemoved = regsByEp.put(registration.getEndpoint(), registration);
             if (registrationRemoved != null) {
-                Collection<Observation> observationsRemoved = unsafeRemoveAllObservations(registrationRemoved.getRegistrationId());
+                Collection<Observation> observationsRemoved = unsafeRemoveAllObservations(registrationRemoved.getId());
                 return new Deregistration(registrationRemoved, observationsRemoved);
             }
         } finally {
@@ -89,17 +89,17 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
     }
 
     @Override
-    public Client updateRegistration(ClientUpdate update) {
+    public Registration updateRegistration(RegistrationUpdate update) {
         try {
             lock.writeLock().lock();
 
-            Client registration = getRegistration(update.getRegistrationId());
+            Registration registration = getRegistration(update.getRegistrationId());
             if (registration == null) {
                 return null;
             } else {
-                Client registrationUpdated = update.updateClient(registration);
-                regsByEp.put(registrationUpdated.getEndpoint(), registrationUpdated);
-                return registrationUpdated;
+                Registration updatedRegistration = update.update(registration);
+                regsByEp.put(updatedRegistration.getEndpoint(), updatedRegistration);
+                return updatedRegistration;
             }
         } finally {
             lock.writeLock().unlock();
@@ -107,13 +107,13 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
     }
 
     @Override
-    public Client getRegistration(String registrationId) {
+    public Registration getRegistration(String registrationId) {
         try {
             lock.readLock().lock();
 
             if (registrationId != null) {
-                for (Client registration : regsByEp.values()) {
-                    if (registrationId.equals(registration.getRegistrationId())) {
+                for (Registration registration : regsByEp.values()) {
+                    if (registrationId.equals(registration.getId())) {
                         return registration;
                     }
                 }
@@ -125,7 +125,7 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
     }
 
     @Override
-    public Client getRegistrationByEndpoint(String endpoint) {
+    public Registration getRegistrationByEndpoint(String endpoint) {
         try {
             lock.readLock().lock();
             return regsByEp.get(endpoint);
@@ -135,13 +135,13 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
     }
 
     @Override
-    public Collection<Client> getRegistrationByAdress(InetSocketAddress address) {
+    public Collection<Registration> getRegistrationByAdress(InetSocketAddress address) {
         // TODO needed to remove getAllRegistration()
         return null;
     }
 
     @Override
-    public Collection<Client> getAllRegistration() {
+    public Collection<Registration> getAllRegistration() {
         try {
             lock.readLock().lock();
             return Collections.unmodifiableCollection(regsByEp.values());
@@ -156,9 +156,9 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
         try {
             lock.writeLock().lock();
 
-            Client registration = getRegistration(registrationId);
+            Registration registration = getRegistration(registrationId);
             if (registration != null) {
-                Collection<Observation> observationsRemoved = unsafeRemoveAllObservations(registration.getRegistrationId());
+                Collection<Observation> observationsRemoved = unsafeRemoveAllObservations(registration.getId());
                 regsByEp.remove(registration.getEndpoint());
                 return new Deregistration(registration, observationsRemoved);
             }
@@ -424,10 +424,10 @@ public class InMemoryRegistrationStore implements CaliforniumRegistrationStore,
         @Override
         public void run() {
             try {
-                for (Client client : new ArrayList<Client>(getAllRegistration())) {
-                    if (!client.isAlive()) {
+                for (Registration reg : new ArrayList<Registration>(getAllRegistration())) {
+                    if (!reg.isAlive()) {
                         // force de-registration
-                        Deregistration removedRegistration = removeRegistration(client.getRegistrationId());
+                        Deregistration removedRegistration = removeRegistration(reg.getId());
                         expirationListener.registrationExpired(removedRegistration.getRegistration(),
                                 removedRegistration.getObservations());
                     }
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java
index 1d6ed805..23736537 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LeshanServer.java
@@ -48,8 +48,8 @@ import org.eclipse.leshan.server.Stoppable;
 import org.eclipse.leshan.server.californium.CaliforniumObservationRegistry;
 import org.eclipse.leshan.server.californium.CaliforniumRegistrationStore;
 import org.eclipse.leshan.server.californium.LeshanServerBuilder;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.client.RegistrationListener;
 import org.eclipse.leshan.server.client.RegistrationService;
 import org.eclipse.leshan.server.impl.RegistrationServiceImpl;
@@ -102,7 +102,7 @@ public class LeshanServer implements LwM2mServer {
      *
      * @param localAddress the address to bind the CoAP server.
      * @param localSecureAddress the address to bind the CoAP server for DTLS connection.
-     * @param registrationStore the {@link Client} store.
+     * @param registrationStore the {@link Registration} store.
      * @param securityRegistry the {@link SecurityInfo} registry.
      * @param modelProvider provides the objects description for each client.
      * @param decoder
@@ -130,17 +130,17 @@ public class LeshanServer implements LwM2mServer {
         this.registrationService.addListener(new RegistrationListener() {
 
             @Override
-            public void updated(final ClientUpdate update, final Client clientUpdated) {
+            public void updated(final RegistrationUpdate update, final Registration updatedRegistration) {
             }
 
             @Override
-            public void unregistered(final Client client) {
-                LeshanServer.this.observationRegistry.cancelObservations(client);
-                requestSender.cancelPendingRequests(client);
+            public void unregistered(final Registration registration) {
+                LeshanServer.this.observationRegistry.cancelObservations(registration);
+                requestSender.cancelPendingRequests(registration);
             }
 
             @Override
-            public void registered(final Client client) {
+            public void registered(final Registration registration) {
             }
         });
 
@@ -275,25 +275,25 @@ public class LeshanServer implements LwM2mServer {
     }
 
     @Override
-    public <T extends LwM2mResponse> T send(final Client destination, final DownlinkRequest<T> request)
+    public <T extends LwM2mResponse> T send(final Registration destination, final DownlinkRequest<T> request)
             throws InterruptedException {
         return requestSender.send(destination, request, null);
     }
 
     @Override
-    public <T extends LwM2mResponse> T send(final Client destination, final DownlinkRequest<T> request, long timeout)
+    public <T extends LwM2mResponse> T send(final Registration destination, final DownlinkRequest<T> request, long timeout)
             throws InterruptedException {
         return requestSender.send(destination, request, timeout);
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(final Client destination, final DownlinkRequest<T> request,
+    public <T extends LwM2mResponse> void send(final Registration destination, final DownlinkRequest<T> request,
             final ResponseCallback<T> responseCallback, final ErrorCallback errorCallback) {
         requestSender.send(destination, request, responseCallback, errorCallback);
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, String requestTicket, DownlinkRequest<T> request) {
+    public <T extends LwM2mResponse> void send(Registration destination, String requestTicket, DownlinkRequest<T> request) {
         requestSender.send(destination, requestTicket, request);
     }
 
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mPskStore.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mPskStore.java
index 001b874b..24dc071e 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mPskStore.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mPskStore.java
@@ -19,7 +19,7 @@ import java.net.InetSocketAddress;
 import java.util.Arrays;
 
 import org.eclipse.californium.scandium.dtls.pskstore.PskStore;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.registration.RegistrationStore;
 import org.eclipse.leshan.server.security.SecurityInfo;
 import org.eclipse.leshan.server.security.SecurityStore;
@@ -54,9 +54,9 @@ public class LwM2mPskStore implements PskStore {
         if (registrationStore == null)
             return null;
 
-        for (Client c : registrationStore.getAllRegistration()) {
-            if (inetAddress.getPort() == c.getPort() && inetAddress.getAddress().equals(c.getAddress())) {
-                SecurityInfo securityInfo = securityStore.getByEndpoint(c.getEndpoint());
+        for (Registration r : registrationStore.getAllRegistration()) {
+            if (inetAddress.getPort() == r.getPort() && inetAddress.getAddress().equals(r.getAddress())) {
+                SecurityInfo securityInfo = securityStore.getByEndpoint(r.getEndpoint());
                 if (securityInfo != null) {
                     return securityInfo.getIdentity();
                 }
diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mResponseBuilder.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mResponseBuilder.java
index de033b69..5d4c66f9 100644
--- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mResponseBuilder.java
+++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/LwM2mResponseBuilder.java
@@ -53,7 +53,7 @@ import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.core.response.ReadResponse;
 import org.eclipse.leshan.core.response.WriteAttributesResponse;
 import org.eclipse.leshan.core.response.WriteResponse;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.observation.ObservationRegistry;
 import org.eclipse.leshan.util.Validate;
 import org.slf4j.Logger;
@@ -67,7 +67,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
     private final Request coapRequest;
     private final Response coapResponse;
     private final ObservationRegistry observationRegistry;
-    private final Client client;
+    private final Registration registration;
     private final LwM2mModel model;
     private final LwM2mNodeDecoder decoder;
 
@@ -105,12 +105,12 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
         }
     }
 
-    public LwM2mResponseBuilder(final Request coapRequest, final Response coapResponse, final Client client,
+    public LwM2mResponseBuilder(final Request coapRequest, final Response coapResponse, final Registration registration,
             final LwM2mModel model, final ObservationRegistry observationRegistry, final LwM2mNodeDecoder decoder) {
         this.coapRequest = coapRequest;
         this.coapResponse = coapResponse;
         this.observationRegistry = observationRegistry;
-        this.client = client;
+        this.registration = registration;
         this.model = model;
         this.decoder = decoder;
     }
@@ -132,7 +132,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -143,7 +143,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
             LinkObject[] links = null;
             if (MediaTypeRegistry.APPLICATION_LINK_FORMAT != coapResponse.getOptions().getContentFormat()) {
                 LOG.debug("Expected LWM2M Client [{}] to return application/link-format [{}] content but got [{}]",
-                        client.getEndpoint(), MediaTypeRegistry.APPLICATION_LINK_FORMAT,
+                        registration.getEndpoint(), MediaTypeRegistry.APPLICATION_LINK_FORMAT,
                         coapResponse.getOptions().getContentFormat());
                 links = new LinkObject[] {}; // empty list
             } else {
@@ -160,7 +160,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -180,7 +180,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -199,7 +199,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -218,7 +218,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
 
     }
@@ -240,7 +240,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -259,7 +259,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -275,7 +275,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
             LwM2mNode content = decodeCoapResponse(request.getPath(), coapResponse);
             if (coapResponse.getOptions().hasObserve()) {
                 // observe request succeed so we can add and observation to registry
-                Observation observation = new Observation(coapRequest.getToken(), client.getRegistrationId(),
+                Observation observation = new Observation(coapRequest.getToken(), registration.getId(),
                         request.getPath(), request.getContext());
                 observationRegistry.addObservation(observation);
                 // add the observation to an ObserveResponse instance
@@ -295,7 +295,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -312,7 +312,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -328,7 +328,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
@@ -344,7 +344,7 @@ public class LwM2mResponseBuilder<T extends LwM2mResponse> implements DownlinkRe
                     coapResponse.getPayloadString(), coapResponse);
             break;
         default:
-            handleUnexpectedResponseCode(client.getEndpoint(), coapRequest, coapResponse);
+            handleUnexpectedResponseCode(registration.getEndpoint(), coapRequest, coapResponse);
         }
     }
 
diff --git a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationEventPublisher.java b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationEventPublisher.java
index 8c3a3d34..c53ffbc8 100644
--- a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationEventPublisher.java
+++ b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationEventPublisher.java
@@ -15,11 +15,11 @@
  *******************************************************************************/
 package org.eclipse.leshan.server.cluster;
 
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationListener;
-import org.eclipse.leshan.server.client.ClientUpdate;
-import org.eclipse.leshan.server.cluster.serialization.ClientSerDes;
-import org.eclipse.leshan.server.cluster.serialization.ClientUpdateSerDes;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
+import org.eclipse.leshan.server.cluster.serialization.RegistrationSerDes;
+import org.eclipse.leshan.server.cluster.serialization.RegistrationUpdateSerDes;
 
 import com.eclipsesource.json.JsonObject;
 
@@ -27,7 +27,7 @@ import redis.clients.jedis.Jedis;
 import redis.clients.util.Pool;
 
 /**
- * A Client registry Listener which publish registration event on Redis channel.
+ * A Registration registry Listener which publish registration event on Redis channel.
  */
 public class RedisRegistrationEventPublisher implements RegistrationListener {
 
@@ -41,18 +41,18 @@ public class RedisRegistrationEventPublisher implements RegistrationListener {
     }
 
     @Override
-    public void registered(Client client) {
-        String payload = ClientSerDes.sSerialize(client);
+    public void registered(Registration registration) {
+        String payload = RegistrationSerDes.sSerialize(registration);
         try (Jedis j = pool.getResource()) {
             j.publish(REGISTER_EVENT, payload);
         }
     }
 
     @Override
-    public void updated(ClientUpdate update, Client registrationUpdated) {
+    public void updated(RegistrationUpdate update, Registration updatedRegistration) {
         JsonObject value = new JsonObject();
-        value.add("regUpdate", ClientUpdateSerDes.jSerialize(update));
-        value.add("regUpdated", ClientSerDes.jSerialize(registrationUpdated));
+        value.add("regUpdate", RegistrationUpdateSerDes.jSerialize(update));
+        value.add("regUpdated", RegistrationSerDes.jSerialize(updatedRegistration));
 
         try (Jedis j = pool.getResource()) {
             j.publish(UPDATE_EVENT, value.toString());
@@ -60,8 +60,8 @@ public class RedisRegistrationEventPublisher implements RegistrationListener {
     }
 
     @Override
-    public void unregistered(Client client) {
-        String payload = ClientSerDes.sSerialize(client);
+    public void unregistered(Registration registration) {
+        String payload = RegistrationSerDes.sSerialize(registration);
         try (Jedis j = pool.getResource()) {
             j.publish(DEREGISTER_EVENT, payload);
         }
diff --git a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationStore.java b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationStore.java
index 2dc143ce..a7e2414f 100644
--- a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationStore.java
+++ b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationStore.java
@@ -37,9 +37,9 @@ import org.eclipse.leshan.server.Startable;
 import org.eclipse.leshan.server.Stoppable;
 import org.eclipse.leshan.server.californium.CaliforniumRegistrationStore;
 import org.eclipse.leshan.server.californium.impl.CoapRequestBuilder;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
-import org.eclipse.leshan.server.cluster.serialization.ClientSerDes;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
+import org.eclipse.leshan.server.cluster.serialization.RegistrationSerDes;
 import org.eclipse.leshan.server.cluster.serialization.ObservationSerDes;
 import org.eclipse.leshan.server.registration.Deregistration;
 import org.eclipse.leshan.server.registration.ExpirationListener;
@@ -99,7 +99,7 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
     /* *************** Leshan Registration API **************** */
 
     @Override
-    public Deregistration addRegistration(Client registration) {
+    public Deregistration addRegistration(Registration registration) {
         try (Jedis j = pool.getResource()) {
             byte[] lockValue = null;
             byte[] lockKey = toLockKey(registration.getEndpoint());
@@ -112,13 +112,13 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
                 byte[] old = j.getSet(k, serializeReg(registration));
 
                 // add registration: secondary index
-                byte[] idx = toRegIdKey(registration.getRegistrationId());
+                byte[] idx = toRegIdKey(registration.getId());
                 j.set(idx, registration.getEndpoint().getBytes(UTF_8));
 
                 if (old != null) {
-                    Client oldRegistration = deserializeReg(old);
+                    Registration oldRegistration = deserializeReg(old);
                     Collection<Observation> obsRemoved = unsafeRemoveAllObservations(j,
-                            oldRegistration.getRegistrationId());
+                            oldRegistration.getId());
                     return new Deregistration(oldRegistration, obsRemoved);
                 }
 
@@ -130,7 +130,7 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
     }
 
     @Override
-    public Client updateRegistration(ClientUpdate update) {
+    public Registration updateRegistration(RegistrationUpdate update) {
         try (Jedis j = pool.getResource()) {
 
             // fetch the client ep by registration ID index
@@ -145,19 +145,19 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
                 return null;
             }
 
-            Client r = deserializeReg(data);
+            Registration r = deserializeReg(data);
 
             byte[] lockValue = null;
             byte[] lockKey = toLockKey(r.getEndpoint());
             try {
                 lockValue = RedisLock.acquire(j, lockKey);
 
-                Client clientUpdated = update.updateClient(r);
+                Registration updatedRegistration = update.update(r);
 
                 // store the new client
-                j.set(toEndpointKey(clientUpdated.getEndpoint()), serializeReg(clientUpdated));
+                j.set(toEndpointKey(updatedRegistration.getEndpoint()), serializeReg(updatedRegistration));
 
-                return clientUpdated;
+                return updatedRegistration;
 
             } finally {
                 RedisLock.release(j, lockKey, lockValue);
@@ -166,7 +166,7 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
     }
 
     @Override
-    public Client getRegistration(String registrationId) {
+    public Registration getRegistration(String registrationId) {
         try (Jedis j = pool.getResource()) {
             byte[] ep = j.get(toRegIdKey(registrationId));
             if (ep == null) {
@@ -182,38 +182,38 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
     }
 
     @Override
-    public Client getRegistrationByEndpoint(String endpoint) {
+    public Registration getRegistrationByEndpoint(String endpoint) {
         Validate.notNull(endpoint);
         try (Jedis j = pool.getResource()) {
             byte[] data = j.get(toEndpointKey(endpoint));
             if (data == null) {
                 return null;
             }
-            Client r = deserializeReg(data);
+            Registration r = deserializeReg(data);
             return r.isAlive() ? r : null;
         }
     }
 
     @Override
-    public Collection<Client> getRegistrationByAdress(InetSocketAddress address) {
+    public Collection<Registration> getRegistrationByAdress(InetSocketAddress address) {
         // TODO Auto-generated method stub
         return null;
     }
 
     @Override
-    public Collection<Client> getAllRegistration() {
+    public Collection<Registration> getAllRegistration() {
         try (Jedis j = pool.getResource()) {
             ScanParams params = new ScanParams().match(EP_REG + "*").count(100);
-            Collection<Client> list = new LinkedList<>();
+            Collection<Registration> list = new LinkedList<>();
             String cursor = "0";
             do {
                 ScanResult<byte[]> res = j.scan(cursor.getBytes(), params);
                 for (byte[] key : res.getResult()) {
                     byte[] element = j.get(key);
                     if (element != null) {
-                        Client c = deserializeReg(element);
-                        if (c.isAlive()) {
-                            list.add(c);
+                        Registration r = deserializeReg(element);
+                        if (r.isAlive()) {
+                            list.add(r);
                         }
                     }
                 }
@@ -240,22 +240,22 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
                 return null;
             }
 
-            Client r = deserializeReg(data);
-            deleteClient(j, r);
-            Collection<Observation> obsRemoved = unsafeRemoveAllObservations(j, r.getRegistrationId());
+            Registration r = deserializeReg(data);
+            deleteRegistration(j, r);
+            Collection<Observation> obsRemoved = unsafeRemoveAllObservations(j, r.getId());
             return new Deregistration(r, obsRemoved);
         }
     }
 
-    private void deleteClient(Jedis j, Client c) {
+    private void deleteRegistration(Jedis j, Registration r) {
         byte[] lockValue = null;
-        byte[] lockKey = toLockKey(c.getEndpoint());
+        byte[] lockKey = toLockKey(r.getEndpoint());
         try {
             lockValue = RedisLock.acquire(j, lockKey);
 
             // delete all entries
-            j.del(toRegIdKey(c.getRegistrationId()));
-            j.del(toEndpointKey(c.getEndpoint()));
+            j.del(toRegIdKey(r.getId()));
+            j.del(toEndpointKey(r.getEndpoint()));
 
         } finally {
             RedisLock.release(j, lockKey, lockValue);
@@ -274,12 +274,12 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
         return toKey(EP_REG.getBytes(UTF_8), endpoint);
     }
 
-    private byte[] serializeReg(Client client) {
-        return ClientSerDes.bSerialize(client);
+    private byte[] serializeReg(Registration registration) {
+        return RegistrationSerDes.bSerialize(registration);
     }
 
-    private Client deserializeReg(byte[] data) {
-        return ClientSerDes.deserialize(data);
+    private Registration deserializeReg(byte[] data) {
+        return RegistrationSerDes.deserialize(data);
     }
 
     /* *************** Leshan Observation API **************** */
@@ -342,7 +342,7 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
     public Collection<Observation> removeObservations(String registrationId) {
         try (Jedis j = pool.getResource()) {
             // check registration exists
-            Client registration = getRegistration(registrationId);
+            Registration registration = getRegistration(registrationId);
             if (registration == null)
                 return Collections.emptyList();
 
@@ -407,7 +407,7 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
 
             org.eclipse.californium.core.observe.Observation obs = deserializeObs(serializedObs);
             String registrationId = extractRegistrationId(obs);
-            Client registration = getRegistration(registrationId);
+            Registration registration = getRegistration(registrationId);
             String endpoint = registration.getEndpoint();
 
             byte[] lockValue = null;
@@ -556,10 +556,10 @@ public class RedisRegistrationStore implements CaliforniumRegistrationStore, Sta
                     // TODO we probably need a lock here
                     ScanResult<byte[]> res = j.scan(cursor.getBytes(), params);
                     for (byte[] key : res.getResult()) {
-                        Client c = deserializeReg(j.get(key));
-                        if (!c.isAlive()) {
-                            deleteClient(j, c);
-                            expirationListener.registrationExpired(c, new ArrayList<Observation>());
+                        Registration r = deserializeReg(j.get(key));
+                        if (!r.isAlive()) {
+                            deleteRegistration(j, r);
+                            expirationListener.registrationExpired(r, new ArrayList<Observation>());
                         }
                     }
                     cursor = res.getStringCursor();
diff --git a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRequestResponseHandler.java b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRequestResponseHandler.java
index 8b9b877f..37ee889a 100644
--- a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRequestResponseHandler.java
+++ b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRequestResponseHandler.java
@@ -28,7 +28,7 @@ import org.eclipse.leshan.core.request.DownlinkRequest;
 import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.server.LwM2mServer;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationService;
 import org.eclipse.leshan.server.cluster.serialization.DownlinkRequestSerDes;
 import org.eclipse.leshan.server.cluster.serialization.ResponseSerDes;
@@ -98,13 +98,13 @@ public class RedisRequestResponseHandler {
         this.server.addResponseListener(new ResponseListener() {
             
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
-                handleResponse(client.getEndpoint(), requestTicket, response);
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
+                handleResponse(registration.getEndpoint(), requestTicket, response);
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
-                handlerError(client.getEndpoint(), requestTicket, exception);
+            public void onError(Registration registration, String requestTicket, Exception exception) {
+                handlerError(registration.getEndpoint(), requestTicket, exception);
             }
 
         });
@@ -210,7 +210,7 @@ public class RedisRequestResponseHandler {
                 return;
 
             // Get the registration for this endpoint
-            Client destination = registrationService.getByEndpoint(endpoint);
+            Registration destination = registrationService.getByEndpoint(endpoint);
             if (destination == null) {
                 sendError(ticket, String.format("No registration for this endpoint %s.", endpoint));
             }
diff --git a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisTokenHandler.java b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisTokenHandler.java
index 20587959..49416282 100644
--- a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisTokenHandler.java
+++ b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisTokenHandler.java
@@ -17,9 +17,9 @@ package org.eclipse.leshan.server.cluster;
 
 import java.util.Arrays;
 
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationListener;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.util.Validate;
 
 import redis.clients.jedis.Jedis;
@@ -44,30 +44,30 @@ public class RedisTokenHandler implements RegistrationListener {
     }
 
     @Override
-    public void registered(Client client) {
+    public void registered(Registration registration) {
         try (Jedis j = pool.getResource()) {
             // create registration entry
-            byte[] k = (EP_UID + client.getEndpoint()).getBytes();
+            byte[] k = (EP_UID + registration.getEndpoint()).getBytes();
             j.set(k, instanceUID.getBytes());
-            j.expire(k, client.getLifeTimeInSec().intValue());
+            j.expire(k, registration.getLifeTimeInSec().intValue());
         }
     }
 
     @Override
-    public void updated(ClientUpdate update, Client clientUpdated) {
+    public void updated(RegistrationUpdate update, Registration updatedRegistration) {
         try (Jedis j = pool.getResource()) {
             // create registration entry
-            byte[] k = (EP_UID + clientUpdated.getEndpoint()).getBytes();
+            byte[] k = (EP_UID + updatedRegistration.getEndpoint()).getBytes();
             j.set(k, instanceUID.getBytes());
-            j.expire(k, clientUpdated.getLifeTimeInSec().intValue());
+            j.expire(k, updatedRegistration.getLifeTimeInSec().intValue());
         }
     }
 
     @Override
-    public void unregistered(Client client) {
+    public void unregistered(Registration registration) {
         try (Jedis j = pool.getResource()) {
             // create registration entry
-            byte[] k = (EP_UID + client.getEndpoint()).getBytes();
+            byte[] k = (EP_UID + registration.getEndpoint()).getBytes();
             j.del(k);
         }
     }
diff --git a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDes.java b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/RegistrationSerDes.java
similarity index 73%
rename from leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDes.java
rename to leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/RegistrationSerDes.java
index 1b4f1a95..5d21fecb 100644
--- a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDes.java
+++ b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/RegistrationSerDes.java
@@ -22,7 +22,7 @@ import java.util.Map;
 
 import org.eclipse.leshan.LinkObject;
 import org.eclipse.leshan.core.request.BindingMode;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 import com.eclipsesource.json.Json;
 import com.eclipsesource.json.JsonArray;
@@ -32,26 +32,26 @@ import com.eclipsesource.json.JsonValue;
 /**
  * Functions for serialize and deserialize a Client in JSON.
  */
-public class ClientSerDes {
+public class RegistrationSerDes {
 
-    public static JsonObject jSerialize(Client c) {
+    public static JsonObject jSerialize(Registration r) {
         JsonObject o = Json.object();
-        o.add("regDate", c.getRegistrationDate().getTime());
-        o.add("address", c.getAddress().getHostAddress());
-        o.add("port", c.getPort());
-        o.add("regAddr", c.getRegistrationEndpointAddress().getHostString());
-        o.add("regPort", c.getRegistrationEndpointAddress().getPort());
-        o.add("lt", c.getLifeTimeInSec());
-        if (c.getSmsNumber() != null) {
-            o.add("sms", c.getSmsNumber());
+        o.add("regDate", r.getRegistrationDate().getTime());
+        o.add("address", r.getAddress().getHostAddress());
+        o.add("port", r.getPort());
+        o.add("regAddr", r.getRegistrationEndpointAddress().getHostString());
+        o.add("regPort", r.getRegistrationEndpointAddress().getPort());
+        o.add("lt", r.getLifeTimeInSec());
+        if (r.getSmsNumber() != null) {
+            o.add("sms", r.getSmsNumber());
         }
-        o.add("ver", c.getLwM2mVersion());
-        o.add("bnd", c.getBindingMode().name());
-        o.add("ep", c.getEndpoint());
-        o.add("regId", c.getRegistrationId());
+        o.add("ver", r.getLwM2mVersion());
+        o.add("bnd", r.getBindingMode().name());
+        o.add("ep", r.getEndpoint());
+        o.add("regId", r.getId());
 
         JsonArray links = new JsonArray();
-        for (LinkObject l : c.getObjectLinks()) {
+        for (LinkObject l : r.getObjectLinks()) {
             JsonObject ol = Json.object();
             ol.add("url", l.getUrl());
             JsonObject at = Json.object();
@@ -67,25 +67,25 @@ public class ClientSerDes {
         }
         o.add("objLink", links);
         JsonObject addAttr = Json.object();
-        for (Map.Entry<String, String> e : c.getAdditionalRegistrationAttributes().entrySet()) {
+        for (Map.Entry<String, String> e : r.getAdditionalRegistrationAttributes().entrySet()) {
             addAttr.add(e.getKey(), e.getValue());
         }
         o.add("addAttr", addAttr);
-        o.add("root", c.getRootPath());
-        o.add("lastUp", c.getLastUpdate().getTime());
+        o.add("root", r.getRootPath());
+        o.add("lastUp", r.getLastUpdate().getTime());
         return o;
     }
 
-    public static String sSerialize(Client c) {
-        return jSerialize(c).toString();
+    public static String sSerialize(Registration r) {
+        return jSerialize(r).toString();
     }
 
-    public static byte[] bSerialize(Client c) {
-        return jSerialize(c).toString().getBytes();
+    public static byte[] bSerialize(Registration r) {
+        return jSerialize(r).toString().getBytes();
     }
 
-    public static Client deserialize(JsonObject jObj) {
-        Client.Builder b = new Client.Builder(jObj.getString("regId", null), jObj.getString("ep", null),
+    public static Registration deserialize(JsonObject jObj) {
+        Registration.Builder b = new Registration.Builder(jObj.getString("regId", null), jObj.getString("ep", null),
                 new InetSocketAddress(jObj.getString("address", null), jObj.getInt("port", 0)).getAddress(),
                 jObj.getInt("port", 0),
                 new InetSocketAddress(jObj.getString("regAddr", null), jObj.getInt("regPort", 0)));
@@ -127,7 +127,7 @@ public class ClientSerDes {
         return b.build();
     }
 
-    public static Client deserialize(byte[] data) {
+    public static Registration deserialize(byte[] data) {
         return deserialize((JsonObject) Json.parse(new String(data)));
     }
 }
\ No newline at end of file
diff --git a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDes.java b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/RegistrationUpdateSerDes.java
similarity index 77%
rename from leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDes.java
rename to leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/RegistrationUpdateSerDes.java
index 60f69e5d..b5d27fb0 100644
--- a/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDes.java
+++ b/leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/serialization/RegistrationUpdateSerDes.java
@@ -22,7 +22,7 @@ import java.util.Map;
 
 import org.eclipse.leshan.LinkObject;
 import org.eclipse.leshan.core.request.BindingMode;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 
 import com.eclipsesource.json.Json;
 import com.eclipsesource.json.JsonArray;
@@ -32,26 +32,26 @@ import com.eclipsesource.json.JsonValue;
 /**
  * Functions for serialize and deserialize a ClientUpdate in JSON.
  */
-public class ClientUpdateSerDes {
+public class RegistrationUpdateSerDes {
 
-    public static JsonObject jSerialize(ClientUpdate c) {
+    public static JsonObject jSerialize(RegistrationUpdate u) {
         JsonObject o = Json.object();
 
         // mandatory fields
-        o.add("regId", c.getRegistrationId());
-        o.add("address", c.getAddress().getHostAddress());
-        o.add("port", c.getPort());
+        o.add("regId", u.getRegistrationId());
+        o.add("address", u.getAddress().getHostAddress());
+        o.add("port", u.getPort());
 
         // optional fields
-        if (c.getLifeTimeInSec() != null)
-            o.add("lt", c.getLifeTimeInSec());
-        if (c.getSmsNumber() != null)
-            o.add("sms", c.getSmsNumber());
-        if (c.getBindingMode() != null)
-            o.add("bnd", c.getBindingMode().name());
-        if (c.getObjectLinks() != null) {
+        if (u.getLifeTimeInSec() != null)
+            o.add("lt", u.getLifeTimeInSec());
+        if (u.getSmsNumber() != null)
+            o.add("sms", u.getSmsNumber());
+        if (u.getBindingMode() != null)
+            o.add("bnd", u.getBindingMode().name());
+        if (u.getObjectLinks() != null) {
             JsonArray links = new JsonArray();
-            for (LinkObject l : c.getObjectLinks()) {
+            for (LinkObject l : u.getObjectLinks()) {
                 JsonObject ol = Json.object();
                 ol.add("url", l.getUrl());
                 JsonObject at = Json.object();
@@ -71,15 +71,15 @@ public class ClientUpdateSerDes {
         return o;
     }
 
-    public static String sSerialize(ClientUpdate c) {
-        return jSerialize(c).toString();
+    public static String sSerialize(RegistrationUpdate r) {
+        return jSerialize(r).toString();
     }
 
-    public static byte[] bSerialize(ClientUpdate c) {
-        return jSerialize(c).toString().getBytes();
+    public static byte[] bSerialize(RegistrationUpdate r) {
+        return jSerialize(r).toString().getBytes();
     }
 
-    public static ClientUpdate deserialize(byte[] data) throws UnknownHostException {
+    public static RegistrationUpdate deserialize(byte[] data) throws UnknownHostException {
         JsonObject v = (JsonObject) Json.parse(new String(data));
 
         // mandatory fields
@@ -124,6 +124,6 @@ public class ClientUpdateSerDes {
             }
         }
 
-        return new ClientUpdate(regId, addr, port, lifetime, sms, b, linkObjs);
+        return new RegistrationUpdate(regId, addr, port, lifetime, sms, b, linkObjs);
     }
 }
\ No newline at end of file
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/LwM2mServer.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/LwM2mServer.java
index 21fbe070..f712b532 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/LwM2mServer.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/LwM2mServer.java
@@ -19,7 +19,7 @@ import org.eclipse.leshan.core.request.DownlinkRequest;
 import org.eclipse.leshan.core.response.ErrorCallback;
 import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ResponseCallback;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationService;
 import org.eclipse.leshan.server.model.LwM2mModelProvider;
 import org.eclipse.leshan.server.observation.ObservationRegistry;
@@ -60,7 +60,7 @@ public interface LwM2mServer {
      * @return the response or <code>null</code> if the CoAP timeout expires ( see
      *         http://tools.ietf.org/html/rfc7252#section-4.2 ).
      */
-    <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request) throws InterruptedException;
+    <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request) throws InterruptedException;
 
     /**
      * Sends a Lightweight M2M request synchronously. Will block until a response is received from the remote client.
@@ -70,13 +70,13 @@ public interface LwM2mServer {
      * @param timeout the request timeout in millisecond
      * @return the response or <code>null</code> if the timeout expires (given parameter or CoAP timeout).
      */
-    <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request, long timeout)
+    <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request, long timeout)
             throws InterruptedException;
 
     /**
      * Sends a Lightweight M2M request asynchronously.
      */
-    <T extends LwM2mResponse> void send(Client destination, DownlinkRequest<T> request,
+    <T extends LwM2mResponse> void send(Registration destination, DownlinkRequest<T> request,
             ResponseCallback<T> responseCallback, ErrorCallback errorCallback);
 
     /**
@@ -88,7 +88,7 @@ public interface LwM2mServer {
      * @param request an instance of downlink request.
      * @param <T> instance of LwM2mResponse
      */
-    <T extends LwM2mResponse> void send(Client destination, String requestTicket, DownlinkRequest<T> request);
+    <T extends LwM2mResponse> void send(Registration destination, String requestTicket, DownlinkRequest<T> request);
 
     /**
      * adds the listener for the given LWM2M client. This method shall be used to re-register a listener for already
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/Client.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/Registration.java
similarity index 92%
rename from leshan-server-core/src/main/java/org/eclipse/leshan/server/client/Client.java
rename to leshan-server-core/src/main/java/org/eclipse/leshan/server/client/Registration.java
index 8b83819a..4a3e9ee9 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/Client.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/Registration.java
@@ -30,9 +30,9 @@ import org.eclipse.leshan.core.request.BindingMode;
 import org.eclipse.leshan.util.Validate;
 
 /**
- * An immutable structure which represent a LW-M2M client registered on the server
+ * An immutable structure which represent a LW-M2M client registration on the server
  */
-public class Client implements Serializable {
+public class Registration implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -64,7 +64,7 @@ public class Client implements Serializable {
      */
     private final String endpoint;
 
-    private final String registrationId;
+    private final String id;
 
     private final LinkObject[] objectLinks;
 
@@ -75,19 +75,19 @@ public class Client implements Serializable {
 
     private final Date lastUpdate;
 
-    protected Client(String registrationId, String endpoint, InetAddress address, int port, String lwM2mVersion,
+    protected Registration(String id, String endpoint, InetAddress address, int port, String lwM2mVersion,
             Long lifetimeInSec, String smsNumber, BindingMode bindingMode, LinkObject[] objectLinks,
             InetSocketAddress registrationEndpointAddress,
 
             Date registrationDate, Date lastUpdate, Map<String, String> additionalRegistrationAttributes) {
 
-        Validate.notNull(registrationId);
+        Validate.notNull(id);
         Validate.notEmpty(endpoint);
         Validate.notNull(address);
         Validate.notNull(port);
         Validate.notNull(registrationEndpointAddress);
 
-        this.registrationId = registrationId;
+        this.id = id;
         this.endpoint = endpoint;
         this.address = address;
         this.port = port;
@@ -118,8 +118,8 @@ public class Client implements Serializable {
 
     }
 
-    public String getRegistrationId() {
-        return registrationId;
+    public String getId() {
+        return id;
     }
 
     public Date getRegistrationDate() {
@@ -272,9 +272,9 @@ public class Client implements Serializable {
     @Override
     public String toString() {
         return String.format(
-                "Client [registrationDate=%s, address=%s, port=%s, registrationEndpoint=%s, lifeTimeInSec=%s, smsNumber=%s, lwM2mVersion=%s, bindingMode=%s, endpoint=%s, registrationId=%s, objectLinks=%s, lastUpdate=%s]",
+                "Registration [registrationDate=%s, address=%s, port=%s, registrationEndpoint=%s, lifeTimeInSec=%s, smsNumber=%s, lwM2mVersion=%s, bindingMode=%s, endpoint=%s, registrationId=%s, objectLinks=%s, lastUpdate=%s]",
                 registrationDate, address, port, registrationEndpointAddress, lifeTimeInSec, smsNumber, lwM2mVersion,
-                bindingMode, endpoint, registrationId, Arrays.toString(objectLinks), lastUpdate);
+                bindingMode, endpoint, id, Arrays.toString(objectLinks), lastUpdate);
     }
 
     /**
@@ -295,8 +295,8 @@ public class Client implements Serializable {
      */
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof Client) {
-            Client other = (Client) obj;
+        if (obj instanceof Registration) {
+            Registration other = (Registration) obj;
             return this.getEndpoint().equals(other.getEndpoint());
         } else {
             return false;
@@ -375,8 +375,8 @@ public class Client implements Serializable {
             return this;
         }
 
-        public Client build() {
-            return new Client(Builder.this.registrationId, Builder.this.endpoint, Builder.this.address,
+        public Registration build() {
+            return new Registration(Builder.this.registrationId, Builder.this.endpoint, Builder.this.address,
                     Builder.this.port, Builder.this.lwM2mVersion, Builder.this.lifeTimeInSec, Builder.this.smsNumber,
                     this.bindingMode, this.objectLinks, this.registrationEndpointAddress, this.registrationDate,
                     this.lastUpdate, this.additionalRegistrationAttributes);
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationListener.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationListener.java
index 8e31e818..e10681bf 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationListener.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationListener.java
@@ -23,22 +23,22 @@ public interface RegistrationListener {
     /**
      * Invoked when a new client has been registered on the server.
      *
-     * @param client
+     * @param registration
      */
-    void registered(Client client);
+    void registered(Registration registration);
 
     /**
-     * Invoked when a client has been updated.
+     * Invoked when a client updated its registration.
      *
      * @param update the registration properties to update
-     * @param clientUpdated the client after the update
+     * @param updatedRegistration the registration after the update
      */
-    void updated(ClientUpdate update, Client clientUpdated);
+    void updated(RegistrationUpdate update, Registration updatedRegistration);
 
     /**
-     * Invoked when a new client has been unregistered from the server.
+     * Invoked when a client has been unregistered from the server.
      *
-     * @param client
+     * @param registration
      */
-    void unregistered(Client client);
+    void unregistered(Registration registration);
 }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationService.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationService.java
index 5225198d..b5b517d9 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationService.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationService.java
@@ -28,7 +28,7 @@ public interface RegistrationService {
      * @param registration id
      * @return the matching registration or <code>null</code> if not found
      */
-    Client getById(String id);
+    Registration getById(String id);
 
     /**
      * Retrieves a registration by end-point.
@@ -36,7 +36,7 @@ public interface RegistrationService {
      * @param endpoint
      * @return the matching registration or <code>null</code> if not found
      */
-    Client getByEndpoint(String endpoint);
+    Registration getByEndpoint(String endpoint);
 
     /**
      * Returns an unmodifiable list of all registrations.
@@ -45,7 +45,7 @@ public interface RegistrationService {
      * @deprecated should be replace by an iterator
      */
     @Deprecated
-    Collection<Client> getAllRegistrations();
+    Collection<Registration> getAllRegistrations();
 
     /**
      * Adds a new listener to be notified with client registration events.
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/ClientUpdate.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationUpdate.java
similarity index 78%
rename from leshan-server-core/src/main/java/org/eclipse/leshan/server/client/ClientUpdate.java
rename to leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationUpdate.java
index 4834d506..2ea5a95d 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/ClientUpdate.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/client/RegistrationUpdate.java
@@ -26,7 +26,7 @@ import org.eclipse.leshan.util.Validate;
 /**
  * A container object for updating a LW-M2M client's registration properties on the server.
  */
-public class ClientUpdate {
+public class RegistrationUpdate {
 
     private final String registrationId;
 
@@ -38,7 +38,7 @@ public class ClientUpdate {
     private final BindingMode bindingMode;
     private final LinkObject[] objectLinks;
 
-    public ClientUpdate(String registrationId, InetAddress address, Integer port, Long lifeTimeInSec, String smsNumber,
+    public RegistrationUpdate(String registrationId, InetAddress address, Integer port, Long lifeTimeInSec, String smsNumber,
             BindingMode bindingMode, LinkObject[] objectLinks) {
         Validate.notNull(registrationId);
         Validate.notNull(address);
@@ -54,29 +54,30 @@ public class ClientUpdate {
     }
 
     /**
-     * Returns an updated version of the client.
+     * Returns an updated version of the registration.
      * 
-     * @param client the registered client
-     * @return the updated client
+     * @param registration the registration to update
+     * @return the updated registration
      */
-    public Client updateClient(Client client) {
-        InetAddress address = this.address != null ? this.address : client.getAddress();
-        int port = this.port != null ? this.port : client.getPort();
-        LinkObject[] linkObject = this.objectLinks != null ? this.objectLinks : client.getObjectLinks();
-        long lifeTimeInSec = this.lifeTimeInSec != null ? this.lifeTimeInSec : client.getLifeTimeInSec();
-        BindingMode bindingMode = this.bindingMode != null ? this.bindingMode : client.getBindingMode();
-        String smsNumber = this.smsNumber != null ? this.smsNumber : client.getSmsNumber();
+    public Registration update(Registration registration) {
+        InetAddress address = this.address != null ? this.address : registration.getAddress();
+        int port = this.port != null ? this.port : registration.getPort();
+        LinkObject[] linkObject = this.objectLinks != null ? this.objectLinks : registration.getObjectLinks();
+        long lifeTimeInSec = this.lifeTimeInSec != null ? this.lifeTimeInSec : registration.getLifeTimeInSec();
+        BindingMode bindingMode = this.bindingMode != null ? this.bindingMode : registration.getBindingMode();
+        String smsNumber = this.smsNumber != null ? this.smsNumber : registration.getSmsNumber();
 
         // this needs to be done in any case, even if no properties have changed, in order
-        // to extend the client registration's time-to-live period ...
+        // to extend the client registration time-to-live period ...
         Date lastUpdate = new Date();
 
-        Client.Builder builder = new Client.Builder(client.getRegistrationId(), client.getEndpoint(), address, port,
-                client.getRegistrationEndpointAddress());
+        Registration.Builder builder = new Registration.Builder(registration.getId(), registration.getEndpoint(),
+                address, port, registration.getRegistrationEndpointAddress());
 
-        builder.lwM2mVersion(client.getLwM2mVersion()).lifeTimeInSec(lifeTimeInSec).smsNumber(smsNumber)
-                .bindingMode(bindingMode).objectLinks(linkObject).registrationDate(client.getRegistrationDate())
-                .lastUpdate(lastUpdate).additionalRegistrationAttributes(client.getAdditionalRegistrationAttributes());
+        builder.lwM2mVersion(registration.getLwM2mVersion()).lifeTimeInSec(lifeTimeInSec).smsNumber(smsNumber)
+                .bindingMode(bindingMode).objectLinks(linkObject).registrationDate(registration.getRegistrationDate())
+                .lastUpdate(lastUpdate)
+                .additionalRegistrationAttributes(registration.getAdditionalRegistrationAttributes());
 
         return builder.build();
 
@@ -113,7 +114,7 @@ public class ClientUpdate {
     @Override
     public String toString() {
         return String.format(
-                "ClientUpdate [registrationId=%s, address=%s, port=%s, lifeTimeInSec=%s, smsNumber=%s, bindingMode=%s, objectLinks=%s]",
+                "RegistrationUpdate [registrationId=%s, address=%s, port=%s, lifeTimeInSec=%s, smsNumber=%s, bindingMode=%s, objectLinks=%s]",
                 registrationId, address, port, lifeTimeInSec, smsNumber, bindingMode, Arrays.toString(objectLinks));
     }
 
@@ -139,7 +140,7 @@ public class ClientUpdate {
             return false;
         if (getClass() != obj.getClass())
             return false;
-        ClientUpdate other = (ClientUpdate) obj;
+        RegistrationUpdate other = (RegistrationUpdate) obj;
         if (address == null) {
             if (other.address != null)
                 return false;
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/LwM2mRequestSenderImpl.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/LwM2mRequestSenderImpl.java
index 4665c287..d6e893e0 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/LwM2mRequestSenderImpl.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/LwM2mRequestSenderImpl.java
@@ -21,7 +21,7 @@ import org.eclipse.leshan.core.response.ErrorCallback;
 import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ResponseCallback;
 import org.eclipse.leshan.server.Stoppable;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.queue.impl.QueuedRequestSender;
 import org.eclipse.leshan.server.request.LwM2mRequestSender;
 import org.eclipse.leshan.server.response.ResponseListener;
@@ -48,14 +48,14 @@ public class LwM2mRequestSenderImpl implements LwM2mRequestSender, Stoppable {
 
     @SuppressWarnings("deprecation")
     @Override
-    public <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request, Long timeout)
+    public <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request, Long timeout)
             throws InterruptedException {
         return defaultRequestSender.send(destination, request, timeout);
     }
 
     @SuppressWarnings("deprecation")
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, DownlinkRequest<T> request,
+    public <T extends LwM2mResponse> void send(Registration destination, DownlinkRequest<T> request,
             ResponseCallback<T> responseCallback, ErrorCallback errorCallback) {
         if (destination.usesQueueMode()) {
             queuedRequestSender.send(destination, request, responseCallback, errorCallback);
@@ -65,7 +65,7 @@ public class LwM2mRequestSenderImpl implements LwM2mRequestSender, Stoppable {
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, String requestTicket, DownlinkRequest<T> request) {
+    public <T extends LwM2mResponse> void send(Registration destination, String requestTicket, DownlinkRequest<T> request) {
         if (destination.usesQueueMode()) {
             queuedRequestSender.send(destination, requestTicket, request);
         } else {
@@ -96,10 +96,10 @@ public class LwM2mRequestSenderImpl implements LwM2mRequestSender, Stoppable {
     }
 
     @Override
-    public void cancelPendingRequests(Client client) {
+    public void cancelPendingRequests(Registration registration) {
         // cancel on the both the senders are required for the scenario
         // where the LWM2M client could change binding modes.
-        defaultRequestSender.cancelPendingRequests(client);
-        queuedRequestSender.cancelPendingRequests(client);
+        defaultRequestSender.cancelPendingRequests(registration);
+        queuedRequestSender.cancelPendingRequests(registration);
     }
 }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/RegistrationServiceImpl.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/RegistrationServiceImpl.java
index 74cf0d22..a8378ce3 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/RegistrationServiceImpl.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/impl/RegistrationServiceImpl.java
@@ -22,8 +22,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import org.eclipse.leshan.core.observation.Observation;
 import org.eclipse.leshan.server.Startable;
 import org.eclipse.leshan.server.Stoppable;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.client.RegistrationListener;
 import org.eclipse.leshan.server.client.RegistrationService;
 import org.eclipse.leshan.server.registration.Deregistration;
@@ -60,49 +60,49 @@ public class RegistrationServiceImpl implements RegistrationService, Startable,
     }
 
     @Override
-    public Collection<Client> getAllRegistrations() {
+    public Collection<Registration> getAllRegistrations() {
         return store.getAllRegistration();
     }
 
     @Override
-    public Client getByEndpoint(String endpoint) {
+    public Registration getByEndpoint(String endpoint) {
         return store.getRegistrationByEndpoint(endpoint);
     }
 
-    public boolean registerClient(Client client) {
-        Validate.notNull(client);
+    public boolean registerClient(Registration registration) {
+        Validate.notNull(registration);
 
-        LOG.debug("Registering new client: {}", client);
+        LOG.debug("Registering new client: {}", registration);
 
-        Deregistration previous = store.addRegistration(client);
+        Deregistration previous = store.addRegistration(registration);
         if (previous != null) {
             for (RegistrationListener l : listeners) {
                 l.unregistered(previous.getRegistration());
             }
         }
         for (RegistrationListener l : listeners) {
-            l.registered(client);
+            l.registered(registration);
         }
 
         return true;
     }
 
-    public Client updateClient(ClientUpdate update) {
+    public Registration updateRegistration(RegistrationUpdate update) {
         Validate.notNull(update);
 
         LOG.debug("Updating registration for client: {}", update);
-        Client clientUpdated = store.updateRegistration(update);
-        if (clientUpdated != null) {
+        Registration updatedRegistration = store.updateRegistration(update);
+        if (updatedRegistration != null) {
             // notify listener
             for (RegistrationListener l : listeners) {
-                l.updated(update, clientUpdated);
+                l.updated(update, updatedRegistration);
             }
-            return clientUpdated;
+            return updatedRegistration;
         }
         return null;
     }
 
-    public Client deregisterClient(String registrationId) {
+    public Registration deregisterClient(String registrationId) {
         Validate.notNull(registrationId);
 
         LOG.debug("Deregistering client with registrationId: {}", registrationId);
@@ -120,7 +120,7 @@ public class RegistrationServiceImpl implements RegistrationService, Startable,
     }
 
     @Override
-    public Client getById(String id) {
+    public Registration getById(String id) {
         return store.getRegistration(id);
     }
 
@@ -143,7 +143,7 @@ public class RegistrationServiceImpl implements RegistrationService, Startable,
     }
 
     @Override
-    public void registrationExpired(Client registration, Collection<Observation> observation) {
+    public void registrationExpired(Registration registration, Collection<Observation> observation) {
         for (RegistrationListener l : listeners) {
             l.unregistered(registration);
         }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/LwM2mModelProvider.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/LwM2mModelProvider.java
index f3705f4d..37bb38d2 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/LwM2mModelProvider.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/LwM2mModelProvider.java
@@ -18,7 +18,7 @@ package org.eclipse.leshan.server.model;
 import org.eclipse.leshan.core.model.LwM2mModel;
 import org.eclipse.leshan.core.node.codec.LwM2mNodeDecoder;
 import org.eclipse.leshan.core.node.codec.LwM2mNodeEncoder;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 /**
  * A <code>LwM2mModelProvider</code> implementation is in charge of returning the description of the LWM2M objects for
@@ -34,11 +34,11 @@ import org.eclipse.leshan.server.client.Client;
 public interface LwM2mModelProvider {
 
     /**
-     * Returns the description of the objects supported by the given client.
+     * Returns the description of the objects supported by the given registration.
      * 
-     * @param client the registered client
+     * @param registration the registered client
      * @return the list of object descriptions
      */
-    LwM2mModel getObjectModel(Client client);
+    LwM2mModel getObjectModel(Registration registration);
 
 }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/StaticModelProvider.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/StaticModelProvider.java
index 59f6b341..f2b60ed8 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/StaticModelProvider.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/model/StaticModelProvider.java
@@ -19,7 +19,7 @@ import java.util.Collection;
 
 import org.eclipse.leshan.core.model.LwM2mModel;
 import org.eclipse.leshan.core.model.ObjectModel;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 /**
  * A LwM2mModelProvider which uses only one model for all registered clients.
@@ -36,7 +36,7 @@ public class StaticModelProvider implements LwM2mModelProvider {
     }
 
     @Override
-    public LwM2mModel getObjectModel(Client client) {
+    public LwM2mModel getObjectModel(Registration registration) {
         // same model for all clients
         return model;
     }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/observation/ObservationRegistry.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/observation/ObservationRegistry.java
index 20f60231..e3f600af 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/observation/ObservationRegistry.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/observation/ObservationRegistry.java
@@ -18,7 +18,7 @@ package org.eclipse.leshan.server.observation;
 import java.util.Set;
 
 import org.eclipse.leshan.core.observation.Observation;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 /**
  * A registry for keeping track of observed resources implemented by LWM2M Clients.
@@ -34,27 +34,27 @@ public interface ObservationRegistry {
     void addObservation(Observation observation);
 
     /**
-     * Cancels all active observations of resource(s) implemented by a particular LWM2M Client.
+     * Cancels all active observations of resource(s) implemented by a particular LWM2M registration.
      * 
      * As a consequence the LWM2M Client will stop sending notifications about updated values of resources in scope of
      * the canceled observation.
      * 
-     * @param client the LWM2M Client to cancel observations for
+     * @param registration the LWM2M Client to cancel observations for
      * @return the number of canceled observations
      */
-    int cancelObservations(Client client);
+    int cancelObservations(Registration registration);
 
     /**
-     * Cancels all active observations for the given resource of a given client.
+     * Cancels all active observations for the given resource of a given registration.
      * 
      * As a consequence the LWM2M Client will stop sending notifications about updated values of resources in scope of
      * the canceled observation.
      * 
-     * @param client the LWM2M Client to cancel observation for
+     * @param registration the LWM2M Client to cancel observation for
      * @param resourcepath resource to cancel observation for
      * @return the number of canceled observations
      */
-    int cancelObservations(Client client, String resourcepath);
+    int cancelObservations(Registration registration, String resourcepath);
 
     /**
      * Cancels an observation.
@@ -67,11 +67,11 @@ public interface ObservationRegistry {
     void cancelObservation(Observation observation);
 
     /**
-     * Get all running observation for a given client
+     * Get all running observation for a given registration
      * 
      * @return an unmodifiable set of observation
      */
-    Set<Observation> getObservations(Client client);
+    Set<Observation> getObservations(Registration registration);
 
     void addListener(ObservationRegistryListener listener);
 
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/QueuedRequestSender.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/QueuedRequestSender.java
index 3bd79671..f263319f 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/QueuedRequestSender.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/QueuedRequestSender.java
@@ -34,10 +34,10 @@ import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.core.response.ResponseCallback;
 import org.eclipse.leshan.server.Stoppable;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationListener;
 import org.eclipse.leshan.server.client.RegistrationService;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.observation.ObservationRegistry;
 import org.eclipse.leshan.server.observation.ObservationRegistryListener;
 import org.eclipse.leshan.server.queue.MessageStore;
@@ -100,20 +100,20 @@ public class QueuedRequestSender implements LwM2mRequestSender, Stoppable {
     }
 
     @Override
-    public <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request, Long requestTimeout)
+    public <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request, Long requestTimeout)
             throws InterruptedException {
         throw new UnsupportedOperationException("QueueMode doesn't support sending of messages synchronously");
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, DownlinkRequest<T> request,
+    public <T extends LwM2mResponse> void send(Registration destination, DownlinkRequest<T> request,
             ResponseCallback<T> responseCallback, ErrorCallback errorCallback) {
         throw new UnsupportedOperationException(
                 "QueueMode doesn't support sending of messages with callbacks. Use a request ticket instead and register your response listeners");
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, String requestTicket, DownlinkRequest<T> request) {
+    public <T extends LwM2mResponse> void send(Registration destination, String requestTicket, DownlinkRequest<T> request) {
         LOG.trace("send(requestTicket={})", requestTicket);
         // safe because DownlinkRequest does not use generic itself
         @SuppressWarnings("unchecked")
@@ -173,24 +173,24 @@ public class QueuedRequestSender implements LwM2mRequestSender, Stoppable {
     }
 
     @Override
-    public void cancelPendingRequests(Client client) {
-        Validate.notNull(client);
+    public void cancelPendingRequests(Registration registration) {
+        Validate.notNull(registration);
 
         if (LOG.isDebugEnabled()) {
-            LOG.debug("Cancelling and removing all pending messages for client {}", client.getEndpoint());
+            LOG.debug("Cancelling and removing all pending messages for client {}", registration.getEndpoint());
         }
 
         readWriteLock.writeLock().lock();
         try {
             // Potentially the first message in the queue would have been sent.
             // So try to cancel it now.
-            delegateSender.cancelPendingRequests(client);
+            delegateSender.cancelPendingRequests(registration);
 
             // It is better to notify the listener with a RequestCanceledException
             // for each queued message to keep the behavior consistent with CaliforniumLwM2mRequestSender.
-            List<QueuedRequest> removedMessages = messageStore.removeAll(client.getEndpoint());
+            List<QueuedRequest> removedMessages = messageStore.removeAll(registration.getEndpoint());
             for (QueuedRequest request : removedMessages) {
-                processingExecutor.execute(new ResponseProcessingTask(client, request.getRequestTicket(),
+                processingExecutor.execute(new ResponseProcessingTask(registration, request.getRequestTicket(),
                         responseListeners, new RequestCanceledException("Queued message cancelled")));
             }
         } finally {
@@ -207,44 +207,44 @@ public class QueuedRequestSender implements LwM2mRequestSender, Stoppable {
         return new ResponseListener() {
 
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 // process only if the client has used Queue mode.
-                if (client != null && client.usesQueueMode()) {
+                if (registration != null && registration.usesQueueMode()) {
                     LOG.trace("response received in Queue mode successfully: {}", requestTicket);
-                    processResponse(client, requestTicket, response);
+                    processResponse(registration, requestTicket, response);
                 }
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 // process only if the client has used Queue mode.
-                if (client != null && client.usesQueueMode()) {
+                if (registration != null && registration.usesQueueMode()) {
                     LOG.debug("exception on sending the request: {}", requestTicket, exception);
                     if (exception instanceof TimeoutException) {
-                        timeout(client.getEndpoint());
+                        timeout(registration.getEndpoint());
                     } else {
-                        processException(client, requestTicket, exception);
+                        processException(registration, requestTicket, exception);
                     }
                 }
             }
         };
     }
 
-    private void processResponse(Client client, String requestTicket, LwM2mResponse response) {
+    private void processResponse(Registration registration, String requestTicket, LwM2mResponse response) {
         LOG.debug("Received Response -> {}", requestTicket);
-        messageStore.deleteFirst(client.getEndpoint());
-        processingExecutor.execute(new ResponseProcessingTask(client, requestTicket, responseListeners, response));
-        processingExecutor.execute(newRequestSendingTask(client.getEndpoint()));
+        messageStore.deleteFirst(registration.getEndpoint());
+        processingExecutor.execute(new ResponseProcessingTask(registration, requestTicket, responseListeners, response));
+        processingExecutor.execute(newRequestSendingTask(registration.getEndpoint()));
     }
 
-    private void processException(Client client, String requestTicket, Exception exception) {
+    private void processException(Registration registration, String requestTicket, Exception exception) {
         LOG.debug("Received error response {}", requestTicket);
-        messageStore.deleteFirst(client.getEndpoint());
-        processingExecutor.execute(new ResponseProcessingTask(client, requestTicket, responseListeners, exception));
+        messageStore.deleteFirst(registration.getEndpoint());
+        processingExecutor.execute(new ResponseProcessingTask(registration, requestTicket, responseListeners, exception));
         // If RequestCanceledException is thrown due to cancelPendingMessages call, then there
         // is no use processing next requests which would be removed in the next few moments.
         if (!(exception instanceof RequestCanceledException)) {
-            processingExecutor.execute(newRequestSendingTask(client.getEndpoint()));
+            processingExecutor.execute(newRequestSendingTask(registration.getEndpoint()));
         }
     }
 
@@ -261,21 +261,21 @@ public class QueuedRequestSender implements LwM2mRequestSender, Stoppable {
     private final class QueueModeObservationRegistryListener implements ObservationRegistryListener {
         @Override
         public void newValue(Observation observation, ObserveResponse response) {
-            Client client = registrationService.getById(observation.getRegistrationId());
+            Registration registration = registrationService.getById(observation.getRegistrationId());
             // if client de-registered already, do nothing.
-            if (client == null) {
+            if (registration == null) {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("No registered client found for registrationId: {}. Request is not sent.",
                             observation.getRegistrationId());
                 }
                 return;
             }
-            if (client.usesQueueMode() && clientStatusTracker.setClientReachable(client.getEndpoint())
-                    && clientStatusTracker.startClientReceiving(client.getEndpoint())) {
+            if (registration.usesQueueMode() && clientStatusTracker.setClientReachable(registration.getEndpoint())
+                    && clientStatusTracker.startClientReceiving(registration.getEndpoint())) {
                 if (LOG.isDebugEnabled()) {
-                    LOG.debug("Notify from {}. Sending queued requests.", client.getEndpoint());
+                    LOG.debug("Notify from {}. Sending queued requests.", registration.getEndpoint());
                 }
-                processingExecutor.execute(newRequestSendingTask(client.getEndpoint()));
+                processingExecutor.execute(newRequestSendingTask(registration.getEndpoint()));
             }
         }
 
@@ -292,34 +292,34 @@ public class QueuedRequestSender implements LwM2mRequestSender, Stoppable {
 
     private final class QueueModeRegistrationListener implements RegistrationListener {
         @Override
-        public void registered(Client client) {
+        public void registered(Registration registration) {
             // When client is in QueueMode
-            if (client.usesQueueMode()) {
-                clientStatusTracker.setClientReachable(client.getEndpoint());
+            if (registration.usesQueueMode()) {
+                clientStatusTracker.setClientReachable(registration.getEndpoint());
                 if (LOG.isDebugEnabled()) {
-                    LOG.debug("Client {} registered.", client.getEndpoint());
+                    LOG.debug("Client {} registered.", registration.getEndpoint());
                 }
             }
         }
 
         @Override
-        public void updated(ClientUpdate update, Client clientUpdated) {
+        public void updated(RegistrationUpdate update, Registration updatedRegistration) {
             // When client is in QueueMode and was previously in unreachable
             // state and when RECEIVING state could be set
             // i.e:- there is no other message currently being sent
-            if (clientUpdated.usesQueueMode() && clientStatusTracker.setClientReachable(clientUpdated.getEndpoint())
-                    && clientStatusTracker.startClientReceiving(clientUpdated.getEndpoint())) {
+            if (updatedRegistration.usesQueueMode() && clientStatusTracker.setClientReachable(updatedRegistration.getEndpoint())
+                    && clientStatusTracker.startClientReceiving(updatedRegistration.getEndpoint())) {
                 if (LOG.isDebugEnabled()) {
-                    LOG.debug("Client {} updated. Sending queued request.", clientUpdated.getEndpoint());
+                    LOG.debug("Registration {} updated. Sending queued request.", updatedRegistration.getEndpoint());
                 }
-                processingExecutor.execute(newRequestSendingTask(clientUpdated.getEndpoint()));
+                processingExecutor.execute(newRequestSendingTask(updatedRegistration.getEndpoint()));
             }
         }
 
         @Override
-        public void unregistered(Client client) {
-            if (client.usesQueueMode()) {
-                clientStatusTracker.clearClientState(client.getEndpoint());
+        public void unregistered(Registration registration) {
+            if (registration.usesQueueMode()) {
+                clientStatusTracker.clearClientState(registration.getEndpoint());
             }
         }
     }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/RequestSendingTask.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/RequestSendingTask.java
index 5e648172..4530574a 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/RequestSendingTask.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/queue/impl/RequestSendingTask.java
@@ -18,7 +18,7 @@ package org.eclipse.leshan.server.queue.impl;
 
 import org.eclipse.leshan.core.request.DownlinkRequest;
 import org.eclipse.leshan.core.response.LwM2mResponse;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationService;
 import org.eclipse.leshan.server.queue.MessageStore;
 import org.eclipse.leshan.server.queue.QueuedRequest;
@@ -73,12 +73,12 @@ class RequestSendingTask implements Runnable {
         if (firstRequest != null) {
             DownlinkRequest<LwM2mResponse> downlinkRequest = firstRequest.getDownlinkRequest();
             LOG.debug("Sending request: {}", downlinkRequest);
-            Client client = registrationService.getByEndpoint(firstRequest.getEndpoint());
-            if (client == null) {
+            Registration registration = registrationService.getByEndpoint(firstRequest.getEndpoint());
+            if (registration == null) {
                 // client not registered anymore -> don't send this request
                 LOG.debug("Client {} not registered anymore: {}", endpoint, downlinkRequest);
             } else {
-                requestSender.send(client, firstRequest.getRequestTicket(), downlinkRequest);
+                requestSender.send(registration, firstRequest.getRequestTicket(), downlinkRequest);
             }
         } else {
             LOG.debug("No more requests to send to client {}", endpoint);
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/Deregistration.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/Deregistration.java
index d7e82515..951f9f21 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/Deregistration.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/Deregistration.java
@@ -19,7 +19,7 @@ import java.util.Collection;
 import java.util.Collections;
 
 import org.eclipse.leshan.core.observation.Observation;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 /**
  * A Deregistration contains all informations which are removed after a client was unregistered.
@@ -27,10 +27,10 @@ import org.eclipse.leshan.server.client.Client;
  * @see RegistrationStore
  */
 public class Deregistration {
-    final Client registration;
+    final Registration registration;
     final Collection<Observation> observations;
 
-    public Deregistration(Client registration, Collection<Observation> observations) {
+    public Deregistration(Registration registration, Collection<Observation> observations) {
         this.registration = registration;
         if (observations == null)
             this.observations = Collections.emptyList();
@@ -38,7 +38,7 @@ public class Deregistration {
             this.observations = observations;
     }
 
-    public Client getRegistration() {
+    public Registration getRegistration() {
         return registration;
     }
 
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/ExpirationListener.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/ExpirationListener.java
index c4a9b903..98521ec1 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/ExpirationListener.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/ExpirationListener.java
@@ -18,7 +18,7 @@ package org.eclipse.leshan.server.registration;
 import java.util.Collection;
 
 import org.eclipse.leshan.core.observation.Observation;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 /**
  * A listener to be aware of registration expiration.
@@ -27,5 +27,5 @@ import org.eclipse.leshan.server.client.Client;
  */
 public interface ExpirationListener {
 
-    void registrationExpired(Client registration, Collection<Observation> observation);
+    void registrationExpired(Registration registration, Collection<Observation> observation);
 }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationHandler.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationHandler.java
index 0937ebf3..512b386d 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationHandler.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationHandler.java
@@ -25,9 +25,9 @@ import org.eclipse.leshan.core.request.UpdateRequest;
 import org.eclipse.leshan.core.response.DeregisterResponse;
 import org.eclipse.leshan.core.response.RegisterResponse;
 import org.eclipse.leshan.core.response.UpdateResponse;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationService;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.impl.RegistrationServiceImpl;
 import org.eclipse.leshan.server.security.SecurityCheck;
 import org.eclipse.leshan.server.security.SecurityInfo;
@@ -38,7 +38,7 @@ import org.slf4j.LoggerFactory;
 
 /**
  * Handle the client registration logic. Check if the client is allowed to register, with the wanted security scheme.
- * Create the {@link Client} representing the registered client and add it to the {@link RegistrationService}
+ * Create the {@link Registration} representing the registered client and add it to the {@link RegistrationService}
  */
 public class RegistrationHandler {
 
@@ -63,7 +63,7 @@ public class RegistrationHandler {
             return RegisterResponse.forbidden(null);
         }
 
-        Client.Builder builder = new Client.Builder(RegistrationHandler.createRegistrationId(),
+        Registration.Builder builder = new Registration.Builder(RegistrationHandler.createRegistrationId(),
                 registerRequest.getEndpointName(), sender.getPeerAddress().getAddress(), sender.getPeerAddress()
                         .getPort(), serverEndpoint);
 
@@ -72,11 +72,11 @@ public class RegistrationHandler {
                 .smsNumber(registerRequest.getSmsNumber()).registrationDate(new Date()).lastUpdate(new Date())
                 .additionalRegistrationAttributes(registerRequest.getAdditionalAttributes());
 
-        Client client = builder.build();
+        Registration registration = builder.build();
 
-        if (registrationService.registerClient(client)) {
-            LOG.debug("New registered client: {}", client);
-            return RegisterResponse.success(client.getRegistrationId());
+        if (registrationService.registerClient(registration)) {
+            LOG.debug("New registered client: {}", registration);
+            return RegisterResponse.success(registration.getId());
         } else {
             return RegisterResponse.forbidden(null);
         }
@@ -89,18 +89,18 @@ public class RegistrationHandler {
         }
 
         // We must check if the client is using the right identity.
-        Client client = registrationService.getById(updateRequest.getRegistrationId());
-        if (client == null) {
+        Registration registration = registrationService.getById(updateRequest.getRegistrationId());
+        if (registration == null) {
             return UpdateResponse.notFound();
         }
-        if (!isAuthorized(client.getEndpoint(), sender)) {
+        if (!isAuthorized(registration.getEndpoint(), sender)) {
             return UpdateResponse.badRequest("forbidden");
         }
 
-        client = registrationService.updateClient(new ClientUpdate(updateRequest.getRegistrationId(), sender
+        registration = registrationService.updateRegistration(new RegistrationUpdate(updateRequest.getRegistrationId(), sender
                 .getPeerAddress().getAddress(), sender.getPeerAddress().getPort(), updateRequest.getLifeTimeInSec(),
                 updateRequest.getSmsNumber(), updateRequest.getBindingMode(), updateRequest.getObjectLinks()));
-        if (client == null) {
+        if (registration == null) {
             return UpdateResponse.notFound();
         } else {
             return UpdateResponse.success();
@@ -113,15 +113,15 @@ public class RegistrationHandler {
         }
 
         // We must check if the client is using the right identity.
-        Client client = registrationService.getById(deregisterRequest.getRegistrationID());
-        if (client == null) {
+        Registration registration = registrationService.getById(deregisterRequest.getRegistrationID());
+        if (registration == null) {
             return DeregisterResponse.notFound();
         }
-        if (!isAuthorized(client.getEndpoint(), sender)) {
+        if (!isAuthorized(registration.getEndpoint(), sender)) {
             return DeregisterResponse.badRequest("forbidden");
         }
 
-        Client unregistered = registrationService.deregisterClient(deregisterRequest.getRegistrationID());
+        Registration unregistered = registrationService.deregisterClient(deregisterRequest.getRegistrationID());
         if (unregistered != null) {
             return DeregisterResponse.success();
         } else {
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationStore.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationStore.java
index edc681e1..15c68695 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationStore.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/registration/RegistrationStore.java
@@ -19,8 +19,8 @@ import java.net.InetSocketAddress;
 import java.util.Collection;
 
 import org.eclipse.leshan.core.observation.Observation;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 
 /**
  * A store for registrations and observations. This interface is also responsible to handle registration expiration.
@@ -33,7 +33,7 @@ public interface RegistrationStore {
      * @param registration the new registration.
      * @return the old registration and its observations removed or null.
      */
-    Deregistration addRegistration(Client registration);
+    Deregistration addRegistration(Registration registration);
 
     /**
      * Update an existing registration
@@ -41,7 +41,7 @@ public interface RegistrationStore {
      * @param update data to update
      * @return the registration updated
      */
-    Client updateRegistration(ClientUpdate update);
+    Registration updateRegistration(RegistrationUpdate update);
 
     /**
      * Get the registration by registration Id.
@@ -49,7 +49,7 @@ public interface RegistrationStore {
      * @param registrationId of the registration.
      * @return the registration or null if there is no registration with this id.
      */
-    Client getRegistration(String registrationId);
+    Registration getRegistration(String registrationId);
 
     /**
      * Get the registration by endpoint.
@@ -57,7 +57,7 @@ public interface RegistrationStore {
      * @param endpoint of the registration.
      * @return the registration or null if there is no registration with this endpoint.
      */
-    Client getRegistrationByEndpoint(String endpoint);
+    Registration getRegistrationByEndpoint(String endpoint);
 
     /**
      * Get the registration by socket address.
@@ -65,7 +65,7 @@ public interface RegistrationStore {
      * @param address of the client registered.
      * @return the registration or null if there is no client registered with this socket address.
      */
-    Collection<Client> getRegistrationByAdress(InetSocketAddress address);
+    Collection<Registration> getRegistrationByAdress(InetSocketAddress address);
 
     /**
      * @return all registrations in this store.
@@ -73,7 +73,7 @@ public interface RegistrationStore {
      */
     // TODO Should be replaced by an iterator.
     @Deprecated
-    Collection<Client> getAllRegistration();
+    Collection<Registration> getAllRegistration();
 
     /**
      * Remove the registration with the given registration Id
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/request/LwM2mRequestSender.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/request/LwM2mRequestSender.java
index cf880470..169dc957 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/request/LwM2mRequestSender.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/request/LwM2mRequestSender.java
@@ -21,25 +21,25 @@ import org.eclipse.leshan.core.request.exception.RequestCanceledException;
 import org.eclipse.leshan.core.response.ErrorCallback;
 import org.eclipse.leshan.core.response.LwM2mResponse;
 import org.eclipse.leshan.core.response.ResponseCallback;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.response.ResponseListener;
 
 public interface LwM2mRequestSender {
 
     /**
      * @Deprecated Synchronous send of a message will not be supported in the future. It is replaced by
-     *             {@link #send(Client, String, DownlinkRequest)}
+     *             {@link #send(Registration, String, DownlinkRequest)}
      */
     @Deprecated
-    <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request, Long timeout)
+    <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request, Long timeout)
             throws InterruptedException;
 
     /**
      * @Deprecated Asynchronous send of a message with a callback will not be supported in the future. It is replaced by
-     *             {@link #send(Client, String, DownlinkRequest)}
+     *             {@link #send(Registration, String, DownlinkRequest)}
      */
     @Deprecated
-    <T extends LwM2mResponse> void send(Client destination, DownlinkRequest<T> request,
+    <T extends LwM2mResponse> void send(Registration destination, DownlinkRequest<T> request,
             ResponseCallback<T> responseCallback, ErrorCallback errorCallback);
 
     /**
@@ -51,7 +51,7 @@ public interface LwM2mRequestSender {
      * @param request an instance of downlink request.
      * @param <T> instance of LwM2mResponse
      */
-    <T extends LwM2mResponse> void send(Client destination, String requestTicket, DownlinkRequest<T> request);
+    <T extends LwM2mResponse> void send(Registration destination, String requestTicket, DownlinkRequest<T> request);
 
     /**
      * adds the listener for the given LWM2M client. This method shall be used to re-register a listener for already
@@ -72,8 +72,8 @@ public interface LwM2mRequestSender {
      * cancel all pending messages for a LWM2M client identified by the registration identifier. In case a client
      * de-registers, the consumer can use this method to cancel all messages pending for the given client.
      * 
-     * @param client client registration meta data of a LWM2M client.
+     * @param registration client registration meta data of a LWM2M client.
      * @throws RequestCanceledException when a request is already being sent in CoAP, then the exception is thrown.
      */
-    void cancelPendingRequests(Client client);
+    void cancelPendingRequests(Registration registration);
 }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseListener.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseListener.java
index d627a644..791523b4 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseListener.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseListener.java
@@ -16,7 +16,7 @@
 package org.eclipse.leshan.server.response;
 
 import org.eclipse.leshan.core.response.LwM2mResponse;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 /**
  * The listener is responsible for handling all the success and error responses for a given requestTicket.
@@ -26,18 +26,18 @@ public interface ResponseListener {
     /**
      * this method is invoked when a response is received from LWM2M Client correlated by the request ticket.
      *
-     * @param client the LWM2M client
+     * @param registration the LWM2M registration of the client which sent the response
      * @param requestTicket globally unique identifier used to correlate the response to the orginial request
      * @param response from LWM2M client
      */
-    void onResponse(Client client, String requestTicket, LwM2mResponse response);
+    void onResponse(Registration registration, String requestTicket, LwM2mResponse response);
 
     /**
      * this method is invoked when a an error response is received from LWM2M Client correlated by the request ticket.
      *
-     * @param client the LWM2M client
+     * @param registration the LWM2M registration of the client to which we try to send a request
      * @param requestTicket globally unique identifier used to correlate the response to the orginial request
      * @param exception error from LWM2M client
      */
-    void onError(Client clien, String requestTicket, Exception exception);
+    void onError(Registration registration, String requestTicket, Exception exception);
 }
diff --git a/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseProcessingTask.java b/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseProcessingTask.java
index ca59572e..9d295850 100644
--- a/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseProcessingTask.java
+++ b/leshan-server-core/src/main/java/org/eclipse/leshan/server/response/ResponseProcessingTask.java
@@ -19,7 +19,7 @@ package org.eclipse.leshan.server.response;
 import java.util.Collection;
 
 import org.eclipse.leshan.core.response.LwM2mResponse;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,44 +35,44 @@ public class ResponseProcessingTask implements Runnable {
     private final boolean hasException;
     private final LwM2mResponse response;
     private final Collection<ResponseListener> responseListeners;
-    private final Client client;
+    private final Registration registration;
     private final String requestTicket;
 
     /**
      * Creates a new task for processing response on an ordinary response result.
      *
-     * @param client instance of {@link Client}
+     * @param registration instance of {@link Registration}
      * @param requestTicket unique ticket correlating the response to its request.
      * @param request request being processed
      * @param responseListeners listeners which are notified for response.
      * @param response response to propagate
      */
-    public ResponseProcessingTask(Client client, String requestTicket, Collection<ResponseListener> responseListeners,
+    public ResponseProcessingTask(Registration registration, String requestTicket, Collection<ResponseListener> responseListeners,
             LwM2mResponse response) {
         this.requestTicket = requestTicket;
         this.exception = null;
         this.hasException = false;
         this.responseListeners = responseListeners;
         this.response = response;
-        this.client = client;
+        this.registration = registration;
     }
 
     /**
      * Creates a new task for processing response on exception.
      *
-     * @param client instance of {@link Client}
+     * @param registration instance of {@link Registration}
      * @param requestTicket unique ticket correlating the response to its request.
      * @param responseListeners listeners which are notified about the exception.
      * @param exception exception to propagate
      */
-    public ResponseProcessingTask(Client client, String requestTicket, Collection<ResponseListener> responseListeners,
+    public ResponseProcessingTask(Registration registration, String requestTicket, Collection<ResponseListener> responseListeners,
             Exception exception) {
         this.requestTicket = requestTicket;
         this.exception = exception;
         this.responseListeners = responseListeners;
         this.hasException = true;
         this.response = null;
-        this.client = client;
+        this.registration = registration;
     }
 
     @Override
@@ -92,11 +92,11 @@ public class ResponseProcessingTask implements Runnable {
             if (listener != null) {
                 if (hasException) {
                     LOG.debug("invoke response listener for requestTicket {} with exception", requestTicket, exception);
-                    listener.onError(client, requestTicket, exception);
+                    listener.onError(registration, requestTicket, exception);
                 } else {
                     LOG.trace("invoke response listener for requestTicket {} with response {}", requestTicket,
                             response);
-                    listener.onResponse(client, requestTicket, response);
+                    listener.onResponse(registration, requestTicket, response);
                 }
             }
         }
diff --git a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/ClientServlet.java b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/ClientServlet.java
index 971d2d51..901f80d2 100644
--- a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/ClientServlet.java
+++ b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/ClientServlet.java
@@ -46,8 +46,8 @@ import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.core.response.ReadResponse;
 import org.eclipse.leshan.core.response.WriteResponse;
 import org.eclipse.leshan.server.LwM2mServer;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.demo.servlet.json.ClientSerializer;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.demo.servlet.json.RegistrationSerializer;
 import org.eclipse.leshan.server.demo.servlet.json.LwM2mNodeDeserializer;
 import org.eclipse.leshan.server.demo.servlet.json.LwM2mNodeSerializer;
 import org.eclipse.leshan.server.demo.servlet.json.ResponseSerializer;
@@ -79,7 +79,7 @@ public class ClientServlet extends HttpServlet {
         this.server = server;
 
         GsonBuilder gsonBuilder = new GsonBuilder();
-        gsonBuilder.registerTypeHierarchyAdapter(Client.class, new ClientSerializer(securePort));
+        gsonBuilder.registerTypeHierarchyAdapter(Registration.class, new RegistrationSerializer(securePort));
         gsonBuilder.registerTypeHierarchyAdapter(LwM2mResponse.class, new ResponseSerializer());
         gsonBuilder.registerTypeHierarchyAdapter(LwM2mNode.class, new LwM2mNodeSerializer());
         gsonBuilder.registerTypeHierarchyAdapter(LwM2mNode.class, new LwM2mNodeDeserializer());
@@ -95,9 +95,9 @@ public class ClientServlet extends HttpServlet {
 
         // all registered clients
         if (req.getPathInfo() == null) {
-            Collection<Client> clients = server.getRegistrationService().getAllRegistrations();
+            Collection<Registration> registrations = server.getRegistrationService().getAllRegistrations();
 
-            String json = this.gson.toJson(clients.toArray(new Client[] {}));
+            String json = this.gson.toJson(registrations.toArray(new Registration[] {}));
             resp.setContentType("application/json");
             resp.getOutputStream().write(json.getBytes("UTF-8"));
             resp.setStatus(HttpServletResponse.SC_OK);
@@ -113,10 +113,10 @@ public class ClientServlet extends HttpServlet {
 
         // /endPoint : get client
         if (path.length == 1) {
-            Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-            if (client != null) {
+            Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+            if (registration != null) {
                 resp.setContentType("application/json");
-                resp.getOutputStream().write(this.gson.toJson(client).getBytes("UTF-8"));
+                resp.getOutputStream().write(this.gson.toJson(registration).getBytes("UTF-8"));
                 resp.setStatus(HttpServletResponse.SC_OK);
             } else {
                 resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -128,8 +128,8 @@ public class ClientServlet extends HttpServlet {
         // /clients/endPoint/LWRequest : do LightWeight M2M read request on a given client.
         try {
             String target = StringUtils.removeStart(req.getPathInfo(), "/" + clientEndpoint);
-            Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-            if (client != null) {
+            Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+            if (registration != null) {
                 // get content format
                 String contentFormatParam = req.getParameter(FORMAT_PARAM);
                 ContentFormat contentFormat = contentFormatParam != null
@@ -137,7 +137,7 @@ public class ClientServlet extends HttpServlet {
 
                 // create & process request
                 ReadRequest request = new ReadRequest(contentFormat, target);
-                ReadResponse cResponse = server.send(client, request, TIMEOUT);
+                ReadResponse cResponse = server.send(registration, request, TIMEOUT);
                 processDeviceResponse(req, resp, cResponse);
             } else {
                 resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -174,8 +174,8 @@ public class ClientServlet extends HttpServlet {
 
         try {
             String target = StringUtils.removeStart(req.getPathInfo(), "/" + clientEndpoint);
-            Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-            if (client != null) {
+            Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+            if (registration != null) {
                 // get content format
                 String contentFormatParam = req.getParameter(FORMAT_PARAM);
                 ContentFormat contentFormat = contentFormatParam != null
@@ -184,7 +184,7 @@ public class ClientServlet extends HttpServlet {
                 // create & process request
                 LwM2mNode node = extractLwM2mNode(target, req);
                 WriteRequest request = new WriteRequest(Mode.REPLACE, contentFormat, target, node);
-                WriteResponse cResponse = server.send(client, request, TIMEOUT);
+                WriteResponse cResponse = server.send(registration, request, TIMEOUT);
                 processDeviceResponse(req, resp, cResponse);
             } else {
                 resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -217,8 +217,8 @@ public class ClientServlet extends HttpServlet {
         if (path.length >= 4 && "observe".equals(path[path.length - 1])) {
             try {
                 String target = StringUtils.substringBetween(req.getPathInfo(), clientEndpoint, "/observe");
-                Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-                if (client != null) {
+                Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+                if (registration != null) {
                     // get content format
                     String contentFormatParam = req.getParameter(FORMAT_PARAM);
                     ContentFormat contentFormat = contentFormatParam != null
@@ -226,7 +226,7 @@ public class ClientServlet extends HttpServlet {
 
                     // create & process request
                     ObserveRequest request = new ObserveRequest(contentFormat, target);
-                    ObserveResponse cResponse = server.send(client, request, TIMEOUT);
+                    ObserveResponse cResponse = server.send(registration, request, TIMEOUT);
                     processDeviceResponse(req, resp, cResponse);
                 } else {
                     resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -253,10 +253,10 @@ public class ClientServlet extends HttpServlet {
         // /clients/endPoint/LWRequest : do LightWeight M2M execute request on a given client.
         if (path.length == 4) {
             try {
-                Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-                if (client != null) {
+                Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+                if (registration != null) {
                     ExecuteRequest request = new ExecuteRequest(target, IOUtils.toString(req.getInputStream()));
-                    ExecuteResponse cResponse = server.send(client, request, TIMEOUT);
+                    ExecuteResponse cResponse = server.send(registration, request, TIMEOUT);
                     processDeviceResponse(req, resp, cResponse);
                 } else {
                     resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -281,8 +281,8 @@ public class ClientServlet extends HttpServlet {
         // /clients/endPoint/LWRequest : do LightWeight M2M create request on a given client.
         if (2 <= path.length && path.length <= 3) {
             try {
-                Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-                if (client != null) {
+                Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+                if (registration != null) {
                     // get content format
                     String contentFormatParam = req.getParameter(FORMAT_PARAM);
                     ContentFormat contentFormat = contentFormatParam != null
@@ -292,7 +292,7 @@ public class ClientServlet extends HttpServlet {
                     LwM2mNode node = extractLwM2mNode(target, req);
                     if (node instanceof LwM2mObjectInstance) {
                         CreateRequest request = new CreateRequest(contentFormat, target, (LwM2mObjectInstance) node);
-                        CreateResponse cResponse = server.send(client, request, TIMEOUT);
+                        CreateResponse cResponse = server.send(registration, request, TIMEOUT);
                         processDeviceResponse(req, resp, cResponse);
                     } else {
                         throw new IllegalArgumentException("payload must contain an object instance");
@@ -327,9 +327,9 @@ public class ClientServlet extends HttpServlet {
         if (path.length >= 4 && "observe".equals(path[path.length - 1])) {
             try {
                 String target = StringUtils.substringsBetween(req.getPathInfo(), clientEndpoint, "/observe")[0];
-                Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-                if (client != null) {
-                    server.getObservationRegistry().cancelObservations(client, target);
+                Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+                if (registration != null) {
+                    server.getObservationRegistry().cancelObservations(registration, target);
                     resp.setStatus(HttpServletResponse.SC_OK);
                 } else {
                     resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
@@ -350,10 +350,10 @@ public class ClientServlet extends HttpServlet {
         // /clients/endPoint/LWRequest/ : delete instance
         try {
             String target = StringUtils.removeStart(req.getPathInfo(), "/" + clientEndpoint);
-            Client client = server.getRegistrationService().getByEndpoint(clientEndpoint);
-            if (client != null) {
+            Registration registration = server.getRegistrationService().getByEndpoint(clientEndpoint);
+            if (registration != null) {
                 DeleteRequest request = new DeleteRequest(target);
-                DeleteResponse cResponse = server.send(client, request, TIMEOUT);
+                DeleteResponse cResponse = server.send(registration, request, TIMEOUT);
                 processDeviceResponse(req, resp, cResponse);
             } else {
                 resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
diff --git a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java
index 054f9c6f..06c8ec23 100644
--- a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java
+++ b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java
@@ -27,10 +27,10 @@ import org.eclipse.leshan.core.node.LwM2mNode;
 import org.eclipse.leshan.core.observation.Observation;
 import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.server.californium.impl.LeshanServer;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.client.RegistrationListener;
-import org.eclipse.leshan.server.demo.servlet.json.ClientSerializer;
+import org.eclipse.leshan.server.demo.servlet.json.RegistrationSerializer;
 import org.eclipse.leshan.server.demo.servlet.json.LwM2mNodeSerializer;
 import org.eclipse.leshan.server.demo.servlet.log.CoapMessage;
 import org.eclipse.leshan.server.demo.servlet.log.CoapMessageListener;
@@ -74,21 +74,21 @@ public class EventServlet extends EventSourceServlet {
     private final RegistrationListener registrationListener = new RegistrationListener() {
 
         @Override
-        public void registered(Client client) {
-            String jClient = EventServlet.this.gson.toJson(client);
-            sendEvent(EVENT_REGISTRATION, jClient, client.getEndpoint());
+        public void registered(Registration registration) {
+            String jReg = EventServlet.this.gson.toJson(registration);
+            sendEvent(EVENT_REGISTRATION, jReg, registration.getEndpoint());
         }
 
         @Override
-        public void updated(ClientUpdate update, Client clientUpdated) {
-            String jClient = EventServlet.this.gson.toJson(clientUpdated);
-            sendEvent(EVENT_UPDATED, jClient, clientUpdated.getEndpoint());
+        public void updated(RegistrationUpdate update, Registration updatedRegistration) {
+            String jReg = EventServlet.this.gson.toJson(updatedRegistration);
+            sendEvent(EVENT_UPDATED, jReg, updatedRegistration.getEndpoint());
         };
 
         @Override
-        public void unregistered(Client client) {
-            String jClient = EventServlet.this.gson.toJson(client);
-            sendEvent(EVENT_DEREGISTRATION, jClient, client.getEndpoint());
+        public void unregistered(Registration registration) {
+            String jReg = EventServlet.this.gson.toJson(registration);
+            sendEvent(EVENT_DEREGISTRATION, jReg, registration.getEndpoint());
         }
     };
 
@@ -104,15 +104,15 @@ public class EventServlet extends EventSourceServlet {
                 LOG.debug("Received notification from [{}] containing value [{}]", observation.getPath(),
                         response.getContent().toString());
             }
-            Client client = server.getRegistrationService().getById(observation.getRegistrationId());
+            Registration registration = server.getRegistrationService().getById(observation.getRegistrationId());
 
-            if (client != null) {
-                String data = new StringBuffer("{\"ep\":\"").append(client.getEndpoint()).append("\",\"res\":\"")
+            if (registration != null) {
+                String data = new StringBuffer("{\"ep\":\"").append(registration.getEndpoint()).append("\",\"res\":\"")
                         .append(observation.getPath().toString()).append("\",\"val\":")
                         .append(gson.toJson(response.getContent()))
                         .append("}").toString();
 
-                sendEvent(EVENT_NOTIFICATION, data, client.getEndpoint());
+                sendEvent(EVENT_NOTIFICATION, data, registration.getEndpoint());
             }
         }
 
@@ -133,7 +133,7 @@ public class EventServlet extends EventSourceServlet {
         }
 
         GsonBuilder gsonBuilder = new GsonBuilder();
-        gsonBuilder.registerTypeHierarchyAdapter(Client.class, new ClientSerializer(securePort));
+        gsonBuilder.registerTypeHierarchyAdapter(Registration.class, new RegistrationSerializer(securePort));
         gsonBuilder.registerTypeHierarchyAdapter(LwM2mNode.class, new LwM2mNodeSerializer());
         gsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
         this.gson = gsonBuilder.create();
diff --git a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/ClientSerializer.java b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/RegistrationSerializer.java
similarity index 85%
rename from leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/ClientSerializer.java
rename to leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/RegistrationSerializer.java
index 3ea887bd..a1f709c8 100644
--- a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/ClientSerializer.java
+++ b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/RegistrationSerializer.java
@@ -17,27 +17,27 @@ package org.eclipse.leshan.server.demo.servlet.json;
 
 import java.lang.reflect.Type;
 
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
 
-public class ClientSerializer implements JsonSerializer<Client> {
+public class RegistrationSerializer implements JsonSerializer<Registration> {
 
     private final int securePort;
 
-    public ClientSerializer(int securePort) {
+    public RegistrationSerializer(int securePort) {
         this.securePort = securePort;
     }
 
     @Override
-    public JsonElement serialize(Client src, Type typeOfSrc, JsonSerializationContext context) {
+    public JsonElement serialize(Registration src, Type typeOfSrc, JsonSerializationContext context) {
         JsonObject element = new JsonObject();
 
         element.addProperty("endpoint", src.getEndpoint());
-        element.addProperty("registrationId", src.getRegistrationId());
+        element.addProperty("registrationId", src.getId());
         element.add("registrationDate", context.serialize(src.getRegistrationDate()));
         element.add("lastUpdate", context.serialize(src.getLastUpdate()));
         element.addProperty("address", src.getAddress().getHostAddress() + ":" + src.getPort());
diff --git a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/log/CoapMessageTracer.java b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/log/CoapMessageTracer.java
index adcb681c..776494e9 100644
--- a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/log/CoapMessageTracer.java
+++ b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/log/CoapMessageTracer.java
@@ -23,7 +23,7 @@ import org.eclipse.californium.core.coap.EmptyMessage;
 import org.eclipse.californium.core.coap.Request;
 import org.eclipse.californium.core.coap.Response;
 import org.eclipse.californium.core.network.interceptors.MessageInterceptor;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationService;
 
 public class CoapMessageTracer implements MessageInterceptor {
@@ -33,16 +33,16 @@ public class CoapMessageTracer implements MessageInterceptor {
     private final RegistrationService registry;
 
     public void addListener(String endpoint, CoapMessageListener listener) {
-        Client client = registry.getByEndpoint(endpoint);
-        if (client != null) {
-            listeners.put(toStringAddress(client.getAddress(), client.getPort()), listener);
+        Registration registration = registry.getByEndpoint(endpoint);
+        if (registration != null) {
+            listeners.put(toStringAddress(registration.getAddress(), registration.getPort()), listener);
         }
     }
 
     public void removeListener(String endpoint) {
-        Client client = registry.getByEndpoint(endpoint);
-        if (client != null) {
-            listeners.remove(toStringAddress(client.getAddress(), client.getPort()));
+        Registration registration = registry.getByEndpoint(endpoint);
+        if (registration != null) {
+            listeners.remove(toStringAddress(registration.getAddress(), registration.getPort()));
         }
     }
 


Test patch:
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/IntegrationTestHelper.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/IntegrationTestHelper.java
index b32f1b84..ba92c388 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/IntegrationTestHelper.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/IntegrationTestHelper.java
@@ -43,9 +43,9 @@ import org.eclipse.leshan.core.request.BindingMode;
 import org.eclipse.leshan.core.response.ExecuteResponse;
 import org.eclipse.leshan.server.californium.LeshanServerBuilder;
 import org.eclipse.leshan.server.californium.impl.LeshanServer;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationListener;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.impl.RegistrationServiceImpl;
 import org.eclipse.leshan.server.impl.SecurityRegistryImpl;
 import org.eclipse.leshan.server.model.StaticModelProvider;
@@ -76,7 +76,7 @@ public class IntegrationTestHelper {
     String currentEndpointIdentifier;
 
     CountDownLatch registerLatch;
-    Client last_registration;
+    Registration last_registration;
     CountDownLatch deregisterLatch;
     CountDownLatch updateLatch;
 
@@ -164,23 +164,23 @@ public class IntegrationTestHelper {
         resetLatch();
         server.getRegistrationService().addListener(new RegistrationListener() {
             @Override
-            public void updated(ClientUpdate update, Client clientUpdated) {
-                if (clientUpdated.getEndpoint().equals(currentEndpointIdentifier)) {
+            public void updated(RegistrationUpdate update, Registration updatedRegistration) {
+                if (updatedRegistration.getEndpoint().equals(currentEndpointIdentifier)) {
                     updateLatch.countDown();
                 }
             }
 
             @Override
-            public void unregistered(Client client) {
-                if (client.getEndpoint().equals(currentEndpointIdentifier)) {
+            public void unregistered(Registration registration) {
+                if (registration.getEndpoint().equals(currentEndpointIdentifier)) {
                     deregisterLatch.countDown();
                 }
             }
 
             @Override
-            public void registered(Client client) {
-                if (client.getEndpoint().equals(currentEndpointIdentifier)) {
-                    last_registration = client;
+            public void registered(Registration registration) {
+                if (registration.getEndpoint().equals(currentEndpointIdentifier)) {
+                    last_registration = registration;
                     registerLatch.countDown();
                 }
             }
@@ -217,14 +217,14 @@ public class IntegrationTestHelper {
         }
     }
 
-    public Client getCurrentRegistration() {
+    public Registration getCurrentRegistration() {
         return server.getRegistrationService().getByEndpoint(currentEndpointIdentifier);
     }
 
     public void deregisterClient() {
-        Client c = getCurrentRegistration();
-        if (c != null)
-            ((RegistrationServiceImpl) server.getRegistrationService()).deregisterClient(c.getRegistrationId());
+        Registration r = getCurrentRegistration();
+        if (r != null)
+            ((RegistrationServiceImpl) server.getRegistrationService()).deregisterClient(r.getId());
     }
 
     public void dispose() {
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/ObserveTest.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/ObserveTest.java
index 9a3f6ed3..9e559344 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/ObserveTest.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/ObserveTest.java
@@ -90,7 +90,7 @@ public class ObserveTest {
         // an observation response should have been sent
         Observation observation = observeResponse.getObservation();
         assertEquals("/3/0/15", observation.getPath().toString());
-        assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+        assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
 
         // write device timezone
         LwM2mResponse writeResponse = helper.server.send(helper.getCurrentRegistration(),
@@ -119,7 +119,7 @@ public class ObserveTest {
         // an observation response should have been sent
         Observation observation = observeResponse.getObservation();
         assertEquals("/3/0", observation.getPath().toString());
-        assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+        assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
 
         // write device timezone
         LwM2mResponse writeResponse = helper.server.send(helper.getCurrentRegistration(),
@@ -153,7 +153,7 @@ public class ObserveTest {
         // an observation response should have been sent
         Observation observation = observeResponse.getObservation();
         assertEquals("/3", observation.getPath().toString());
-        assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+        assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
 
         // write device timezone
         LwM2mResponse writeResponse = helper.server.send(helper.getCurrentRegistration(),
@@ -188,7 +188,7 @@ public class ObserveTest {
         // an observation response should have been sent
         Observation observation = observeResponse.getObservation();
         assertEquals("/3/0/15", observation.getPath().toString());
-        assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+        assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
 
         // *** HACK send time-stamped notification as Leshan client does not support it *** //
         // create time-stamped nodes
@@ -228,7 +228,7 @@ public class ObserveTest {
         // an observation response should have been sent
         Observation observation = observeResponse.getObservation();
         assertEquals("/3/0", observation.getPath().toString());
-        assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+        assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
 
         // *** HACK send time-stamped notification as Leshan client does not support it *** //
         // create time-stamped nodes
@@ -268,7 +268,7 @@ public class ObserveTest {
         // an observation response should have been sent
         Observation observation = observeResponse.getObservation();
         assertEquals("/3", observation.getPath().toString());
-        assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+        assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
 
         // *** HACK send time-stamped notification as Leshan client does not support it *** //
         // create time-stamped nodes
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeIntegrationTestHelper.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeIntegrationTestHelper.java
index 3fc912f9..8c2d727b 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeIntegrationTestHelper.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeIntegrationTestHelper.java
@@ -45,7 +45,7 @@ import org.eclipse.leshan.server.californium.impl.CaliforniumLwM2mRequestSender;
 import org.eclipse.leshan.server.californium.impl.CaliforniumObservationRegistryImpl;
 import org.eclipse.leshan.server.californium.impl.InMemoryRegistrationStore;
 import org.eclipse.leshan.server.californium.impl.RegisterResource;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.impl.LwM2mRequestSenderImpl;
 import org.eclipse.leshan.server.impl.RegistrationServiceImpl;
 import org.eclipse.leshan.server.impl.SecurityRegistryImpl;
@@ -172,7 +172,7 @@ public class QueueModeIntegrationTestHelper extends IntegrationTestHelper {
     }
 
     @Override
-    public Client getCurrentRegistration() {
+    public Registration getCurrentRegistration() {
         return server.getRegistrationService().getByEndpoint(getCurrentEndpoint());
     }
 }
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeTest.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeTest.java
index 0c9a0573..21f18e39 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeTest.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/QueueModeTest.java
@@ -38,7 +38,7 @@ import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.core.response.WriteResponse;
 import org.eclipse.leshan.integration.tests.util.QueuedModeLeshanClient;
 import org.eclipse.leshan.integration.tests.util.QueuedModeLeshanClient.OnGetCallback;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.observation.ObservationRegistryListener;
 import org.eclipse.leshan.server.queue.MessageStore;
 import org.eclipse.leshan.server.queue.impl.InMemoryMessageStore;
@@ -230,16 +230,16 @@ public class QueueModeTest {
 
         responseListener = new ResponseListener() {
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 if (response instanceof ObserveResponse) {
                     Observation observation = ((ObserveResponse) response).getObservation();
                     assertEquals("/3/0/15", observation.getPath().toString());
-                    assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+                    assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
                 }
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 throw new IllegalStateException("unexpected exception occurred: ", exception);
             }
         };
@@ -287,17 +287,17 @@ public class QueueModeTest {
 
         responseListener = new ResponseListener() {
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 if (response instanceof ObserveResponse) {
                     LOG.trace("Received observe response for ticket {} from LWM2M client {}", requestTicket, response);
                     Observation observation = ((ObserveResponse) response).getObservation();
                     assertEquals("/3/0/15", observation.getPath().toString());
-                    assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+                    assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
                 }
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 throw new IllegalStateException("unexpected exception occurred: ", exception);
             }
         };
@@ -322,7 +322,7 @@ public class QueueModeTest {
         createAndAddResponseListener(acceptCountDownLatch);
         responseListener = new ResponseListener() {
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 if (response instanceof WriteResponse) {
                     LOG.trace("Received write response for ticket {} from LWM2M client {}", requestTicket, response);
                     acceptCountDownLatch.countDown();
@@ -331,7 +331,7 @@ public class QueueModeTest {
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 throw new IllegalStateException("unexpected exception occurred: ", exception);
             }
         };
@@ -364,18 +364,18 @@ public class QueueModeTest {
         final CountDownLatch serverResponseReceivedCountDownLatch = new CountDownLatch(2);
         responseListener = new ResponseListener() {
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 if (response instanceof ObserveResponse) {
                     serverResponseReceivedCountDownLatch.countDown();
                     LOG.trace("Received observe response for ticket {} from LWM2M client {}", requestTicket, response);
                     Observation observation = ((ObserveResponse) response).getObservation();
                     assertEquals("/3/0/15", observation.getPath().toString());
-                    assertEquals(helper.getCurrentRegistration().getRegistrationId(), observation.getRegistrationId());
+                    assertEquals(helper.getCurrentRegistration().getId(), observation.getRegistrationId());
                 }
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 throw new IllegalStateException("unexpected exception occurred: ", exception);
             }
         };
@@ -496,12 +496,12 @@ public class QueueModeTest {
         helper.server.getLwM2mRequestSender().addResponseListener(new ResponseListener() {
 
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 responseCountDownLatch.countDown();
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 assertTrue("Expected a RequestCanceledException but received " + exception,
                         exception instanceof RequestCanceledException);
                 exceptionCountDownLatch.countDown();
@@ -536,12 +536,12 @@ public class QueueModeTest {
         helper.server.getLwM2mRequestSender().addResponseListener(new ResponseListener() {
 
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 unexpectedResponseCountDownLatch.countDown();
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 assertTrue("Expected a RequestCanceledException but received " + exception,
                         exception instanceof RequestCanceledException);
                 exceptionCountDownLatch.countDown();
@@ -563,7 +563,7 @@ public class QueueModeTest {
 
     @Test
     public void sending_message_for_unknown_client_gives_error_response() throws InterruptedException {
-        Client destination = helper.getCurrentRegistration();
+        Registration destination = helper.getCurrentRegistration();
         // stop the lwm2m client created by default
         helper.client.stop(DEREGISTER);
 
@@ -574,12 +574,12 @@ public class QueueModeTest {
         helper.server.getLwM2mRequestSender().addResponseListener(new ResponseListener() {
 
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 responseCountDownLatch.countDown();
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 assertTrue("Expected a RequestCanceledException but received " + exception,
                         exception instanceof RequestCanceledException);
                 exceptionCountDownLatch.countDown();
@@ -600,12 +600,12 @@ public class QueueModeTest {
         responseListener = new ResponseListener() {
 
             @Override
-            public void onResponse(Client client, String requestTicket, LwM2mResponse response) {
+            public void onResponse(Registration registration, String requestTicket, LwM2mResponse response) {
                 acceptCountDownLatch.countDown();
             }
 
             @Override
-            public void onError(Client client, String requestTicket, Exception exception) {
+            public void onError(Registration registration, String requestTicket, Exception exception) {
                 throw new IllegalStateException("unexpected exception occurred: ", exception);
             }
         };
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisIntegrationTestHelper.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisIntegrationTestHelper.java
index 17bba58e..173b52b9 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisIntegrationTestHelper.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisIntegrationTestHelper.java
@@ -20,8 +20,8 @@ import java.net.InetSocketAddress;
 
 import org.eclipse.leshan.core.node.codec.DefaultLwM2mNodeDecoder;
 import org.eclipse.leshan.server.californium.LeshanServerBuilder;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.client.RegistrationListener;
 import org.eclipse.leshan.server.cluster.RedisRegistrationStore;
 import org.eclipse.leshan.server.impl.SecurityRegistryImpl;
@@ -69,23 +69,23 @@ public class RedisIntegrationTestHelper extends IntegrationTestHelper {
         resetLatch();
         server.getRegistrationService().addListener(new RegistrationListener() {
             @Override
-            public void updated(ClientUpdate update, Client clientUpdated) {
-                if (clientUpdated.getEndpoint().equals(getCurrentEndpoint())) {
+            public void updated(RegistrationUpdate update, Registration updatedRegistration) {
+                if (updatedRegistration.getEndpoint().equals(getCurrentEndpoint())) {
                     updateLatch.countDown();
                 }
             }
 
             @Override
-            public void unregistered(Client client) {
-                if (client.getEndpoint().equals(getCurrentEndpoint())) {
+            public void unregistered(Registration registration) {
+                if (registration.getEndpoint().equals(getCurrentEndpoint())) {
                     deregisterLatch.countDown();
                 }
             }
 
             @Override
-            public void registered(Client client) {
-                if (client.getEndpoint().equals(getCurrentEndpoint())) {
-                    last_registration = client;
+            public void registered(Registration registration) {
+                if (registration.getEndpoint().equals(getCurrentEndpoint())) {
+                    last_registration = registration;
                     registerLatch.countDown();
                 }
             }
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisSecureIntegrationTestHelper.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisSecureIntegrationTestHelper.java
index 4d035c6d..5ff6adf4 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisSecureIntegrationTestHelper.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RedisSecureIntegrationTestHelper.java
@@ -21,8 +21,8 @@ import java.security.cert.Certificate;
 
 import org.eclipse.leshan.core.node.codec.DefaultLwM2mNodeDecoder;
 import org.eclipse.leshan.server.californium.LeshanServerBuilder;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.client.RegistrationListener;
 import org.eclipse.leshan.server.cluster.RedisRegistrationStore;
 import org.eclipse.leshan.server.cluster.RedisSecurityRegistry;
@@ -57,23 +57,23 @@ public class RedisSecureIntegrationTestHelper extends SecureIntegrationTestHelpe
         resetLatch();
         server.getRegistrationService().addListener(new RegistrationListener() {
             @Override
-            public void updated(ClientUpdate update, Client clientUpdated) {
-                if (clientUpdated.getEndpoint().equals(getCurrentEndpoint())) {
+            public void updated(RegistrationUpdate update, Registration updatedRegistration) {
+                if (updatedRegistration.getEndpoint().equals(getCurrentEndpoint())) {
                     updateLatch.countDown();
                 }
             }
 
             @Override
-            public void unregistered(Client client) {
-                if (client.getEndpoint().equals(getCurrentEndpoint())) {
+            public void unregistered(Registration registration) {
+                if (registration.getEndpoint().equals(getCurrentEndpoint())) {
                     deregisterLatch.countDown();
                 }
             }
 
             @Override
-            public void registered(Client client) {
-                if (client.getEndpoint().equals(getCurrentEndpoint())) {
-                    last_registration = client;
+            public void registered(Registration registration) {
+                if (registration.getEndpoint().equals(getCurrentEndpoint())) {
+                    last_registration = registration;
                     registerLatch.countDown();
                 }
             }
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RegistrationTest.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RegistrationTest.java
index 97c2fa4f..e66dde90 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RegistrationTest.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/RegistrationTest.java
@@ -47,7 +47,7 @@ import org.eclipse.leshan.core.request.RegisterRequest;
 import org.eclipse.leshan.core.response.ObserveResponse;
 import org.eclipse.leshan.core.response.ReadResponse;
 import org.eclipse.leshan.core.response.RegisterResponse;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.security.NonUniqueSecurityInfoException;
 import org.junit.After;
 import org.junit.Before;
@@ -212,12 +212,12 @@ public class RegistrationTest {
         assertThat(observeResponse.getCoapResponse(), is(instanceOf(Response.class)));
 
         // check observation registry is not null
-        Client currentRegistration = helper.getCurrentRegistration();
+        Registration currentRegistration = helper.getCurrentRegistration();
         Set<Observation> observations = helper.server.getObservationRegistry()
                 .getObservations(currentRegistration);
         assertEquals(1, observations.size());
         Observation obs = observations.iterator().next();
-        assertEquals(currentRegistration.getRegistrationId(), obs.getRegistrationId());
+        assertEquals(currentRegistration.getId(), obs.getRegistrationId());
         assertEquals(new LwM2mPath(3, 0), obs.getPath());
 
         // Check de-registration
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/SecurityTest.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/SecurityTest.java
index a9c29fbf..b30400db 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/SecurityTest.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/SecurityTest.java
@@ -24,7 +24,7 @@ import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.cert.Certificate;
 
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.security.NonUniqueSecurityInfoException;
 import org.eclipse.leshan.server.security.SecurityInfo;
 import org.junit.After;
@@ -130,7 +130,7 @@ public class SecurityTest {
         helper.assertClientNotRegisterered();
         helper.client.start();
         helper.waitForRegistration(1);
-        Client registration = helper.getCurrentRegistration();
+        Registration registration = helper.getCurrentRegistration();
         helper.assertClientRegisterered();
 
         // Check for update
@@ -147,8 +147,8 @@ public class SecurityTest {
         helper.client.start();
         helper.waitForRegistration(1);
         helper.assertClientRegisterered();
-        Client newRegistration = helper.getCurrentRegistration();
-        assertNotEquals(registration.getRegistrationId(), newRegistration.getRegistrationId());
+        Registration newRegistration = helper.getCurrentRegistration();
+        assertNotEquals(registration.getId(), newRegistration.getId());
 
     }
 
diff --git a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/util/QueueModeLeshanServer.java b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/util/QueueModeLeshanServer.java
index 9c4aa50b..29dad2fe 100644
--- a/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/util/QueueModeLeshanServer.java
+++ b/leshan-integration-tests/src/test/java/org/eclipse/leshan/integration/tests/util/QueueModeLeshanServer.java
@@ -25,10 +25,10 @@ import org.eclipse.leshan.server.Destroyable;
 import org.eclipse.leshan.server.LwM2mServer;
 import org.eclipse.leshan.server.Startable;
 import org.eclipse.leshan.server.Stoppable;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.client.RegistrationService;
 import org.eclipse.leshan.server.client.RegistrationListener;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.model.LwM2mModelProvider;
 import org.eclipse.leshan.server.observation.ObservationRegistry;
 import org.eclipse.leshan.server.queue.MessageStore;
@@ -65,17 +65,17 @@ public class QueueModeLeshanServer implements LwM2mServer {
         this.registrationService.addListener(new RegistrationListener() {
 
             @Override
-            public void updated(ClientUpdate update, Client clientUpdated) {
+            public void updated(RegistrationUpdate update, Registration updatedRegistration) {
             }
 
             @Override
-            public void unregistered(Client client) {
-                QueueModeLeshanServer.this.observationRegistry.cancelObservations(client);
-                QueueModeLeshanServer.this.lwM2mRequestSender.cancelPendingRequests(client);
+            public void unregistered(Registration registration) {
+                QueueModeLeshanServer.this.observationRegistry.cancelObservations(registration);
+                QueueModeLeshanServer.this.lwM2mRequestSender.cancelPendingRequests(registration);
             }
 
             @Override
-            public void registered(Client client) {
+            public void registered(Registration registration) {
             }
         });
 
@@ -142,25 +142,25 @@ public class QueueModeLeshanServer implements LwM2mServer {
     }
 
     @Override
-    public <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request)
+    public <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request)
             throws InterruptedException {
         throw new UnsupportedOperationException("Server doesn't support synchronous sending of messages");
     }
 
     @Override
-    public <T extends LwM2mResponse> T send(Client destination, DownlinkRequest<T> request, long timeout)
+    public <T extends LwM2mResponse> T send(Registration destination, DownlinkRequest<T> request, long timeout)
             throws InterruptedException {
         throw new UnsupportedOperationException("Server doesn't support synchronous sending of messages");
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, DownlinkRequest<T> request,
+    public <T extends LwM2mResponse> void send(Registration destination, DownlinkRequest<T> request,
             final ResponseCallback<T> responseCallback, ErrorCallback errorCallback) {
         // Noop.
     }
 
     @Override
-    public <T extends LwM2mResponse> void send(Client destination, String requestTicket, DownlinkRequest<T> request) {
+    public <T extends LwM2mResponse> void send(Registration destination, String requestTicket, DownlinkRequest<T> request) {
         lwM2mRequestSender.send(destination, requestTicket, request);
     }
 
diff --git a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationTest.java b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationTest.java
index 08b1cf57..439c1859 100644
--- a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationTest.java
+++ b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumObservationTest.java
@@ -28,7 +28,7 @@ import org.eclipse.leshan.core.node.codec.DefaultLwM2mNodeDecoder;
 import org.eclipse.leshan.core.observation.Observation;
 import org.eclipse.leshan.server.californium.CaliforniumObservationRegistry;
 import org.eclipse.leshan.server.californium.CaliforniumRegistrationStore;
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 import org.eclipse.leshan.server.model.StandardModelProvider;
 import org.junit.Assert;
 import org.junit.Before;
@@ -54,76 +54,76 @@ public class CaliforniumObservationTest {
 
     @Test
     public void observe_twice_cancels_first() {
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 12));
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 12));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 12));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 12));
 
         // check the presence of only one observation.
-        Set<Observation> observations = registry.getObservations(support.client);
+        Set<Observation> observations = registry.getObservations(support.registration);
         Assert.assertEquals(1, observations.size());
     }
 
     @Test
     public void cancel_by_client() {
         // create some observations and add it to registry
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 13));
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 12));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 13));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 12));
 
         givenAnObservation("anotherClient", new LwM2mPath(3, 0, 12));
 
         // check its presence
-        Set<Observation> observations = registry.getObservations(support.client);
+        Set<Observation> observations = registry.getObservations(support.registration);
         Assert.assertEquals(2, observations.size());
 
         // cancel it
-        int nbCancelled = registry.cancelObservations(support.client);
+        int nbCancelled = registry.cancelObservations(support.registration);
         Assert.assertEquals(2, nbCancelled);
 
         // check its absence
-        observations = registry.getObservations(support.client);
+        observations = registry.getObservations(support.registration);
         Assert.assertTrue(observations.isEmpty());
     }
 
     @Test
     public void cancel_by_path() {
         // create some observations and add it to registry
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 13));
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 12));
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 12));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 13));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 12));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 12));
 
         givenAnObservation("anotherClient", new LwM2mPath(3, 0, 12));
 
         // check its presence
-        Set<Observation> observations = registry.getObservations(support.client);
+        Set<Observation> observations = registry.getObservations(support.registration);
         Assert.assertEquals(2, observations.size());
 
         // cancel it
-        int nbCancelled = registry.cancelObservations(support.client, "/3/0/12");
+        int nbCancelled = registry.cancelObservations(support.registration, "/3/0/12");
         Assert.assertEquals(1, nbCancelled);
 
         // check its absence
-        observations = registry.getObservations(support.client);
+        observations = registry.getObservations(support.registration);
         Assert.assertEquals(1, observations.size());
     }
 
     @Test
     public void cancel_by_observation() throws UnknownHostException {
         // create some observations and add it to registry
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 13));
-        givenAnObservation(support.client.getRegistrationId(), new LwM2mPath(3, 0, 12));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 13));
+        givenAnObservation(support.registration.getId(), new LwM2mPath(3, 0, 12));
         givenAnObservation("anotherClient", new LwM2mPath(3, 0, 12));
 
-        Observation observationToCancel = givenAnObservation(support.client.getRegistrationId(),
+        Observation observationToCancel = givenAnObservation(support.registration.getId(),
                 new LwM2mPath(3, 0, 12));
 
         // check its presence
-        Set<Observation> observations = registry.getObservations(support.client);
+        Set<Observation> observations = registry.getObservations(support.registration);
         Assert.assertEquals(2, observations.size());
 
         // cancel it
         registry.cancelObservation(observationToCancel);
 
         // check its absence
-        observations = registry.getObservations(support.client);
+        observations = registry.getObservations(support.registration);
         Assert.assertEquals(1, observations.size());
     }
 
@@ -136,8 +136,8 @@ public class CaliforniumObservationTest {
         coapRequest.getOptions().addUriPath(String.valueOf(target.getObjectId()));
         coapRequest.getOptions().addUriPath(String.valueOf(target.getObjectInstanceId()));
         coapRequest.getOptions().addUriPath(String.valueOf(target.getResourceId()));
-        coapRequest.setDestination(support.client.getAddress());
-        coapRequest.setDestinationPort(support.client.getPort());
+        coapRequest.setDestination(support.registration.getAddress());
+        coapRequest.setDestinationPort(support.registration.getPort());
         Map<String, String> context = new HashMap<>();
         context.put(CoapRequestBuilder.CTX_REGID, registrationId);
         context.put(CoapRequestBuilder.CTX_LWM2M_PATH, target.toString());
@@ -151,11 +151,11 @@ public class CaliforniumObservationTest {
         return observation;
     }
 
-    public Client givenASimpleClient(String registrationId) {
+    public Registration givenASimpleClient(String registrationId) {
         InetSocketAddress registrationAddress = InetSocketAddress.createUnresolved("localhost", 5683);
-        Client.Builder builder;
+        Registration.Builder builder;
         try {
-            builder = new Client.Builder(registrationId, registrationId + "_ep", InetAddress.getLocalHost(), 10000,
+            builder = new Registration.Builder(registrationId, registrationId + "_ep", InetAddress.getLocalHost(), 10000,
                     registrationAddress);
             return builder.build();
         } catch (UnknownHostException e) {
diff --git a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumTestSupport.java b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumTestSupport.java
index b25bccd2..225fdf06 100644
--- a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumTestSupport.java
+++ b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CaliforniumTestSupport.java
@@ -21,11 +21,11 @@ import java.net.UnknownHostException;
 import java.util.Random;
 import java.util.concurrent.ThreadLocalRandom;
 
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 public class CaliforniumTestSupport {
 
-    public Client client;
+    public Registration registration;
     public InetAddress destination;
     public int destinationPort = 5000;
     public InetSocketAddress registrationAddress;
@@ -33,10 +33,10 @@ public class CaliforniumTestSupport {
     public void givenASimpleClient() throws UnknownHostException {
         registrationAddress = InetSocketAddress.createUnresolved("localhost", 5683);
 
-        Client.Builder builder = new Client.Builder("ID", "urn:client", InetAddress.getLocalHost(), 10000,
+        Registration.Builder builder = new Registration.Builder("ID", "urn:client", InetAddress.getLocalHost(), 10000,
                 registrationAddress);
 
-        client = builder.build();
+        registration = builder.build();
     }
 
     public static byte[] createToken() {
diff --git a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CoapRequestBuilderTest.java b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CoapRequestBuilderTest.java
index 4ae67392..16428d99 100644
--- a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CoapRequestBuilderTest.java
+++ b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/CoapRequestBuilderTest.java
@@ -45,8 +45,8 @@ import org.eclipse.leshan.core.request.ReadRequest;
 import org.eclipse.leshan.core.request.WriteAttributesRequest;
 import org.eclipse.leshan.core.request.WriteRequest;
 import org.eclipse.leshan.core.request.WriteRequest.Mode;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.Client.Builder;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.Registration.Builder;
 import org.eclipse.leshan.tlv.Tlv;
 import org.eclipse.leshan.tlv.Tlv.TlvType;
 import org.eclipse.leshan.tlv.TlvDecoder;
@@ -67,12 +67,12 @@ public class CoapRequestBuilderTest {
         encoder = new DefaultLwM2mNodeEncoder();
     }
 
-    private Client newClient() throws UnknownHostException {
-        return newClient(null);
+    private Registration newRegistration() throws UnknownHostException {
+        return newRegistration(null);
     }
 
-    private Client newClient(String rootpath) throws UnknownHostException {
-        Builder b = new Client.Builder("regid", "endpoint", Inet4Address.getByName("127.0.0.1"), 12354,
+    private Registration newRegistration(String rootpath) throws UnknownHostException {
+        Builder b = new Registration.Builder("regid", "endpoint", Inet4Address.getByName("127.0.0.1"), 12354,
                 new InetSocketAddress(0));
         if (rootpath != null) {
             Map<String, String> attr = new HashMap<>();
@@ -84,12 +84,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_read_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         ReadRequest request = new ReadRequest(3, 0);
         builder.visit(request);
 
@@ -103,12 +103,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_read_request_with_non_default_object_path() throws Exception {
-        Client client = newClient("/lwm2m");
+        Registration reg = newRegistration("/lwm2m");
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         ReadRequest request = new ReadRequest(3, 0, 1);
         builder.visit(request);
 
@@ -119,12 +119,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_read_request_with_root_path() throws Exception {
-        Client client = newClient("/");
+        Registration reg = newRegistration("/");
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         ReadRequest request = new ReadRequest(3);
         builder.visit(request);
 
@@ -135,12 +135,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_discover_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         DiscoverRequest request = new DiscoverRequest(3, 0);
         builder.visit(request);
 
@@ -155,12 +155,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_write_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         WriteRequest request = new WriteRequest(Mode.UPDATE, 3, 0, LwM2mSingleResource.newStringResource(4, "value"));
         builder.visit(request);
 
@@ -180,12 +180,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_write_request_replace() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         WriteRequest request = new WriteRequest(3, 0, 14, "value");
         builder.visit(request);
 
@@ -196,12 +196,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_write_attribute_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         WriteAttributesRequest request = new WriteAttributesRequest(3, 0, 14,
                 new ObserveSpec.Builder().minPeriod(10).maxPeriod(100).build());
         builder.visit(request);
@@ -216,12 +216,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_execute_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         ExecuteRequest request = new ExecuteRequest(3, 0, 12, "params");
         builder.visit(request);
 
@@ -236,12 +236,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_create_request__without_instance_id() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         CreateRequest request = new CreateRequest(12, LwM2mSingleResource.newStringResource(0, "value"));
         builder.visit(request);
 
@@ -260,12 +260,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_create_request__with_instance_id() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         CreateRequest request = new CreateRequest(12,
                 new LwM2mObjectInstance(26, LwM2mSingleResource.newStringResource(0, "value")));
         builder.visit(request);
@@ -286,12 +286,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_delete_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         DeleteRequest request = new DeleteRequest(12, 0);
         builder.visit(request);
 
@@ -305,12 +305,12 @@ public class CoapRequestBuilderTest {
 
     @Test
     public void build_observe_request() throws Exception {
-        Client client = newClient();
+        Registration reg = newRegistration();
 
         // test
         CoapRequestBuilder builder = new CoapRequestBuilder(
-                new InetSocketAddress(client.getAddress(), client.getPort()), client.getRootPath(),
-                client.getRegistrationId(), client.getEndpoint(), model, encoder);
+                new InetSocketAddress(reg.getAddress(), reg.getPort()), reg.getRootPath(),
+                reg.getId(), reg.getEndpoint(), model, encoder);
         ObserveRequest request = new ObserveRequest(12, 0);
         builder.visit(request);
 
diff --git a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/RegistrationServiceImplTest.java b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/RegistrationServiceImplTest.java
index 5a9c2029..1dfcee1b 100644
--- a/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/RegistrationServiceImplTest.java
+++ b/leshan-server-cf/src/test/java/org/eclipse/leshan/server/californium/impl/RegistrationServiceImplTest.java
@@ -20,8 +20,8 @@ import java.net.InetSocketAddress;
 
 import org.eclipse.leshan.LinkObject;
 import org.eclipse.leshan.core.request.BindingMode;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.eclipse.leshan.server.impl.RegistrationServiceImpl;
 import org.junit.Assert;
 import org.junit.Before;
@@ -38,7 +38,7 @@ public class RegistrationServiceImplTest {
     BindingMode binding = BindingMode.UQS;
     LinkObject[] objectLinks = LinkObject.parse("</3>".getBytes(org.eclipse.leshan.util.Charsets.UTF_8));
     String registrationId = "4711";
-    Client client;
+    Registration registration;
 
     @Before
     public void setUp() throws Exception {
@@ -48,47 +48,47 @@ public class RegistrationServiceImplTest {
 
     @Test
     public void update_registration_keeps_properties_unchanged() {
-        givenASimpleClient(lifetime);
-        registry.registerClient(client);
+        givenASimpleRegistration(lifetime);
+        registry.registerClient(registration);
 
-        ClientUpdate update = new ClientUpdate(registrationId, address, port, null, null, null, null);
-        Client updatedClient = registry.updateClient(update);
-        Assert.assertEquals(lifetime, updatedClient.getLifeTimeInSec());
-        Assert.assertSame(binding, updatedClient.getBindingMode());
-        Assert.assertEquals(sms, updatedClient.getSmsNumber());
+        RegistrationUpdate update = new RegistrationUpdate(registrationId, address, port, null, null, null, null);
+        Registration updatedRegistration = registry.updateRegistration(update);
+        Assert.assertEquals(lifetime, updatedRegistration.getLifeTimeInSec());
+        Assert.assertSame(binding, updatedRegistration.getBindingMode());
+        Assert.assertEquals(sms, updatedRegistration.getSmsNumber());
 
-        Client registeredClient = registry.getByEndpoint(ep);
-        Assert.assertEquals(lifetime, registeredClient.getLifeTimeInSec());
-        Assert.assertSame(binding, registeredClient.getBindingMode());
-        Assert.assertEquals(sms, registeredClient.getSmsNumber());
+        Registration reg = registry.getByEndpoint(ep);
+        Assert.assertEquals(lifetime, reg.getLifeTimeInSec());
+        Assert.assertSame(binding, reg.getBindingMode());
+        Assert.assertEquals(sms, reg.getSmsNumber());
     }
 
     @Test
     public void client_registration_sets_time_to_live() {
-        givenASimpleClient(lifetime);
-        registry.registerClient(client);
-        Assert.assertTrue(client.isAlive());
+        givenASimpleRegistration(lifetime);
+        registry.registerClient(registration);
+        Assert.assertTrue(registration.isAlive());
     }
 
     @Test
     public void update_registration_to_extend_time_to_live() {
-        givenASimpleClient(0L);
-        registry.registerClient(client);
-        Assert.assertFalse(client.isAlive());
+        givenASimpleRegistration(0L);
+        registry.registerClient(registration);
+        Assert.assertFalse(registration.isAlive());
 
-        ClientUpdate update = new ClientUpdate(registrationId, address, port, lifetime, null, null, null);
-        Client updatedClient = registry.updateClient(update);
-        Assert.assertTrue(updatedClient.isAlive());
+        RegistrationUpdate update = new RegistrationUpdate(registrationId, address, port, lifetime, null, null, null);
+        Registration updatedRegistration = registry.updateRegistration(update);
+        Assert.assertTrue(updatedRegistration.isAlive());
 
-        Client registeredClient = registry.getByEndpoint(ep);
-        Assert.assertTrue(registeredClient.isAlive());
+        Registration reg = registry.getByEndpoint(ep);
+        Assert.assertTrue(reg.isAlive());
     }
 
-    private void givenASimpleClient(Long lifetime) {
+    private void givenASimpleRegistration(Long lifetime) {
 
-        Client.Builder builder = new Client.Builder(registrationId, ep, address, port,
+        Registration.Builder builder = new Registration.Builder(registrationId, ep, address, port,
                 InetSocketAddress.createUnresolved("localhost", 5683));
 
-        client = builder.lifeTimeInSec(lifetime).smsNumber(sms).bindingMode(binding).objectLinks(objectLinks).build();
+        registration = builder.lifeTimeInSec(lifetime).smsNumber(sms).bindingMode(binding).objectLinks(objectLinks).build();
     }
 }
diff --git a/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDesTest.java b/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDesTest.java
index 0c130860..7c710994 100644
--- a/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDesTest.java
+++ b/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientSerDesTest.java
@@ -24,8 +24,8 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.leshan.LinkObject;
-import org.eclipse.leshan.server.client.Client;
-import org.eclipse.leshan.server.cluster.serialization.ClientSerDes;
+import org.eclipse.leshan.server.client.Registration;
+import org.eclipse.leshan.server.cluster.serialization.RegistrationSerDes;
 import org.junit.Test;
 
 public class ClientSerDesTest {
@@ -39,16 +39,16 @@ public class ClientSerDesTest {
         objs[0] = new LinkObject("/0/1024/2", att);
         objs[1] = new LinkObject("/0/2");
 
-        Client.Builder builder = new Client.Builder("registrationId", "endpoint", Inet4Address.getByName("127.0.0.1"),
+        Registration.Builder builder = new Registration.Builder("registrationId", "endpoint", Inet4Address.getByName("127.0.0.1"),
                 1, new InetSocketAddress(212)).objectLinks(objs);
 
         builder.registrationDate(new Date(100L));
         builder.lastUpdate(new Date(101L));
-        Client c = builder.build();
+        Registration r = builder.build();
 
-        byte[] ser = ClientSerDes.bSerialize(c);
-        Client c2 = ClientSerDes.deserialize(ser);
+        byte[] ser = RegistrationSerDes.bSerialize(r);
+        Registration r2 = RegistrationSerDes.deserialize(ser);
 
-        assertEquals(c, c2);
+        assertEquals(r, r2);
     }
 }
diff --git a/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDesTest.java b/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDesTest.java
index 3543f86e..735bb3b0 100644
--- a/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDesTest.java
+++ b/leshan-server-cluster/src/test/java/org/eclipse/leshan/server/cluster/serialization/ClientUpdateSerDesTest.java
@@ -23,7 +23,7 @@ import java.util.Map;
 
 import org.eclipse.leshan.LinkObject;
 import org.eclipse.leshan.core.request.BindingMode;
-import org.eclipse.leshan.server.client.ClientUpdate;
+import org.eclipse.leshan.server.client.RegistrationUpdate;
 import org.junit.Test;
 
 public class ClientUpdateSerDesTest {
@@ -37,12 +37,12 @@ public class ClientUpdateSerDesTest {
         objs[0] = new LinkObject("/0/1024/2", att);
         objs[1] = new LinkObject("/0/2");
 
-        ClientUpdate cu = new ClientUpdate("myId", Inet4Address.getByName("127.0.0.1"), 5683, 60000l, null,
+        RegistrationUpdate ru = new RegistrationUpdate("myId", Inet4Address.getByName("127.0.0.1"), 5683, 60000l, null,
                 BindingMode.U, objs);
 
-        byte[] ser = ClientUpdateSerDes.bSerialize(cu);
-        ClientUpdate cu2 = ClientUpdateSerDes.deserialize(ser);
+        byte[] ser = RegistrationUpdateSerDes.bSerialize(ru);
+        RegistrationUpdate ru2 = RegistrationUpdateSerDes.deserialize(ser);
 
-        assertEquals(cu, cu2);
+        assertEquals(ru, ru2);
     }
 }
diff --git a/leshan-server-core/src/test/java/org/eclipse/leshan/server/client/ClientSortObjectTest.java b/leshan-server-core/src/test/java/org/eclipse/leshan/server/client/ClientSortObjectTest.java
index 782e8e6a..55c19a5d 100644
--- a/leshan-server-core/src/test/java/org/eclipse/leshan/server/client/ClientSortObjectTest.java
+++ b/leshan-server-core/src/test/java/org/eclipse/leshan/server/client/ClientSortObjectTest.java
@@ -33,12 +33,12 @@ public class ClientSortObjectTest {
         objs[1] = new LinkObject("/0/2");
         objs[2] = null;
 
-        Client.Builder builder = new Client.Builder("registrationId", "endpoint", Inet4Address.getByName("127.0.0.1"),
+        Registration.Builder builder = new Registration.Builder("registrationId", "endpoint", Inet4Address.getByName("127.0.0.1"),
                 1, new InetSocketAddress(212)).objectLinks(objs);
 
-        Client c = builder.build();
+        Registration r = builder.build();
 
-        LinkObject[] res = c.getSortedObjectLinks();
+        LinkObject[] res = r.getSortedObjectLinks();
         Assert.assertEquals(3, res.length);
         Assert.assertNull(res[0]);
         Assert.assertEquals("/0/2", res[1].getUrl());
diff --git a/leshan-server-core/src/test/java/org/eclipse/leshan/server/impl/BasicTestSupport.java b/leshan-server-core/src/test/java/org/eclipse/leshan/server/impl/BasicTestSupport.java
index 6d2daa6c..88bfdd0e 100644
--- a/leshan-server-core/src/test/java/org/eclipse/leshan/server/impl/BasicTestSupport.java
+++ b/leshan-server-core/src/test/java/org/eclipse/leshan/server/impl/BasicTestSupport.java
@@ -19,11 +19,11 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 
-import org.eclipse.leshan.server.client.Client;
+import org.eclipse.leshan.server.client.Registration;
 
 public class BasicTestSupport {
 
-    public Client client;
+    public Registration registration;
     public InetAddress destination;
     public int destinationPort = 5000;
     public InetSocketAddress registrationAddress;
@@ -31,9 +31,9 @@ public class BasicTestSupport {
     public void givenASimpleClient() throws UnknownHostException {
         registrationAddress = InetSocketAddress.createUnresolved("localhost", 5683);
 
-        Client.Builder builder = new Client.Builder("ID", "urn:client", InetAddress.getLocalHost(), 10000,
+        Registration.Builder builder = new Registration.Builder("ID", "urn:client", InetAddress.getLocalHost(), 10000,
                 registrationAddress);
 
-        client = builder.build();
+        registration = builder.build();
     }
 }