diff --git a/global/config-samples/ecord-global-config.json b/global/config-samples/ecord-global-config.json
index 156c23a..9dba092 100644
--- a/global/config-samples/ecord-global-config.json
+++ b/global/config-samples/ecord-global-config.json
@@ -4,8 +4,7 @@
       "xos" : {
         "username" : "xosadmin@opencord.org",
         "password" : "0Ui8QNJNCdXrjjLpF1U6",
-        "address" : "127.0.0.1",
-        "resource" : "/xosapi/v1/vnaas/usernetworkinterfaces/"
+        "endpoint" : "10.90.1.10:80/xosapi/v1/vnaas/usernetworkinterfaces"
       }
     },
     "org.opencord.ce.global.channel.http" : {
diff --git a/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/VirtualDomainDeviceProvider.java b/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/VirtualDomainDeviceProvider.java
index 36daf56..e67e804 100644
--- a/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/VirtualDomainDeviceProvider.java
+++ b/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/VirtualDomainDeviceProvider.java
@@ -24,6 +24,8 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.config.basics.SubjectFactories;
+import org.onosproject.store.service.AtomicCounter;
+import org.onosproject.store.service.StorageService;
 import org.opencord.ce.api.services.virtualprovider.DomainVirtualDevice;
 import org.opencord.ce.api.services.virtualprovider.EcordDeviceProviderService;
 import org.onlab.packet.ChassisId;
@@ -88,7 +90,7 @@
     private static final String UNKNOWN = "unknown";
     private static final String NO_LLDP = "no-lldp";
     private static final String DOMAIN_ID = "domainId";
-
+    private static final String LATLNG_COUNTER = "ecord-latlng-counter";
 
     private ApplicationId appId;
 
@@ -111,12 +113,16 @@
     protected ClusterService clusterService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected MetroOrchestrationService metroOrchestrationService;
 
     protected DeviceProviderService deviceProviderService;
 
     private EcordDriverConfig ecordDriverConfig;
     private XoSHttpClient xoSHttpClient;
+    private AtomicCounter latlngCounter;
 
     private final NetworkConfigListener configListener = new InternalConfigListener();
 
@@ -148,9 +154,16 @@
     public void activate() {
         appId = coreService.registerApplication(PROVIDER_NAME);
        // configRegistry.registerConfigFactory(diverConfigFactory);
+        latlngCounter = storageService.atomicCounterBuilder()
+                .withName(LATLNG_COUNTER)
+                .build()
+                .asAtomicCounter();
         configRegistry.registerConfigFactory(xosEndpointConfigFactory);
         configService.addListener(configListener);
         deviceProviderService = deviceProviderRegistry.register(this);
+        if (!configService.getSubjects(XosEndPointConfig.class).isEmpty()) {
+            readXoSEndPointConfig();
+        }
         log.info("Started");
     }
 
@@ -264,6 +277,7 @@
         log.info("Notifying ecord virtual ports...");
         deviceProviderService.updatePorts(deviceId, portDescriptions);
        // addGlobalMefLtp(deviceId, portDescriptions);
+        log.info("Notifying XOS of virtual ports...");
         notifyXoS(deviceId, portDescriptions);
     }
 
