diff --git a/Sources/XXLegacyDatabaseMigrator/Migrator.swift b/Sources/XXLegacyDatabaseMigrator/Migrator.swift
index 2e15273b93a69c2de134d34f4a1f5aae1a73e70d..73af8c3f78edb467902039d69965c19a65282ecb 100644
--- a/Sources/XXLegacyDatabaseMigrator/Migrator.swift
+++ b/Sources/XXLegacyDatabaseMigrator/Migrator.swift
@@ -70,7 +70,13 @@ extension Migrator {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension Migrator {
   public static let failing = Migrator { _, _, _, _ in fatalError() }
+
+  public static let unimplemented = Migrator(
+    run: XCTUnimplemented("\(Self.self)")
+  )
 }
 #endif
diff --git a/Sources/XXModels/Database.swift b/Sources/XXModels/Database.swift
index 7b20c22db659110c53a08fb1bcbfb895878dbf77..d1801b0eec115b1ccc48e83a3b3319529bf9b591 100644
--- a/Sources/XXModels/Database.swift
+++ b/Sources/XXModels/Database.swift
@@ -209,5 +209,38 @@ extension Database {
     deleteFileTransfer: .failing(),
     drop: .failing
   )
+
+  static public let unimplemented = Database(
+    fetchChatInfos: .unimplemented(),
+    fetchChatInfosPublisher: .unimplemented(),
+    fetchContacts: .unimplemented(),
+    fetchContactsPublisher: .unimplemented(),
+    saveContact: .unimplemented(),
+    bulkUpdateContacts: .unimplemented(),
+    deleteContact: .unimplemented(),
+    fetchContactChatInfos: .unimplemented(),
+    fetchContactChatInfosPublisher: .unimplemented(),
+    fetchGroups: .unimplemented(),
+    fetchGroupsPublisher: .unimplemented(),
+    saveGroup: .unimplemented(),
+    deleteGroup: .unimplemented(),
+    fetchGroupChatInfos: .unimplemented(),
+    fetchGroupChatInfosPublisher: .unimplemented(),
+    fetchGroupInfos: .unimplemented(),
+    fetchGroupInfosPublisher: .unimplemented(),
+    saveGroupMember: .unimplemented(),
+    deleteGroupMember: .unimplemented(),
+    fetchMessages: .unimplemented(),
+    fetchMessagesPublisher: .unimplemented(),
+    saveMessage: .unimplemented(),
+    bulkUpdateMessages: .unimplemented(),
+    deleteMessage: .unimplemented(),
+    deleteMessages: .unimplemented(),
+    fetchFileTransfers: .unimplemented(),
+    fetchFileTransfersPublisher: .unimplemented(),
+    saveFileTransfer: .unimplemented(),
+    deleteFileTransfer: .unimplemented(),
+    drop: .unimplemented
+  )
 }
 #endif
