diff --git a/server/sockeye.csproj b/server/sockeye.csproj
index a271fc9..ae93a5c 100644
--- a/server/sockeye.csproj
+++ b/server/sockeye.csproj
@@ -69,6 +69,8 @@
-
+
+
+
\ No newline at end of file
diff --git a/sockeye.tests/ResignTests.cs b/sockeye.tests/ResignTests.cs
new file mode 100644
index 0000000..983b0eb
--- /dev/null
+++ b/sockeye.tests/ResignTests.cs
@@ -0,0 +1,102 @@
+namespace sockeye.tests;
+
+/*
+Extract key fixture data, note that pgroup / format is 1 for v7 product family keys and not 1 for any v8 family keys
+mkdir C:\data\sockeye-fixtures
+$env:PGCLIENTENCODING = "UTF8"
+.\psql -U postgres -d sockeye -At -o C:\data\sockeye-fixtures\resign.json -c "
+ SELECT json_agg(t ORDER BY t.id) FROM (
+ SELECT id,
+ pgroup AS format,
+ key
+ FROM alicense
+ WHERE key IS NOT NULL
+ ) t;"
+
+
+
+*/
+// public class UnitTest1
+// {
+// [Fact]
+// public void Test1()
+// {
+
+// }
+// }
+
+
+using System.Text.Json;
+
+public record ResignRow(long Id, int Format, string Key);
+
+public static class ResignFixture
+{
+ static readonly Lazy> _rows = new(Load);
+ public static IReadOnlyDictionary Rows => _rows.Value;
+
+ static Dictionary Load()
+ {
+ var path = "C:\\data\\sockeye-fixtures\\resign.json";//Environment.GetEnvironmentVariable("SOCKEYE_RESIGN_FIXTURE");
+ if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
+ throw new InvalidOperationException(
+ "Set SOCKEYE_RESIGN_FIXTURE to the exported alicense JSON file.");
+
+ var rows = JsonSerializer.Deserialize>(
+ File.ReadAllText(path),
+ new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
+
+ return rows.ToDictionary(r => r.Id);
+ }
+}
+
+public class ResignTests
+{
+ public static IEnumerable