diff --git a/js/src/types/address.model.ts b/js/src/types/address.model.ts
index bfac5696e..e75d18f2f 100644
--- a/js/src/types/address.model.ts
+++ b/js/src/types/address.model.ts
@@ -65,80 +65,93 @@ export class Address implements IAddress {
   }
 
   get poiInfos(): IPoiInfo {
-    /* generate name corresponding to poi type */
-    let name = "";
-    let alternativeName = "";
-    let poiIcon: IPOIIcon = poiIcons.default;
-    // Google Maps doesn't have a type
-    if (this.type == null && this.description === this.street) {
-      this.type = "house";
-    }
-    switch (this.type) {
-      case "house":
-        name = this.description;
-        alternativeName = [this.postalCode, this.locality, this.country]
-          .filter((zone) => zone)
-          .join(", ");
-        poiIcon = poiIcons.defaultAddress;
-        break;
-      case "street":
-      case "secondary":
-        name = this.description;
-        alternativeName = [this.postalCode, this.locality, this.country]
-          .filter((zone) => zone)
-          .join(", ");
-        poiIcon = poiIcons.defaultStreet;
-        break;
-      case "zone":
-      case "city":
-      case "administrative":
-        name = this.postalCode
-          ? `${this.description} (${this.postalCode})`
-          : this.description;
-        alternativeName = [this.region, this.country]
-          .filter((zone) => zone)
-          .join(", ");
-        poiIcon = poiIcons.defaultAdministrative;
-        break;
-      default:
-        // POI
-        name = this.description;
-        alternativeName = "";
-        if (this.street && this.street.trim()) {
-          alternativeName = `${this.street}`;
-          if (this.locality) {
-            alternativeName += ` (${this.locality})`;
-          }
-        } else if (this.locality && this.locality.trim()) {
-          alternativeName = `${this.locality}, ${this.region}, ${this.country}`;
-        } else if (this.region && this.region.trim()) {
-          alternativeName = `${this.region}, ${this.country}`;
-        } else if (this.country && this.country.trim()) {
-          alternativeName = this.country;
-        }
-        poiIcon = this.iconForPOI;
-        break;
-    }
-    return { name, alternativeName, poiIcon };
+    return addressToPoiInfos(this);
   }
 
   get fullName(): string {
-    const { name, alternativeName } = this.poiInfos;
-    if (name && alternativeName) {
-      return `${name}, ${alternativeName}`;
-    }
-    if (name) {
-      return name;
-    }
-    return "";
+    return addressFullName(this);
   }
 
   get iconForPOI(): IPOIIcon {
-    if (this.type == null) {
-      return poiIcons.default;
-    }
-    const type = this.type.split(":").pop() || "";
-    if (poiIcons[type]) return poiIcons[type];
-    return poiIcons.default;
+    return iconForAddress(this);
   }
 }
+
+export function addressToPoiInfos(address: IAddress): IPoiInfo {
+  /* generate name corresponding to poi type */
+  let name = "";
+  let alternativeName = "";
+  let poiIcon: IPOIIcon = poiIcons.default;
+  let addressType = address.type;
+  // Google Maps doesn't have a type
+  if (address.type == null && address.description === address.street) {
+    addressType = "house";
+  }
+  switch (addressType) {
+    case "house":
+      name = address.description;
+      alternativeName = [address.postalCode, address.locality, address.country]
+        .filter((zone) => zone)
+        .join(", ");
+      poiIcon = poiIcons.defaultAddress;
+      break;
+    case "street":
+    case "secondary":
+      name = address.description;
+      alternativeName = [address.postalCode, address.locality, address.country]
+        .filter((zone) => zone)
+        .join(", ");
+      poiIcon = poiIcons.defaultStreet;
+      break;
+    case "zone":
+    case "city":
+    case "administrative":
+      name = address.postalCode
+        ? `${address.description} (${address.postalCode})`
+        : address.description;
+      alternativeName = [address.region, address.country]
+        .filter((zone) => zone)
+        .join(", ");
+      poiIcon = poiIcons.defaultAdministrative;
+      break;
+    default:
+      // POI
+      name = address.description;
+      alternativeName = "";
+      if (address.street && address.street.trim()) {
+        alternativeName = `${address.street}`;
+        if (address.locality) {
+          alternativeName += ` (${address.locality})`;
+        }
+      } else if (address.locality && address.locality.trim()) {
+        alternativeName = `${address.locality}, ${address.region}, ${address.country}`;
+      } else if (address.region && address.region.trim()) {
+        alternativeName = `${address.region}, ${address.country}`;
+      } else if (address.country && address.country.trim()) {
+        alternativeName = address.country;
+      }
+      poiIcon = iconForAddress(address);
+      break;
+  }
+  return { name, alternativeName, poiIcon };
+}
+
+export function iconForAddress(address: IAddress): IPOIIcon {
+  if (address.type == null) {
+    return poiIcons.default;
+  }
+  const type = address.type.split(":").pop() || "";
+  if (poiIcons[type]) return poiIcons[type];
+  return poiIcons.default;
+}
+
+export function addressFullName(address: IAddress): string {
+  const { name, alternativeName } = addressToPoiInfos(address);
+  if (name && alternativeName) {
+    return `${name}, ${alternativeName}`;
+  }
+  if (name) {
+    return name;
+  }
+  return "";
+}