diff --git a/integreat_cms/cms/templates/pois/poi_form.html b/integreat_cms/cms/templates/pois/poi_form.html
index e06df4ab7b..e8c5eed51d 100644
--- a/integreat_cms/cms/templates/pois/poi_form.html
+++ b/integreat_cms/cms/templates/pois/poi_form.html
@@ -174,6 +174,9 @@
{% include "./poi_form_sidebar/organization_box.html" with box_id="poi-organization" %}
{% endif %}
{% include "./poi_form_sidebar/barrier_free_box.html" with box_id="poi-barrier-free" %}
+ {% if poi_form.instance.id and perms.cms.view_contact %}
+ {% include "./poi_form_sidebar/related_contacts_box.html" with box_id="poi-related-contacts" %}
+ {% endif %}
{% if poi_form.instance.id and perms.cms.change_poi %}
{% include "./poi_form_sidebar/action_box.html" with box_id="poi-action" %}
{% endif %}
diff --git a/integreat_cms/cms/templates/pois/poi_form_sidebar/related_contacts_box.html b/integreat_cms/cms/templates/pois/poi_form_sidebar/related_contacts_box.html
new file mode 100644
index 0000000000..cd8022ef9e
--- /dev/null
+++ b/integreat_cms/cms/templates/pois/poi_form_sidebar/related_contacts_box.html
@@ -0,0 +1,28 @@
+{% extends "../../_collapsible_box.html" %}
+{% load i18n %}
+{% load widget_tweaks %}
+{% block collapsible_box_icon %}
+ message-square
+{% endblock collapsible_box_icon %}
+{% block collapsible_box_title %}
+ {% trans "Related contacts" %}
+{% endblock collapsible_box_title %}
+{% block collapsible_box_content %}
+ {% with poi_form.instance.contacts.all as contacts %}
+
+
+ {% if contacts %}
+ {% trans "This location is currently referred to in those contacts." %}
+ {% else %}
+ {% trans "This location is not currently referred to in any contact." %}
+ {% endif %}
+
+ {% for contact in contacts %}
+
+ {{ contact }}
+
+ {% endfor %}
+
+ {% endwith %}
+{% endblock collapsible_box_content %}
diff --git a/integreat_cms/locale/de/LC_MESSAGES/django.po b/integreat_cms/locale/de/LC_MESSAGES/django.po
index 24990687b6..0ea4b03756 100644
--- a/integreat_cms/locale/de/LC_MESSAGES/django.po
+++ b/integreat_cms/locale/de/LC_MESSAGES/django.po
@@ -7669,6 +7669,18 @@ msgstr "Nur Koordinaten übernehmen"
msgid "Please choose one option or cancel"
msgstr "Bitte eine Option auswählen oder abbrechen"
+#: cms/templates/pois/poi_form_sidebar/related_contacts_box.html
+msgid "Related contacts"
+msgstr "Zugehörige Kontakte"
+
+#: cms/templates/pois/poi_form_sidebar/related_contacts_box.html
+msgid "This location is currently referred to in those contacts."
+msgstr "Dieser Ort wird in folgenden Kontakten verwendet."
+
+#: cms/templates/pois/poi_form_sidebar/related_contacts_box.html
+msgid "This location is not currently referred to in any contact."
+msgstr "Zur Zeit gibt es keine Kontakte zu diesem Ort."
+
#: cms/templates/pois/poi_list.html cms/templates/pois/poi_list_archived.html
msgid "Archived locations"
msgstr "Archivierte Orte"
diff --git a/tests/cms/views/poi/test_poi_form.py b/tests/cms/views/poi/test_poi_form.py
index 41d6411616..2cc263af3a 100644
--- a/tests/cms/views/poi/test_poi_form.py
+++ b/tests/cms/views/poi/test_poi_form.py
@@ -218,3 +218,101 @@ def test_poi_in_use_not_bulk_archived(
# Check the POI is not archived
assert not POI.objects.filter(id=poi_id).first().archived
+
+
+@pytest.mark.django_db
+def test_poi_form_shows_associated_contacts(
+ load_test_data: None,
+ login_role_user: tuple[Client, str],
+ settings: SettingsWrapper,
+) -> None:
+ """
+ POI "Draft location" (id=6) has three related contacts. Test whether they are shown in the POI form.
+ """
+ client, role = login_role_user
+
+ # Choose a POI which has related contacts
+ POI_ID = 6
+
+ # Set the language setting to English so assertion does not fail because of corresponding German sentence appearing instead the english one.
+ settings.LANGUAGE_CODE = "en"
+
+ poi = POI.objects.filter(id=POI_ID).first()
+ related_contacts = list(poi.contacts.all())
+
+ assert len(related_contacts) > 0
+
+ edit_poi = reverse(
+ "edit_poi",
+ kwargs={
+ "poi_id": poi.id,
+ "region_slug": poi.region.slug,
+ "language_slug": poi.region.default_language.slug,
+ },
+ )
+ response = client.get(edit_poi)
+
+ if role == ANONYMOUS:
+ assert response.status_code == 302
+ assert (
+ response.headers.get("location") == f"{settings.LOGIN_URL}?next={edit_poi}"
+ )
+ # probably needs adjustment after #2958
+ elif role in HIGH_PRIV_STAFF_ROLES:
+ for contact in related_contacts:
+ assert f"{contact.title} {contact.name}" in response.content.decode("utf-8")
+ else:
+ assert (
+ "This location is currently referred to in those contacts."
+ not in response.content.decode("utf-8")
+ )
+
+
+@pytest.mark.django_db
+def test_poi_form_shows_no_associated_contacts(
+ load_test_data: None,
+ login_role_user: tuple[Client, str],
+ settings: SettingsWrapper,
+) -> None:
+ """
+ POI "Test location" (id=4) has no related contacts. Test whether the correct message is shown in the POi form.
+ """
+ client, role = login_role_user
+
+ # Choose a POI which has related contacts
+ POI_ID = 4
+
+ # Set the language setting to English so assertion does not fail because of corresponding German sentence appearing instead the english one.
+ settings.LANGUAGE_CODE = "en"
+
+ poi = POI.objects.filter(id=POI_ID).first()
+ related_contacts = list(poi.contacts.all())
+
+ assert len(related_contacts) == 0
+
+ edit_poi = reverse(
+ "edit_poi",
+ kwargs={
+ "poi_id": poi.id,
+ "region_slug": poi.region.slug,
+ "language_slug": poi.region.default_language.slug,
+ },
+ )
+ response = client.get(edit_poi)
+
+ if role == ANONYMOUS:
+ assert response.status_code == 302
+ assert (
+ response.headers.get("location") == f"{settings.LOGIN_URL}?next={edit_poi}"
+ )
+ # probably needs adjustment after #2958
+ elif role in HIGH_PRIV_STAFF_ROLES:
+ assert (
+ "This location is not currently referred to in any contact."
+ in response.content.decode("utf-8")
+ )
+ else:
+ assert (
+ "This location is not currently referred to in any contact."
+ not in response.content.decode("utf-8")
+ )