@@ -279,12 +293,25 @@
                 ConnectPoint cp = new ConnectPoint(deviceId, port.portNumber());
                 switch (type) {
                     case UNI:
+                        log.debug("Port descriptions {}", portDescriptions);
+                        //If XoSClient null create new one
+                        if (xoSHttpClient == null) {
+                            readXoSEndPointConfig();
+                        }
                         ObjectNode body = xoSHttpClient.mapper().createObjectNode();
                         body.put("tenant", port.annotations().value(DOMAIN_ID));
                         body.put("name", "UNI:" + cp.toString());
-                        body.put("latlng", "[" + port.annotations().value(LATITUDE) + ", " +
-                                port.annotations().value(LONGITUDE) + "]");
+                        String latitude = port.annotations().value(LATITUDE);
+                        String longitude = port.annotations().value(LONGITUDE);
+                        if (latitude == null || longitude == null) {
+                            //Something went wrong in the local, lets reset them both
+                            longitude = String.valueOf(latlngCounter.get());
+                            latitude = String.valueOf(latlngCounter.getAndAdd(10L));
+                        }
+                        body.put("latlng", "[" + latitude + ", " +
+                                longitude + "]");
                         body.put("cpe_id", cp.toString());
+                        log.debug("Node {}", body.toString());
                         xoSHttpClient.restPost(body.toString());
                         break;
                     case ENNI:
@@ -348,8 +375,12 @@
     }
 
     private void readXoSEndPointConfig() {
-        xoSHttpClient =
-                new XoSHttpClient(configRegistry.getConfig(appId, XosEndPointConfig.class).xos());
+        XosEndPointConfig xosEndPointConfig = configRegistry.getConfig(appId, XosEndPointConfig.class);
+        if (xosEndPointConfig != null) {
+            xoSHttpClient = new XoSHttpClient(xosEndPointConfig.xos());
+        } else {
+            log.warn("Null configuration for XOS, can't push UNIs");
+        }
     }
 
     private void readDriverFromConfig() {
@@ -360,13 +391,9 @@
     private class InternalConfigListener implements NetworkConfigListener {
         @Override
         public void event(NetworkConfigEvent event) {
-            if (!event.configClass().equals(EcordDriverConfig.class) ||
-                    !event.configClass().equals(XosEndPointConfig.class)) {
-                return;
-            }
             switch (event.type()) {
                 case CONFIG_ADDED:
-                    log.info("Network configuration added");
+                    log.debug("Network configuration added");
                     if (event.configClass().equals(EcordDriverConfig.class)) {
                         eventExecutor.execute(VirtualDomainDeviceProvider.this::readDriverFromConfig);
                     } else {
@@ -375,7 +402,7 @@
 
                     break;
                 case CONFIG_UPDATED:
-                    log.info("Network configuration updated");
+                    log.debug("Network configuration updated");
                     if (event.configClass().equals(EcordDriverConfig.class)) {
                         eventExecutor.execute(VirtualDomainDeviceProvider.this::readDriverFromConfig);
                     } else {
@@ -386,5 +413,11 @@
                     break;
             }
         }
+
+        @Override
+        public boolean isRelevant(NetworkConfigEvent event) {
+            return event.configClass().equals(EcordDriverConfig.class)
+                    || event.configClass().equals(XosEndPointConfig.class);
+        }
     }
 }
diff --git a/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/XoSHttpClient.java b/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/XoSHttpClient.java
index fdd8570..59c544f 100644
--- a/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/XoSHttpClient.java
+++ b/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/XoSHttpClient.java
@@ -44,7 +44,10 @@
     private XosEndPoint xosEndPoint;
     private final Client client = ClientBuilder.newClient();
 
-
+    /**
+     * Creates a Client to contact XOS from this ONOS instance.
+     * @param xosEndPoint class containing info of the endpoint of XOS
+     */
     public XoSHttpClient(XosEndPoint xosEndPoint) {
         this.xosEndPoint = xosEndPoint;
         // Setup credentials
@@ -59,17 +62,21 @@
         mapper().enable(SerializationFeature.INDENT_OUTPUT);
     }
 
+    /**
+     * Enables to make a post request to XOS.
+     * @param body the body to post to XOS
+     */
     public void restPost(String body) {
-        WebTarget webTarget = client.target("http://" + xosEndPoint.ipAddress().toString() +
-                 xosEndPoint.resource() + "/");
+        log.info("URL {}", "http://" + xosEndPoint.endpoint());
+        WebTarget webTarget = client.target("http://" + xosEndPoint.endpoint());
         Response response;
         response = webTarget.request(MediaType.APPLICATION_JSON)
                 .post(Entity.entity(body, MediaType.APPLICATION_JSON));
         try {
             if (response.getStatus() != HTTP_OK) {
-                log.warn("Failed to put resource {}", xosEndPoint.resource());
+                log.warn("Failed to post resource {}, response {}", xosEndPoint.endpoint(), response);
             } else {
-                log.info("Post to XoS successful: {}", response.getStatus());
+                log.info("Post UNIs to XoS successful: {}", response.getStatus());
             }
         } catch (javax.ws.rs.ProcessingException e) {
             log.error("Javax process exception in XoSClientHttp: {}", e.getMessage());
diff --git a/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/config/XosEndPointConfig.java b/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/config/XosEndPointConfig.java
index df0c59e..c64aaa9 100644
--- a/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/config/XosEndPointConfig.java
+++ b/global/virtualprovider/src/main/java/org/opencord/ce/global/virtualdomain/config/XosEndPointConfig.java
@@ -16,46 +16,43 @@
 
 package org.opencord.ce.global.virtualdomain.config;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import org.onlab.packet.IpAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.config.Config;
 
 /**
- * Global XoS endpoint.
+ * Global XoS endpoint containing all information from XOS.
  */
 public class XosEndPointConfig extends Config<ApplicationId> {
+
     private static final String USERNAME = "username";
     private static final String PASSWD = "password";
-    private static final String XOS = "xos";
-    private static final String ADDRESS = "address";
-    private static final String RESOURCE = "resource";
+    private static final String ENDPOINT = "endpoint";
 
+    /**
+     * Gets the enpoint from the Configuration.
+     * @return a class containing all the info to connect
+     */
     public XosEndPoint xos() {
-        JsonNode xosNode = object.path(XOS);
-        IpAddress ipAddress = IpAddress.valueOf(xosNode.get(ADDRESS).asText());
-        String username = xosNode.get(USERNAME).asText();
-        String password = xosNode.get(PASSWD).asText();
-        String resource = xosNode.get(RESOURCE).asText();
-        return new XosEndPoint(ipAddress, username, password, resource);
+        String endpoint = node.get(ENDPOINT).asText();
+        String username = node.get(USERNAME).asText();
+        String password = node.get(PASSWD).asText();
+        return new XosEndPoint(endpoint, username, password);
     }
 
     public static class XosEndPoint {
-        private IpAddress ipAddress;
+        private String endpoint;
         private String username;
         private String password;
-        private String resource;
 
-        public XosEndPoint(IpAddress ipAddress, String username,
-                           String password, String resource) {
-            this.ipAddress = ipAddress;
+        public XosEndPoint(String endpoint, String username,
+                           String password) {
+            this.endpoint = endpoint;
             this.username = username;
             this.password = password;
-            this.resource = resource;
         }
 
-        public IpAddress ipAddress() {
-            return ipAddress;
+        public String endpoint() {
+            return endpoint;
         }
 
         public String username() {
@@ -66,9 +63,6 @@
             return password;
         }
 
-        public String resource() {
-            return resource;
-        }
     }
 
 }
