diff --git a/Sources/App/DependencyRegistrator.swift b/Sources/App/DependencyRegistrator.swift
index 9102274af7c0c37ce986b8aba6b2607a33cd66ca..2a886995871ac2b82dd2fb0c5e01b1b0187a71bb 100644
--- a/Sources/App/DependencyRegistrator.swift
+++ b/Sources/App/DependencyRegistrator.swift
@@ -185,7 +185,7 @@ struct DependencyRegistrator {
 
         container.register(
             RequestsCoordinator(
-                searchFactory: SearchController.init,
+                searchFactory: SearchContainerController.init,
                 contactFactory: ContactController.init(_:),
                 singleChatFactory: SingleChatController.init(_:),
                 groupChatFactory: GroupChatController.init(_:),
@@ -197,7 +197,7 @@ struct DependencyRegistrator {
             OnboardingCoordinator(
                 emailFactory: OnboardingEmailController.init,
                 phoneFactory: OnboardingPhoneController.init,
-                searchFactory: SearchController.init,
+                searchFactory: SearchContainerController.init,
                 welcomeFactory: OnboardingWelcomeController.init,
                 chatListFactory: ChatListController.init,
                 usernameFactory: OnboardingUsernameController.init(_:),
@@ -211,7 +211,7 @@ struct DependencyRegistrator {
         container.register(
             ContactListCoordinator(
                 scanFactory: ScanContainerController.init,
-                searchFactory: SearchController.init,
+                searchFactory: SearchContainerController.init,
                 newGroupFactory: CreateGroupController.init,
                 requestsFactory: RequestsContainerController.init,
                 contactFactory: ContactController.init(_:),
@@ -235,7 +235,7 @@ struct DependencyRegistrator {
         container.register(
             ChatListCoordinator(
                 scanFactory: ScanContainerController.init,
-                searchFactory: SearchController.init,
+                searchFactory: SearchContainerController.init,
                 newGroupFactory: CreateGroupController.init,
                 contactsFactory: ContactListController.init,
                 contactFactory: ContactController.init(_:),
diff --git a/Sources/ScanFeature/Views/ScanContainerView.swift b/Sources/ScanFeature/Views/ScanContainerView.swift
index b9b35cef12d02a3a8ea88ead84692938e31ed773..7e5eeee37a1a32765a33735ec8e1c65a05473dd5 100644
--- a/Sources/ScanFeature/Views/ScanContainerView.swift
+++ b/Sources/ScanFeature/Views/ScanContainerView.swift
@@ -3,7 +3,7 @@ import Shared
 
 final class ScanContainerView: UIView {
     let scrollView = UIScrollView()
-    let segmentedControl = SegmentedControl()
+    let segmentedControl = ScanSegmentedControl()
 
     init() {
         super.init(frame: .zero)
diff --git a/Sources/ScanFeature/Views/SegmentedControl.swift b/Sources/ScanFeature/Views/ScanSegmentedControl.swift
similarity index 93%
rename from Sources/ScanFeature/Views/SegmentedControl.swift
rename to Sources/ScanFeature/Views/ScanSegmentedControl.swift
index 11faf5a55448b39530fc66a71610a8b49852dfd0..f3fd72acf3326b05b8057e5a9fe0948aa113688c 100644
--- a/Sources/ScanFeature/Views/SegmentedControl.swift
+++ b/Sources/ScanFeature/Views/ScanSegmentedControl.swift
@@ -2,15 +2,15 @@ import UIKit
 import Shared
 import SnapKit
 
-final class SegmentedControl: UIView {
+final class ScanSegmentedControl: UIView {
     private let trackHeight = 2.0
     private let numberOfTabs = 2.0
     private let trackView = UIView()
     private let stackView = UIStackView()
     private var leftConstraint: Constraint?
     private let trackIndicatorView = UIView()
-    private(set) var leftButton = SegmentedControlButton()
-    private(set) var rightButton = SegmentedControlButton()
+    private(set) var leftButton = ScanSegmentedControlButton()
+    private(set) var rightButton = ScanSegmentedControlButton()
 
     init() {
         super.init(frame: .zero)
diff --git a/Sources/ScanFeature/Views/SegmentedControlButton.swift b/Sources/ScanFeature/Views/ScanSegmentedControlButton.swift
similarity index 95%
rename from Sources/ScanFeature/Views/SegmentedControlButton.swift
rename to Sources/ScanFeature/Views/ScanSegmentedControlButton.swift
index c23f16c1539338457198024f84216ffffdca1590..b9e711c614b239dfb55158c530adbe121f0ca691 100644
--- a/Sources/ScanFeature/Views/SegmentedControlButton.swift
+++ b/Sources/ScanFeature/Views/ScanSegmentedControlButton.swift
@@ -1,7 +1,7 @@
 import UIKit
 import Shared
 
-final class SegmentedControlButton: UIControl {
+final class ScanSegmentedControlButton: UIControl {
     private let titleLabel = UILabel()
     private let imageView = UIImageView()
 
diff --git a/Sources/SearchFeature/Controllers/SearchContainerController.swift b/Sources/SearchFeature/Controllers/SearchContainerController.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f42bb1ad0dd5d18fdaac51d5cc831e7b0d918ecf
--- /dev/null
+++ b/Sources/SearchFeature/Controllers/SearchContainerController.swift
@@ -0,0 +1,48 @@
+import UIKit
+import Theme
+import Shared
+import DependencyInjection
+
+public final class SearchContainerController: UIViewController {
+    @Dependency private var statusBarController: StatusBarStyleControlling
+
+    lazy private var screenView = SearchContainerView()
+
+    public override func loadView() {
+        view = screenView
+    }
+
+    public override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        statusBarController.style.send(.darkContent)
+
+        navigationController?.navigationBar.customize(
+            backgroundColor: Asset.neutralWhite.color
+        )
+    }
+
+    public override func viewDidLoad() {
+        super.viewDidLoad()
+        setupNavigationBar()
+    }
+
+    private func setupNavigationBar() {
+        navigationItem.backButtonTitle = " "
+
+        let titleLabel = UILabel()
+        titleLabel.text = Localized.Ud.title
+        titleLabel.textColor = Asset.neutralActive.color
+        titleLabel.font = Fonts.Mulish.semiBold.font(size: 18.0)
+
+        let backButton = UIButton.back()
+        backButton.addTarget(self, action: #selector(didTapBack), for: .touchUpInside)
+
+        navigationItem.leftBarButtonItem = UIBarButtonItem(
+            customView: UIStackView(arrangedSubviews: [backButton, titleLabel])
+        )
+    }
+
+    @objc private func didTapBack() {
+        navigationController?.popViewController(animated: true)
+    }
+}
diff --git a/Sources/SearchFeature/Controllers/SearchController.swift b/Sources/SearchFeature/Controllers/SearchController.swift
index 795c60009cb827d2aacca5d3e27eb89e7114b26b..809682d6d1a8f2a7225406aa4563f9a726170d91 100644
--- a/Sources/SearchFeature/Controllers/SearchController.swift
+++ b/Sources/SearchFeature/Controllers/SearchController.swift
@@ -11,7 +11,7 @@ import DrawerFeature
 import DependencyInjection
 import ScrollViewController
 
-public final class SearchController: UIViewController {
+final class SearchController: UIViewController {
     @KeyObject(.email, defaultValue: nil) var email: String?
     @KeyObject(.phone, defaultValue: nil) var phone: String?
     @KeyObject(.sharingEmail, defaultValue: false) var isSharingEmail: Bool
@@ -19,26 +19,25 @@ public final class SearchController: UIViewController {
 
     @Dependency private var hud: HUDType
     @Dependency private var coordinator: SearchCoordinating
-    @Dependency private var statusBarController: StatusBarStyleControlling
 
     lazy private var tableController = SearchTableController(viewModel)
     lazy private var screenView = SearchView {
         let actionButton = CapsuleButton()
         actionButton.set(
             style: .seeThrough,
-            title: Localized.ContactSearch.Placeholder.Drawer.action
+            title: Localized.Ud.Placeholder.Drawer.action
         )
 
         let drawer = DrawerController(with: [
             DrawerText(
                 font: Fonts.Mulish.bold.font(size: 26.0),
-                text: Localized.ContactSearch.Placeholder.Drawer.title,
+                text: Localized.Ud.Placeholder.Drawer.title,
                 color: Asset.neutralActive.color,
                 alignment: .left,
                 spacingAfter: 19
             ),
             DrawerLinkText(
-                text: Localized.ContactSearch.Placeholder.Drawer.subtitle,
+                text: Localized.Ud.Placeholder.Drawer.subtitle,
                 urlString: "https://links.xx.network/adrp",
                 spacingAfter: 37
             ),
@@ -64,26 +63,16 @@ public final class SearchController: UIViewController {
     private var cancellables = Set<AnyCancellable>()
     private var drawerCancellables = Set<AnyCancellable>()
 
-    public override func loadView() {
+    override func loadView() {
         view = screenView
     }
 
-    public override func viewWillAppear(_ animated: Bool) {
-        super.viewWillAppear(animated)
-        statusBarController.style.send(.darkContent)
-
-        navigationController?.navigationBar.customize(
-            backgroundColor: Asset.neutralWhite.color,
-            shadowColor: Asset.neutralDisabled.color
-        )
-    }
-
-    public override func viewDidAppear(_ animated: Bool) {
+    override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
         viewModel.didAppear()
     }
 
-    public override func viewDidLoad() {
+    override func viewDidLoad() {
         super.viewDidLoad()
         setupNavigationBar()
         setupTableView()
@@ -110,7 +99,7 @@ public final class SearchController: UIViewController {
         navigationItem.backButtonTitle = " "
 
         let titleLabel = UILabel()
-        titleLabel.text = Localized.ContactSearch.title
+        titleLabel.text = Localized.Ud.title
         titleLabel.textColor = Asset.neutralActive.color
         titleLabel.font = Fonts.Mulish.semiBold.font(size: 18.0)
 
@@ -231,7 +220,7 @@ public final class SearchController: UIViewController {
         navigationController?.popViewController(animated: true)
     }
 
-    public func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) {
+    func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) {
         let contact = viewModel.itemsRelay.value[indexPath.row]
 
         guard contact.authStatus == .stranger else {
@@ -253,7 +242,7 @@ extension SearchController {
 
         let drawerTitle = DrawerText(
             font: Fonts.Mulish.extraBold.font(size: 26.0),
-            text: Localized.ContactSearch.RequestDrawer.title,
+            text: Localized.Ud.RequestDrawer.title,
             color: Asset.neutralDark.color,
             spacingAfter: 20
         )
@@ -288,7 +277,7 @@ extension SearchController {
 
         if let email = email {
             let drawerEmail = DrawerSwitch(
-                title: Localized.ContactSearch.RequestDrawer.email,
+                title: Localized.Ud.RequestDrawer.email,
                 content: email,
                 spacingAfter: phone != nil ? 23 : 31,
                 isInitiallyOn: isSharingEmail
@@ -304,7 +293,7 @@ extension SearchController {
 
         if let phone = phone {
             let drawerPhone = DrawerSwitch(
-                title: Localized.ContactSearch.RequestDrawer.phone,
+                title: Localized.Ud.RequestDrawer.phone,
                 content: "\(Country.findFrom(phone).prefix) \(phone.dropLast(2))",
                 spacingAfter: 31,
                 isInitiallyOn: isSharingPhone
@@ -320,14 +309,14 @@ extension SearchController {
 
         let drawerSendButton = DrawerCapsuleButton(
             model: .init(
-                title: Localized.ContactSearch.RequestDrawer.send,
+                title: Localized.Ud.RequestDrawer.send,
                 style: .brandColored
             ), spacingAfter: 5
         )
 
         let drawerCancelButton = DrawerCapsuleButton(
             model: .init(
-                title: Localized.ContactSearch.RequestDrawer.cancel,
+                title: Localized.Ud.RequestDrawer.cancel,
                 style: .simplestColoredBrand
             ), spacingAfter: 5
         )
@@ -423,14 +412,14 @@ extension SearchController {
 
         let drawerTitle = DrawerText(
             font: Fonts.Mulish.extraBold.font(size: 26.0),
-            text: Localized.ContactSearch.NicknameDrawer.title,
+            text: Localized.Ud.NicknameDrawer.title,
             color: Asset.neutralDark.color,
             spacingAfter: 20
         )
 
         let drawerSubtitle = DrawerText(
             font: Fonts.Mulish.regular.font(size: 16.0),
-            text: Localized.ContactSearch.NicknameDrawer.subtitle,
+            text: Localized.Ud.NicknameDrawer.subtitle,
             color: Asset.neutralDark.color,
             spacingAfter: 20
         )
@@ -454,7 +443,7 @@ extension SearchController {
 
         let drawerSaveButton = DrawerCapsuleButton(
             model: .init(
-                title: Localized.ContactSearch.NicknameDrawer.save,
+                title: Localized.Ud.NicknameDrawer.save,
                 style: .brandColored
             ), spacingAfter: 5
         )
diff --git a/Sources/SearchFeature/Views/SearchContainerView.swift b/Sources/SearchFeature/Views/SearchContainerView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..5b3509055302c958da178a02c9b7dd12a1ea385e
--- /dev/null
+++ b/Sources/SearchFeature/Views/SearchContainerView.swift
@@ -0,0 +1,28 @@
+import UIKit
+import Shared
+
+final class SearchContainerView: UIView {
+    let scrollView = UIScrollView()
+    let segmentedControl = SearchSegmentedControl()
+
+    init() {
+        super.init(frame: .zero)
+
+        backgroundColor = Asset.neutralWhite.color
+        addSubview(segmentedControl)
+        addSubview(scrollView)
+
+        scrollView.snp.makeConstraints {
+            $0.edges.equalToSuperview()
+        }
+
+        segmentedControl.snp.makeConstraints {
+            $0.top.equalTo(safeAreaLayoutGuide).offset(10)
+            $0.left.equalToSuperview()
+            $0.right.equalToSuperview()
+            $0.height.equalTo(60)
+        }
+    }
+
+    required init?(coder: NSCoder) { nil }
+}
diff --git a/Sources/SearchFeature/Views/SearchPlaceholderView.swift b/Sources/SearchFeature/Views/SearchPlaceholderView.swift
index e6697688f13ab4b13c023f9e8579f081ff00be44..84ae459286df757555853e8fd4eb7369c323d476 100644
--- a/Sources/SearchFeature/Views/SearchPlaceholderView.swift
+++ b/Sources/SearchFeature/Views/SearchPlaceholderView.swift
@@ -60,6 +60,6 @@ final class SearchEmptyView: UIView {
     required init?(coder: NSCoder) { nil }
 
     func set(filter: String) {
-        title.text = Localized.ContactSearch.noneFound(filter)
+        title.text = Localized.Ud.noneFound(filter)
     }
 }
diff --git a/Sources/SearchFeature/Views/SearchSegmentedButton.swift b/Sources/SearchFeature/Views/SearchSegmentedButton.swift
new file mode 100644
index 0000000000000000000000000000000000000000..1142ead739213297ceeff7fdd80e19b5a814d317
--- /dev/null
+++ b/Sources/SearchFeature/Views/SearchSegmentedButton.swift
@@ -0,0 +1,42 @@
+import UIKit
+import Shared
+
+final class SearchSegmentedButton: UIControl {
+    let titleLabel = UILabel()
+    let imageView = UIImageView()
+
+    init() {
+        super.init(frame: .zero)
+
+        imageView.contentMode = .center
+        titleLabel.textAlignment = .center
+        titleLabel.textColor = Asset.neutralWhite.color
+        titleLabel.font = Fonts.Mulish.semiBold.font(size: 13.0)
+
+        addSubview(titleLabel)
+        addSubview(imageView)
+
+        imageView.snp.makeConstraints {
+            $0.top.equalToSuperview().offset(7.5)
+            $0.centerX.equalToSuperview()
+        }
+
+        titleLabel.snp.makeConstraints {
+            $0.top.equalTo(imageView.snp.bottom).offset(2)
+            $0.centerX.equalToSuperview()
+            $0.bottom.equalToSuperview().offset(-7.5)
+        }
+    }
+
+    required init?(coder: NSCoder) { nil }
+
+    func setup(title: String, icon: UIImage) {
+        titleLabel.text = title
+        imageView.image = icon
+    }
+
+    func update(color: UIColor) {
+        imageView.tintColor = color
+        titleLabel.textColor = color
+    }
+}
diff --git a/Sources/SearchFeature/Views/SearchSegmentedControl.swift b/Sources/SearchFeature/Views/SearchSegmentedControl.swift
new file mode 100644
index 0000000000000000000000000000000000000000..af0e4271cf53e611fcd604f4410f3d3b812fad33
--- /dev/null
+++ b/Sources/SearchFeature/Views/SearchSegmentedControl.swift
@@ -0,0 +1,120 @@
+import UIKit
+import Shared
+import SnapKit
+
+final class SearchSegmentedControl: UIView {
+    private let trackView = UIView()
+    private let stackView = UIStackView()
+    private var leftConstraint: Constraint?
+    private let trackIndicatorView = UIView()
+    private(set) var usernameButton = SearchSegmentedButton()
+    private(set) var emailButton = SearchSegmentedButton()
+    private(set) var phoneButton = SearchSegmentedButton()
+    private(set) var qrCodeButton = SearchSegmentedButton()
+
+    init() {
+        super.init(frame: .zero)
+        trackView.backgroundColor = Asset.neutralLine.color
+        trackIndicatorView.backgroundColor = Asset.brandPrimary.color
+
+        qrCodeButton.titleLabel.text = Localized.Ud.Tab.qr
+        emailButton.titleLabel.text = Localized.Ud.Tab.email
+        phoneButton.titleLabel.text = Localized.Ud.Tab.phone
+        usernameButton.titleLabel.text = Localized.Ud.Tab.username
+
+        usernameButton.titleLabel.textColor = Asset.brandPrimary.color
+        emailButton.titleLabel.textColor = Asset.neutralDisabled.color
+        phoneButton.titleLabel.textColor = Asset.neutralDisabled.color
+        qrCodeButton.titleLabel.textColor = Asset.neutralDisabled.color
+
+        usernameButton.imageView.tintColor = Asset.brandPrimary.color
+        emailButton.imageView.tintColor = Asset.neutralDisabled.color
+        phoneButton.imageView.tintColor = Asset.neutralDisabled.color
+        qrCodeButton.imageView.tintColor = Asset.neutralDisabled.color
+
+        qrCodeButton.imageView.image = Asset.searchTabQr.image
+        emailButton.imageView.image = Asset.searchTabEmail.image
+        phoneButton.imageView.image = Asset.searchTabPhone.image
+        usernameButton.imageView.image = Asset.searchTabUsername.image
+
+        stackView.addArrangedSubview(usernameButton)
+        stackView.addArrangedSubview(emailButton)
+        stackView.addArrangedSubview(phoneButton)
+        stackView.addArrangedSubview(qrCodeButton)
+        stackView.distribution = .fillEqually
+        stackView.backgroundColor = Asset.neutralWhite.color
+
+        addSubview(stackView)
+        addSubview(trackView)
+        trackView.addSubview(trackIndicatorView)
+
+        stackView.snp.makeConstraints {
+            $0.edges.equalToSuperview()
+        }
+
+        trackView.snp.makeConstraints {
+            $0.left.equalToSuperview()
+            $0.right.equalToSuperview()
+            $0.bottom.equalToSuperview()
+            $0.height.equalTo(2)
+        }
+
+        trackIndicatorView.snp.makeConstraints {
+            $0.top.equalToSuperview()
+            leftConstraint = $0.left.equalToSuperview().constraint
+            $0.width.equalToSuperview().dividedBy(4)
+            $0.bottom.equalToSuperview()
+        }
+    }
+
+    required init?(coder: NSCoder) { nil }
+
+    func updateSwipePercentage(_ percentageScrolled: CGFloat) {
+        let amountOfTabs = 4.0
+        let tabWidth = bounds.width / amountOfTabs
+        let leftOffset = percentageScrolled * tabWidth
+
+        leftConstraint?.update(offset: leftOffset)
+
+        let usernamePercentage = percentageScrolled > 1 ? 1 : percentageScrolled
+        let phonePercentage = percentageScrolled <= 1 ? 0 : percentageScrolled - 1
+        let emailPercentage = percentageScrolled > 1 ? 1 - (percentageScrolled-1) : percentageScrolled
+        let qrPercentage = percentageScrolled > 1 ? 1 - (percentageScrolled-1) : percentageScrolled
+
+        let usernameColor = UIColor.fade(
+            from: Asset.brandPrimary.color,
+            to: Asset.neutralDisabled.color,
+            pcent: usernamePercentage
+        )
+
+        let emailColor = UIColor.fade(
+            from: Asset.neutralDisabled.color,
+            to: Asset.brandPrimary.color,
+            pcent: emailPercentage
+        )
+
+        let phoneColor = UIColor.fade(
+            from: Asset.neutralDisabled.color,
+            to: Asset.brandPrimary.color,
+            pcent: phonePercentage
+        )
+
+        let qrColor = UIColor.fade(
+            from: Asset.brandPrimary.color,
+            to: Asset.neutralDisabled.color,
+            pcent: qrPercentage
+        )
+
+        usernameButton.imageView.tintColor = usernameColor
+        usernameButton.titleLabel.textColor = usernameColor
+
+        emailButton.imageView.tintColor = emailColor
+        emailButton.titleLabel.textColor = emailColor
+
+        phoneButton.imageView.tintColor = phoneColor
+        phoneButton.titleLabel.textColor = phoneColor
+
+        qrCodeButton.imageView.tintColor = qrColor
+        qrCodeButton.titleLabel.textColor = qrColor
+    }
+}
diff --git a/Sources/SearchFeature/Views/SearchView.swift b/Sources/SearchFeature/Views/SearchView.swift
index 86f929b1000aca396cd1fd8c63de372ff399472f..e4b6b63844aea298d89a881a7d529a5e0ea002d5 100644
--- a/Sources/SearchFeature/Views/SearchView.swift
+++ b/Sources/SearchFeature/Views/SearchView.swift
@@ -4,9 +4,9 @@ import InputField
 
 final class SearchView: UIView {
     private enum Constants {
-        static let phone = Localized.ContactSearch.Filter.phone
-        static let email = Localized.ContactSearch.Filter.email
-        static let username = Localized.ContactSearch.Filter.username
+        static let phone = Localized.Ud.Tab.phone
+        static let email = Localized.Ud.Tab.email
+        static let username = Localized.Ud.Tab.username
     }
 
     let input = InputField()
@@ -66,7 +66,7 @@ final class SearchView: UIView {
         backgroundColor = Asset.neutralWhite.color
 
         input.setup(
-            placeholder: Localized.ContactSearch.title,
+            placeholder: Localized.Ud.title,
             leftView: .image(Asset.lens.image.withTintColor(Asset.neutralDisabled.color)),
             accessibility: Localized.Accessibility.Search.input,
             allowsEmptySpace: false,
diff --git a/Sources/Shared/AutoGenerated/Assets.swift b/Sources/Shared/AutoGenerated/Assets.swift
index 2b2248fb83ad430ec95d9378a5d5762e8d74c046..0f3b9d9280e9df670205e4f58eb7adc194456358 100644
--- a/Sources/Shared/AutoGenerated/Assets.swift
+++ b/Sources/Shared/AutoGenerated/Assets.swift
@@ -113,6 +113,10 @@ public enum Asset {
   public static let searchLens = ImageAsset(name: "search_lens")
   public static let searchPhone = ImageAsset(name: "search_phone")
   public static let searchPlaceholderImage = ImageAsset(name: "search_placeholder_image")
+  public static let searchTabEmail = ImageAsset(name: "search_tab_email")
+  public static let searchTabPhone = ImageAsset(name: "search_tab_phone")
+  public static let searchTabQr = ImageAsset(name: "search_tab_qr")
+  public static let searchTabUsername = ImageAsset(name: "search_tab_username")
   public static let searchUsername = ImageAsset(name: "search_username")
   public static let icon32 = ImageAsset(name: "Icon-32")
   public static let settingsAdvanced = ImageAsset(name: "settings_advanced")
diff --git a/Sources/Shared/AutoGenerated/Strings.swift b/Sources/Shared/AutoGenerated/Strings.swift
index 07f2cee03ff185b2bd7f9fd768d00758302c74a2..a7b424f76629a0d52e217855b372e1a332da30c3 100644
--- a/Sources/Shared/AutoGenerated/Strings.swift
+++ b/Sources/Shared/AutoGenerated/Strings.swift
@@ -534,57 +534,6 @@ public enum Localized {
     }
   }
 
-  public enum ContactSearch {
-    /// There are no users with that %@.
-    public static func noneFound(_ p1: Any) -> String {
-      return Localized.tr("Localizable", "contactSearch.noneFound", String(describing: p1))
-    }
-    /// User
-    public static let sectionTitle = Localized.tr("Localizable", "contactSearch.sectionTitle")
-    /// Search
-    public static let title = Localized.tr("Localizable", "contactSearch.title")
-    public enum Filter {
-      /// Email
-      public static let email = Localized.tr("Localizable", "contactSearch.filter.email")
-      /// Phone
-      public static let phone = Localized.tr("Localizable", "contactSearch.filter.phone")
-      /// Username
-      public static let username = Localized.tr("Localizable", "contactSearch.filter.username")
-    }
-    public enum NicknameDrawer {
-      /// Save
-      public static let save = Localized.tr("Localizable", "contactSearch.nicknameDrawer.save")
-      /// Edit your new contact’s nickname so you know who they are.
-      public static let subtitle = Localized.tr("Localizable", "contactSearch.nicknameDrawer.subtitle")
-      /// Add a nickname
-      public static let title = Localized.tr("Localizable", "contactSearch.nicknameDrawer.title")
-    }
-    public enum Placeholder {
-      /// Searching is private by nature. The network cannot identify who a search request came from.
-      public static let title = Localized.tr("Localizable", "contactSearch.placeholder.title")
-      public enum Drawer {
-        /// Got it
-        public static let action = Localized.tr("Localizable", "contactSearch.placeholder.drawer.action")
-        /// You can search for users by their username, email, or phone number using the xx network’s #Anonymous Data Retrieval protocol# which keeps a user’s identity anonymous while requesting data. All sent requests contain salted hashes of what you are searching for. Raw data on emails, usernames, and phone numbers do not leave your phone.
-        public static let subtitle = Localized.tr("Localizable", "contactSearch.placeholder.drawer.subtitle")
-        /// Search
-        public static let title = Localized.tr("Localizable", "contactSearch.placeholder.drawer.title")
-      }
-    }
-    public enum RequestDrawer {
-      /// Cancel
-      public static let cancel = Localized.tr("Localizable", "contactSearch.requestDrawer.cancel")
-      /// EMAIL ADDRESS
-      public static let email = Localized.tr("Localizable", "contactSearch.requestDrawer.email")
-      /// PHONE NUMBER
-      public static let phone = Localized.tr("Localizable", "contactSearch.requestDrawer.phone")
-      /// Send Contact Request
-      public static let send = Localized.tr("Localizable", "contactSearch.requestDrawer.send")
-      /// Request Contact
-      public static let title = Localized.tr("Localizable", "contactSearch.requestDrawer.title")
-    }
-  }
-
   public enum Countries {
     /// Country Code
     public static let title = Localized.tr("Localizable", "countries.title")
@@ -1231,6 +1180,59 @@ public enum Localized {
     }
   }
 
+  public enum Ud {
+    /// There are no users with that %@.
+    public static func noneFound(_ p1: Any) -> String {
+      return Localized.tr("Localizable", "ud.noneFound", String(describing: p1))
+    }
+    /// User
+    public static let sectionTitle = Localized.tr("Localizable", "ud.sectionTitle")
+    /// Search
+    public static let title = Localized.tr("Localizable", "ud.title")
+    public enum NicknameDrawer {
+      /// Save
+      public static let save = Localized.tr("Localizable", "ud.nicknameDrawer.save")
+      /// Edit your new contact’s nickname so you know who they are.
+      public static let subtitle = Localized.tr("Localizable", "ud.nicknameDrawer.subtitle")
+      /// Add a nickname
+      public static let title = Localized.tr("Localizable", "ud.nicknameDrawer.title")
+    }
+    public enum Placeholder {
+      /// Searching is private by nature. The network cannot identify who a search request came from.
+      public static let title = Localized.tr("Localizable", "ud.placeholder.title")
+      public enum Drawer {
+        /// Got it
+        public static let action = Localized.tr("Localizable", "ud.placeholder.drawer.action")
+        /// You can search for users by their username, email, or phone number using the xx network’s #Anonymous Data Retrieval protocol# which keeps a user’s identity anonymous while requesting data. All sent requests contain salted hashes of what you are searching for. Raw data on emails, usernames, and phone numbers do not leave your phone.
+        public static let subtitle = Localized.tr("Localizable", "ud.placeholder.drawer.subtitle")
+        /// Search
+        public static let title = Localized.tr("Localizable", "ud.placeholder.drawer.title")
+      }
+    }
+    public enum RequestDrawer {
+      /// Cancel
+      public static let cancel = Localized.tr("Localizable", "ud.requestDrawer.cancel")
+      /// EMAIL ADDRESS
+      public static let email = Localized.tr("Localizable", "ud.requestDrawer.email")
+      /// PHONE NUMBER
+      public static let phone = Localized.tr("Localizable", "ud.requestDrawer.phone")
+      /// Send Contact Request
+      public static let send = Localized.tr("Localizable", "ud.requestDrawer.send")
+      /// Request Contact
+      public static let title = Localized.tr("Localizable", "ud.requestDrawer.title")
+    }
+    public enum Tab {
+      /// Email
+      public static let email = Localized.tr("Localizable", "ud.tab.email")
+      /// Phone
+      public static let phone = Localized.tr("Localizable", "ud.tab.phone")
+      /// QR Code
+      public static let qr = Localized.tr("Localizable", "ud.tab.qr")
+      /// Username
+      public static let username = Localized.tr("Localizable", "ud.tab.username")
+    }
+  }
+
   public enum Validator {
     public enum Code {
       /// Code length should be at least 4 chars
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Contents.json
@@ -0,0 +1,16 @@
+{
+  "images" : [
+    {
+      "filename" : "Icon.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true,
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Icon.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..488ddd5591377db8b2e8c7e3199c76dfe643394f
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_email.imageset/Icon.pdf
@@ -0,0 +1,87 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 3.000000 4.599121 cm
+0.809948 0.827749 0.850000 scn
+16.199999 0.000879 m
+1.800000 0.000879 l
+0.805887 0.000879 0.000000 0.806765 0.000000 1.800879 c
+0.000000 12.679177 l
+0.041948 13.642586 0.835680 14.401790 1.800000 14.400878 c
+16.199999 14.400878 l
+17.194113 14.400878 18.000000 13.594990 18.000000 12.600878 c
+18.000000 1.800879 l
+18.000000 0.806765 17.194113 0.000879 16.199999 0.000879 c
+h
+1.800000 10.919678 m
+1.800000 1.800878 l
+16.199999 1.800878 l
+16.199999 10.919678 l
+9.000000 6.120877 l
+1.800000 10.919678 l
+h
+2.520000 12.600878 m
+9.000000 8.280877 l
+15.480000 12.600878 l
+2.520000 12.600878 l
+h
+f
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  681
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000771 00000 n
+0000000793 00000 n
+0000000966 00000 n
+0000001040 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1099
+%%EOF
\ No newline at end of file
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Contents.json
@@ -0,0 +1,16 @@
+{
+  "images" : [
+    {
+      "filename" : "Icon.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true,
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Icon.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..e53e9789a38f9a7ffb48759a3c5c0e8c23dbd900
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_phone.imageset/Icon.pdf
@@ -0,0 +1,202 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 3.000000 0.831543 cm
+0.809948 0.827749 0.850000 scn
+5.310195 13.179303 m
+4.370402 13.521046 l
+4.207593 13.073322 l
+4.452703 12.664807 l
+5.310195 13.179303 l
+h
+5.934925 14.897307 m
+5.006448 15.268698 l
+5.000554 15.253963 l
+4.995131 15.239050 l
+5.934925 14.897307 l
+h
+6.052061 16.107719 m
+7.032641 16.303835 l
+7.027975 16.327169 l
+7.022203 16.350256 l
+6.052061 16.107719 l
+h
+5.036876 20.168457 m
+6.007019 20.410994 l
+5.787323 21.289776 l
+4.891161 21.157784 l
+5.036876 20.168457 l
+h
+0.000000 19.426592 m
+-0.145715 20.415918 l
+-1.053928 20.282150 l
+-0.998153 19.365835 l
+0.000000 19.426592 l
+h
+5.310195 7.517696 m
+4.598751 6.814928 l
+4.603089 6.810590 l
+5.310195 7.517696 l
+h
+17.414316 2.168457 m
+17.363102 1.169769 l
+18.311787 1.121119 l
+18.409060 2.066057 l
+17.414316 2.168457 l
+h
+17.960955 7.478652 m
+18.955698 7.376251 l
+19.046246 8.255862 l
+18.184332 8.453384 l
+17.960955 7.478652 l
+h
+14.212583 8.337654 m
+14.435959 9.312387 l
+14.413817 9.317461 l
+14.391468 9.321525 l
+14.212583 8.337654 l
+h
+12.963124 8.181472 m
+13.363943 7.265314 l
+13.387419 7.275585 l
+13.410338 7.287045 l
+12.963124 8.181472 l
+h
+11.088938 7.361515 m
+10.574442 6.504023 l
+11.016961 6.238511 l
+11.489756 6.445358 l
+11.088938 7.361515 l
+h
+6.249989 12.837560 m
+6.874718 14.555564 l
+4.995131 15.239050 l
+4.370402 13.521046 l
+6.249989 12.837560 l
+h
+6.863401 14.525917 m
+7.089864 15.092072 7.149697 15.718555 7.032641 16.303835 c
+5.071480 15.911604 l
+5.110607 15.715972 5.092350 15.483454 5.006448 15.268698 c
+6.863401 14.525917 l
+h
+7.022203 16.350256 m
+6.007019 20.410994 l
+4.066734 19.925920 l
+5.081918 15.865184 l
+7.022203 16.350256 l
+h
+4.891161 21.157784 m
+-0.145715 20.415918 l
+0.145715 18.437265 l
+5.182591 19.179131 l
+4.891161 21.157784 l
+h
+-0.998153 19.365835 m
+-0.710203 14.635235 1.265032 10.189831 4.598764 6.814941 c
+6.021627 8.220452 l
+3.029979 11.249034 1.256841 15.237471 0.998153 19.487349 c
+-0.998153 19.365835 l
+h
+4.603089 6.810590 m
+8.022314 3.391365 12.552481 1.416468 17.363102 1.169769 c
+17.465532 3.167145 l
+13.139493 3.388992 9.079639 5.162467 6.017303 8.224804 c
+4.603089 6.810590 l
+h
+18.409060 2.066057 m
+18.955698 7.376251 l
+16.966211 7.581052 l
+16.419573 2.270857 l
+18.409060 2.066057 l
+h
+18.184332 8.453384 m
+14.435959 9.312387 l
+13.989206 7.362922 l
+17.737579 6.503920 l
+18.184332 8.453384 l
+h
+14.391468 9.321525 m
+13.786641 9.431493 13.131458 9.383673 12.515911 9.075899 c
+13.410338 7.287045 l
+13.575702 7.369726 13.779521 7.399999 14.033697 7.353785 c
+14.391468 9.321525 l
+h
+12.562305 9.097629 m
+10.688119 8.277673 l
+11.489756 6.445358 l
+13.363943 7.265314 l
+12.562305 9.097629 l
+h
+11.603433 8.219008 m
+10.504310 8.878483 9.475373 9.686473 8.555264 10.606584 c
+7.141050 9.192369 l
+8.173217 8.160202 9.330832 7.250189 10.574442 6.504023 c
+11.603433 8.219008 l
+h
+8.555264 10.606584 m
+7.605314 11.556533 6.834208 12.582933 6.167688 13.693798 c
+4.452703 12.664807 l
+5.191823 11.432940 6.060631 10.272789 7.141050 9.192369 c
+8.555264 10.606584 l
+h
+f
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  3012
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000003102 00000 n
+0000003125 00000 n
+0000003298 00000 n
+0000003372 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+3431
+%%EOF
\ No newline at end of file
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Contents.json
@@ -0,0 +1,16 @@
+{
+  "images" : [
+    {
+      "filename" : "Icon.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true,
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Icon.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..8ff4fc0bf67f1a731cc8516ce77a2de344bc843c
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_qr.imageset/Icon.pdf
@@ -0,0 +1,189 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 5.000000 12.871094 cm
+0.809948 0.827749 0.850000 scn
+5.685554 6.128906 m
+0.435554 6.128906 l
+0.378356 6.128906 0.321724 6.117636 0.268880 6.095747 c
+0.216036 6.073858 0.168026 6.041771 0.127580 6.001326 c
+0.087135 5.960881 0.055048 5.912870 0.033159 5.860026 c
+0.011270 5.807182 0.000000 5.750551 0.000000 5.693353 c
+0.000000 0.443353 l
+-0.000018 0.327108 0.045616 0.215499 0.127082 0.132578 c
+0.208548 0.049657 0.319328 0.002053 0.435554 0.000013 c
+5.685554 0.000013 l
+5.802508 0.002013 5.914114 0.049368 5.996826 0.132080 c
+6.079538 0.214792 6.126893 0.326398 6.128893 0.443353 c
+6.128893 5.693353 l
+6.126853 5.809579 6.079249 5.920358 5.996328 6.001824 c
+5.913407 6.083291 5.801798 6.128924 5.685554 6.128906 c
+h
+4.371108 1.757799 m
+1.750000 1.757799 l
+1.750000 4.378906 l
+4.371108 4.378906 l
+4.371108 1.757799 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 5.000000 5.000000 cm
+0.809948 0.827749 0.850000 scn
+5.685554 6.128906 m
+0.435554 6.128906 l
+0.319328 6.126867 0.208548 6.079262 0.127082 5.996341 c
+0.045616 5.913420 -0.000018 5.801811 0.000000 5.685567 c
+0.000000 0.435567 l
+0.000000 0.378369 0.011270 0.321738 0.033159 0.268894 c
+0.055048 0.216050 0.087135 0.168039 0.127580 0.127594 c
+0.168026 0.087149 0.216036 0.055061 0.268880 0.033173 c
+0.321724 0.011284 0.378356 0.000013 0.435554 0.000013 c
+5.685554 0.000013 l
+5.801798 -0.000004 5.913407 0.045629 5.996328 0.127095 c
+6.079249 0.208562 6.126853 0.319341 6.128893 0.435567 c
+6.128893 5.685567 l
+6.126893 5.802522 6.079538 5.914128 5.996826 5.996840 c
+5.914114 6.079551 5.802508 6.126906 5.685554 6.128906 c
+h
+4.371108 1.750013 m
+1.750000 1.750013 l
+1.750000 4.371121 l
+4.371108 4.371121 l
+4.371108 1.750013 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 12.871094 12.871094 cm
+0.809948 0.827749 0.850000 scn
+5.693339 6.128906 m
+0.443339 6.128906 l
+0.327095 6.128924 0.215486 6.083291 0.132565 6.001824 c
+0.049644 5.920358 0.002039 5.809579 0.000000 5.693353 c
+0.000000 0.443353 l
+0.002000 0.326398 0.049355 0.214792 0.132067 0.132080 c
+0.214778 0.049368 0.326384 0.002013 0.443339 0.000013 c
+5.693339 0.000013 l
+5.809565 0.002053 5.920344 0.049657 6.001811 0.132578 c
+6.083277 0.215499 6.128911 0.327108 6.128893 0.443353 c
+6.128893 5.693353 l
+6.128893 5.808869 6.082995 5.919643 6.001312 6.001326 c
+5.919630 6.083008 5.808856 6.128906 5.693339 6.128906 c
+h
+4.378893 1.757799 m
+1.757785 1.757799 l
+1.757785 4.378906 l
+4.378893 4.378906 l
+4.378893 1.757799 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 12.871094 8.500000 cm
+0.809948 0.827749 0.850000 scn
+0.443339 0.000013 m
+0.327095 -0.000005 0.215486 0.045629 0.132565 0.127095 c
+0.049644 0.208562 0.002039 0.319341 0.000000 0.435567 c
+0.000000 2.185567 l
+0.002000 2.302522 0.049355 2.414128 0.132067 2.496840 c
+0.214778 2.579551 0.326384 2.626907 0.443339 2.628906 c
+2.193339 2.628906 l
+2.309565 2.626867 2.420345 2.579262 2.501811 2.496341 c
+2.583277 2.413420 2.628911 2.301811 2.628893 2.185567 c
+2.628893 0.435567 l
+2.628893 0.320050 2.582995 0.209276 2.501312 0.127594 c
+2.419630 0.045911 2.308856 0.000013 2.193339 0.000013 c
+0.443339 0.000013 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 12.871094 5.000000 cm
+0.809948 0.827749 0.850000 scn
+5.693339 6.128906 m
+4.814446 6.128906 l
+4.698220 6.126867 4.587441 6.079262 4.505975 5.996341 c
+4.424509 5.913420 4.378875 5.801811 4.378893 5.685567 c
+4.378893 3.500014 l
+3.064446 3.500014 l
+2.948930 3.500014 2.838156 3.454116 2.756473 3.372433 c
+2.674791 3.290751 2.628893 3.179976 2.628893 3.064460 c
+2.628893 1.750013 l
+0.443339 1.750013 l
+0.327095 1.750031 0.215486 1.704398 0.132565 1.622931 c
+0.049644 1.541465 0.002039 1.430686 0.000000 1.314460 c
+0.000000 0.435567 l
+0.002039 0.319341 0.049644 0.208562 0.132565 0.127095 c
+0.215486 0.045629 0.327095 -0.000004 0.443339 0.000013 c
+5.693339 0.000013 l
+5.808856 0.000013 5.919630 0.045911 6.001312 0.127594 c
+6.082995 0.209276 6.128893 0.320051 6.128893 0.435567 c
+6.128893 5.685567 l
+6.128911 5.801811 6.083277 5.913420 6.001811 5.996341 c
+5.920344 6.079262 5.809565 6.126867 5.693339 6.128906 c
+h
+f
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  4107
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000004197 00000 n
+0000004220 00000 n
+0000004393 00000 n
+0000004467 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+4526
+%%EOF
\ No newline at end of file
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Contents.json b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..d9a97df899595ebc48148baa9cbedb9be8f763fa
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Contents.json
@@ -0,0 +1,16 @@
+{
+  "images" : [
+    {
+      "filename" : "Icon.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true,
+    "template-rendering-intent" : "template"
+  }
+}
diff --git a/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Icon.pdf b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Icon.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..5f75d04ba8fcb3c602e0eb08226b68a3e6cc3d1c
--- /dev/null
+++ b/Sources/Shared/Resources/Assets.xcassets/AssetsSearch/search_tab_username.imageset/Icon.pdf
@@ -0,0 +1,95 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 4.000000 11.000000 cm
+0.809948 0.827749 0.850000 scn
+3.000000 5.000000 m
+3.000000 7.761424 5.238576 10.000000 8.000000 10.000000 c
+10.761423 10.000000 13.000000 7.761424 13.000000 5.000000 c
+13.000000 2.238576 10.761423 0.000000 8.000000 0.000000 c
+5.238576 0.000000 3.000000 2.238576 3.000000 5.000000 c
+h
+8.000000 2.000000 m
+9.656855 2.000000 11.000000 3.343146 11.000000 5.000000 c
+11.000000 6.656854 9.656855 8.000000 8.000000 8.000000 c
+6.343146 8.000000 5.000000 6.656854 5.000000 5.000000 c
+5.000000 3.343146 6.343146 2.000000 8.000000 2.000000 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 4.000000 13.000000 cm
+0.809948 0.827749 0.850000 scn
+2.343146 -5.343145 m
+0.842855 -6.843436 0.000000 -8.878267 0.000000 -11.000000 c
+2.000000 -11.000000 l
+2.000000 -9.408701 2.632141 -7.882577 3.757360 -6.757359 c
+4.882578 -5.632140 6.408701 -5.000000 8.000000 -5.000000 c
+9.591299 -5.000000 11.117423 -5.632140 12.242641 -6.757359 c
+13.367860 -7.882577 14.000000 -9.408701 14.000000 -11.000000 c
+16.000000 -11.000000 l
+16.000000 -8.878267 15.157146 -6.843436 13.656855 -5.343145 c
+12.156564 -3.842854 10.121732 -3.000000 8.000000 -3.000000 c
+5.878268 -3.000000 3.843437 -3.842854 2.343146 -5.343145 c
+h
+f
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  1279
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000001369 00000 n
+0000001392 00000 n
+0000001565 00000 n
+0000001639 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1698
+%%EOF
\ No newline at end of file
diff --git a/Sources/Shared/Resources/en.lproj/Localizable.strings b/Sources/Shared/Resources/en.lproj/Localizable.strings
index aebff7b7bcdb9b2c872577060b8f9244300baa90..7c8da3fd206e97854424e16b94dbbc91a22b9d5f 100644
--- a/Sources/Shared/Resources/en.lproj/Localizable.strings
+++ b/Sources/Shared/Resources/en.lproj/Localizable.strings
@@ -931,41 +931,43 @@
 
 // SearchFeature
 
-"contactSearch.title"
+"ud.title"
 = "Search";
-"contactSearch.placeholder.title"
+"ud.placeholder.title"
 = "Searching is private by nature. The network cannot identify who a search request came from.";
-"contactSearch.placeholder.drawer.title"
+"ud.placeholder.drawer.title"
 = "Search";
-"contactSearch.placeholder.drawer.subtitle"
+"ud.placeholder.drawer.subtitle"
 = "You can search for users by their username, email, or phone number using the xx network’s #Anonymous Data Retrieval protocol# which keeps a user’s identity anonymous while requesting data. All sent requests contain salted hashes of what you are searching for. Raw data on emails, usernames, and phone numbers do not leave your phone.";
-"contactSearch.placeholder.drawer.action"
+"ud.placeholder.drawer.action"
 = "Got it";
-"contactSearch.filter.phone"
+"ud.tab.phone"
 = "Phone";
-"contactSearch.filter.email"
+"ud.tab.email"
 = "Email";
-"contactSearch.filter.username"
+"ud.tab.username"
 = "Username";
-"contactSearch.sectionTitle"
+"ud.tab.qr"
+= "QR Code";
+"ud.sectionTitle"
 = "User";
-"contactSearch.noneFound"
+"ud.noneFound"
 = "There are no users with that %@.";
-"contactSearch.requestDrawer.title"
+"ud.requestDrawer.title"
 = "Request Contact";
-"contactSearch.requestDrawer.email"
+"ud.requestDrawer.email"
 = "EMAIL ADDRESS";
-"contactSearch.requestDrawer.phone"
+"ud.requestDrawer.phone"
 = "PHONE NUMBER";
-"contactSearch.requestDrawer.send"
+"ud.requestDrawer.send"
 = "Send Contact Request";
-"contactSearch.requestDrawer.cancel"
+"ud.requestDrawer.cancel"
 = "Cancel";
-"contactSearch.nicknameDrawer.title"
+"ud.nicknameDrawer.title"
 = "Add a nickname";
-"contactSearch.nicknameDrawer.subtitle"
+"ud.nicknameDrawer.subtitle"
 = "Edit your new contact’s nickname so you know who they are.";
-"contactSearch.nicknameDrawer.save"
+"ud.nicknameDrawer.save"
 = "Save";
 
 // LaunchFeature