diff --git a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
index bf24b11..affe3a3 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
@@ -59,7 +59,7 @@
     private SetupStepGroup mSetupStepGroup;
     private static final String STATE_STEP = "step";
     private int mStepNumber;
-    private static final int STEP_0 = 0;
+    private static final int STEP_WELCOME = 0;
     private static final int STEP_1 = 1;
     private static final int STEP_2 = 2;
     private static final int STEP_3 = 3;
@@ -113,18 +113,20 @@
 
         if (savedInstanceState == null) {
             mStepNumber = determineSetupStepNumber();
+            if (mStepNumber == STEP_1 && !mWasLanguageAndInputSettingsInvoked) {
+                mStepNumber = STEP_WELCOME;
+            }
+            if (mStepNumber == STEP_3) {
+                // This IME already has been enabled and set as current IME.
+                // TODO: Implement tutorial.
+                invokeSettingsOfThisIme();
+                finish();
+                return;
+            }
         } else {
             mStepNumber = savedInstanceState.getInt(STATE_STEP);
         }
 
-        if (mStepNumber == STEP_3) {
-            // This IME already has been enabled and set as current IME.
-            // TODO: Implement tutorial.
-            invokeSettingsOfThisIme();
-            finish();
-            return;
-        }
-
         final String applicationName = getResources().getString(getApplicationInfo().labelRes);
         mWelcomeScreen = findViewById(R.id.setup_welcome_screen);
         final TextView welcomeTitle = (TextView)findViewById(R.id.setup_welcome_title);
@@ -230,13 +232,13 @@
             finish();
             return;
         }
-        final int stepState = determineSetupState();
+        final int currentStep = determineSetupStepNumber();
         final int nextStep;
         if (v == mActionStart) {
             nextStep = STEP_1;
         } else if (v == mActionNext) {
             nextStep = mStepNumber + 1;
-        } else if (v == mStep1Bullet && stepState == STEP_2) {
+        } else if (v == mStep1Bullet && currentStep == STEP_2) {
             nextStep = STEP_1;
         } else {
             nextStep = mStepNumber;
@@ -316,7 +318,7 @@
         return myImi.getId().equals(currentImeId);
     }
 
-    private int determineSetupState() {
+    private int determineSetupStepNumber() {
         mHandler.cancelPollingImeSettings();
         if (!isThisImeEnabled(this)) {
             return STEP_1;
@@ -327,14 +329,6 @@
         return STEP_3;
     }
 
-    private int determineSetupStepNumber() {
-        final int stepState = determineSetupState();
-        if (stepState == STEP_1) {
-            return mWasLanguageAndInputSettingsInvoked ? STEP_1 : STEP_0;
-        }
-        return stepState;
-    }
-
     @Override
     protected void onSaveInstanceState(final Bundle outState) {
         super.onSaveInstanceState(outState);
@@ -348,15 +342,11 @@
     }
 
     @Override
-    protected void onStart() {
-        super.onStart();
-        mStepNumber = determineSetupStepNumber();
-    }
-
-    @Override
     protected void onRestart() {
         super.onRestart();
-        mStepNumber = determineSetupStepNumber();
+        if (mStepNumber != STEP_WELCOME) {
+            mStepNumber = determineSetupStepNumber();
+        }
     }
 
     @Override
@@ -368,7 +358,7 @@
     @Override
     public void onBackPressed() {
         if (mStepNumber == STEP_1) {
-            mStepNumber = STEP_0;
+            mStepNumber = STEP_WELCOME;
             updateSetupStepView();
             return;
         }
@@ -384,15 +374,14 @@
     @Override
     public void onWindowFocusChanged(final boolean hasFocus) {
         super.onWindowFocusChanged(hasFocus);
-        if (!hasFocus) {
-            return;
+        if (hasFocus && mStepNumber != STEP_WELCOME) {
+            mStepNumber = determineSetupStepNumber();
+            updateSetupStepView();
         }
-        mStepNumber = determineSetupStepNumber();
-        updateSetupStepView();
     }
 
     private void updateSetupStepView() {
-        final boolean welcomeScreen = (mStepNumber == STEP_0);
+        final boolean welcomeScreen = (mStepNumber == STEP_WELCOME);
         mWelcomeScreen.setVisibility(welcomeScreen ? View.VISIBLE : View.GONE);
         mSetupScreen.setVisibility(welcomeScreen ? View.GONE: View.VISIBLE);
         if (welcomeScreen) {
@@ -401,7 +390,7 @@
             return;
         }
         mWelcomeVideoView.stopPlayback();
-        final boolean isStepActionAlreadyDone = mStepNumber < determineSetupState();
+        final boolean isStepActionAlreadyDone = mStepNumber < determineSetupStepNumber();
         mSetupStepGroup.enableStep(mStepNumber, isStepActionAlreadyDone);
         mActionNext.setVisibility(isStepActionAlreadyDone ? View.VISIBLE : View.GONE);
         mActionFinish.setVisibility((mStepNumber == STEP_3) ? View.VISIBLE : View.GONE);
