diff --git a/GerbilManager.Tests/GerbilSearchTests.cs b/GerbilManager.Tests/GerbilSearchTests.cs
new file mode 100644
index 0000000..b694f52
--- /dev/null
+++ b/GerbilManager.Tests/GerbilSearchTests.cs
@@ -0,0 +1,58 @@
+using System.Net;
+using System.Net.Http.Json;
+using GerbilManagerWebAPI.Models;
+
+namespace GerbilManager.Tests;
+
+/// SEARCH-1: separator-insensitive name search + OriginBreeder (Herkunft) filter.
+public class GerbilSearchTests : IClassFixture
+{
+ private readonly HttpClient _client;
+
+ public GerbilSearchTests(ApiFactory factory) => _client = factory.CreateClient();
+
+ private static HttpContent Gerbil(string name, string? originBreeder = null) =>
+ JsonContent.Create(new
+ {
+ name,
+ gender = "female",
+ originBreeder,
+ });
+
+ [Theory]
+ [InlineData("Clan-Kleine-Chaoten", "clankleinechaoten")]
+ [InlineData("Clan Kleine Chaoten", "clankleinechaoten")]
+ [InlineData("v.d. Kleinen_Chaoten", "vdkleinenchaoten")]
+ public void Normalize_strips_separators_and_lowercases(string input, string expected) =>
+ Assert.Equal(expected, GerbilSearch.Normalize(input));
+
+ [Fact]
+ public async Task NameSearch_filter_matches_across_separators()
+ {
+ var create = await _client.PostAsync("/gerbils", Gerbil("Clan-Kleine-Chaoten"));
+ Assert.Equal(HttpStatusCode.Created, create.StatusCode);
+
+ // Gridify contains is "=*value" (no trailing '*', per the main hotfix 0ee2b53).
+ // The client normalizes the user's term the same way the column is normalized.
+ var json = await _client.GetStringAsync("/gerbils?filter=nameSearch=*clankleinechaoten");
+ Assert.Contains("Clan-Kleine-Chaoten", json);
+
+ // a term that doesn't normalize-match must NOT return it
+ var miss = await _client.GetStringAsync("/gerbils?filter=nameSearch=*completelyother");
+ Assert.DoesNotContain("Clan-Kleine-Chaoten", miss);
+ }
+
+ [Fact]
+ public async Task OriginBreeder_is_filterable_and_listed_in_breeders_endpoint()
+ {
+ await _client.PostAsync("/gerbils", Gerbil("Herkunftstier", originBreeder: "Zucht der kleinen Chaoten"));
+
+ // distinct-values dropdown source
+ var breeders = await _client.GetStringAsync("/gerbils/breeders");
+ Assert.Contains("Zucht der kleinen Chaoten", breeders);
+
+ // Gridify filter on the field
+ var filtered = await _client.GetStringAsync("/gerbils?filter=originBreeder==Zucht der kleinen Chaoten");
+ Assert.Contains("Herkunftstier", filtered);
+ }
+}