diff --git a/lib/src/app.dart b/lib/src/app.dart
index 3e2b29d60263127e11faa00ddc88778a5d9eabd1..fbedba3885efb6cbc2ee9f5fc4b948572a12ff32 100644
--- a/lib/src/app.dart
+++ b/lib/src/app.dart
@@ -9,6 +9,17 @@ import 'package:shared_preferences/shared_preferences.dart';
 
 import 'package:uni_links/uni_links.dart';
 
+enum AppMode {
+  Default,
+  Authorization,
+}
+
+enum Screen {
+  App,
+  OAuth,
+  Dashboard
+}
+
 class App extends StatelessWidget {
   Future<Widget> initApplication() async {
     Uri initialUri;
@@ -58,11 +69,12 @@ class MainApp extends StatefulWidget {
 class _MainAppState extends State<MainApp> {
   StreamSubscription _sub;
 
-  String _appMode = "";
+  /// "Default" when you open app, "Authorization" when app initiated
+  /// from third party app
+  AppMode _appMode;
 
   // Url of the app which invoked OAuth
   String _invokerURL;
-  String _host;
 
   @override
   initState() {
@@ -89,22 +101,17 @@ class _MainAppState extends State<MainApp> {
   updateAppMode(Uri uri) {
     if (uri?.path == "/authorize") {
       setState(() {
-        _appMode = "oauth";
+        _appMode = AppMode.Authorization;
         _invokerURL = uri.queryParameters["invokerUrl"];
+
       });
     } else {
       setState(() {
-        _appMode = "app";
+        _appMode = AppMode.Default;
       });
     }
   }
 
-  setMode(String mode) {
-    setState(() {
-      _appMode = mode;
-    });
-  }
-
   @override
   Widget build(BuildContext context) {
     return new Scaffold(
@@ -112,7 +119,6 @@ class _MainAppState extends State<MainApp> {
       body: Home(
         mode: _appMode,
         invokerURL: _invokerURL,
-        setMode: setMode,
         host: widget.initialHost
       )
     );
diff --git a/lib/src/screens/home.dart b/lib/src/screens/home.dart
index a336e144994788c2e649399288ebdb6afc92cf78..4f3de27332b692f034901bd73ca48b5230a4e94f 100644
--- a/lib/src/screens/home.dart
+++ b/lib/src/screens/home.dart
@@ -8,13 +8,18 @@ import 'dart:async';
 import 'package:shared_preferences/shared_preferences.dart';
 
 import '../../config.dart';
+import '../app.dart';
 
 class Home extends StatefulWidget {
-  Home({@required this.mode, @required this.invokerURL, @required this.setMode, @required this.host});
-  final String mode;
+  Home({
+    @required this.mode,
+    @required this.invokerURL,
+    @required this.host,
+  });
+
+  final AppMode mode;
   final String invokerURL;
   final String host;
-  final void Function(String) setMode;
 
   @override
   _HomeState createState() => _HomeState();
@@ -24,24 +29,28 @@ class _HomeState extends State<Home> {
   String _host = Config.appFlavor == Flavor.DEVELOPMENT ? Config.HOSTS[0] : Config.DEFAULT_APP_HOST;
   bool _hidden = true;
 
+  Screen _currentScreen = Screen.App;
+
   @override
   initState() {
     super.initState();
+
+    // Set up initial host
     if (widget.host != null) {
       setState(() {
         _host = widget.host;
       });
     }
 
-    showMode(widget.mode);
+    setScreenByMode(widget.mode);
 
     FlutterAppAuthWrapper.eventStream().listen((data) {
       var token = json.decode(data.toString())["access_token"];
       _showAlert(token);
-      widget.setMode("");
+      setScreen(Screen.App);
     }, onError: (error) {
       log("Err $error");
-      widget.setMode("");
+      setScreen(Screen.App);
     });
 
     Timer(
@@ -54,6 +63,25 @@ class _HomeState extends State<Home> {
     );
   }
 
+  setScreen(Screen screen) {
+    if (
+      _currentScreen == screen &&
+      screen != Screen.Dashboard // ATM we can not determine whether dashboard was closed or not, so we avoid this case
+    ) {
+      return;
+    }
+
+    setState(() {
+      _currentScreen = screen;
+    });
+
+    if (_currentScreen == Screen.Dashboard) {
+      openVereign();
+    } else if (_currentScreen == Screen.OAuth) {
+      startOAuth();
+    }
+  }
+
   Future<void> _showAlert(token) {
     return showDialog<void>(
       context: context,
@@ -93,17 +121,17 @@ class _HomeState extends State<Home> {
     }
 
     if (widget.mode != oldWidget.mode) {
-      showMode(widget.mode);
+      setScreenByMode(widget.mode);
     }
 
     super.didUpdateWidget(oldWidget);
   }
 
-  showMode(mode) {
-    if (mode == "app") {
-      openVereign();
-    } else if (mode == "oauth") {
-      startOAuth();
+  setScreenByMode(AppMode mode) {
+    if (mode == AppMode.Authorization) {
+      setScreen(Screen.OAuth);
+    } else if (mode == AppMode.Default) {
+      setScreen(Screen.Dashboard);
     }
   }
 
@@ -141,10 +169,13 @@ class _HomeState extends State<Home> {
     }
 
     var children = <Widget>[
-      _urlButton(context, "Open Dashboard", openVereign),
-      _urlButton(context, "Authorize with Vereign", startOAuth)
+      _urlButton(context, "Open Dashboard", () => setScreen(Screen.Dashboard)),
     ];
 
+    if (widget.mode == AppMode.Authorization) {
+      children.add(_urlButton(context, "Authorize with Vereign", () => setScreen(Screen.OAuth)));
+    }
+
     if (Config.appFlavor == Flavor.DEVELOPMENT) {
       children.add(
         wrapInContainer(