diff --git a/src/core/js/ext_map.js b/src/core/js/ext_map.js
index f0283cddc4940dc5ac56594a0a1b2fda7f9ea047..96ce6a2c83b1a7eda7d7a76fae1d6dd88e24ce80 100644
--- a/src/core/js/ext_map.js
+++ b/src/core/js/ext_map.js
@@ -601,9 +601,17 @@ var caosdb_map = new function () {
      * @returns {HTMLElement} a popup element.
      */
     this._make_map_popup = function (entity, datamodel, lat, lng) {
+        const id = getEntityID(entity);
         const role_label = $(entity).find(
-            ".label.caosdb-f-entity-role").first().clone();
+            ".badge.caosdb-f-entity-role").first().clone();
         const parent_list = caosdb_map.make_parent_labels(entity);
+
+        const entity_on_page = $(`#${id}`).length > 0;
+        const href = entity_on_page ? `#${id}` : connection.getBasePath() + `Entity/${id}`
+        const link_title = entity_on_page ? "Jump to this entity." : "Browse to this entity.";
+        const link = $(`<a class="float-end" title="${link_title}" href="${href}"/>`)
+            .append(`<i class="bi bi-box-arrow-up-right"></i></a>`);
+
         const name = caosdb_map.make_entity_name_label(entity);
         const dms_lat = L.NumberFormatter.toDMS(lat);
         const dms_lng = L.NumberFormatter.toDMS(lng);
@@ -617,6 +625,7 @@ var caosdb_map = new function () {
         const ret = $('<div/>')
             .append(role_label)
             .append(parent_list)
+            .append(link)
             .append(name)
             .append(loc);
         return ret[0];
@@ -1498,23 +1507,22 @@ var caosdb_map = new function () {
          */
         this.make_entity_name_label = function (entity) {
             const name = getEntityName(entity);
-            const id = getEntityID(entity);
-
-            const entity_on_page = $(`#${id}`).length > 0;
-            const href = entity_on_page ? `#${id}` : connection.getBasePath() + `Entity/${id}`
-            const link_title = entity_on_page ? "Jump to this entity." : "Browse to this entity.";
-            const link = $(`<a title="${link_title}" href="${href}"/>`)
-                .addClass("pull-right")
-                .append(`<i class="bi bi-box-arrow-up-right"></i></a>`);
 
-            const name_label = $('<div/>')
+            const name_label = $('<div class=""/>')
                 // TODO move to global css
                 .css({
                     "margin-top": "4px",
                     "margin-bottom": "4px"
                 })
                 .text(name)
-                .append(link);
+
+            const id = getEntityID(entity);
+            resolve_references.resolve_reference(id).then(reference_info => {
+                name_label.append(reference_info.text);
+                if(reference_info.callback) {
+                    name_label.append(reference_info.callback(reference_info.data));
+                }
+            });
             return name_label[0];
         }
 
diff --git a/src/core/js/ext_references.js b/src/core/js/ext_references.js
index cabf5741c2aab2ac7a9ca2d0d4c363f8a3530341..e2c4ece42cfdf9902761ddfa34cb83a4b88deed2 100644
--- a/src/core/js/ext_references.js
+++ b/src/core/js/ext_references.js
@@ -299,6 +299,8 @@ var resolve_references = new function () {
      *     understood and used by the `callback` function.
      */
 
+    this._cache = {};
+
     /**
      * Return a reference_info for an entity.
      *
@@ -318,40 +320,49 @@ var resolve_references = new function () {
      * the entity which is to be resolved.  @return {reference_info}
      */
     this.resolve_reference = async function (id) {
-  const custom_reference_resolver = window["${BUILD_EXT_REFERENCES_CUSTOM_RESOLVER}"];
-  if (custom_reference_resolver && typeof custom_reference_resolver.resolve === "function") {
-      // try custom_reference_resolver and fall-back to standard implementation
-      var ret = await custom_reference_resolver.resolve(id);
-      if (ret) {
-        return ret;
-      }
-  }
+        if(!resolve_references._cache[id]) {
+            resolve_references._cache[id] = resolve_references
+                ._resolve_reference_no_cache(id);
+        }
 
-  const entity = (await resolve_references.retrieve(id))[0];
-
-  // TODO handle multiple parents
-  const par = resolve_references.getParents(entity)[0] || {};
-
-  var ret = {
-      "text": id
-  };
-  if (getEntityHeadingAttribute(entity, "path") !==
-      undefined || par.name == "Image") {
-      // show file name
-      var pths = getEntityHeadingAttribute(entity, "path")
-    .split("/");
-      ret["text"] = pths[pths.length - 1];
-  } else if (par.name === "TestReferenced" && typeof resolve_references.test_resolver === "function") {
-      // this is a test case, initialized by the test suite.
-      ret = resolve_references.test_resolver(entity);
-  } else {
-      var name = getEntityName(entity);
-      if (typeof name !== "undefined" && name.length > 0) {
-    ret["text"] = name;
-      }
-  }
+        return await resolve_references._cache[id];
+    }
 
-  return ret;
+    this._resolve_reference_no_cache = async function (id) {
+        const custom_reference_resolver = window["${BUILD_EXT_REFERENCES_CUSTOM_RESOLVER}"];
+        if (custom_reference_resolver && typeof custom_reference_resolver.resolve === "function") {
+            // try custom_reference_resolver and fall-back to standard implementation
+            var ret = await custom_reference_resolver.resolve(id);
+            if (ret) {
+              return ret;
+            }
+        }
+
+        const entity = (await resolve_references.retrieve(id))[0];
+
+        // TODO handle multiple parents
+        const par = resolve_references.getParents(entity)[0] || {};
+
+        var ret = {
+            "text": id
+        };
+        if (getEntityHeadingAttribute(entity, "path") !==
+            undefined || par.name == "Image") {
+            // show file name
+            var pths = getEntityHeadingAttribute(entity, "path")
+          .split("/");
+            ret["text"] = pths[pths.length - 1];
+        } else if (par.name === "TestReferenced" && typeof resolve_references.test_resolver === "function") {
+            // this is a test case, initialized by the test suite.
+            ret = resolve_references.test_resolver(entity);
+        } else {
+            var name = getEntityName(entity);
+            if (typeof name !== "undefined" && name.length > 0) {
+          ret["text"] = name;
+            }
+        }
+
+        return ret;
     }