From 968c2e70d25806473101c9ab5b7e447a92f656f9 Mon Sep 17 00:00:00 2001
From: ganfra <francoisg@element.io>
Date: Fri, 15 Oct 2021 16:41:05 +0200
Subject: [PATCH] Hilt: continue migration VM

---
 .../app/core/di/MavericksViewModelModule.kt   | 160 ++++++++++++++++++
 .../call/transfer/CallTransferActivity.kt     |  20 +--
 .../call/transfer/CallTransferViewModel.kt    |  18 +-
 .../contactsbook/ContactsBookFragment.kt      |   7 +-
 .../contactsbook/ContactsBookViewModel.kt     |  17 +-
 .../createdirect/CreateDirectRoomActivity.kt  |  11 +-
 .../createdirect/CreateDirectRoomViewModel.kt |  22 +--
 .../settings/KeysBackupManageActivity.kt      |   1 -
 .../settings/KeysBackupSettingsViewModel.kt   |  17 +-
 .../quads/SharedSecureStorageActivity.kt      |   1 -
 .../quads/SharedSecureStorageViewModel.kt     |  43 ++---
 .../features/devtools/RoomDevToolActivity.kt  |   8 +-
 .../features/devtools/RoomDevToolViewModel.kt |  22 +--
 .../vector/app/features/home/HomeActivity.kt  |  10 --
 .../app/features/home/HomeDetailFragment.kt   |   7 +-
 .../home/PromoteRestrictedViewModel.kt        |  18 +-
 .../home/room/detail/RoomDetailActivity.kt    |   7 -
 .../reactions/ViewReactionsBottomSheet.kt     |   1 -
 .../reactions/ViewReactionsViewModel.kt       |  15 +-
 .../detail/upgrade/MigrateRoomBottomSheet.kt  |  10 +-
 .../detail/upgrade/MigrateRoomViewModel.kt    |  20 +--
 .../RoomListQuickActionsBottomSheet.kt        |   1 -
 .../invite/InviteUsersToRoomActivity.kt       |   8 +-
 .../picker/RoomDirectoryPickerFragment.kt     |   3 +-
 .../picker/RoomDirectoryPickerViewModel.kt    |  16 +-
 .../RoomNotificationSettingsViewModel.kt      |  25 +--
 .../settings/ignored/IgnoredUsersViewModel.kt |  15 +-
 .../VectorSettingsIgnoredUsersFragment.kt     |   1 -
 .../features/spaces/SpaceCreationActivity.kt  |   5 +-
 .../features/spaces/SpaceExploreActivity.kt   |   7 +-
 .../spaces/create/CreateSpaceViewModel.kt     |  21 +--
 .../spaces/explore/SpaceDirectoryViewModel.kt |  19 +--
 .../spaces/invite/SpaceInviteBottomSheet.kt   |   6 +-
 .../invite/SpaceInviteBottomSheetViewModel.kt |  17 +-
 .../leave/SpaceLeaveAdvancedActivity.kt       |   4 -
 .../leave/SpaceLeaveAdvancedViewModel.kt      |  19 +--
 .../spaces/manage/SpaceAddRoomFragment.kt     |   6 +-
 .../spaces/manage/SpaceAddRoomsViewModel.kt   |  18 +-
 .../spaces/people/SpacePeopleFragment.kt      |   6 -
 .../spaces/people/SpacePeopleViewModel.kt     |  20 +--
 .../spaces/preview/SpacePreviewFragment.kt    |   5 +-
 .../spaces/preview/SpacePreviewViewModel.kt   |  16 +-
 .../spaces/share/ShareSpaceBottomSheet.kt     |   6 +-
 .../spaces/share/ShareSpaceViewModel.kt       |  19 +--
 .../app/features/terms/ReviewTermsActivity.kt |   1 -
 .../features/terms/ReviewTermsViewModel.kt    |  18 +-
 .../app/features/usercode/UserCodeActivity.kt |   6 -
 .../usercode/UserCodeSharedViewModel.kt       |  20 +--
 .../userdirectory/UserListViewModel.kt        |  17 +-
 .../app/features/widgets/WidgetActivity.kt    |  15 +-
 .../app/features/widgets/WidgetViewModel.kt   |  18 +-
 .../RoomWidgetPermissionViewModel.kt          |  19 +--
 .../signout/ServerBackupStatusViewModel.kt    |  18 +-
 .../SignOutBottomSheetDialogFragment.kt       |  10 +-
 .../workers/signout/SignoutCheckViewModel.kt  |  18 +-
 55 files changed, 331 insertions(+), 527 deletions(-)

diff --git a/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt b/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt
index 430ecac83d..6724954479 100644
--- a/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt
@@ -23,11 +23,38 @@ import dagger.multibindings.IntoMap
 import im.vector.app.features.auth.ReAuthViewModel
 import im.vector.app.features.call.VectorCallViewModel
 import im.vector.app.features.call.conference.JitsiCallViewModel
+import im.vector.app.features.call.transfer.CallTransferViewModel
+import im.vector.app.features.contactsbook.ContactsBookViewModel
+import im.vector.app.features.createdirect.CreateDirectRoomViewModel
+import im.vector.app.features.crypto.keysbackup.settings.KeysBackupSettingsViewModel
+import im.vector.app.features.crypto.quads.SharedSecureStorageViewModel
+import im.vector.app.features.devtools.RoomDevToolViewModel
+import im.vector.app.features.home.PromoteRestrictedViewModel
+import im.vector.app.features.home.room.detail.timeline.reactions.ViewReactionsViewModel
+import im.vector.app.features.home.room.detail.upgrade.MigrateRoomViewModel
 import im.vector.app.features.home.room.list.RoomListViewModel
 import im.vector.app.features.roomdirectory.RoomDirectoryViewModel
+import im.vector.app.features.roomdirectory.picker.RoomDirectoryPickerViewModel
+import im.vector.app.features.roomprofile.notifications.RoomNotificationSettingsViewModel
+import im.vector.app.features.settings.ignored.IgnoredUsersViewModel
 import im.vector.app.features.spaces.SpaceListViewModel
+import im.vector.app.features.spaces.create.CreateSpaceViewModel
+import im.vector.app.features.spaces.explore.SpaceDirectoryViewModel
+import im.vector.app.features.spaces.invite.SpaceInviteBottomSheetViewModel
+import im.vector.app.features.spaces.leave.SpaceLeaveAdvancedViewModel
+import im.vector.app.features.spaces.manage.SpaceAddRoomsViewModel
 import im.vector.app.features.spaces.manage.SpaceManageRoomsViewModel
 import im.vector.app.features.spaces.manage.SpaceManageSharedViewModel
+import im.vector.app.features.spaces.people.SpacePeopleViewModel
+import im.vector.app.features.spaces.preview.SpacePreviewViewModel
+import im.vector.app.features.spaces.share.ShareSpaceViewModel
+import im.vector.app.features.terms.ReviewTermsViewModel
+import im.vector.app.features.usercode.UserCodeSharedViewModel
+import im.vector.app.features.userdirectory.UserListViewModel
+import im.vector.app.features.widgets.WidgetViewModel
+import im.vector.app.features.widgets.permissions.RoomWidgetPermissionViewModel
+import im.vector.app.features.workers.signout.ServerBackupStatusViewModel
+import im.vector.app.features.workers.signout.SignoutCheckViewModel
 
 @InstallIn(MavericksViewModelComponent::class)
 @Module
