diff --git a/res/values/strings.xml b/res/values/strings.xml
index ee835fd..3bf6c8d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -288,13 +288,7 @@
     <string name="abandoned_promises_title">This app is not installed</string>
     <!-- Explanation for abandoned promise dialog. "The first 'it' refers to the shortcut icon.
     The second "it" refers to the app. -->
-    <plurals name="abandoned_promises_explanation">
-        <item quantity="one">The app for this icon isn\'t installed.
-            You can remove it, or search for the app and install it manually.
-        </item>
-        <item quantity="other">The app for this icon isn\'t installed.
-            You can remove all such broken icons, remove only this one,
-            or search for the app and install it manually.
-        </item>
-    </plurals>
+    <string name="abandoned_promise_explanation">The app for this icon isn\'t installed.
+        You can remove it, or search for the app and install it manually.
+    </string>
 </resources>
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 4ca3c50..1f79834 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -2545,12 +2545,9 @@
 
         // Check for abandoned promise
         if (shortcut.isAbandoned() && v instanceof BubbleTextView) {
-            final ArrayList<BubbleTextView> abandoned =
-                    mWorkspace.getAbandonedPromises(new ArrayList<BubbleTextView>());
             AlertDialog.Builder builder = new AlertDialog.Builder(this);
             builder.setTitle(R.string.abandoned_promises_title);
-            builder.setMessage(getResources().getQuantityString(
-                    R.plurals.abandoned_promises_explanation, abandoned.size()));
+            builder.setMessage(R.string.abandoned_promise_explanation);
             builder.setPositiveButton(R.string.abandoned_search,
                     new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int id) {
@@ -2558,16 +2555,6 @@
                         }
                     }
             );
-            if (abandoned.size() > 1) {
-                builder.setNegativeButton(R.string.abandoned_clean_all,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int id) {
-                                final UserHandleCompat user = UserHandleCompat.myUserHandle();
-                                mWorkspace.removeAbandonedPromises(abandoned, user);
-                            }
-                        }
-                );
-            }
             builder.setNeutralButton(R.string.abandoned_clean_this,
                     new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int id) {
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 74ef1d4..78454e9 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -4857,38 +4857,16 @@
         });
     }
 
-    ArrayList<BubbleTextView> getAbandonedPromises(final ArrayList<BubbleTextView> abandoned) {
-        mapOverShortcuts(Workspace.MAP_RECURSE, new Workspace.ShortcutOperator() {
-            @Override
-            public boolean evaluate(ItemInfo info, View view, View parent) {
-                if (info instanceof ShortcutInfo
-                        && ((ShortcutInfo) info).isAbandoned()
-                        && view instanceof BubbleTextView) {
-                    abandoned.add((BubbleTextView) view);
-                }
-                return false;
-            }
-        });
-        return abandoned;
-    }
-    public void removeAbandonedPromise(BubbleTextView view, UserHandleCompat user) {
-        ArrayList<BubbleTextView> views = new ArrayList<BubbleTextView>(1);
-        views.add(view);
-        removeAbandonedPromises(views, user);
-    }
-
-    public void removeAbandonedPromises(ArrayList<BubbleTextView> views, UserHandleCompat user) {
-        HashSet<ComponentName> cns = new HashSet<ComponentName>(views.size());
-        for (final BubbleTextView bubble : views) {
-            if (bubble.getTag() != null && bubble.getTag() instanceof ShortcutInfo) {
-                final ShortcutInfo shortcut = (ShortcutInfo) bubble.getTag();
-                if (shortcut.isAbandoned()) {
-                    cns.add(shortcut.getRestoredIntent().getComponent());
-                    LauncherModel.deleteItemFromDatabase(mLauncher, shortcut);
-                }
+    public void removeAbandonedPromise(BubbleTextView abandonedIcon, UserHandleCompat user) {
+        if (abandonedIcon.getTag() != null && abandonedIcon.getTag() instanceof ShortcutInfo) {
+            final ShortcutInfo shortcut = (ShortcutInfo) abandonedIcon.getTag();
+            if (shortcut.isAbandoned()) {
+                HashSet<ComponentName> cns = new HashSet<ComponentName>(1);
+                cns.add(shortcut.getRestoredIntent().getComponent());
+                LauncherModel.deleteItemFromDatabase(mLauncher, shortcut);
+                removeItemsByComponentName(cns, user);
             }
         }
-        removeItemsByComponentName(cns, user);
     }
 
     public void updatePackageState(final String pkgName, final int state) {
