diff --git a/submodules/Camera/Sources/Camera.swift b/submodules/Camera/Sources/Camera.swift
index ca84dca958..f0a4d76653 100644
--- a/submodules/Camera/Sources/Camera.swift
+++ b/submodules/Camera/Sources/Camera.swift
@@ -102,7 +102,7 @@ final class CameraDeviceContext {
             return 30.0
         }
         switch DeviceModel.current {
-        case .iPhone15ProMax, .iPhone14ProMax, .iPhone13ProMax:
+        case .iPhone15ProMax, .iPhone14ProMax, .iPhone13ProMax, .iPhone16ProMax:
             return 60.0
         default:
             return 30.0
diff --git a/submodules/Camera/Sources/CameraMetrics.swift b/submodules/Camera/Sources/CameraMetrics.swift
index 4d5c684da8..01d68996e1 100644
--- a/submodules/Camera/Sources/CameraMetrics.swift
+++ b/submodules/Camera/Sources/CameraMetrics.swift
@@ -34,6 +34,10 @@ public extension Camera {
                 self = .iPhone15Pro
             case .iPhone15ProMax:
                 self = .iPhone15ProMax
+            case .iPhone16Pro:
+                self = .iPhone15Pro
+            case .iPhone16ProMax:
+                self = .iPhone15ProMax
             case .unknown:
                 self = .unknown
             default:
diff --git a/submodules/Display/Source/DeviceMetrics.swift b/submodules/Display/Source/DeviceMetrics.swift
index b01c2a487d..64801b608e 100644
--- a/submodules/Display/Source/DeviceMetrics.swift
+++ b/submodules/Display/Source/DeviceMetrics.swift
@@ -36,6 +36,8 @@ public enum DeviceMetrics: CaseIterable, Equatable {
     case iPhone14ProZoomed
     case iPhone14ProMax
     case iPhone14ProMaxZoomed
+    case iPhone16Pro
+    case iPhone16ProMax
     case iPad
     case iPadMini
     case iPad102Inch
@@ -68,6 +70,8 @@ public enum DeviceMetrics: CaseIterable, Equatable {
             .iPhone14ProZoomed,
             .iPhone14ProMax,
             .iPhone14ProMaxZoomed,
+            .iPhone16Pro,
+            .iPhone16ProMax,
             .iPad,
             .iPadMini,
             .iPad102Inch,
@@ -171,6 +175,10 @@ public enum DeviceMetrics: CaseIterable, Equatable {
                 return CGSize(width: 430.0, height: 932.0)
             case .iPhone14ProMaxZoomed:
                 return CGSize(width: 375.0, height: 812.0)
+            case .iPhone16Pro:
+                return CGSize(width: 402.0, height: 874.0)
+            case .iPhone16ProMax:
+                return CGSize(width: 440.0, height: 956.0)
             case .iPad:
                 return CGSize(width: 768.0, height: 1024.0)
             case .iPadMini:
@@ -204,6 +212,8 @@ public enum DeviceMetrics: CaseIterable, Equatable {
                 return 53.0 + UIScreenPixel
             case .iPhone14Pro, .iPhone14ProMax:
                 return 55.0
+            case .iPhone16Pro, .iPhone16ProMax:
+                return 55.0
             case let .unknown(_, _, _, screenCornerRadius):
                 return screenCornerRadius
             default:
@@ -213,7 +223,7 @@ public enum DeviceMetrics: CaseIterable, Equatable {
     
     func safeInsets(inLandscape: Bool) -> UIEdgeInsets {
         switch self {
-            case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed:
+            case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed, .iPhone16Pro, .iPhone16ProMax:
                 return inLandscape ? UIEdgeInsets(top: 0.0, left: 44.0, bottom: 0.0, right: 44.0) : UIEdgeInsets(top: 44.0, left: 0.0, bottom: 0.0, right: 0.0)
             default:
                 return UIEdgeInsets.zero
@@ -222,7 +232,7 @@ public enum DeviceMetrics: CaseIterable, Equatable {
     
     public func onScreenNavigationHeight(inLandscape: Bool, systemOnScreenNavigationHeight: CGFloat?) -> CGFloat? {
         switch self {
-        case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProMax:
+        case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProMax, .iPhone16Pro, .iPhone16ProMax:
             return inLandscape ? 21.0 : 34.0
         case .iPhone14ProZoomed:
             return inLandscape ? 21.0 : 28.0
@@ -262,6 +272,8 @@ public enum DeviceMetrics: CaseIterable, Equatable {
                 return 54.0
             case .iPhone14ProMaxZoomed:
                 return 47.0
+            case .iPhone16Pro, .iPhone16ProMax:
+                return 54.0
             case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax:
                 return 44.0
             case .iPadPro11Inch, .iPadPro3rdGen, .iPadMini, .iPadMini6thGen:
@@ -280,7 +292,7 @@ public enum DeviceMetrics: CaseIterable, Equatable {
                     return 162.0
                 case .iPhone6, .iPhone6Plus:
                     return 163.0
-                case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed:
+                case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed, .iPhone16Pro, .iPhone16ProMax:
                     return 172.0
                 case .iPad, .iPad102Inch, .iPadPro10Inch:
                     return 348.0
@@ -299,9 +311,9 @@ public enum DeviceMetrics: CaseIterable, Equatable {
                     return 216.0
                 case .iPhone6Plus:
                     return 226.0
-                case .iPhoneX, .iPhone12Mini, .iPhone12, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMaxZoomed:
+                case .iPhoneX, .iPhone12Mini, .iPhone12, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMaxZoomed, .iPhone16Pro:
                     return 292.0
-                case .iPhoneXSMax, .iPhoneXr, .iPhone12ProMax, .iPhone13ProMax, .iPhone14ProMax:
+                case .iPhoneXSMax, .iPhoneXr, .iPhone12ProMax, .iPhone13ProMax, .iPhone14ProMax, .iPhone16ProMax:
                     return 302.0
                 case .iPad, .iPad102Inch, .iPadPro10Inch:
                     return 263.0
@@ -320,7 +332,7 @@ public enum DeviceMetrics: CaseIterable, Equatable {
     func predictiveInputHeight(inLandscape: Bool) -> CGFloat {
         if inLandscape {
             switch self {
-                case .iPhone4, .iPhone5, .iPhone6, .iPhone6Plus, .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed:
+                case .iPhone4, .iPhone5, .iPhone6, .iPhone6Plus, .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed, .iPhone16Pro, .iPhone16ProMax:
                     return 37.0
                 case .iPad, .iPad102Inch, .iPadPro10Inch, .iPadPro11Inch, .iPadPro, .iPadPro3rdGen, .iPadMini, .iPadMini6thGen:
                     return 50.0
@@ -331,7 +343,7 @@ public enum DeviceMetrics: CaseIterable, Equatable {
             switch self {
                 case .iPhone4, .iPhone5:
                     return 37.0
-                case .iPhone6, .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed:
+                case .iPhone6, .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed, .iPhone16Pro, .iPhone16ProMax:
                     return 44.0
                 case .iPhone6Plus:
                     return 45.0
@@ -358,7 +370,7 @@ public enum DeviceMetrics: CaseIterable, Equatable {
     
     public var hasDynamicIsland: Bool {
         switch self {
-            case .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed:
+            case .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed, .iPhone16Pro, .iPhone16ProMax:
                 return true
             default:
                 return false
diff --git a/submodules/PasscodeUI/Sources/PasscodeLayout.swift b/submodules/PasscodeUI/Sources/PasscodeLayout.swift
index 5819862754..c5032937c6 100644
--- a/submodules/PasscodeUI/Sources/PasscodeLayout.swift
+++ b/submodules/PasscodeUI/Sources/PasscodeLayout.swift
@@ -67,7 +67,7 @@ struct PasscodeKeyboardLayout {
                 self.topOffset = 226.0
                 self.biometricsOffset = 30.0
                 self.deleteOffset = 20.0
-            case .iPhoneX, .iPhone12Mini, .iPhone12, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMaxZoomed:
+            case .iPhoneX, .iPhone12Mini, .iPhone12, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMaxZoomed, .iPhone16Pro:
                 self.buttonSize = 75.0
                 self.horizontalSecond = 103.0
                 self.horizontalThird = 206.0
@@ -78,7 +78,7 @@ struct PasscodeKeyboardLayout {
                 self.topOffset = 294.0
                 self.biometricsOffset = 30.0
                 self.deleteOffset = 20.0
-            case .iPhoneXSMax, .iPhoneXr, .iPhone12ProMax, .iPhone13ProMax, .iPhone14ProMax:
+            case .iPhoneXSMax, .iPhoneXr, .iPhone12ProMax, .iPhone13ProMax, .iPhone14ProMax, .iPhone16ProMax:
                 self.buttonSize = 85.0
                 self.horizontalSecond = 115.0
                 self.horizontalThird = 230.0
@@ -151,11 +151,11 @@ public struct PasscodeLayout {
                 self.titleOffset = 112.0
                 self.subtitleOffset = -6.0
                 self.inputFieldOffset = 156.0
-            case .iPhoneX, .iPhone12Mini, .iPhone12, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMaxZoomed:
+            case .iPhoneX, .iPhone12Mini, .iPhone12, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMaxZoomed, .iPhone16Pro:
                 self.titleOffset = 162.0
                 self.subtitleOffset = 0.0
                 self.inputFieldOffset = 206.0
-            case .iPhoneXSMax, .iPhoneXr, .iPhone12ProMax, .iPhone13ProMax, .iPhone14ProMax:
+            case .iPhoneXSMax, .iPhoneXr, .iPhone12ProMax, .iPhone13ProMax, .iPhone14ProMax, .iPhone16ProMax:
                 self.titleOffset = 180.0
                 self.subtitleOffset = 0.0
                 self.inputFieldOffset = 226.0
diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerOpenWebApp.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerOpenWebApp.swift
index c899f6db8e..b9a165de76 100644
--- a/submodules/TelegramUI/Sources/Chat/ChatControllerOpenWebApp.swift
+++ b/submodules/TelegramUI/Sources/Chat/ChatControllerOpenWebApp.swift
@@ -135,22 +135,16 @@ func openWebAppImpl(context: AccountContext, parentController: ViewController, u
                 }
             }, didDismiss: { [weak parentController] in
                 if let parentController = parentController as? ChatControllerImpl {
-//                    let isFocused = parentController.chatDisplayNode.textInputPanelNode?.isFocused ?? false
-//                    parentController.chatDisplayNode.insertSubnode(parentController.chatDisplayNode.inputPanelContainerNode, aboveSubnode: parentController.chatDisplayNode.inputContextPanelContainer)
-//                    if isFocused {
-//                        parentController.chatDisplayNode.textInputPanelNode?.ensureFocused()
-//                    }
-                    
                     parentController.updateChatPresentationInterfaceState(interactive: false) { state in
                         return state.updatedForceInputCommandsHidden(false)
                     }
                 }
             }, getNavigationController: { [weak parentController] in
+                var navigationController: NavigationController?
                 if let parentController = parentController as? ChatControllerImpl {
-                    return parentController.effectiveNavigationController ?? context.sharedContext.mainWindow?.viewController as? NavigationController
-                } else {
-                    return parentController?.navigationController as? NavigationController
+                    navigationController = parentController.effectiveNavigationController
                 }
+                return navigationController ?? (context.sharedContext.mainWindow?.viewController as? NavigationController)
             })
             controller.navigationPresentation = .flatModal
             parentController.push(controller)
@@ -209,11 +203,11 @@ func openWebAppImpl(context: AccountContext, parentController: ViewController, u
                 }, requestSwitchInline: { [weak parentController] query, chatTypes, completion in
                     ChatControllerImpl.botRequestSwitchInline(context: context, controller: parentController as? ChatControllerImpl, peerId: peer.id, botAddress: botAddress, query: query, chatTypes: chatTypes, completion: completion)
                 }, getNavigationController: { [weak parentController] in
+                    var navigationController: NavigationController?
                     if let parentController = parentController as? ChatControllerImpl {
-                        return parentController.effectiveNavigationController ?? context.sharedContext.mainWindow?.viewController as? NavigationController
-                    } else {
-                        return parentController?.navigationController as? NavigationController
+                        navigationController = parentController.effectiveNavigationController
                     }
+                    return navigationController ?? (context.sharedContext.mainWindow?.viewController as? NavigationController)
                 })
                 controller.navigationPresentation = .flatModal
                 if let parentController = parentController as? ChatControllerImpl {
@@ -257,11 +251,11 @@ func openWebAppImpl(context: AccountContext, parentController: ViewController, u
                         parentController.chatDisplayNode.historyNode.scrollToEndOfHistory()
                     }
                 }, getNavigationController: { [weak parentController] in
+                    var navigationController: NavigationController?
                     if let parentController = parentController as? ChatControllerImpl {
-                        return parentController.effectiveNavigationController ?? context.sharedContext.mainWindow?.viewController as? NavigationController
-                    } else {
-                        return parentController?.navigationController as? NavigationController
+                        navigationController = parentController.effectiveNavigationController
                     }
+                    return navigationController ?? (context.sharedContext.mainWindow?.viewController as? NavigationController)
                 })
                 controller.navigationPresentation = .flatModal
                 if let parentController = parentController as? ChatControllerImpl {