@@ -73,6 +100,139 @@ interface MavericksViewModelModule {
     @MavericksViewModelKey(RoomDirectoryViewModel::class)
     fun roomDirectoryViewModelFactory(factory: RoomDirectoryViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
 
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(ViewReactionsViewModel::class)
+    fun viewReactionsViewModelFactory(factory: ViewReactionsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
 
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(RoomWidgetPermissionViewModel::class)
+    fun roomWidgetPermissionViewModelFactory(factory: RoomWidgetPermissionViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(WidgetViewModel::class)
+    fun widgetViewModelFactory(factory: WidgetViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(ServerBackupStatusViewModel::class)
+    fun serverBackupStatusViewModelFactory(factory: ServerBackupStatusViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SignoutCheckViewModel::class)
+    fun signoutCheckViewModelFactory(factory: SignoutCheckViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(RoomDirectoryPickerViewModel::class)
+    fun roomDirectoryPickerViewModelFactory(factory: RoomDirectoryPickerViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(RoomDevToolViewModel::class)
+    fun roomDevToolViewModelFactory(factory: RoomDevToolViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(MigrateRoomViewModel::class)
+    fun migrateRoomViewModelFactory(factory: MigrateRoomViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(IgnoredUsersViewModel::class)
+    fun ignoredUsersViewModelFactory(factory: IgnoredUsersViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(CallTransferViewModel::class)
+    fun callTransferViewModelFactory(factory: CallTransferViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(ContactsBookViewModel::class)
+    fun contactsBookViewModelFactory(factory: ContactsBookViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(CreateDirectRoomViewModel::class)
+    fun createDirectRoomViewModelFactory(factory: CreateDirectRoomViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(RoomNotificationSettingsViewModel::class)
+    fun roomNotificationSettingsViewModelFactory(factory: RoomNotificationSettingsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(KeysBackupSettingsViewModel::class)
+    fun keysBackupSettingsViewModelFactory(factory: KeysBackupSettingsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SharedSecureStorageViewModel::class)
+    fun sharedSecureStorageViewModelFactory(factory: SharedSecureStorageViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(PromoteRestrictedViewModel::class)
+    fun promoteRestrictedViewModelFactory(factory: PromoteRestrictedViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(UserListViewModel::class)
+    fun userListViewModelFactory(factory: UserListViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(UserCodeSharedViewModel::class)
+    fun userCodeSharedViewModelFactory(factory: UserCodeSharedViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(ReviewTermsViewModel::class)
+    fun reviewTermsViewModelFactory(factory: ReviewTermsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(ShareSpaceViewModel::class)
+    fun shareSpaceViewModelFactory(factory: ShareSpaceViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SpacePreviewViewModel::class)
+    fun spacePreviewViewModelFactory(factory: SpacePreviewViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SpacePeopleViewModel::class)
+    fun spacePeopleViewModelFactory(factory: SpacePeopleViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SpaceAddRoomsViewModel::class)
+    fun spaceAddRoomsViewModelFactory(factory: SpaceAddRoomsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SpaceLeaveAdvancedViewModel::class)
+    fun spaceLeaveAdvancedViewModelFactory(factory: SpaceLeaveAdvancedViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SpaceInviteBottomSheetViewModel::class)
+    fun spaceInviteBottomSheetViewModelFactory(factory: SpaceInviteBottomSheetViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(SpaceDirectoryViewModel::class)
+    fun spaceDirectoryViewModelFactory(factory: SpaceDirectoryViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
+
+    @Binds
+    @IntoMap
+    @MavericksViewModelKey(CreateSpaceViewModel::class)
+    fun createSpaceViewModelFactory(factory: CreateSpaceViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
 
 }
diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
index 2a50dc85f9..a2e81e64fa 100644
--- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
@@ -40,14 +40,8 @@ data class CallTransferArgs(val callId: String) : Parcelable
 
 private const val USER_LIST_FRAGMENT_TAG = "USER_LIST_FRAGMENT_TAG"
 
-class CallTransferActivity : VectorBaseActivity<ActivityCallTransferBinding>(),
-        CallTransferViewModel.Factory,
-        UserListViewModel.Factory,
-        ContactsBookViewModel.Factory {
+class CallTransferActivity : VectorBaseActivity<ActivityCallTransferBinding>() {
 
-    @Inject lateinit var userListViewModelFactory: UserListViewModel.Factory
-    @Inject lateinit var callTransferViewModelFactory: CallTransferViewModel.Factory
-    @Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
     @Inject lateinit var errorFormatter: ErrorFormatter
 
     private lateinit var sectionsPagerAdapter: CallTransferPagerAdapter
@@ -62,18 +56,6 @@ class CallTransferActivity : VectorBaseActivity<ActivityCallTransferBinding>(),
         injector.inject(this)
     }
 
-    override fun create(initialState: UserListViewState): UserListViewModel {
-        return userListViewModelFactory.create(initialState)
-    }
-
-    override fun create(initialState: CallTransferViewState): CallTransferViewModel {
-        return callTransferViewModelFactory.create(initialState)
-    }
-
-    override fun create(initialState: ContactsBookViewState): ContactsBookViewModel {
-        return contactsBookViewModelFactory.create(initialState)
-    }
-
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         waitingView = views.waitingView.waitingView
diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt
index a26b03a3aa..de352149a7 100644
--- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt
@@ -16,13 +16,12 @@
 
 package im.vector.app.features.call.transfer
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.MavericksViewModelFactory
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.features.call.dialpad.DialPadLookup
@@ -41,18 +40,11 @@ class CallTransferViewModel @AssistedInject constructor(@Assisted initialState:
     VectorViewModel<CallTransferViewState, CallTransferAction, CallTransferViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: CallTransferViewState): CallTransferViewModel
+    interface Factory: MavericksAssistedViewModelFactory<CallTransferViewModel,CallTransferViewState> {
+        override fun create(state: CallTransferViewState): CallTransferViewModel
     }
 
-    companion object : MavericksViewModelFactory<CallTransferViewModel, CallTransferViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: CallTransferViewState): CallTransferViewModel? {
-            val activity: CallTransferActivity = (viewModelContext as ActivityViewModelContext).activity()
-            return activity.callTransferViewModelFactory.create(state)
-        }
-    }
+    companion object : MavericksViewModelFactory<CallTransferViewModel, CallTransferViewState> by hiltMavericksViewModelFactory()
 
     private val call = callManager.getCallById(initialState.callId)
     private val callListener = object : WebRtcCall.Listener {
diff --git a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
index ea1841d870..d79ad308de 100644
--- a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
@@ -43,9 +43,8 @@ import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 
 class ContactsBookFragment @Inject constructor(
-        private val contactsBookViewModelFactory: ContactsBookViewModel.Factory,
         private val contactsBookController: ContactsBookController
-) : VectorBaseFragment<FragmentContactsBookBinding>(), ContactsBookController.Callback, ContactsBookViewModel.Factory {
+) : VectorBaseFragment<FragmentContactsBookBinding>(), ContactsBookController.Callback {
 
     override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentContactsBookBinding {
         return FragmentContactsBookBinding.inflate(inflater, container, false)
@@ -58,10 +57,6 @@ class ContactsBookFragment @Inject constructor(
 
     private lateinit var sharedActionViewModel: UserListSharedActionViewModel
 
-    override fun create(initialState: ContactsBookViewState): ContactsBookViewModel {
-        return contactsBookViewModelFactory.create(initialState)
-    }
-
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         sharedActionViewModel = activityViewModelProvider.get(UserListSharedActionViewModel::class.java)
diff --git a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt
index 6b5a6465a6..05f98dedff 100644
--- a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt
@@ -28,6 +28,8 @@ import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.core.contacts.ContactsDataSource
 import im.vector.app.core.contacts.MappedContact
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
@@ -45,20 +47,11 @@ class ContactsBookViewModel @AssistedInject constructor(@Assisted
     VectorViewModel<ContactsBookViewState, ContactsBookAction, EmptyViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: ContactsBookViewState): ContactsBookViewModel
+    interface Factory: MavericksAssistedViewModelFactory<ContactsBookViewModel,ContactsBookViewState> {
+        override fun create(state: ContactsBookViewState): ContactsBookViewModel
     }
 
-    companion object : MavericksViewModelFactory<ContactsBookViewModel, ContactsBookViewState> {
-
-        override fun create(viewModelContext: ViewModelContext, state: ContactsBookViewState): ContactsBookViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<ContactsBookViewModel, ContactsBookViewState> by hiltMavericksViewModelFactory()
 
     private var allContacts: List<MappedContact> = emptyList()
     private var mappedContacts: List<MappedContact> = emptyList()
diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
index ae3af4b3e9..e310eb8e70 100644
--- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
@@ -55,13 +55,10 @@ import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
 import java.net.HttpURLConnection
 import javax.inject.Inject
 
-class CreateDirectRoomActivity : SimpleFragmentActivity(), UserListViewModel.Factory, CreateDirectRoomViewModel.Factory, ContactsBookViewModel.Factory {
+class CreateDirectRoomActivity : SimpleFragmentActivity(){
 
     private val viewModel: CreateDirectRoomViewModel by viewModel()
     private lateinit var sharedActionViewModel: UserListSharedActionViewModel
-    @Inject lateinit var userListViewModelFactory: UserListViewModel.Factory
-    @Inject lateinit var createDirectRoomViewModelFactory: CreateDirectRoomViewModel.Factory
-    @Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
     @Inject lateinit var errorFormatter: ErrorFormatter
 
     override fun injectWith(injector: ScreenComponent) {
@@ -69,12 +66,6 @@ class CreateDirectRoomActivity : SimpleFragmentActivity(), UserListViewModel.Fac
         injector.inject(this)
     }
 
-    override fun create(initialState: UserListViewState) = userListViewModelFactory.create(initialState)
-
-    override fun create(initialState: CreateDirectRoomViewState) = createDirectRoomViewModelFactory.create(initialState)
-
-    override fun create(initialState: ContactsBookViewState) = contactsBookViewModelFactory.create(initialState)
-
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         views.toolbar.visibility = View.GONE
diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
index 347dcdc410..0d75bb7ecb 100644
--- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
@@ -16,16 +16,14 @@
 
 package im.vector.app.features.createdirect
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.mvrx.runCatchingToAsync
 import im.vector.app.core.platform.VectorViewModel
@@ -45,21 +43,11 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
     VectorViewModel<CreateDirectRoomViewState, CreateDirectRoomAction, CreateDirectRoomViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: CreateDirectRoomViewState): CreateDirectRoomViewModel
+    interface Factory: MavericksAssistedViewModelFactory<CreateDirectRoomViewModel,CreateDirectRoomViewState> {
+        override fun create(state: CreateDirectRoomViewState): CreateDirectRoomViewModel
     }
 
-    companion object : MavericksViewModelFactory<CreateDirectRoomViewModel, CreateDirectRoomViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: CreateDirectRoomViewState): CreateDirectRoomViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<CreateDirectRoomViewModel, CreateDirectRoomViewState> by hiltMavericksViewModelFactory()
 
     override fun handle(action: CreateDirectRoomAction) {
         when (action) {
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupManageActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupManageActivity.kt
index 716f02369a..29d513ced0 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupManageActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupManageActivity.kt
@@ -40,7 +40,6 @@ class KeysBackupManageActivity : SimpleFragmentActivity() {
     override fun getTitleRes() = R.string.encryption_message_recovery
 
     private val viewModel: KeysBackupSettingsViewModel by viewModel()
-    @Inject lateinit var keysBackupSettingsViewModelFactory: KeysBackupSettingsViewModel.Factory
 
     override fun injectWith(injector: ScreenComponent) {
         super.injectWith(injector)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsViewModel.kt
index 6814b376c2..08d118c403 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsViewModel.kt
@@ -15,16 +15,16 @@
  */
 package im.vector.app.features.crypto.keysbackup.settings
 
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Fail
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
 import com.airbnb.mvrx.Uninitialized
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
 import org.matrix.android.sdk.api.MatrixCallback
@@ -41,18 +41,11 @@ class KeysBackupSettingsViewModel @AssistedInject constructor(@Assisted initialS
         KeysBackupStateListener {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: KeysBackupSettingViewState): KeysBackupSettingsViewModel
+    interface Factory: MavericksAssistedViewModelFactory<KeysBackupSettingsViewModel,KeysBackupSettingViewState> {
+        override fun create(state: KeysBackupSettingViewState): KeysBackupSettingsViewModel
     }
 
-    companion object : MavericksViewModelFactory<KeysBackupSettingsViewModel, KeysBackupSettingViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: KeysBackupSettingViewState): KeysBackupSettingsViewModel? {
-            val activity: KeysBackupManageActivity = (viewModelContext as ActivityViewModelContext).activity()
-            return activity.keysBackupSettingsViewModelFactory.create(state)
-        }
-    }
+    companion object : MavericksViewModelFactory<KeysBackupSettingsViewModel, KeysBackupSettingViewState> by hiltMavericksViewModelFactory()
 
     private val keysBackupService: KeysBackupService = session.cryptoService().keysBackupService()
 
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt
index bd7195ad1e..ad3e28c715 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt
@@ -52,7 +52,6 @@ class SharedSecureStorageActivity :
     ) : Parcelable
 
     private val viewModel: SharedSecureStorageViewModel by viewModel()
-    @Inject lateinit var viewModelFactory: SharedSecureStorageViewModel.Factory
     @Inject lateinit var errorFormatter: ErrorFormatter
 
     override fun injectWith(injector: ScreenComponent) {
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
index bb4d4ce99a..b93dac7c8c 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
@@ -29,6 +29,8 @@ import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.R
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.core.platform.WaitingViewData
@@ -54,8 +56,18 @@ data class SharedSecureStorageViewState(
         val step: Step = Step.EnterPassphrase,
         val activeDeviceCount: Int = 0,
         val showResetAllAction: Boolean = false,
-        val userId: String = ""
+        val userId: String = "",
+        val keyId: String?,
+        val requestedSecrets: List<String>,
+        val resultKeyStoreAlias: String
 ) : MavericksState {
+
+    constructor(args: SharedSecureStorageActivity.Args): this(
+            keyId = args.keyId,
+            requestedSecrets = args.requestedSecrets,
+            resultKeyStoreAlias = args.resultKeyStoreAlias
+    )
+
     enum class Step {
         EnterPassphrase,
         EnterKey,
@@ -64,22 +76,21 @@ data class SharedSecureStorageViewState(
 }
 
 class SharedSecureStorageViewModel @AssistedInject constructor(
-        @Assisted initialState: SharedSecureStorageViewState,
-        @Assisted val args: SharedSecureStorageActivity.Args,
+        @Assisted private val initialState: SharedSecureStorageViewState,
         private val stringProvider: StringProvider,
         private val session: Session) :
     VectorViewModel<SharedSecureStorageViewState, SharedSecureStorageAction, SharedSecureStorageViewEvent>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SharedSecureStorageViewState, args: SharedSecureStorageActivity.Args): SharedSecureStorageViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SharedSecureStorageViewModel,SharedSecureStorageViewState> {
+        override fun create(state: SharedSecureStorageViewState): SharedSecureStorageViewModel
     }
 
     init {
         setState {
             copy(userId = session.myUserId)
         }
-        val isValid = session.sharedSecretStorageService.checkShouldBeAbleToAccessSecrets(args.requestedSecrets, args.keyId) is IntegrityResult.Success
+        val isValid = session.sharedSecretStorageService.checkShouldBeAbleToAccessSecrets(initialState.requestedSecrets, initialState.keyId) is IntegrityResult.Success
         if (!isValid) {
             _viewEvents.post(
                     SharedSecureStorageViewEvent.Error(
@@ -88,7 +99,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
                     )
             )
         }
-        val keyResult = args.keyId?.let { session.sharedSecretStorageService.getKey(it) }
+        val keyResult = initialState.keyId?.let { session.sharedSecretStorageService.getKey(it) }
                 ?: session.sharedSecretStorageService.getDefaultKey()
 
         if (!keyResult.isSuccess()) {
@@ -218,7 +229,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
                 }
 
                 withContext(Dispatchers.IO) {
-                    args.requestedSecrets.forEach {
+                    initialState.requestedSecrets.forEach {
                         if (session.accountDataService().getUserAccountDataEvent(it) != null) {
                             val res = session.sharedSecretStorageService.getSecret(
                                     name = it,
@@ -235,7 +246,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
                 _viewEvents.post(SharedSecureStorageViewEvent.HideModalLoading)
                 val safeForIntentCypher = ByteArrayOutputStream().also {
                     it.use {
-                        session.securelyStoreObject(decryptedSecretMap as Map<String, String>, args.resultKeyStoreAlias, it)
+                        session.securelyStoreObject(decryptedSecretMap as Map<String, String>, initialState.resultKeyStoreAlias, it)
                     }
                 }.toByteArray().toBase64NoPadding()
                 _viewEvents.post(SharedSecureStorageViewEvent.FinishSuccess(safeForIntentCypher))
@@ -287,7 +298,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
                 )
 
                 withContext(Dispatchers.IO) {
-                    args.requestedSecrets.forEach {
+                    initialState.requestedSecrets.forEach {
                         if (session.accountDataService().getUserAccountDataEvent(it) != null) {
                             val res = session.sharedSecretStorageService.getSecret(
                                     name = it,
@@ -304,7 +315,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
                 _viewEvents.post(SharedSecureStorageViewEvent.HideModalLoading)
                 val safeForIntentCypher = ByteArrayOutputStream().also {
                     it.use {
-                        session.securelyStoreObject(decryptedSecretMap as Map<String, String>, args.resultKeyStoreAlias, it)
+                        session.securelyStoreObject(decryptedSecretMap as Map<String, String>, initialState.resultKeyStoreAlias, it)
                     }
                 }.toByteArray().toBase64NoPadding()
                 _viewEvents.post(SharedSecureStorageViewEvent.FinishSuccess(safeForIntentCypher))
@@ -320,13 +331,5 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
         _viewEvents.post(SharedSecureStorageViewEvent.Dismiss)
     }
 
-    companion object : MavericksViewModelFactory<SharedSecureStorageViewModel, SharedSecureStorageViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: SharedSecureStorageViewState): SharedSecureStorageViewModel? {
-            val activity: SharedSecureStorageActivity = viewModelContext.activity()
-            val args: SharedSecureStorageActivity.Args = activity.intent.getParcelableExtra(Mavericks.KEY_ARG) ?: error("Missing args")
-            return activity.viewModelFactory.create(state, args)
-        }
-    }
+    companion object : MavericksViewModelFactory<SharedSecureStorageViewModel, SharedSecureStorageViewState> by hiltMavericksViewModelFactory()
 }
diff --git a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt
index 2686722c6e..31880a66ab 100644
--- a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt
@@ -45,10 +45,8 @@ import kotlinx.parcelize.Parcelize
 import org.billcarsonfr.jsonviewer.JSonViewerFragment
 import javax.inject.Inject
 
-class RoomDevToolActivity : SimpleFragmentActivity(), RoomDevToolViewModel.Factory,
-        FragmentManager.OnBackStackChangedListener {
+class RoomDevToolActivity : SimpleFragmentActivity(), FragmentManager.OnBackStackChangedListener {
 
-    @Inject lateinit var viewModelFactory: RoomDevToolViewModel.Factory
     @Inject lateinit var colorProvider: ColorProvider
 
     //    private lateinit var viewModel: RoomDevToolViewModel
@@ -70,10 +68,6 @@ class RoomDevToolActivity : SimpleFragmentActivity(), RoomDevToolViewModel.Facto
         injector.inject(this)
     }
 
-    override fun create(initialState: RoomDevToolViewState): RoomDevToolViewModel {
-        return viewModelFactory.create(initialState)
-    }
-
     override fun initUiAndData() {
         super.initUiAndData()
         viewModel.subscribe(this) {
diff --git a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolViewModel.kt b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolViewModel.kt
index 023d1976c9..b17bb1d2b1 100644
--- a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolViewModel.kt
@@ -16,19 +16,17 @@
 
 package im.vector.app.features.devtools
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.ViewModelContext
 import com.squareup.moshi.Types
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.R
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.error.ErrorFormatter
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.core.resources.StringProvider
@@ -51,21 +49,11 @@ class RoomDevToolViewModel @AssistedInject constructor(
 ) : VectorViewModel<RoomDevToolViewState, RoomDevToolAction, DevToolsViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: RoomDevToolViewState): RoomDevToolViewModel
+    interface Factory : MavericksAssistedViewModelFactory<RoomDevToolViewModel, RoomDevToolViewState> {
+        override fun create(state: RoomDevToolViewState): RoomDevToolViewModel
     }
 
-    companion object : MavericksViewModelFactory<RoomDevToolViewModel, RoomDevToolViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: RoomDevToolViewState): RoomDevToolViewModel {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<RoomDevToolViewModel, RoomDevToolViewState> by hiltMavericksViewModelFactory()
 
     init {
         session.getRoom(initialState.roomId)
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
index ff1154acc3..9894912884 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
@@ -95,9 +95,7 @@ class HomeActivity :
         VectorBaseActivity<ActivityHomeBinding>(),
         ToolbarConfigurable,
         UnknownDeviceDetectorSharedViewModel.Factory,
-        ServerBackupStatusViewModel.Factory,
         UnreadMessagesSharedViewModel.Factory,
-        PromoteRestrictedViewModel.Factory,
         NavigationInterceptor,
         SpaceInviteBottomSheet.InteractionListener,
         MatrixToBottomSheet.InteractionListener {
@@ -108,8 +106,6 @@ class HomeActivity :
     @Inject lateinit var viewModelFactory: HomeActivityViewModel.Factory
 
     private val serverBackupStatusViewModel: ServerBackupStatusViewModel by viewModel()
-    @Inject lateinit var serverBackupviewModelFactory: ServerBackupStatusViewModel.Factory
-    @Inject lateinit var promoteRestrictedViewModelFactory: PromoteRestrictedViewModel.Factory
     private val promoteRestrictedViewModel: PromoteRestrictedViewModel by viewModel()
 
     @Inject lateinit var activeSessionHolder: ActiveSessionHolder
@@ -183,10 +179,6 @@ class HomeActivity :
         return unknownDeviceViewModelFactory.create(initialState)
     }
 
-    override fun create(initialState: ServerBackupStatusViewState): ServerBackupStatusViewModel {
-        return serverBackupviewModelFactory.create(initialState)
-    }
-
     override fun create(initialState: UnreadMessagesState): UnreadMessagesSharedViewModel {
         return unreadMessagesSharedViewModelFactory.create(initialState)
     }
@@ -590,8 +582,6 @@ class HomeActivity :
         }
     }
 
-    override fun create(initialState: ActiveSpaceViewState) = promoteRestrictedViewModelFactory.create(initialState)
-
     override fun mxToBottomSheetNavigateToRoom(roomId: String) {
         navigator.openRoom(this, roomId)
     }
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
index c8fff5605b..5ea4855bbe 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
@@ -65,7 +65,6 @@ import javax.inject.Inject
 
 class HomeDetailFragment @Inject constructor(
         val homeDetailViewModelFactory: HomeDetailViewModel.Factory,
-        private val serverBackupStatusViewModelFactory: ServerBackupStatusViewModel.Factory,
         private val avatarRenderer: AvatarRenderer,
         private val colorProvider: ColorProvider,
         private val alertManager: PopupAlertManager,
@@ -74,8 +73,7 @@ class HomeDetailFragment @Inject constructor(
         private val appStateHandler: AppStateHandler
 ) : VectorBaseFragment<FragmentHomeDetailBinding>(),
         KeysBackupBanner.Delegate,
-        CurrentCallsView.Callback,
-        ServerBackupStatusViewModel.Factory {
+        CurrentCallsView.Callback {
 
     private val viewModel: HomeDetailViewModel by fragmentViewModel()
     private val unknownDeviceDetectorSharedViewModel: UnknownDeviceDetectorSharedViewModel by activityViewModel()
@@ -504,7 +502,4 @@ class HomeDetailFragment @Inject constructor(
         return this
     }
 
-    override fun create(initialState: ServerBackupStatusViewState): ServerBackupStatusViewModel {
-        return serverBackupStatusViewModelFactory.create(initialState)
-    }
 }
diff --git a/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt
index 0c8c9e480c..af6a226198 100644
--- a/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt
@@ -27,6 +27,8 @@ import dagger.assisted.AssistedInject
 import im.vector.app.AppStateHandler
 import im.vector.app.RoomGroupingMethod
 import im.vector.app.core.di.ActiveSessionHolder
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.EmptyAction
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
@@ -72,21 +74,11 @@ class PromoteRestrictedViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: ActiveSpaceViewState): PromoteRestrictedViewModel
+    interface Factory: MavericksAssistedViewModelFactory<PromoteRestrictedViewModel,ActiveSpaceViewState> {
+        override fun create(state: ActiveSpaceViewState): PromoteRestrictedViewModel
     }
 
-    companion object : MavericksViewModelFactory<PromoteRestrictedViewModel, ActiveSpaceViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: ActiveSpaceViewState): PromoteRestrictedViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<PromoteRestrictedViewModel, ActiveSpaceViewState> by hiltMavericksViewModelFactory()
 
     override fun handle(action: EmptyAction) {}
 }
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt
index 76c3816ce6..24d7e13b79 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt
@@ -48,7 +48,6 @@ class RoomDetailActivity :
         VectorBaseActivity<ActivityRoomDetailBinding>(),
         ToolbarConfigurable,
         RequireActiveMembershipViewModel.Factory,
-        RoomWidgetPermissionViewModel.Factory,
         MatrixToBottomSheet.InteractionListener {
 
     override fun getBinding(): ActivityRoomDetailBinding {
@@ -85,12 +84,6 @@ class RoomDetailActivity :
         return requireActiveMembershipViewModelFactory.create(initialState.copy(roomId = currentRoomId ?: ""))
     }
 
-    @Inject
-    lateinit var permissionsViewModelFactory: RoomWidgetPermissionViewModel.Factory
-    override fun create(initialState: RoomWidgetPermissionViewState): RoomWidgetPermissionViewModel {
-        return permissionsViewModelFactory.create(initialState)
-    }
-
     override fun injectWith(injector: ScreenComponent) {
         injector.inject(this)
     }
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsBottomSheet.kt
index 81ebd6d3de..356de36294 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsBottomSheet.kt
@@ -44,7 +44,6 @@ class ViewReactionsBottomSheet :
 
     private val viewModel: ViewReactionsViewModel by fragmentViewModel(ViewReactionsViewModel::class)
 
-    @Inject lateinit var viewReactionsViewModelFactory: ViewReactionsViewModel.Factory
     private lateinit var sharedActionViewModel: MessageSharedActionViewModel
 
     @Inject lateinit var epoxyController: ViewReactionsEpoxyController
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt
index 5baab683cf..715b0130bf 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsViewModel.kt
@@ -27,6 +27,8 @@ import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.core.date.DateFormatKind
 import im.vector.app.core.date.VectorDateFormatter
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.EmptyAction
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
@@ -70,18 +72,11 @@ class ViewReactionsViewModel @AssistedInject constructor(@Assisted
             ?: throw IllegalStateException("Shouldn't use this ViewModel without a room")
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: DisplayReactionsViewState): ViewReactionsViewModel
+    interface Factory: MavericksAssistedViewModelFactory<ViewReactionsViewModel,DisplayReactionsViewState> {
+        override fun create(state: DisplayReactionsViewState): ViewReactionsViewModel
     }
 
-    companion object : MavericksViewModelFactory<ViewReactionsViewModel, DisplayReactionsViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: DisplayReactionsViewState): ViewReactionsViewModel? {
-            val fragment: ViewReactionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
-            return fragment.viewReactionsViewModelFactory.create(state)
-        }
-    }
+    companion object : MavericksViewModelFactory<ViewReactionsViewModel, DisplayReactionsViewState> by hiltMavericksViewModelFactory()
 
     init {
         observeEventAnnotationSummaries()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomBottomSheet.kt
index 2fa210a748..bd4092097a 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomBottomSheet.kt
@@ -37,8 +37,7 @@ import kotlinx.parcelize.Parcelize
 import javax.inject.Inject
 
 class MigrateRoomBottomSheet :
-        VectorBaseBottomSheetDialogFragment<BottomSheetRoomUpgradeBinding>(),
-        MigrateRoomViewModel.Factory {
+        VectorBaseBottomSheetDialogFragment<BottomSheetRoomUpgradeBinding>(){
 
     enum class MigrationReason {
         MANUAL,
@@ -53,9 +52,6 @@ class MigrateRoomBottomSheet :
             val customDescription: CharSequence? = null
     ) : Parcelable
 
-    @Inject
-    lateinit var viewModelFactory: MigrateRoomViewModel.Factory
-
     override val showExpanded = true
 
     @Inject
@@ -152,10 +148,6 @@ class MigrateRoomBottomSheet :
         }
     }
 
-    override fun create(initialState: MigrateRoomViewState): MigrateRoomViewModel {
-        return viewModelFactory.create(initialState)
-    }
-
     companion object {
 
         const val REQUEST_KEY = "MigrateRoomBottomSheetRequest"
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt
index bb28836cd3..94be14fe4d 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt
@@ -16,15 +16,14 @@
 
 package im.vector.app.features.home.room.detail.upgrade
 
-import com.airbnb.mvrx.ActivityViewModelContext
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.features.session.coroutineScope
@@ -51,20 +50,11 @@ class MigrateRoomViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: MigrateRoomViewState): MigrateRoomViewModel
+    interface Factory: MavericksAssistedViewModelFactory<MigrateRoomViewModel,MigrateRoomViewState> {
+        override fun create(state: MigrateRoomViewState): MigrateRoomViewModel
     }
 
-    companion object : MavericksViewModelFactory<MigrateRoomViewModel, MigrateRoomViewState> {
-
-        override fun create(viewModelContext: ViewModelContext, state: MigrateRoomViewState): MigrateRoomViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<MigrateRoomViewModel, MigrateRoomViewState> by hiltMavericksViewModelFactory()
 
     override fun handle(action: MigrateRoomAction) {
         when (action) {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt
index 8c1bdc086f..ac667fb5fe 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt
@@ -62,7 +62,6 @@ class RoomListQuickActionsBottomSheet :
 
     private lateinit var sharedActionViewModel: RoomListQuickActionsSharedActionViewModel
     @Inject lateinit var sharedViewPool: RecyclerView.RecycledViewPool
-    @Inject lateinit var roomNotificationSettingsViewModelFactory: RoomNotificationSettingsViewModel.Factory
     @Inject lateinit var roomListActionsEpoxyController: RoomListQuickActionsEpoxyController
     @Inject lateinit var navigator: Navigator
     @Inject lateinit var errorFormatter: ErrorFormatter
diff --git a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
index dd07319e9f..0aaa5b9834 100644
--- a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
@@ -53,13 +53,11 @@ import javax.inject.Inject
 @Parcelize
 data class InviteUsersToRoomArgs(val roomId: String) : Parcelable
 
-class InviteUsersToRoomActivity : SimpleFragmentActivity(), UserListViewModel.Factory, ContactsBookViewModel.Factory, InviteUsersToRoomViewModel.Factory {
+class InviteUsersToRoomActivity : SimpleFragmentActivity(), InviteUsersToRoomViewModel.Factory {
 
     private val viewModel: InviteUsersToRoomViewModel by viewModel()
     private lateinit var sharedActionViewModel: UserListSharedActionViewModel
-    @Inject lateinit var userListViewModelFactory: UserListViewModel.Factory
     @Inject lateinit var inviteUsersToRoomViewModelFactory: InviteUsersToRoomViewModel.Factory
-    @Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
     @Inject lateinit var errorFormatter: ErrorFormatter
 
     override fun injectWith(injector: ScreenComponent) {
@@ -67,10 +65,6 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity(), UserListViewModel.Fa
         injector.inject(this)
     }
 
-    override fun create(initialState: UserListViewState) = userListViewModelFactory.create(initialState)
-
-    override fun create(initialState: ContactsBookViewState) = contactsBookViewModelFactory.create(initialState)
-
     override fun create(initialState: InviteUsersToRoomViewState) = inviteUsersToRoomViewModelFactory.create(initialState)
 
     override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt
index a32a3a897f..2707b87c1f 100644
--- a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt
@@ -39,8 +39,7 @@ import im.vector.app.features.roomdirectory.RoomDirectoryViewModel
 import timber.log.Timber
 import javax.inject.Inject
 
-class RoomDirectoryPickerFragment @Inject constructor(val roomDirectoryPickerViewModelFactory: RoomDirectoryPickerViewModel.Factory,
-                                                      private val roomDirectoryPickerController: RoomDirectoryPickerController
+class RoomDirectoryPickerFragment @Inject constructor(private val roomDirectoryPickerController: RoomDirectoryPickerController
 ) : VectorBaseFragment<FragmentRoomDirectoryPickerBinding>(),
         OnBackPressed,
         RoomDirectoryPickerController.Callback {
diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt
index 3f73b80bc6..019afafa20 100644
--- a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt
@@ -16,7 +16,6 @@
 
 package im.vector.app.features.roomdirectory.picker
 
-import androidx.lifecycle.viewModelScope
 import com.airbnb.mvrx.Fail
 import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
@@ -28,6 +27,8 @@ import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.R
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
@@ -46,18 +47,11 @@ class RoomDirectoryPickerViewModel @AssistedInject constructor(
 ) : VectorViewModel<RoomDirectoryPickerViewState, RoomDirectoryPickerAction, EmptyViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: RoomDirectoryPickerViewState): RoomDirectoryPickerViewModel
+    interface Factory: MavericksAssistedViewModelFactory<RoomDirectoryPickerViewModel,RoomDirectoryPickerViewState> {
+        override fun create(state: RoomDirectoryPickerViewState): RoomDirectoryPickerViewModel
     }
 
-    companion object : MavericksViewModelFactory<RoomDirectoryPickerViewModel, RoomDirectoryPickerViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: RoomDirectoryPickerViewState): RoomDirectoryPickerViewModel? {
-            val fragment: RoomDirectoryPickerFragment = (viewModelContext as FragmentViewModelContext).fragment()
-            return fragment.roomDirectoryPickerViewModelFactory.create(state)
-        }
-    }
+    companion object : MavericksViewModelFactory<RoomDirectoryPickerViewModel, RoomDirectoryPickerViewState> by hiltMavericksViewModelFactory()
 
     init {
         observeAndCompute()
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/notifications/RoomNotificationSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/notifications/RoomNotificationSettingsViewModel.kt
index f91b482b13..c83a069250 100644
--- a/vector/src/main/java/im/vector/app/features/roomprofile/notifications/RoomNotificationSettingsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/notifications/RoomNotificationSettingsViewModel.kt
@@ -16,16 +16,14 @@
 
 package im.vector.app.features.roomprofile.notifications
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
-import im.vector.app.features.home.room.list.actions.RoomListQuickActionsBottomSheet
 import kotlinx.coroutines.launch
 import org.matrix.android.sdk.api.session.Session
 import org.matrix.android.sdk.flow.flow
@@ -37,24 +35,11 @@ class RoomNotificationSettingsViewModel @AssistedInject constructor(
 ) : VectorViewModel<RoomNotificationSettingsViewState, RoomNotificationSettingsAction, RoomNotificationSettingsViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: RoomNotificationSettingsViewState): RoomNotificationSettingsViewModel
+    interface Factory: MavericksAssistedViewModelFactory<RoomNotificationSettingsViewModel,RoomNotificationSettingsViewState> {
+       override fun create(state: RoomNotificationSettingsViewState): RoomNotificationSettingsViewModel
     }
 
-    companion object : MavericksViewModelFactory<RoomNotificationSettingsViewModel, RoomNotificationSettingsViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: RoomNotificationSettingsViewState): RoomNotificationSettingsViewModel {
-            val fragmentModelContext = (viewModelContext as FragmentViewModelContext)
-            return if (fragmentModelContext.fragment is RoomNotificationSettingsFragment) {
-                val fragment: RoomNotificationSettingsFragment = fragmentModelContext.fragment()
-                fragment.viewModelFactory.create(state)
-            } else {
-                val fragment: RoomListQuickActionsBottomSheet = fragmentModelContext.fragment()
-                fragment.roomNotificationSettingsViewModelFactory.create(state)
-            }
-        }
-    }
+    companion object : MavericksViewModelFactory<RoomNotificationSettingsViewModel, RoomNotificationSettingsViewState> by hiltMavericksViewModelFactory()
 
     private val room = session.getRoom(initialState.roomId)!!
 
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
index 91213809de..abfeab9504 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
@@ -28,6 +28,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.core.platform.VectorViewModelAction
 import kotlinx.coroutines.launch
@@ -49,18 +51,11 @@ class IgnoredUsersViewModel @AssistedInject constructor(@Assisted initialState:
     VectorViewModel<IgnoredUsersViewState, IgnoredUsersAction, IgnoredUsersViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: IgnoredUsersViewState): IgnoredUsersViewModel
+    interface Factory: MavericksAssistedViewModelFactory<IgnoredUsersViewModel,IgnoredUsersViewState> {
+        override fun create(state: IgnoredUsersViewState): IgnoredUsersViewModel
     }
 
-    companion object : MavericksViewModelFactory<IgnoredUsersViewModel, IgnoredUsersViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: IgnoredUsersViewState): IgnoredUsersViewModel? {
-            val ignoredUsersFragment: VectorSettingsIgnoredUsersFragment = (viewModelContext as FragmentViewModelContext).fragment()
-            return ignoredUsersFragment.ignoredUsersViewModelFactory.create(state)
-        }
-    }
+    companion object : MavericksViewModelFactory<IgnoredUsersViewModel, IgnoredUsersViewState> by hiltMavericksViewModelFactory()
 
     init {
         observeIgnoredUsers()
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
index 1526ac0e69..509014492d 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
@@ -36,7 +36,6 @@ import im.vector.app.databinding.FragmentGenericRecyclerBinding
 import javax.inject.Inject
 
 class VectorSettingsIgnoredUsersFragment @Inject constructor(
-        val ignoredUsersViewModelFactory: IgnoredUsersViewModel.Factory,
         private val ignoredUsersController: IgnoredUsersController
 ) : VectorBaseFragment<FragmentGenericRecyclerBinding>(),
         IgnoredUsersController.Callback {
diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt
index 1844e8e9ca..4c86c4d554 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt
@@ -41,9 +41,7 @@ import im.vector.app.features.spaces.create.SpaceTopology
 import im.vector.app.features.spaces.create.SpaceType
 import javax.inject.Inject
 
-class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Factory {
-
-    @Inject lateinit var viewModelFactory: CreateSpaceViewModel.Factory
+class SpaceCreationActivity : SimpleFragmentActivity(){
 
     override fun injectWith(injector: ScreenComponent) {
         super.injectWith(injector)
@@ -188,5 +186,4 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac
         }
     }
 
-    override fun create(initialState: CreateSpaceState): CreateSpaceViewModel = viewModelFactory.create(initialState)
 }
diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceExploreActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceExploreActivity.kt
index 47e4c6420b..675dc08716 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/SpaceExploreActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceExploreActivity.kt
@@ -37,9 +37,7 @@ import im.vector.app.features.spaces.explore.SpaceDirectoryViewEvents
 import im.vector.app.features.spaces.explore.SpaceDirectoryViewModel
 import javax.inject.Inject
 
-class SpaceExploreActivity : VectorBaseActivity<ActivitySimpleBinding>(), SpaceDirectoryViewModel.Factory, MatrixToBottomSheet.InteractionListener {
-
-    @Inject lateinit var spaceDirectoryViewModelFactory: SpaceDirectoryViewModel.Factory
+class SpaceExploreActivity : VectorBaseActivity<ActivitySimpleBinding>(), MatrixToBottomSheet.InteractionListener {
 
     override fun injectWith(injector: ScreenComponent) {
         injector.inject(this)
@@ -113,9 +111,6 @@ class SpaceExploreActivity : VectorBaseActivity<ActivitySimpleBinding>(), SpaceD
         }
     }
 
-    override fun create(initialState: SpaceDirectoryState): SpaceDirectoryViewModel =
-            spaceDirectoryViewModelFactory.create(initialState)
-
     override fun mxToBottomSheetNavigateToRoom(roomId: String) {
         navigator.openRoom(this, roomId)
     }
diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt
index 34cc72b03f..e9e6f1c0d4 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt
@@ -16,10 +16,7 @@
 
 package im.vector.app.features.spaces.create
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
@@ -29,6 +26,8 @@ import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.R
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.error.ErrorFormatter
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.extensions.isEmail
@@ -76,8 +75,8 @@ class CreateSpaceViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: CreateSpaceState): CreateSpaceViewModel
+    interface Factory: MavericksAssistedViewModelFactory<CreateSpaceViewModel,CreateSpaceState> {
+        override fun create(state: CreateSpaceState): CreateSpaceViewModel
     }
 
     private fun startListenToIdentityManager() {
@@ -93,17 +92,9 @@ class CreateSpaceViewModel @AssistedInject constructor(
         super.onCleared()
     }
 
-    companion object : MavericksViewModelFactory<CreateSpaceViewModel, CreateSpaceState> {
+    companion object : MavericksViewModelFactory<CreateSpaceViewModel, CreateSpaceState> by hiltMavericksViewModelFactory(){
 
-        override fun create(viewModelContext: ViewModelContext, state: CreateSpaceState): CreateSpaceViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-
-        override fun initialState(viewModelContext: ViewModelContext): CreateSpaceState? {
+        override fun initialState(viewModelContext: ViewModelContext): CreateSpaceState {
             return CreateSpaceState(
                     defaultRooms = mapOf(
                             0 to viewModelContext.activity.getString(R.string.create_spaces_default_public_room_name),
diff --git a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt
index 5e2537f587..b3bfed5cba 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/explore/SpaceDirectoryViewModel.kt
@@ -16,17 +16,16 @@
 
 package im.vector.app.features.spaces.explore
 
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
 import com.airbnb.mvrx.Uninitialized
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
 import kotlinx.coroutines.Dispatchers
@@ -52,19 +51,11 @@ class SpaceDirectoryViewModel @AssistedInject constructor(
 ) : VectorViewModel<SpaceDirectoryState, SpaceDirectoryViewAction, SpaceDirectoryViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SpaceDirectoryState): SpaceDirectoryViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SpaceDirectoryViewModel,SpaceDirectoryState> {
+        override fun create(state: SpaceDirectoryState): SpaceDirectoryViewModel
     }
 
-    companion object : MavericksViewModelFactory<SpaceDirectoryViewModel, SpaceDirectoryState> {
-        override fun create(viewModelContext: ViewModelContext, state: SpaceDirectoryState): SpaceDirectoryViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<SpaceDirectoryViewModel, SpaceDirectoryState> by hiltMavericksViewModelFactory()
 
     init {
 
diff --git a/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheet.kt
index 4f8d0b6c2f..9aec9edeaa 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheet.kt
@@ -43,7 +43,7 @@ import kotlinx.parcelize.Parcelize
 import org.matrix.android.sdk.api.util.toMatrixItem
 import javax.inject.Inject
 
-class SpaceInviteBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetInvitedToSpaceBinding>(), SpaceInviteBottomSheetViewModel.Factory {
+class SpaceInviteBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetInvitedToSpaceBinding>() {
 
     interface InteractionListener {
         fun spaceInviteBottomSheetOnAccept(spaceId: String)
@@ -65,10 +65,6 @@ class SpaceInviteBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetIn
 
     private val viewModel: SpaceInviteBottomSheetViewModel by fragmentViewModel(SpaceInviteBottomSheetViewModel::class)
 
-    @Inject lateinit var viewModelFactory: SpaceInviteBottomSheetViewModel.Factory
-
-    override fun create(initialState: SpaceInviteBottomSheetState) = viewModelFactory.create(initialState)
-
     override fun injectWith(injector: ScreenComponent) {
         injector.inject(this)
     }
diff --git a/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt
index 00fb6c4054..d28b3cc9e9 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt
@@ -28,6 +28,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.error.ErrorFormatter
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.features.session.coroutineScope
@@ -93,20 +95,11 @@ class SpaceInviteBottomSheetViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SpaceInviteBottomSheetState): SpaceInviteBottomSheetViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SpaceInviteBottomSheetViewModel,SpaceInviteBottomSheetState> {
+        override fun create(state: SpaceInviteBottomSheetState): SpaceInviteBottomSheetViewModel
     }
 
-    companion object : MavericksViewModelFactory<SpaceInviteBottomSheetViewModel, SpaceInviteBottomSheetState> {
-
-        override fun create(viewModelContext: ViewModelContext, state: SpaceInviteBottomSheetState): SpaceInviteBottomSheetViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<SpaceInviteBottomSheetViewModel, SpaceInviteBottomSheetState> by hiltMavericksViewModelFactory()
 
     override fun handle(action: SpaceInviteBottomSheetAction) {
         when (action) {
diff --git a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedActivity.kt
index 762abf10cb..de3456863c 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedActivity.kt
@@ -41,18 +41,14 @@ import im.vector.app.features.spaces.SpaceBottomSheetSettingsArgs
 import javax.inject.Inject
 
 class SpaceLeaveAdvancedActivity : VectorBaseActivity<ActivitySimpleLoadingBinding>(),
-        SpaceLeaveAdvancedViewModel.Factory,
         ToolbarConfigurable {
 
     override fun getBinding(): ActivitySimpleLoadingBinding = ActivitySimpleLoadingBinding.inflate(layoutInflater)
 
     val leaveViewModel: SpaceLeaveAdvancedViewModel by viewModel()
 
-    @Inject lateinit var viewModelFactory: SpaceLeaveAdvancedViewModel.Factory
     @Inject lateinit var errorFormatter: ErrorFormatter
 
-    override fun create(initialState: SpaceLeaveAdvanceViewState) = viewModelFactory.create(initialState)
-
     override fun injectWith(injector: ScreenComponent) {
         super.injectWith(injector)
         injector.inject(this)
diff --git a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt
index 3d24cf6225..aeca13d1cf 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/leave/SpaceLeaveAdvancedViewModel.kt
@@ -16,18 +16,17 @@
 
 package im.vector.app.features.spaces.leave
 
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
 import com.airbnb.mvrx.Uninitialized
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.AppStateHandler
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
 import kotlinx.coroutines.flow.launchIn
@@ -127,17 +126,9 @@ class SpaceLeaveAdvancedViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SpaceLeaveAdvanceViewState): SpaceLeaveAdvancedViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SpaceLeaveAdvancedViewModel, SpaceLeaveAdvanceViewState> {
+        override fun create(state: SpaceLeaveAdvanceViewState): SpaceLeaveAdvancedViewModel
     }
 
-    companion object : MavericksViewModelFactory<SpaceLeaveAdvancedViewModel, SpaceLeaveAdvanceViewState> {
-        override fun create(viewModelContext: ViewModelContext, state: SpaceLeaveAdvanceViewState): SpaceLeaveAdvancedViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<SpaceLeaveAdvancedViewModel, SpaceLeaveAdvanceViewState> by hiltMavericksViewModelFactory()
 }
diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt
index 0512a478a1..5dbd35fc20 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt
@@ -44,9 +44,8 @@ class SpaceAddRoomFragment @Inject constructor(
         private val spaceEpoxyController: AddRoomListController,
         private val roomEpoxyController: AddRoomListController,
         private val dmEpoxyController: AddRoomListController,
-        private val viewModelFactory: SpaceAddRoomsViewModel.Factory
 ) : VectorBaseFragment<FragmentSpaceAddRoomsBinding>(),
-        OnBackPressed, AddRoomListController.Listener, SpaceAddRoomsViewModel.Factory {
+        OnBackPressed, AddRoomListController.Listener {
 
     override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) =
             FragmentSpaceAddRoomsBinding.inflate(layoutInflater, container, false)
@@ -55,9 +54,6 @@ class SpaceAddRoomFragment @Inject constructor(
 
     private val sharedViewModel: SpaceManageSharedViewModel by activityViewModel()
 
-    override fun create(initialState: SpaceAddRoomsState): SpaceAddRoomsViewModel =
-            viewModelFactory.create(initialState)
-
     override fun getMenuRes(): Int = R.menu.menu_space_add_room
 
     private var saveNeeded = false
diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt
index bf062ce0a8..1ff8a321e5 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt
@@ -29,6 +29,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
@@ -55,10 +57,12 @@ class SpaceAddRoomsViewModel @AssistedInject constructor(
 ) : VectorViewModel<SpaceAddRoomsState, SpaceAddRoomActions, SpaceAddRoomsViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SpaceAddRoomsState): SpaceAddRoomsViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SpaceAddRoomsViewModel,SpaceAddRoomsState> {
+        override fun create(state: SpaceAddRoomsState): SpaceAddRoomsViewModel
     }
 
+    companion object : MavericksViewModelFactory<SpaceAddRoomsViewModel, SpaceAddRoomsState> by hiltMavericksViewModelFactory()
+
     val updatableLiveSpacePageResult: UpdatableLivePageResult by lazy {
         session.getFilteredPagedRoomSummariesLive(
                 roomSummaryQueryParams {
@@ -132,16 +136,6 @@ class SpaceAddRoomsViewModel @AssistedInject constructor(
         }
     }
 
-    companion object : MavericksViewModelFactory<SpaceAddRoomsViewModel, SpaceAddRoomsState> {
-        override fun create(viewModelContext: ViewModelContext, state: SpaceAddRoomsState): SpaceAddRoomsViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
-
     fun canGoBack(): Boolean {
         val needToSave = selectionList.values.any { it }
         if (needToSave) {
diff --git a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleFragment.kt
index e1629d5dc1..b53845c09a 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleFragment.kt
@@ -44,13 +44,11 @@ import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 
 class SpacePeopleFragment @Inject constructor(
-        private val viewModelFactory: SpacePeopleViewModel.Factory,
         private val roomMemberModelFactory: RoomMemberListViewModel.Factory,
         private val drawableProvider: DrawableProvider,
         private val colorProvider: ColorProvider,
         private val epoxyController: SpacePeopleListController
 ) : VectorBaseFragment<FragmentRecyclerviewWithSearchBinding>(),
-        SpacePeopleViewModel.Factory,
         RoomMemberListViewModel.Factory,
         OnBackPressed, SpacePeopleListController.InteractionListener {
 
@@ -66,10 +64,6 @@ class SpacePeopleFragment @Inject constructor(
         return true
     }
 
-    override fun create(initialState: SpacePeopleViewState): SpacePeopleViewModel {
-        return viewModelFactory.create(initialState)
-    }
-
     override fun create(initialState: RoomMemberListViewState): RoomMemberListViewModel {
         return roomMemberModelFactory.create(initialState)
     }
diff --git a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt
index efa7d97e9c..bf77166a5c 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt
@@ -16,17 +16,15 @@
 
 package im.vector.app.features.spaces.people
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.features.raw.wellknown.getElementWellknown
@@ -44,19 +42,11 @@ class SpacePeopleViewModel @AssistedInject constructor(
 ) : VectorViewModel<SpacePeopleViewState, SpacePeopleViewAction, SpacePeopleViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SpacePeopleViewState): SpacePeopleViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SpacePeopleViewModel,SpacePeopleViewState> {
+        override fun create(state: SpacePeopleViewState): SpacePeopleViewModel
     }
 
-    companion object : MavericksViewModelFactory<SpacePeopleViewModel, SpacePeopleViewState> {
-        override fun create(viewModelContext: ViewModelContext, state: SpacePeopleViewState): SpacePeopleViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<SpacePeopleViewModel, SpacePeopleViewState> by hiltMavericksViewModelFactory()
 
     override fun handle(action: SpacePeopleViewAction) {
         when (action) {
diff --git a/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt
index eb02ed7c2d..7e08d7c924 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt
@@ -49,10 +49,9 @@ data class SpacePreviewArgs(
 ) : Parcelable
 
 class SpacePreviewFragment @Inject constructor(
-        private val viewModelFactory: SpacePreviewViewModel.Factory,
         private val avatarRenderer: AvatarRenderer,
         private val epoxyController: SpacePreviewController
-) : VectorBaseFragment<FragmentSpacePreviewBinding>(), SpacePreviewViewModel.Factory {
+) : VectorBaseFragment<FragmentSpacePreviewBinding>() {
 
     private val viewModel by fragmentViewModel(SpacePreviewViewModel::class)
     lateinit var sharedActionViewModel: SpacePreviewSharedActionViewModel
@@ -66,8 +65,6 @@ class SpacePreviewFragment @Inject constructor(
         sharedActionViewModel = activityViewModelProvider.get(SpacePreviewSharedActionViewModel::class.java)
     }
 
-    override fun create(initialState: SpacePreviewState) = viewModelFactory.create(initialState)
-
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
diff --git a/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewViewModel.kt
index d71a4bef46..ae69375ad6 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewViewModel.kt
@@ -28,6 +28,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.error.ErrorFormatter
 import im.vector.app.core.platform.VectorViewModel
 import kotlinx.coroutines.Dispatchers
@@ -58,19 +60,11 @@ class SpacePreviewViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SpacePreviewState): SpacePreviewViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SpacePreviewViewModel,SpacePreviewState> {
+        override fun create(state: SpacePreviewState): SpacePreviewViewModel
     }
 
-    companion object : MavericksViewModelFactory<SpacePreviewViewModel, SpacePreviewState> {
-        override fun create(viewModelContext: ViewModelContext, state: SpacePreviewState): SpacePreviewViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<SpacePreviewViewModel, SpacePreviewState> by hiltMavericksViewModelFactory()
 
     override fun handle(action: SpacePreviewViewAction) {
         when (action) {
diff --git a/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceBottomSheet.kt
index bd69de0d95..d32c121258 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceBottomSheet.kt
@@ -35,7 +35,7 @@ import im.vector.app.features.invite.InviteUsersToRoomActivity
 import kotlinx.parcelize.Parcelize
 import javax.inject.Inject
 
-class ShareSpaceBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetSpaceInviteBinding>(), ShareSpaceViewModel.Factory {
+class ShareSpaceBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetSpaceInviteBinding>(){
 
     @Parcelize
     data class Args(
@@ -47,10 +47,6 @@ class ShareSpaceBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSheetSpa
 
     private val viewModel: ShareSpaceViewModel by fragmentViewModel(ShareSpaceViewModel::class)
 
-    @Inject lateinit var viewModelFactory: ShareSpaceViewModel.Factory
-
-    override fun create(initialState: ShareSpaceViewState): ShareSpaceViewModel = viewModelFactory.create(initialState)
-
     override fun injectWith(injector: ScreenComponent) {
         injector.inject(this)
     }
diff --git a/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt
index d96cecbfbb..56de40a50a 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/share/ShareSpaceViewModel.kt
@@ -16,15 +16,14 @@
 
 package im.vector.app.features.spaces.share
 
-import com.airbnb.mvrx.ActivityViewModelContext
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
 import com.airbnb.mvrx.Uninitialized
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
 import kotlinx.coroutines.flow.launchIn
@@ -38,19 +37,11 @@ class ShareSpaceViewModel @AssistedInject constructor(
         private val session: Session) : VectorViewModel<ShareSpaceViewState, ShareSpaceAction, ShareSpaceViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: ShareSpaceViewState): ShareSpaceViewModel
+    interface Factory: MavericksAssistedViewModelFactory<ShareSpaceViewModel,ShareSpaceViewState> {
+        override fun create(state: ShareSpaceViewState): ShareSpaceViewModel
     }
 
-    companion object : MavericksViewModelFactory<ShareSpaceViewModel, ShareSpaceViewState> {
-        override fun create(viewModelContext: ViewModelContext, state: ShareSpaceViewState): ShareSpaceViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<ShareSpaceViewModel, ShareSpaceViewState> by hiltMavericksViewModelFactory()
 
     init {
         val roomSummary = session.getRoomSummary(initialState.spaceId)
diff --git a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt
index 02f25563b8..194084fe2d 100644
--- a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt
@@ -32,7 +32,6 @@ import javax.inject.Inject
 class ReviewTermsActivity : SimpleFragmentActivity() {
 
     @Inject lateinit var errorFormatter: ErrorFormatter
-    @Inject lateinit var viewModelFactory: ReviewTermsViewModel.Factory
 
     private val reviewTermsViewModel: ReviewTermsViewModel by viewModel()
 
diff --git a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt
index 6a46061a31..db46c55b7d 100644
--- a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt
@@ -15,16 +15,15 @@
  */
 package im.vector.app.features.terms
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.Loading
 import com.airbnb.mvrx.MavericksViewModelFactory
 import com.airbnb.mvrx.Success
 import com.airbnb.mvrx.Uninitialized
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.VectorViewModel
 import kotlinx.coroutines.launch
@@ -37,18 +36,11 @@ class ReviewTermsViewModel @AssistedInject constructor(
 ) : VectorViewModel<ReviewTermsViewState, ReviewTermsAction, ReviewTermsViewEvents>(initialState) {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: ReviewTermsViewState): ReviewTermsViewModel
+    interface Factory: MavericksAssistedViewModelFactory<ReviewTermsViewModel,ReviewTermsViewState> {
+        override fun create(state: ReviewTermsViewState): ReviewTermsViewModel
     }
 
-    companion object : MavericksViewModelFactory<ReviewTermsViewModel, ReviewTermsViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: ReviewTermsViewState): ReviewTermsViewModel? {
-            val activity: ReviewTermsActivity = (viewModelContext as ActivityViewModelContext).activity()
-            return activity.viewModelFactory.create(state)
-        }
-    }
+    companion object : MavericksViewModelFactory<ReviewTermsViewModel, ReviewTermsViewState> by hiltMavericksViewModelFactory()
 
     lateinit var termsArgs: ServiceTermsArgs
 
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
index db1bc3056a..a2c156d722 100644
--- a/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
@@ -41,11 +41,8 @@ import javax.inject.Inject
 import kotlin.reflect.KClass
 
 class UserCodeActivity : VectorBaseActivity<ActivitySimpleBinding>(),
-        UserCodeSharedViewModel.Factory,
         MatrixToBottomSheet.InteractionListener {
 
-    @Inject lateinit var viewModelFactory: UserCodeSharedViewModel.Factory
-
     val sharedViewModel: UserCodeSharedViewModel by viewModel()
 
     @Parcelize
@@ -147,9 +144,6 @@ class UserCodeActivity : VectorBaseActivity<ActivitySimpleBinding>(),
         }.exhaustive
     }
 
-    override fun create(initialState: UserCodeState) =
-            viewModelFactory.create(initialState)
-
     companion object {
         fun newIntent(context: Context, userId: String): Intent {
             return Intent(context, UserCodeActivity::class.java).apply {
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
index 2319eef6c4..7efbfd396e 100644
--- a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
@@ -16,15 +16,13 @@
 
 package im.vector.app.features.usercode
 
-import androidx.lifecycle.viewModelScope
-import com.airbnb.mvrx.ActivityViewModelContext
-import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.MavericksViewModelFactory
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.R
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.core.resources.StringProvider
 import im.vector.app.features.createdirect.DirectRoomHelper
@@ -45,15 +43,7 @@ class UserCodeSharedViewModel @AssistedInject constructor(
         private val directRoomHelper: DirectRoomHelper,
         private val rawService: RawService) : VectorViewModel<UserCodeState, UserCodeActions, UserCodeShareViewEvents>(initialState) {
 
-    companion object : MavericksViewModelFactory<UserCodeSharedViewModel, UserCodeState> {
-        override fun create(viewModelContext: ViewModelContext, state: UserCodeState): UserCodeSharedViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<UserCodeSharedViewModel, UserCodeState> by hiltMavericksViewModelFactory()
 
     init {
         val user = session.getUser(initialState.userId)
@@ -66,8 +56,8 @@ class UserCodeSharedViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: UserCodeState): UserCodeSharedViewModel
+    interface Factory: MavericksAssistedViewModelFactory<UserCodeSharedViewModel,UserCodeState> {
+        override fun create(state: UserCodeState): UserCodeSharedViewModel
     }
 
     override fun handle(action: UserCodeActions) {
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt
index 457f8cbd9a..a22c7ecf16 100644
--- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt
@@ -25,6 +25,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.extensions.isEmail
 import im.vector.app.core.extensions.toggle
@@ -61,20 +63,11 @@ class UserListViewModel @AssistedInject constructor(@Assisted initialState: User
     private val identityServerUsersSearch = MutableStateFlow("")
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: UserListViewState): UserListViewModel
+    interface Factory: MavericksAssistedViewModelFactory<UserListViewModel,UserListViewState> {
+        override fun create(state: UserListViewState): UserListViewModel
     }
 
-    companion object : MavericksViewModelFactory<UserListViewModel, UserListViewState> {
-
-        override fun create(viewModelContext: ViewModelContext, state: UserListViewState): UserListViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<UserListViewModel, UserListViewState> by hiltMavericksViewModelFactory()
 
     private val identityServerListener = object : IdentityServiceListener {
         override fun onIdentityServerChange() {
diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt
index 23f1cfe119..d2061c71b3 100644
--- a/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt
@@ -38,9 +38,7 @@ import java.io.Serializable
 import javax.inject.Inject
 
 class WidgetActivity : VectorBaseActivity<ActivityWidgetBinding>(),
-        ToolbarConfigurable,
-        WidgetViewModel.Factory,
-        RoomWidgetPermissionViewModel.Factory {
+        ToolbarConfigurable {
 
     companion object {
 
@@ -66,9 +64,6 @@ class WidgetActivity : VectorBaseActivity<ActivityWidgetBinding>(),
         }
     }
 
-    @Inject lateinit var viewModelFactory: WidgetViewModel.Factory
-    @Inject lateinit var permissionsViewModelFactory: RoomWidgetPermissionViewModel.Factory
-
     private val viewModel: WidgetViewModel by viewModel()
     private val permissionViewModel: RoomWidgetPermissionViewModel by viewModel()
 
@@ -133,14 +128,6 @@ class WidgetActivity : VectorBaseActivity<ActivityWidgetBinding>(),
         }
     }
 
-    override fun create(initialState: WidgetViewState): WidgetViewModel {
-        return viewModelFactory.create(initialState)
-    }
-
-    override fun create(initialState: RoomWidgetPermissionViewState): RoomWidgetPermissionViewModel {
-        return permissionsViewModelFactory.create(initialState)
-    }
-
     private fun handleClose(event: WidgetViewEvents.Close) {
         if (event.content != null) {
             val intent = createResultIntent(event.content)
diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt
index 1cf3e367ea..26a43ec8d0 100644
--- a/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt
@@ -27,6 +27,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import im.vector.app.core.resources.StringProvider
 import im.vector.app.features.widgets.permissions.WidgetPermissionsHelper
@@ -57,21 +59,11 @@ class WidgetViewModel @AssistedInject constructor(@Assisted val initialState: Wi
         IntegrationManagerService.Listener {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: WidgetViewState): WidgetViewModel
+    interface Factory: MavericksAssistedViewModelFactory<WidgetViewModel,WidgetViewState> {
+        override fun create(state: WidgetViewState): WidgetViewModel
     }
 
-    companion object : MavericksViewModelFactory<WidgetViewModel, WidgetViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: WidgetViewState): WidgetViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<WidgetViewModel, WidgetViewState> by hiltMavericksViewModelFactory()
 
     private val room = session.getRoom(initialState.roomId)
     private val widgetService = session.widgetService()
diff --git a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt
index 71eaebbc91..b1fe18cc3f 100644
--- a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt
@@ -18,11 +18,12 @@ package im.vector.app.features.widgets.permissions
 import com.airbnb.mvrx.ActivityViewModelContext
 import com.airbnb.mvrx.FragmentViewModelContext
 import com.airbnb.mvrx.MavericksViewModelFactory
-import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
 import im.vector.app.R
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.VectorViewModel
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.map
@@ -141,19 +142,9 @@ class RoomWidgetPermissionViewModel @AssistedInject constructor(@Assisted val in
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: RoomWidgetPermissionViewState): RoomWidgetPermissionViewModel
+    interface Factory: MavericksAssistedViewModelFactory<RoomWidgetPermissionViewModel,RoomWidgetPermissionViewState> {
+        override fun create(state: RoomWidgetPermissionViewState): RoomWidgetPermissionViewModel
     }
 
-    companion object : MavericksViewModelFactory<RoomWidgetPermissionViewModel, RoomWidgetPermissionViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: RoomWidgetPermissionViewState): RoomWidgetPermissionViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<RoomWidgetPermissionViewModel, RoomWidgetPermissionViewState> by hiltMavericksViewModelFactory()
 }
diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt
index 9b9f3fe490..0663ec83ab 100644
--- a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt
@@ -27,6 +27,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.platform.EmptyAction
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
@@ -67,21 +69,11 @@ class ServerBackupStatusViewModel @AssistedInject constructor(@Assisted initialS
         VectorViewModel<ServerBackupStatusViewState, EmptyAction, EmptyViewEvents>(initialState), KeysBackupStateListener {
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: ServerBackupStatusViewState): ServerBackupStatusViewModel
+    interface Factory: MavericksAssistedViewModelFactory<ServerBackupStatusViewModel,ServerBackupStatusViewState> {
+        override fun create(state: ServerBackupStatusViewState): ServerBackupStatusViewModel
     }
 
-    companion object : MavericksViewModelFactory<ServerBackupStatusViewModel, ServerBackupStatusViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: ServerBackupStatusViewState): ServerBackupStatusViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<ServerBackupStatusViewModel, ServerBackupStatusViewState> by hiltMavericksViewModelFactory()
 
     // Keys exported manually
     val keysExportedToFile = MutableLiveData<Boolean>()
diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt b/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt
index 7f089082a2..68502bceaf 100644
--- a/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/workers/signout/SignOutBottomSheetDialogFragment.kt
@@ -46,8 +46,7 @@ import javax.inject.Inject
 
 // TODO this needs to be refactored to current standard and remove legacy
 class SignOutBottomSheetDialogFragment :
-        VectorBaseBottomSheetDialogFragment<BottomSheetLogoutAndBackupBinding>(),
-        SignoutCheckViewModel.Factory {
+        VectorBaseBottomSheetDialogFragment<BottomSheetLogoutAndBackupBinding>(){
 
     var onSignOut: Runnable? = null
 
@@ -59,13 +58,6 @@ class SignOutBottomSheetDialogFragment :
         isCancelable = true
     }
 
-    @Inject
-    lateinit var viewModelFactory: SignoutCheckViewModel.Factory
-
-    override fun create(initialState: SignoutCheckViewState): SignoutCheckViewModel {
-        return viewModelFactory.create(initialState)
-    }
-
     private val viewModel: SignoutCheckViewModel by fragmentViewModel(SignoutCheckViewModel::class)
 
     override fun injectWith(injector: ScreenComponent) {
diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt b/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt
index 057d9e31f8..3e36106ff2 100644
--- a/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt
@@ -29,6 +29,8 @@ import com.airbnb.mvrx.ViewModelContext
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import im.vector.app.core.di.MavericksAssistedViewModelFactory
+import im.vector.app.core.di.hiltMavericksViewModelFactory
 import im.vector.app.core.extensions.exhaustive
 import im.vector.app.core.platform.EmptyViewEvents
 import im.vector.app.core.platform.VectorViewModel
@@ -66,21 +68,11 @@ class SignoutCheckViewModel @AssistedInject constructor(
     }
 
     @AssistedFactory
-    interface Factory {
-        fun create(initialState: SignoutCheckViewState): SignoutCheckViewModel
+    interface Factory: MavericksAssistedViewModelFactory<SignoutCheckViewModel,SignoutCheckViewState> {
+        override fun create(state: SignoutCheckViewState): SignoutCheckViewModel
     }
 
-    companion object : MavericksViewModelFactory<SignoutCheckViewModel, SignoutCheckViewState> {
-
-        @JvmStatic
-        override fun create(viewModelContext: ViewModelContext, state: SignoutCheckViewState): SignoutCheckViewModel? {
-            val factory = when (viewModelContext) {
-                is FragmentViewModelContext -> viewModelContext.fragment as? Factory
-                is ActivityViewModelContext -> viewModelContext.activity as? Factory
-            }
-            return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
-        }
-    }
+    companion object : MavericksViewModelFactory<SignoutCheckViewModel, SignoutCheckViewState> by hiltMavericksViewModelFactory()
 
     init {
         session.cryptoService().keysBackupService().addListener(this)