diff --git a/Sources/XXModels/Operations/BulkUpdate.swift b/Sources/XXModels/Operations/BulkUpdate.swift
index 6c9c28f4de91d1844d853cbc800defdd92e56e57..ca08bdb7ac8d711ab794998ae7b46d935824f192 100644
--- a/Sources/XXModels/Operations/BulkUpdate.swift
+++ b/Sources/XXModels/Operations/BulkUpdate.swift
@@ -22,9 +22,15 @@ public struct BulkUpdate<Query, Assignments> {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension BulkUpdate {
   public static func failing<Query, Assignments>() -> BulkUpdate<Query, Assignments> {
     BulkUpdate<Query, Assignments> { _, _ in fatalError() }
   }
+
+  public static func unimplemented<Query, Assignments>() -> BulkUpdate<Query, Assignments> {
+    BulkUpdate<Query, Assignments>(run: XCTUnimplemented("\(Self.self)"))
+  }
 }
 #endif
diff --git a/Sources/XXModels/Operations/Delete.swift b/Sources/XXModels/Operations/Delete.swift
index b305699998ceb845a1492096a79496b65ca2bb52..85119dcd2e1f9ca5ac5cbcf259fedd403ebcc30f 100644
--- a/Sources/XXModels/Operations/Delete.swift
+++ b/Sources/XXModels/Operations/Delete.swift
@@ -22,9 +22,15 @@ public struct Delete<Model> {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension Delete {
   public static func failing<Model>() -> Delete<Model> {
     Delete<Model> { _ in fatalError() }
   }
+
+  public static func unimplemented<Model>() -> Delete<Model> {
+    Delete<Model>(run: XCTUnimplemented("\(Self.self)"))
+  }
 }
 #endif
diff --git a/Sources/XXModels/Operations/DeleteMany.swift b/Sources/XXModels/Operations/DeleteMany.swift
index 43c155cbaab3c8a14b9e41dd780e12bcb12e1673..b75c6271d098184c7539fdf83667616dc06406ed 100644
--- a/Sources/XXModels/Operations/DeleteMany.swift
+++ b/Sources/XXModels/Operations/DeleteMany.swift
@@ -21,9 +21,15 @@ public struct DeleteMany<Model, Query> {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension DeleteMany {
   public static func failing<Model, Query>() -> DeleteMany<Model, Query> {
     DeleteMany<Model, Query> { _ in fatalError() }
   }
+
+  public static func unimplemented<Model>() -> DeleteMany<Model, Query> {
+    DeleteMany<Model, Query>(run: XCTUnimplemented("\(Self.self)"))
+  }
 }
 #endif
diff --git a/Sources/XXModels/Operations/Drop.swift b/Sources/XXModels/Operations/Drop.swift
index d80e2425413417c2d40461800e98854d63e1bb7a..4821f69f1ccddad0aef0fdedcfa12de8e5e699f8 100644
--- a/Sources/XXModels/Operations/Drop.swift
+++ b/Sources/XXModels/Operations/Drop.swift
@@ -20,7 +20,10 @@ public struct Drop {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension Drop {
   public static let failing = Drop { fatalError() }
+  public static let unimplemented = Drop(run: XCTUnimplemented("\(Self.self)"))
 }
 #endif
diff --git a/Sources/XXModels/Operations/Fetch.swift b/Sources/XXModels/Operations/Fetch.swift
index 7fe8e6e93891b126d3919d2550e4e0adfee80ca7..ff9c0ee7d11041194db009e94b5bc57176f0ec1c 100644
--- a/Sources/XXModels/Operations/Fetch.swift
+++ b/Sources/XXModels/Operations/Fetch.swift
@@ -22,9 +22,15 @@ public struct Fetch<Model, Query> {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension Fetch {
   public static func failing<Model, Query>() -> Fetch<Model, Query> {
     Fetch<Model, Query> { _ in fatalError() }
   }
+
+  public static func unimplemented<Model, Query>() -> Fetch<Model, Query> {
+    Fetch<Model, Query>(run: XCTUnimplemented("\(Self.self)"))
+  }
 }
 #endif
diff --git a/Sources/XXModels/Operations/FetchPublisher.swift b/Sources/XXModels/Operations/FetchPublisher.swift
index fe78d3b5208fe088631796097dca0deea103799f..9372d2a0f773c6569ab054f999b275cac4e3f292 100644
--- a/Sources/XXModels/Operations/FetchPublisher.swift
+++ b/Sources/XXModels/Operations/FetchPublisher.swift
@@ -23,9 +23,17 @@ public struct FetchPublisher<Model, Query> {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension FetchPublisher {
   public static func failing<Model, Query>() -> FetchPublisher<Model, Query> {
     FetchPublisher<Model, Query> { _ in fatalError() }
   }
+
+  public static func unimplemented<Model, Query>() -> FetchPublisher<Model, Query> {
+    FetchPublisher<Model, Query>(
+      run: XCTUnimplemented("\(Self.self)", placeholder: Empty().eraseToAnyPublisher())
+    )
+  }
 }
 #endif
diff --git a/Sources/XXModels/Operations/Save.swift b/Sources/XXModels/Operations/Save.swift
index 31ec662ba5cc4730a2e872f972d1b4b693037a42..6ab8076321775cc8e716464cebf3b5e4b1d0ac42 100644
--- a/Sources/XXModels/Operations/Save.swift
+++ b/Sources/XXModels/Operations/Save.swift
@@ -25,9 +25,15 @@ public struct Save<Model> {
 }
 
 #if DEBUG
+import XCTestDynamicOverlay
+
 extension Save {
   public static func failing<Model>() -> Save<Model> {
     Save<Model> { _ in fatalError() }
   }
+
+  public static func unimplemented<Model>() -> Save<Model> {
+    Save<Model>(run: XCTUnimplemented("\(Self.self)"))
+  }
 }
 #endif
diff --git a/Tests/XXLegacyDatabaseMigratorTests/MigratorTests.swift b/Tests/XXLegacyDatabaseMigratorTests/MigratorTests.swift
index 2a83537f4e496ccd355de9d39c550e6ab8498b66..68fcbf6f901d6b1e75b802ea2a636afa60c81ebe 100644
--- a/Tests/XXLegacyDatabaseMigratorTests/MigratorTests.swift
+++ b/Tests/XXLegacyDatabaseMigratorTests/MigratorTests.swift
@@ -36,7 +36,7 @@ final class MigratorTests: XCTestCase {
 
     var didSaveContacts = [XXModels.Contact]()
 
-    var newDb = XXModels.Database.failing
+    var newDb = XXModels.Database.unimplemented
     newDb.fetchContacts = .init { _ in [] }
     newDb.saveContact = .init(run: {
       didSaveContacts.append($0)
@@ -182,7 +182,7 @@ final class MigratorTests: XCTestCase {
 
     // Mock up new database:
 
-    var newDb = XXModels.Database.failing
+    var newDb = XXModels.Database.unimplemented
     newDb.fetchContacts = .init { _ in [] }
     newDb.saveContact = .init { $0 }