diff --git a/Package.swift b/Package.swift
index eb6b71d06d8ca515abdd0d7040f3a7426c5a2fa4..dfb1ab44f978f8bbcdd0ba43a8971960e7960c54 100644
--- a/Package.swift
+++ b/Package.swift
@@ -168,6 +168,7 @@ let package = Package(
       dependencies: [
         .target(name: "Shared"),
         .target(name: "AppResources"),
+        .target(name: "HUDFeature"),
         .product(name: "SnapKit", package: "SnapKit"),
         .product(name: "Logging", package: "swift-log"),
         .product(name: "XXModels", package: "client-ios-db"),
diff --git a/Sources/AppCore/AppDependencies.swift b/Sources/AppCore/AppDependencies.swift
index 9c4c392e6b47067a5ca46d226e6ce3ecf623e59e..e2cbb47285f84c977a6a2f6929a3f2f1f3a8483a 100644
--- a/Sources/AppCore/AppDependencies.swift
+++ b/Sources/AppCore/AppDependencies.swift
@@ -8,7 +8,6 @@ public struct AppDependencies {
   public var networkMonitor: NetworkMonitor
   public var toastManager: ToastManager
   public var backupHandler: BackupCallbackHandler
-  public var hudManager: HUDManager
   public var dbManager: DBManager
   public var groupRequest: GroupRequestHandler
   public var groupMessageHandler: GroupMessageHandler
@@ -53,7 +52,6 @@ extension AppDependencies {
       backupHandler: .live(
         messenger: messenger
       ),
-      hudManager: .live(),
       dbManager: dbManager,
       groupRequest: .live(
         messenger: messenger,
@@ -107,7 +105,6 @@ extension AppDependencies {
     networkMonitor: .unimplemented,
     toastManager: .unimplemented,
     backupHandler: .unimplemented,
-    hudManager: .unimplemented,
     dbManager: .unimplemented,
     groupRequest: .unimplemented,
     groupMessageHandler: .unimplemented,
diff --git a/Sources/AppCore/HUDManager/HUDHide.swift b/Sources/AppCore/HUDManager/HUDHide.swift
deleted file mode 100644
index fe96ef1faacb7a9c59d58b96407a1de8573bc77d..0000000000000000000000000000000000000000
--- a/Sources/AppCore/HUDManager/HUDHide.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import XCTestDynamicOverlay
-
-public struct HUDHide {
-  init(run: @escaping () -> Void) {
-    self.run = run
-  }
-
-  public var run: () -> Void
-
-  public func callAsFunction() -> Void {
-    run()
-  }
-}
-
-extension HUDHide {
-  public static let unimplemented = HUDHide(
-    run: XCTUnimplemented("\(Self.self)")
-  )
-}
diff --git a/Sources/AppCore/HUDManager/HUDManager.swift b/Sources/AppCore/HUDManager/HUDManager.swift
deleted file mode 100644
index 2c402e3b6b55677fbb3066ddb32777fd20d8224b..0000000000000000000000000000000000000000
--- a/Sources/AppCore/HUDManager/HUDManager.swift
+++ /dev/null
@@ -1,49 +0,0 @@
-import Combine
-import Foundation
-import XCTestDynamicOverlay
-
-public struct HUDManager {
-  public var show: HUDShow
-  public var hide: HUDHide
-  public var observe: HUDObserve
-}
-
-extension HUDManager {
-  public static func live() -> HUDManager {
-    class Context {
-      var timer: Timer?
-      let modelSubject = PassthroughSubject<HUDModel?, Never>()
-    }
-
-    let context = Context()
-
-    return .init(
-      show: .init {
-        guard let model = $0 else {
-          context.modelSubject.send(.init(hasDotAnimation: true))
-          return
-        }
-        if model.isAutoDismissable {
-          DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
-            context.modelSubject.send(nil)
-          }
-        }
-        context.modelSubject.send(model)
-      },
-      hide: .init {
-        context.modelSubject.send(nil)
-      },
-      observe: .init {
-        context.modelSubject.eraseToAnyPublisher()
-      }
-    )
-  }
-}
-
-extension HUDManager {
-  public static let unimplemented = HUDManager(
-    show: .unimplemented,
-    hide: .unimplemented,
-    observe: .unimplemented
-  )
-}
diff --git a/Sources/AppCore/HUDManager/HUDObserve.swift b/Sources/AppCore/HUDManager/HUDObserve.swift
deleted file mode 100644
index c4257fdfc52b9d49bd199747a033cb51ccd18904..0000000000000000000000000000000000000000
--- a/Sources/AppCore/HUDManager/HUDObserve.swift
+++ /dev/null
@@ -1,16 +0,0 @@
-import Combine
-import XCTestDynamicOverlay
-
-public struct HUDObserve {
-  public var run: () -> AnyPublisher<HUDModel?, Never>
-
-  public func callAsFunction() -> AnyPublisher<HUDModel?, Never> {
-    run()
-  }
-}
-
-extension HUDObserve {
-  public static let unimplemented = HUDObserve(
-    run: XCTUnimplemented("\(Self.self)")
-  )
-}
diff --git a/Sources/AppCore/HUDManager/HUDShow.swift b/Sources/AppCore/HUDManager/HUDShow.swift
deleted file mode 100644
index 81038e4e2799a5681c0de3aa92ad0816ff77646b..0000000000000000000000000000000000000000
--- a/Sources/AppCore/HUDManager/HUDShow.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-import XCTestDynamicOverlay
-
-public struct HUDShow {
-  init(run: @escaping (HUDModel?) -> Void) {
-    self.run = run
-  }
-
-  public var run: (HUDModel?) -> Void
-
-  public func callAsFunction(_ model: HUDModel? = nil) -> Void {
-    run(model)
-  }
-}
-
-extension HUDShow {
-  public static let unimplemented = HUDShow(
-    run: XCTUnimplemented("\(Self.self)")
-  )
-}
diff --git a/Sources/AppCore/RootViewController.swift b/Sources/AppCore/RootViewController.swift
index fbeebe5ef3971d9add68f6c1b09dc585380dab43..b462d098a5af876ef0a030634d83d7d888e44e96 100644
--- a/Sources/AppCore/RootViewController.swift
+++ b/Sources/AppCore/RootViewController.swift
@@ -1,40 +1,41 @@
-import UIKit
 import Combine
 import Dependencies
+import HUDFeature
+import UIKit
 
 public final class RootViewController: UIViewController {
   @Dependency(\.app.statusBar) var statusBar
-  @Dependency(\.app.hudManager) var hudManager
   @Dependency(\.app.toastManager) var toastManager
-  
-  var hud: HUDView?
+
   var cancellables = Set<AnyCancellable>()
   public let navController: UINavigationController
-  
+  let hudPresenter = HUDPresenter()
+
   var toastTimer: Timer?
   let toastTopPadding: CGFloat = 10
   var topToastConstraint: NSLayoutConstraint?
-  
+
   public init(_ content: UINavigationController) {
     self.navController = content
     super.init(nibName: nil, bundle: nil)
+    hudPresenter.parentController = self
   }
-  
+
   required init?(coder: NSCoder) { nil }
-  
+
   public override var preferredStatusBarStyle: UIStatusBarStyle  {
     statusBar.get()
   }
-  
+
   public override func viewDidLoad() {
     super.viewDidLoad()
-    
+
     addChild(navController)
     view.addSubview(navController.view)
     navController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
     navController.view.frame = view.bounds
     navController.didMove(toParent: self)
-    
+
     statusBar
       .observe()
       .receive(on: DispatchQueue.main)
@@ -43,7 +44,7 @@ public final class RootViewController: UIViewController {
           self?.setNeedsStatusBarAppearanceUpdate()
         }
       }.store(in: &cancellables)
-    
+
     toastManager
       .observe()
       .receive(on: DispatchQueue.main)
@@ -52,59 +53,41 @@ public final class RootViewController: UIViewController {
         add(toastView: toastView)
         present(toastView: toastView)
       }.store(in: &cancellables)
-    
-    hudManager
-      .observe()
-      .receive(on: DispatchQueue.main)
-      .sink { [unowned self] model in
-        guard let model else {
-          guard let hud else { return }
-          UIView.animate(withDuration: 0.2) {
-            hud.alpha = 0.0
-          } completion: { _ in
-            hud.removeFromSuperview()
-            self.hud = nil
-          }
-          return
-        }
-        add(hudView: HUDView().setup(model: model))
-        view.endEditing(true)
-      }.store(in: &cancellables)
   }
 }
 
 extension RootViewController {
   @objc private func didPanToast(_ sender: UIPanGestureRecognizer) {
     guard let toastView = sender.view else { return }
-    
+
     switch sender.state {
     case .began, .changed:
       toastTimer?.invalidate()
       let padding = toastTopPadding + min(0, sender.translation(in: view).y)
       topToastConstraint?.constant = padding
-      
+
     case .cancelled, .ended, .failed:
       let halfFrameHeight = -0.5 * toastView.frame.height
       let verticalTranslation = sender.translation(in: toastView).y
       let didSwipeAboveHalf = verticalTranslation < halfFrameHeight
-      
+
       if didSwipeAboveHalf {
         dismiss(toastView: toastView)
       } else {
         present(toastView: toastView)
       }
-      
+
     case .possible:
       break
     @unknown default:
       break
     }
   }
-  
+
   private func dismiss(toastView: UIView) {
     toastView.isUserInteractionEnabled = false
     topToastConstraint?.constant = -(toastView.frame.height + view.safeAreaLayoutGuide.layoutFrame.minY)
-    
+
     topToastConstraint = nil
     UIView.animate(withDuration: 0.25) {
       self.view.setNeedsLayout()
@@ -115,35 +98,35 @@ extension RootViewController {
       self.toastManager.dismiss()
     }
   }
-  
+
   private func add(toastView: UIView) {
     let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didPanToast(_:)))
     toastView.addGestureRecognizer(gestureRecognizer)
-    
+
     toastView.translatesAutoresizingMaskIntoConstraints = false
     view.addSubview(toastView)
-    
+
     NSLayoutConstraint.activate([
       toastView.heightAnchor.constraint(equalToConstant: 78),
       toastView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: 20),
       toastView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor, constant: -20)
     ])
-    
+
     topToastConstraint = toastView.topAnchor.constraint(
       equalTo: view.safeAreaLayoutGuide.topAnchor,
       constant: -(toastView.frame.height + view.safeAreaLayoutGuide.layoutFrame.height)
     )
-    
+
     topToastConstraint?.isActive = true
-    
+
     view.setNeedsLayout()
     view.layoutIfNeeded()
   }
-  
+
   private func present(toastView: UIView) {
     toastView.isUserInteractionEnabled = false
     topToastConstraint?.constant = toastTopPadding
-    
+
     UIView.animate(
       withDuration: 0.5,
       delay: 0,
@@ -155,7 +138,7 @@ extension RootViewController {
       self.view.layoutIfNeeded()
     } completion: { _ in
       toastView.isUserInteractionEnabled = true
-      
+
       self.toastTimer?.invalidate()
       self.toastTimer = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { [weak self] _ in
         guard let self else { return }
@@ -164,32 +147,3 @@ extension RootViewController {
     }
   }
 }
-
-extension RootViewController {
-  private func add(hudView: HUDView) {
-    if let hud {
-      hud.removeFromSuperview()
-      self.hud = nil
-    }
-    
-    hudView.alpha = 0.0
-    hudView.translatesAutoresizingMaskIntoConstraints = false
-    view.addSubview(hudView)
-    
-    NSLayoutConstraint.activate([
-      hudView.topAnchor.constraint(equalTo: view.topAnchor),
-      hudView.leftAnchor.constraint(equalTo: view.leftAnchor),
-      hudView.rightAnchor.constraint(equalTo: view.rightAnchor),
-      hudView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
-    ])
-    
-    view.setNeedsLayout()
-    view.layoutIfNeeded()
-    
-    UIView.animate(withDuration: 0.2) {
-      hudView.alpha = 1.0
-    }
-    
-    hud = hudView
-  }
-}
diff --git a/Sources/AppCore/UI/HUDView.swift b/Sources/AppCore/UI/HUDView.swift
deleted file mode 100644
index 926e36420b97b084cfa35255c981885cbf240eb4..0000000000000000000000000000000000000000
--- a/Sources/AppCore/UI/HUDView.swift
+++ /dev/null
@@ -1,81 +0,0 @@
-import UIKit
-import Shared
-import Combine
-import SnapKit
-import AppResources
-
-final class HUDView: UIView {
-  let titleLabel = UILabel()
-  let contentLabel = UILabel()
-  let stackView = UIStackView()
-  let backgroundView = UIView()
-  let actionButton = CapsuleButton()
-  let animationView = DotAnimation()
-  var cancellables = Set<AnyCancellable>()
-
-  init() {
-    super.init(frame: .zero)
-    stackView.spacing = 20
-    stackView.axis = .vertical
-
-    titleLabel.numberOfLines = 0
-    titleLabel.textAlignment = .center
-    titleLabel.textColor = Asset.neutralWhite.color
-    titleLabel.font = Fonts.Mulish.bold.font(size: 30.0)
-
-    contentLabel.numberOfLines = 0
-    contentLabel.textAlignment = .center
-    contentLabel.textColor = Asset.neutralWhite.color
-    contentLabel.font = Fonts.Mulish.regular.font(size: 15.0)
-
-    animationView.setColor(Asset.neutralWhite.color)
-    backgroundColor =  Asset.neutralDark.color.withAlphaComponent(0.9)
-
-    addSubview(backgroundView)
-    backgroundView.addSubview(stackView)
-
-    backgroundView.snp.makeConstraints {
-      $0.centerY.equalToSuperview()
-      $0.left.equalToSuperview().offset(30)
-      $0.right.equalToSuperview().offset(-30)
-    }
-
-    stackView.snp.makeConstraints {
-      $0.top.equalToSuperview().offset(15)
-      $0.left.equalToSuperview().offset(15)
-      $0.right.equalToSuperview().offset(-15)
-      $0.bottom.equalToSuperview().offset(-20)
-    }
-  }
-
-  required init?(coder: NSCoder) { nil }
-
-  func setup(model: HUDModel) -> Self {
-    if let title = model.title {
-      titleLabel.text = title
-      stackView.addArrangedSubview(titleLabel)
-    }
-    if let content = model.content {
-      contentLabel.text = content
-      stackView.addArrangedSubview(contentLabel)
-    }
-    if model.hasDotAnimation {
-      animationView.snp.makeConstraints {
-        $0.height.equalTo(20)
-      }
-      stackView.addArrangedSubview(animationView)
-    }
-    if let actionTitle = model.actionTitle {
-      actionButton.set(
-        style: .seeThroughWhite,
-        title: actionTitle
-      )
-      actionButton
-        .publisher(for: .touchUpInside)
-        .sink { model.onTapClosure?() }
-        .store(in: &cancellables)
-      stackView.addArrangedSubview(actionButton)
-    }
-    return self
-  }
-}
diff --git a/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift b/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift
index 20ecc78451a20f26d467f8455dacb950b4acf7d9..024dc2bf0e6cc2c03ad4d18c6e5e92a8fd7219aa 100644
--- a/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift
+++ b/Sources/BackupFeature/ViewModels/BackupConfigViewModel.swift
@@ -34,7 +34,7 @@ extension BackupConfigViewModel {
     class Context {
       @Dependency(\.navigator) var navigator
       @Dependency(\.backupService) var service
-      @Dependency(\.app.hudManager) var hudManager
+      @Dependency(\.hudManager) var hudManager
     }
 
     let context = Context()
diff --git a/Sources/BackupFeature/ViewModels/BackupSFTPViewModel.swift b/Sources/BackupFeature/ViewModels/BackupSFTPViewModel.swift
index f4c0b87cae090a84fbd133c663b0f12dac6395a1..11d753b84c2c6f612f0eee46eda7d93603859542 100644
--- a/Sources/BackupFeature/ViewModels/BackupSFTPViewModel.swift
+++ b/Sources/BackupFeature/ViewModels/BackupSFTPViewModel.swift
@@ -18,7 +18,7 @@ struct SFTPViewState {
 }
 
 final class BackupSFTPViewModel {
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<SFTPViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/ChatFeature/ViewModels/GroupChatViewModel.swift b/Sources/ChatFeature/ViewModels/GroupChatViewModel.swift
index e083c9c4abe8c76603091b542bf5e78e8dc00cb5..b7f66eb6134edfbd74d6b5cbed1033ba3ba1ab80 100644
--- a/Sources/ChatFeature/ViewModels/GroupChatViewModel.swift
+++ b/Sources/ChatFeature/ViewModels/GroupChatViewModel.swift
@@ -23,7 +23,7 @@ final class GroupChatViewModel {
   @Dependency(\.sendReport) var sendReport
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.app.toastManager) var toastManager
   @Dependency(\.reportingStatus) var reportingStatus
 
diff --git a/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift b/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift
index 92b93761bcf599f72275369d966ee39e05ef22f7..73db2666bcecbe0a683bd25b8b8dce236c1c8299 100644
--- a/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift
+++ b/Sources/ChatFeature/ViewModels/SingleChatViewModel.swift
@@ -33,7 +33,7 @@ final class SingleChatViewModel: NSObject {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.sendImage) var sendImage
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.app.sendMessage) var sendMessage
   @Dependency(\.app.toastManager) var toastManager
   @Dependency(\.app.networkMonitor) var networkMonitor
diff --git a/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift b/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift
index 8fea8877f547bfdf7d205e95412cf2b783f9762d..957516d21618b52682899f76e29db6b41e97ea51 100644
--- a/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift
+++ b/Sources/ChatListFeature/ViewModel/ChatListViewModel.swift
@@ -27,7 +27,7 @@ typealias SearchSnapshot = NSDiffableDataSourceSnapshot<SearchSection, SearchIte
 final class ChatListViewModel {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.reportingStatus) var reportingStatus
   
   // TO REFACTOR:
diff --git a/Sources/ContactFeature/ViewModels/ContactViewModel.swift b/Sources/ContactFeature/ViewModels/ContactViewModel.swift
index 99b3440b1dce4842647e76f4b8ee12b40a583d65..4191f76810ddac9ca55dbae9b3900e2c1d6b4618 100644
--- a/Sources/ContactFeature/ViewModels/ContactViewModel.swift
+++ b/Sources/ContactFeature/ViewModels/ContactViewModel.swift
@@ -21,7 +21,7 @@ struct ContactViewState: Equatable {
 final class ContactViewModel {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   
   @KeyObject(.username, defaultValue: nil) var username: String?
   @KeyObject(.sharingEmail, defaultValue: false) var sharingEmail: Bool
diff --git a/Sources/CreateGroupFeature/CreateGroupViewModel.swift b/Sources/CreateGroupFeature/CreateGroupViewModel.swift
index 25ef6090123ff307f2f6555d56bade868c5f5ce8..ba9df21c40bce6abd61bebba56fa9b2e10962efe 100644
--- a/Sources/CreateGroupFeature/CreateGroupViewModel.swift
+++ b/Sources/CreateGroupFeature/CreateGroupViewModel.swift
@@ -19,7 +19,7 @@ struct CreateGroupViewModel {
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<ViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/LaunchFeature/LaunchViewModel.swift b/Sources/LaunchFeature/LaunchViewModel.swift
index 732d2e2dd3bd4155d0b10376f17ac8e20af75c2b..95aedf5d7ee986ee2800f50f13aba0fb8c539549 100644
--- a/Sources/LaunchFeature/LaunchViewModel.swift
+++ b/Sources/LaunchFeature/LaunchViewModel.swift
@@ -53,7 +53,7 @@ final class LaunchViewModel {
   @Dependency(\.app.messenger) var messenger
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.updateErrors) var updateErrors
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.checkVersion) var checkVersion
   @Dependency(\.dummyTraffic) var dummyTraffic
   @Dependency(\.app.toastManager) var toastManager
diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingCodeViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingCodeViewModel.swift
index de57405fcb07c431f33e639f7a7b7b4a3b4dfa15..570edad96cbccdc21520d50846c3edb16e467656 100644
--- a/Sources/OnboardingFeature/ViewModels/OnboardingCodeViewModel.swift
+++ b/Sources/OnboardingFeature/ViewModels/OnboardingCodeViewModel.swift
@@ -23,7 +23,7 @@ final class OnboardingCodeViewModel {
 
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   @KeyObject(.email, defaultValue: nil) var email: String?
   @KeyObject(.phone, defaultValue: nil) var phone: String?
diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift
index 01e5e6281f1e033dfd29814e9e62809e351c2e42..0af88c771abde62acfec00e6b1f7220e6bbff82c 100644
--- a/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift
+++ b/Sources/OnboardingFeature/ViewModels/OnboardingEmailViewModel.swift
@@ -17,7 +17,7 @@ final class OnboardingEmailViewModel {
 
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<ViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift
index c60f176063e7ad63f7069e7cc7f7d341ca8f048b..5fa427fbab976ea59e1c7c56abb3ecc28dd673d3 100644
--- a/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift
+++ b/Sources/OnboardingFeature/ViewModels/OnboardingPhoneViewModel.swift
@@ -20,7 +20,7 @@ final class OnboardingPhoneViewModel {
 
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<ViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift b/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift
index 21ff5adbede032d0cd47efded7f9220e007ba0ba..ad29990efdbb9cc1d02f8373d54a83e8ca05a02f 100644
--- a/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift
+++ b/Sources/OnboardingFeature/ViewModels/OnboardingUsernameViewModel.swift
@@ -19,7 +19,7 @@ final class OnboardingUsernameViewModel {
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   @KeyObject(.username, defaultValue: "") var username: String
 
diff --git a/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift
index 5dc1176a6943c69a78f3a3e04000a783fcb0f586..804dfa78043ca097082f6c6a6b0fc45a1ff38911 100644
--- a/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift
+++ b/Sources/ProfileFeature/ViewModels/ProfileCodeViewModel.swift
@@ -22,7 +22,7 @@ final class ProfileCodeViewModel {
 
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   @KeyObject(.email, defaultValue: nil) var email: String?
   @KeyObject(.phone, defaultValue: nil) var phone: String?
diff --git a/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift
index 2fc959aea69cb0f53bc8c1452a07273b58d29664..01d93e61791c15671cec5272088bbe21628b304a 100644
--- a/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift
+++ b/Sources/ProfileFeature/ViewModels/ProfileEmailViewModel.swift
@@ -17,7 +17,7 @@ final class ProfileEmailViewModel {
 
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<ViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift
index 901053939fb2a01fa1173d879c6fe36b28ac368b..02c0d7546244200437ca8f016a51a1506bee6ebd 100644
--- a/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift
+++ b/Sources/ProfileFeature/ViewModels/ProfilePhoneViewModel.swift
@@ -20,7 +20,7 @@ final class ProfilePhoneViewModel {
 
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<ViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift b/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift
index 4d7eb1b323d8d55716affe0b59803a35fea933e7..4d8e382e75e0524549f6c4528cd451b1b92ec34a 100644
--- a/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift
+++ b/Sources/ProfileFeature/ViewModels/ProfileViewModel.swift
@@ -34,7 +34,7 @@ final class ProfileViewModel {
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.permissions) var permissions
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.backupService) var backupService
 
   var name: String { username! }
diff --git a/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift b/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift
index 809e53b500a86030f932609c7fcf998be5b057f5..e46c794bc3ad38bcc4c053deaf84480e93ef66e1 100644
--- a/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift
+++ b/Sources/RequestsFeature/ViewModels/RequestsFailedViewModel.swift
@@ -12,7 +12,7 @@ import XXMessengerClient
 final class RequestsFailedViewModel {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   
   @KeyObject(.username, defaultValue: nil) var username: String?
   @KeyObject(.sharingEmail, defaultValue: false) var sharingEmail: Bool
diff --git a/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift b/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift
index 46d4fe29bc99ebb71207264a27663a1f16de7731..14c4644b6a6c7d83267e84360ee468527e05391b 100644
--- a/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift
+++ b/Sources/RequestsFeature/ViewModels/RequestsReceivedViewModel.swift
@@ -22,7 +22,7 @@ struct RequestReceived: Hashable, Equatable {
 final class RequestsReceivedViewModel {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.reportingStatus) var reportingStatus
   
   @KeyObject(.isShowingHiddenRequests, defaultValue: false) var isShowingHiddenRequests: Bool
diff --git a/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift b/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift
index 6293a25bd8795b5d5b5fe56954216c09db468b73..2fbbacb26eaefdc0940cece7a2dbcb6c08cea47f 100644
--- a/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift
+++ b/Sources/RequestsFeature/ViewModels/RequestsSentViewModel.swift
@@ -20,7 +20,7 @@ struct RequestSent: Hashable, Equatable {
 final class RequestsSentViewModel {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.app.toastManager) var toastManager
   @Dependency(\.reportingStatus) var reportingStatus
   
diff --git a/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift b/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift
index 323b07949159aba1fc1bc2bca224d3e8ed050177..01efa75fe48a58570d486af5bf059049f0dc5cfe 100644
--- a/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift
+++ b/Sources/RestoreFeature/ViewModels/RestoreListViewModel.swift
@@ -12,7 +12,7 @@ public struct RestorationDetails {
 }
 
 final class RestoreListViewModel {
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var sftpPublisher: AnyPublisher<Void, Never> {
     sftpSubject.eraseToAnyPublisher()
diff --git a/Sources/RestoreFeature/ViewModels/RestoreSFTPViewModel.swift b/Sources/RestoreFeature/ViewModels/RestoreSFTPViewModel.swift
index 3af77801cb933e381fc9867030b67cde74508af0..ac84e998e928741ab760b2f5fb7a9152ed246067 100644
--- a/Sources/RestoreFeature/ViewModels/RestoreSFTPViewModel.swift
+++ b/Sources/RestoreFeature/ViewModels/RestoreSFTPViewModel.swift
@@ -16,7 +16,7 @@ struct SFTPViewState {
 }
 
 final class RestoreSFTPViewModel {
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   var statePublisher: AnyPublisher<SFTPViewState, Never> {
     stateSubject.eraseToAnyPublisher()
diff --git a/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift b/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift
index e4249b8bff0fa6271a0f7aabf17270e4f0150969..37ff07fa9a4f96f3addeb7980c974e9765fc0295 100644
--- a/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift
+++ b/Sources/SearchFeature/ViewModels/SearchLeftViewModel.swift
@@ -26,7 +26,7 @@ struct SearchLeftViewState {
 final class SearchLeftViewModel {
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @Dependency(\.app.toastManager) var toastManager
   @Dependency(\.reportingStatus) var reportingStatus
   @Dependency(\.app.networkMonitor) var networkMonitor
diff --git a/Sources/SettingsFeature/ViewModels/SettingsDeleteViewModel.swift b/Sources/SettingsFeature/ViewModels/SettingsDeleteViewModel.swift
index e2a1912aa5cd68fc032ac2e54de0a1bc571ede70..19d28b25d72b6d5d2ad12999b95cb64c755f417e 100644
--- a/Sources/SettingsFeature/ViewModels/SettingsDeleteViewModel.swift
+++ b/Sources/SettingsFeature/ViewModels/SettingsDeleteViewModel.swift
@@ -18,7 +18,7 @@ final class SettingsDeleteViewModel {
   @Dependency(\.app.bgQueue) var bgQueue
   @Dependency(\.app.dbManager) var dbManager
   @Dependency(\.app.messenger) var messenger
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
   @KeyObject(.username, defaultValue: nil) var username: String?
 
   var statePublisher: AnyPublisher<ViewState, Never> {
diff --git a/Sources/SettingsFeature/ViewModels/SettingsMainViewModel.swift b/Sources/SettingsFeature/ViewModels/SettingsMainViewModel.swift
index 4fd4323dd0086207e7be26d2acd82bc117779a8b..2ac1b45d88ed84ae9abe25c91ceb730904fe4a50 100644
--- a/Sources/SettingsFeature/ViewModels/SettingsMainViewModel.swift
+++ b/Sources/SettingsFeature/ViewModels/SettingsMainViewModel.swift
@@ -22,7 +22,7 @@ final class SettingsMainViewModel {
   @Dependency(\.permissions) var permissions
   @Dependency(\.app.messenger) var messenger
   @Dependency(\.dummyTraffic) var dummyTraffic
-  @Dependency(\.app.hudManager) var hudManager
+  @Dependency(\.hudManager) var hudManager
 
   @KeyObject(.biometrics, defaultValue: false) var biometrics
   @KeyObject(.hideAppList, defaultValue: false) var hideAppList