diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 6e3032f..c119999 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -41,6 +41,7 @@
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
@@ -478,11 +479,18 @@
         // On large interfaces, we want the screen to auto-rotate based on the current orientation
         unlockScreenOrientation(true);
 
+        // The two first run cling paths are mutually exclusive, if the launcher is preinstalled
+        // on the device, then we always show the first run cling experience (or if there is no
+        // launcher2). Otherwise, we prompt the user upon started for migration
         showFirstRunActivity();
-        if (mModel.canMigrateFromOldLauncherDb()) {
-            mLauncherClings.showMigrationCling();
+        if (mLauncherClings.shouldShowFirstRunOrMigrationClings()) {
+            if (mModel.canMigrateFromOldLauncherDb(this)) {
+                mLauncherClings.showMigrationCling();
+            } else {
+                mLauncherClings.showFirstRunCling();
+            }
         } else {
-            mLauncherClings.showFirstRunCling();
+            mLauncherClings.removeFirstRunAndMigrationClings();
         }
     }
 
@@ -4280,6 +4288,21 @@
         mLauncherClings.updateSearchBarHint(hint);
     }
 
+    protected boolean isLauncherPreinstalled() {
+        PackageManager pm = getPackageManager();
+        try {
+            ApplicationInfo ai = pm.getApplicationInfo(getComponentName().getPackageName(), 0);
+            if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                return true;
+            } else {
+                return false;
+            }
+        } catch (NameNotFoundException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
     protected String getFirstRunClingSearchBarHint() {
         return "";
     }
diff --git a/src/com/android/launcher3/LauncherClings.java b/src/com/android/launcher3/LauncherClings.java
index 85937aa..42a134f 100644
--- a/src/com/android/launcher3/LauncherClings.java
+++ b/src/com/android/launcher3/LauncherClings.java
@@ -200,14 +200,27 @@
         }
     }
 
-    /** Shows the first run cling */
-    public void showFirstRunCling() {
+    public boolean shouldShowFirstRunOrMigrationClings() {
         SharedPreferences sharedPrefs = mLauncher.getSharedPrefs();
-        if (isClingsEnabled() &&
-                !sharedPrefs.getBoolean(FIRST_RUN_CLING_DISMISSED_KEY, false) &&
-                !skipCustomClingIfNoAccounts() ) {
+        return isClingsEnabled() &&
+            !sharedPrefs.getBoolean(FIRST_RUN_CLING_DISMISSED_KEY, false) &&
+            !sharedPrefs.getBoolean(MIGRATION_CLING_DISMISSED_KEY, false);
+    }
 
+    public void removeFirstRunAndMigrationClings() {
+        removeCling(R.id.first_run_cling);
+        removeCling(R.id.migration_cling);
+    }
 
+    /**
+     * Shows the first run cling.
+     *
+     * This flow is mutually exclusive with showMigrationCling, and only runs if this Launcher
+     * package was preinstalled or there is no db to migrate from.
+     */
+    public void showFirstRunCling() {
+        if (!skipCustomClingIfNoAccounts()) {
+            SharedPreferences sharedPrefs = mLauncher.getSharedPrefs();
             // If we're not using the default workspace layout, replace workspace cling
             // with a custom workspace cling (usually specified in an overlay)
             // For now, only do this on tablets
@@ -238,22 +251,22 @@
             }
             initCling(R.id.first_run_cling, 0, false, true);
         } else {
-            removeCling(R.id.first_run_cling);
+            removeFirstRunAndMigrationClings();
         }
     }
 
+    /**
+     * Shows the migration cling.
+     *
+     * This flow is mutually exclusive with showFirstRunCling, and only runs if this Launcher
+     * package was not preinstalled and there exists a db to migrate from.
+     */
     public void showMigrationCling() {
-        // Enable the clings only if they have not been dismissed before
-        if (isClingsEnabled() && !mLauncher.getSharedPrefs().getBoolean(
-                MIGRATION_CLING_DISMISSED_KEY, false)) {
-            mLauncher.hideWorkspaceSearchAndHotseat();
+        mLauncher.hideWorkspaceSearchAndHotseat();
 
-            Cling c = initCling(R.id.migration_cling, 0, false, true);
-            c.bringScrimToFront();
-            c.bringToFront();
-        } else {
-            removeCling(R.id.migration_cling);
-        }
+        Cling c = initCling(R.id.migration_cling, 0, false, true);
+        c.bringScrimToFront();
+        c.bringToFront();
     }
 
     public void showMigrationWorkspaceCling() {
@@ -300,7 +313,6 @@
         }
     }
 
-
     /** Removes the cling outright from the DragLayer */
     private void removeCling(int id) {
         final View cling = mLauncher.findViewById(id);
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index d271976..4478e9b 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -227,8 +227,8 @@
         }
     }
 
-    boolean canMigrateFromOldLauncherDb() {
-        return mOldContentProviderExists;
+    boolean canMigrateFromOldLauncherDb(Launcher launcher) {
+        return mOldContentProviderExists && !launcher.isLauncherPreinstalled() ;
     }
 
     static boolean findNextAvailableIconSpaceInScreen(ArrayList<ItemInfo> items, int[] xy,
