diff --git a/tests/integration/test_web_ui.py b/tests/integration/test_web_ui.py
new file mode 100644
index 0000000..6ecf40d
--- /dev/null
+++ b/tests/integration/test_web_ui.py
@@ -0,0 +1,87 @@
+"""Integration tests for Web UI functionality."""
+import pytest
+from urllib.parse import quote
+
+
+@pytest.mark.typesense
+async def test_web_search_preserves_language_in_results(
+ sqlite, typesense, anonymous_client, cn
+):
+ """Test that search results include language parameter in concept links."""
+ # Perform a search in German
+ response = await anonymous_client.get(
+ "/web/search/", params={"query": "Esel", "language": "de"}
+ )
+ assert response.status_code == 200
+
+ # Check that the HTML contains links with language parameter
+ html_content = response.text
+
+ # Search results should link to concepts with language parameter
+ # The link format should be: /web/concept/{iri}?language=de
+ concept_iri = cn.concept_2023_low["@id"]
+ expected_link_pattern = f"/web/concept/{quote(concept_iri)}?language=de"
+
+ assert expected_link_pattern in html_content, (
+ f"Expected to find link '{expected_link_pattern}' in search results, "
+ f"but it was not present. This means clicking on a search result "
+ f"will not preserve the language setting."
+ )
+
+
+@pytest.mark.typesense
+async def test_web_search_multiple_languages(sqlite, typesense, anonymous_client, cn):
+ """Test that different languages produce correctly parameterized links."""
+ languages = ["en", "de"]
+
+ for lang in languages:
+ response = await anonymous_client.get(
+ "/web/search/", params={"query": "test", "language": lang}
+ )
+ assert response.status_code == 200
+
+ # Verify the hidden language input has the correct value
+ html_content = response.text
+ assert f'