diff --git a/src/AddressRegistry.Projections.Wms/Migrations/20250120114301_SwitchViewsToV3.Designer.cs b/src/AddressRegistry.Projections.Wms/Migrations/20250120114301_SwitchViewsToV3.Designer.cs
new file mode 100644
index 000000000..75fcecbaa
--- /dev/null
+++ b/src/AddressRegistry.Projections.Wms/Migrations/20250120114301_SwitchViewsToV3.Designer.cs
@@ -0,0 +1,225 @@
+//
+using System;
+using AddressRegistry.Projections.Wms;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using NetTopologySuite.Geometries;
+
+#nullable disable
+
+namespace AddressRegistry.Projections.Wms.Migrations
+{
+ [DbContext(typeof(WmsContext))]
+ [Migration("20250120114301_SwitchViewsToV3")]
+ partial class SwitchViewsToV3
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.3")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("AddressRegistry.Projections.Wms.AddressWmsItemV2.AddressWmsItemV2", b =>
+ {
+ b.Property("AddressPersistentLocalId")
+ .HasColumnType("int");
+
+ b.Property("BoxNumber")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HouseNumber")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HouseNumberLabel")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HouseNumberLabelLength")
+ .HasColumnType("int");
+
+ b.Property("LabelType")
+ .HasColumnType("int");
+
+ b.Property("OfficiallyAssigned")
+ .HasColumnType("bit");
+
+ b.Property("ParentAddressPersistentLocalId")
+ .HasColumnType("int");
+
+ b.Property("Position")
+ .IsRequired()
+ .HasColumnType("sys.geometry");
+
+ b.Property("PositionMethod")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PositionSpecification")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PositionX")
+ .HasColumnType("float");
+
+ b.Property("PositionY")
+ .HasColumnType("float");
+
+ b.Property("PostalCode")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Removed")
+ .HasColumnType("bit");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("StreetNamePersistentLocalId")
+ .HasColumnType("int");
+
+ b.Property("VersionAsString")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("VersionTimestampAsDateTimeOffset")
+ .HasColumnType("datetimeoffset")
+ .HasColumnName("VersionTimestamp");
+
+ b.HasKey("AddressPersistentLocalId");
+
+ SqlServerKeyBuilderExtensions.IsClustered(b.HasKey("AddressPersistentLocalId"));
+
+ b.HasIndex("ParentAddressPersistentLocalId");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("StreetNamePersistentLocalId");
+
+ b.HasIndex("Removed", "Status");
+
+ SqlServerIndexBuilderExtensions.IncludeProperties(b.HasIndex("Removed", "Status"), new[] { "StreetNamePersistentLocalId", "Position" });
+
+ b.HasIndex("PositionX", "PositionY", "Removed", "Status");
+
+ SqlServerIndexBuilderExtensions.IncludeProperties(b.HasIndex("PositionX", "PositionY", "Removed", "Status"), new[] { "StreetNamePersistentLocalId" });
+
+ b.ToTable("AddressWmsV2", "wms.address");
+ });
+
+ modelBuilder.Entity("AddressRegistry.Projections.Wms.AddressWmsItemV3.AddressWmsItemV3", b =>
+ {
+ b.Property("AddressPersistentLocalId")
+ .HasColumnType("int");
+
+ b.Property("BoxNumber")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HouseNumber")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HouseNumberLabel")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("HouseNumberLabelLength")
+ .HasColumnType("int");
+
+ b.Property("LabelType")
+ .HasColumnType("int");
+
+ b.Property("OfficiallyAssigned")
+ .HasColumnType("bit");
+
+ b.Property("ParentAddressPersistentLocalId")
+ .HasColumnType("int");
+
+ b.Property("Position")
+ .IsRequired()
+ .HasColumnType("sys.geometry");
+
+ b.Property("PositionMethod")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PositionSpecification")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("PositionX")
+ .HasColumnType("float");
+
+ b.Property("PositionY")
+ .HasColumnType("float");
+
+ b.Property("PostalCode")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Removed")
+ .HasColumnType("bit");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("StreetNamePersistentLocalId")
+ .HasColumnType("int");
+
+ b.Property("VersionAsString")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("VersionTimestampAsDateTimeOffset")
+ .HasColumnType("datetimeoffset")
+ .HasColumnName("VersionTimestamp");
+
+ b.HasKey("AddressPersistentLocalId");
+
+ SqlServerKeyBuilderExtensions.IsClustered(b.HasKey("AddressPersistentLocalId"));
+
+ b.HasIndex("ParentAddressPersistentLocalId");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("StreetNamePersistentLocalId");
+
+ b.HasIndex("Removed", "Status");
+
+ SqlServerIndexBuilderExtensions.IncludeProperties(b.HasIndex("Removed", "Status"), new[] { "StreetNamePersistentLocalId", "Position" });
+
+ b.HasIndex("PositionX", "PositionY", "Removed", "Status");
+
+ SqlServerIndexBuilderExtensions.IncludeProperties(b.HasIndex("PositionX", "PositionY", "Removed", "Status"), new[] { "StreetNamePersistentLocalId" });
+
+ b.ToTable("AddressWmsV3", "wms.address");
+ });
+
+ modelBuilder.Entity("Be.Vlaanderen.Basisregisters.ProjectionHandling.Runner.ProjectionStates.ProjectionStateItem", b =>
+ {
+ b.Property("Name")
+ .HasColumnType("nvarchar(450)");
+
+ b.Property("DesiredState")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("DesiredStateChangedAt")
+ .HasColumnType("datetimeoffset");
+
+ b.Property("ErrorMessage")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Position")
+ .HasColumnType("bigint");
+
+ b.HasKey("Name");
+
+ b.ToTable("ProjectionStates", "wms.address");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/AddressRegistry.Projections.Wms/Migrations/20250120114301_SwitchViewsToV3.cs b/src/AddressRegistry.Projections.Wms/Migrations/20250120114301_SwitchViewsToV3.cs
new file mode 100644
index 000000000..99f220310
--- /dev/null
+++ b/src/AddressRegistry.Projections.Wms/Migrations/20250120114301_SwitchViewsToV3.cs
@@ -0,0 +1,284 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace AddressRegistry.Projections.Wms.Migrations
+{
+ ///
+ public partial class SwitchViewsToV3 : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresAfgekeurd]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresVoorgesteld]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresInGebruik]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresGehistoreerd]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresView]");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresView] WITH SCHEMABINDING AS
+SELECT a.[AddressPersistentLocalId] as ObjectId
+ ,CONCAT('https://data.vlaanderen.be/id/adres/', a.[AddressPersistentLocalId]) as Id
+ ,a.[VersionAsString] as VersieId
+ ,s.[PersistentLocalId] as StraatnaamObjectId
+ ,s.[NameDutch] as Straatnaam
+ ,a.[HouseNumberLabel] as HuisnummerLabel
+ ,a.[LabelType]
+ ,a.[HouseNumberLabelLength] as LabelLengte
+ ,s.[NisCode] as GemeenteObjectId
+ ,m.[NameDutch] as Gemeentenaam
+ ,a.[PostalCode] as PostinfoObjectId
+ ,[wms].[GetFullAddress](s.[NameDutch], a.[HouseNumber], a.[BoxNumber], a.[PostalCode], m.[NameDutch]) as VolledigAdres
+ ,a.[HouseNumber] as Huisnummer
+ ,a.[BoxNumber] as Busnummer
+ ,a.[Status] as AdresStatus
+ ,a.[Position] as AdresPositie
+ ,a.[PositionMethod] as PositieGeometrieMethode
+ ,a.[PositionSpecification] as PositieSpecificatie
+ ,a.[OfficiallyAssigned] as OfficieelToegekend
+FROM [wms.address].AddressWmsV3 as a
+JOIN [wms.streetname].[StreetNameHelperV2] s ON a.[StreetNamePersistentLocalId] = s.[PersistentLocalId] AND a.[Removed] = 0
+JOIN [wms.municipality].[MunicipalityHelper] m ON s.[NisCode] = m.[NisCode] AND s.[Removed] = 0");
+
+ migrationBuilder.Sql("CREATE UNIQUE CLUSTERED INDEX IX_AdresView_ObjectId ON [wms].[AdresView] ([ObjectId])");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresVoorgesteld] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'Voorgesteld';");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresInGebruik] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'InGebruik'");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresGehistoreerd] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'Gehistoreerd'");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresAfgekeurd] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'Afgekeurd'");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresAfgekeurd]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresVoorgesteld]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresInGebruik]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresGehistoreerd]");
+ migrationBuilder.Sql("DROP VIEW [wms].[AdresView]");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresView] WITH SCHEMABINDING AS
+SELECT a.[AddressPersistentLocalId] as ObjectId
+ ,CONCAT('https://data.vlaanderen.be/id/adres/', a.[AddressPersistentLocalId]) as Id
+ ,a.[VersionAsString] as VersieId
+ ,s.[PersistentLocalId] as StraatnaamObjectId
+ ,s.[NameDutch] as Straatnaam
+ ,a.[HouseNumberLabel] as HuisnummerLabel
+ ,a.[LabelType]
+ ,a.[HouseNumberLabelLength] as LabelLengte
+ ,s.[NisCode] as GemeenteObjectId
+ ,m.[NameDutch] as Gemeentenaam
+ ,a.[PostalCode] as PostinfoObjectId
+ ,[wms].[GetFullAddress](s.[NameDutch], a.[HouseNumber], a.[BoxNumber], a.[PostalCode], m.[NameDutch]) as VolledigAdres
+ ,a.[HouseNumber] as Huisnummer
+ ,a.[BoxNumber] as Busnummer
+ ,a.[Status] as AdresStatus
+ ,a.[Position] as AdresPositie
+ ,a.[PositionMethod] as PositieGeometrieMethode
+ ,a.[PositionSpecification] as PositieSpecificatie
+ ,a.[OfficiallyAssigned] as OfficieelToegekend
+FROM [wms.address].AddressWmsV2 as a
+JOIN [wms.streetname].[StreetNameHelperV2] s ON a.[StreetNamePersistentLocalId] = s.[PersistentLocalId] AND a.[Removed] = 0
+JOIN [wms.municipality].[MunicipalityHelper] m ON s.[NisCode] = m.[NisCode] AND s.[Removed] = 0");
+
+ migrationBuilder.Sql("CREATE UNIQUE CLUSTERED INDEX IX_AdresView_ObjectId ON [wms].[AdresView] ([ObjectId])");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresVoorgesteld] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'Voorgesteld';");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresInGebruik] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'InGebruik'");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresGehistoreerd] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'Gehistoreerd'");
+
+ migrationBuilder.Sql(@"
+CREATE VIEW [wms].[AdresAfgekeurd] WITH SCHEMABINDING AS
+SELECT
+ [ObjectId]
+ ,[Id]
+ ,[VersieId]
+ ,[StraatnaamObjectId]
+ ,[Straatnaam]
+ ,[HuisnummerLabel]
+ ,[LabelType]
+ ,[LabelLengte]
+ ,[GemeenteObjectId]
+ ,[Gemeentenaam]
+ ,[PostinfoObjectId]
+ ,[VolledigAdres]
+ ,[Huisnummer]
+ ,[Busnummer]
+ ,[AdresStatus]
+ ,[AdresPositie]
+ ,[PositieGeometrieMethode]
+ ,[PositieSpecificatie]
+ ,[OfficieelToegekend]
+FROM [wms].[AdresView]
+WHERE [AdresStatus] = 'Afgekeurd'");
+ }
+ }
+}