diff --git a/modules/backend/src/main/scala/docspell/backend/auth/Login.scala b/modules/backend/src/main/scala/docspell/backend/auth/Login.scala
index 55080ab2..05e55f24 100644
--- a/modules/backend/src/main/scala/docspell/backend/auth/Login.scala
+++ b/modules/backend/src/main/scala/docspell/backend/auth/Login.scala
@@ -50,7 +50,7 @@ object Login {
   }
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, Login[F]] =
-    Resource.pure(new Login[F] {
+    Resource.pure[F, Login[F]](new Login[F] {
 
       def loginSession(config: Config)(sessionKey: String): F[Result] =
         AuthToken.fromString(sessionKey) match {
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala b/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala
index 22141327..6a08adbf 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala
@@ -76,7 +76,7 @@ object OCollective {
   }
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OCollective[F]] =
-    Resource.pure(new OCollective[F] {
+    Resource.pure[F, OCollective[F]](new OCollective[F] {
       def find(name: Ident): F[Option[RCollective]] =
         store.transact(RCollective.findById(name))
 
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala b/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala
index 5f6dc1ca..197449ba 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala
@@ -20,7 +20,7 @@ trait OEquipment[F[_]] {
 object OEquipment {
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OEquipment[F]] =
-    Resource.pure(new OEquipment[F] {
+    Resource.pure[F, OEquipment[F]](new OEquipment[F] {
       def findAll(account: AccountId, nameQuery: Option[String]): F[Vector[REquipment]] =
         store.transact(REquipment.findAll(account.collective, nameQuery, _.name))
 
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala
index 91194ed7..bcd9c8bc 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala
@@ -70,7 +70,7 @@ object OItem {
   case class AttachmentData[F[_]](ra: RAttachment, meta: FileMeta, data: Stream[F, Byte])
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OItem[F]] =
-    Resource.pure(new OItem[F] {
+    Resource.pure[F, OItem[F]](new OItem[F] {
 
       def findItem(id: Ident, collective: Ident): F[Option[ItemData]] =
         store.transact(QItem.findItem(id)).map(opt => opt.flatMap(_.filterCollective(collective)))
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala b/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala
index 3a12d4bf..0ab6cd8b 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala
@@ -40,7 +40,7 @@ object OJob {
       store: Store[F],
       clientEC: ExecutionContext
   ): Resource[F, OJob[F]] =
-    Resource.pure(new OJob[F] {
+    Resource.pure[F, OJob[F]](new OJob[F] {
 
       def queueState(collective: Ident, maxResults: Int): F[CollectiveQueueState] =
         store
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala b/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala
index 5fad31bd..ee7b775f 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala
@@ -104,7 +104,7 @@ object OMail {
   }
 
   def apply[F[_]: Effect](store: Store[F], emil: Emil[F]): Resource[F, OMail[F]] =
-    Resource.pure(new OMail[F] {
+    Resource.pure[F, OMail[F]](new OMail[F] {
       def getSettings(accId: AccountId, nameQ: Option[String]): F[Vector[RUserEmail]] =
         store.transact(RUserEmail.findByAccount(accId, nameQ))
 
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala b/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala
index a00b7afd..08ab257c 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala
@@ -37,7 +37,7 @@ object OOrganization {
   case class PersonAndContacts(person: RPerson, contacts: Seq[RContact])
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OOrganization[F]] =
-    Resource.pure(new OOrganization[F] {
+    Resource.pure[F, OOrganization[F]](new OOrganization[F] {
 
       def findAllOrg(account: AccountId, query: Option[String]): F[Vector[OrgAndContacts]] =
         store
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OSource.scala b/modules/backend/src/main/scala/docspell/backend/ops/OSource.scala
index 9f3e685d..286670fc 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OSource.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OSource.scala
@@ -20,7 +20,7 @@ trait OSource[F[_]] {
 object OSource {
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OSource[F]] =
-    Resource.pure(new OSource[F] {
+    Resource.pure[F, OSource[F]](new OSource[F] {
       def findAll(account: AccountId): F[Vector[RSource]] =
         store.transact(RSource.findAll(account.collective, _.abbrev))
 
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala b/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala
index 29a9748c..79824a2a 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala
@@ -20,7 +20,7 @@ trait OTag[F[_]] {
 object OTag {
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OTag[F]] =
-    Resource.pure(new OTag[F] {
+    Resource.pure[F, OTag[F]](new OTag[F] {
       def findAll(account: AccountId, nameQuery: Option[String]): F[Vector[RTag]] =
         store.transact(RTag.findAll(account.collective, nameQuery, _.name))
 
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
index 07be67b6..8c8c361b 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
@@ -57,7 +57,7 @@ object OUpload {
       cfg: Config,
       httpClientEC: ExecutionContext
   ): Resource[F, OUpload[F]] =
-    Resource.pure(new OUpload[F] {
+    Resource.pure[F, OUpload[F]](new OUpload[F] {
 
       def submit(data: OUpload.UploadData[F], account: AccountId): F[OUpload.UploadResult] =
         for {
diff --git a/modules/backend/src/main/scala/docspell/backend/signup/OSignup.scala b/modules/backend/src/main/scala/docspell/backend/signup/OSignup.scala
index 40159449..067ac3b4 100644
--- a/modules/backend/src/main/scala/docspell/backend/signup/OSignup.scala
+++ b/modules/backend/src/main/scala/docspell/backend/signup/OSignup.scala
@@ -22,7 +22,7 @@ object OSignup {
   private[this] val logger = getLogger
 
   def apply[F[_]: Effect](store: Store[F]): Resource[F, OSignup[F]] =
-    Resource.pure(new OSignup[F] {
+    Resource.pure[F, OSignup[F]](new OSignup[F] {
 
       def newInvite(cfg: Config)(password: Password): F[NewInviteResult] =
         if (cfg.mode == Config.Mode.Invite) {
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
index 0e31f1cd..8c8318fa 100644
--- a/project/Dependencies.scala
+++ b/project/Dependencies.scala
@@ -12,9 +12,9 @@ object Dependencies {
   val EmilVersion = "0.2.0"
   val FastparseVersion = "2.1.3"
   val FlywayVersion = "6.2.1"
-  val Fs2Version = "2.1.0"
+  val Fs2Version = "2.2.2"
   val H2Version = "1.4.200"
-  val Http4sVersion = "0.21.0-RC2"
+  val Http4sVersion = "0.21.0-RC3"
   val KindProjectorVersion = "0.10.3"
   val Log4sVersion = "1.8.2"
   val LogbackVersion = "1.2.3"