diff --git a/src/com/android/settings/FingerprintEnroll.java b/src/com/android/settings/FingerprintEnroll.java
index 865fcdc..376444e 100644
--- a/src/com/android/settings/FingerprintEnroll.java
+++ b/src/com/android/settings/FingerprintEnroll.java
@@ -384,15 +384,6 @@
             }
         };
 
-        private boolean runConfirmDeviceCredentials(int request) {
-            if (DEBUG) Log.v(TAG, "runKeyguardConfirmation(" + request + ")");
-            Resources res = getResources();
-            return new ChooseLockSettingsHelper(getActivity(), this)
-                    .launchConfirmationActivity(request,
-                            res.getText(R.string.master_clear_gesture_prompt),
-                            res.getText(R.string.master_clear_gesture_explanation));
-        }
-
         @Override
         public void onActivityResult(int requestCode, int resultCode, Intent data) {
             super.onActivityResult(requestCode, resultCode, data);
diff --git a/src/com/android/settings/FingerprintSettings.java b/src/com/android/settings/FingerprintSettings.java
index f91fcfa..e7443e3 100644
--- a/src/com/android/settings/FingerprintSettings.java
+++ b/src/com/android/settings/FingerprintSettings.java
@@ -22,7 +22,9 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.os.Handler;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceGroup;
@@ -30,12 +32,13 @@
 import android.service.fingerprint.FingerprintManager;
 import android.service.fingerprint.FingerprintManagerReceiver;
 import android.service.fingerprint.FingerprintManager.FingerprintItem;
+import android.util.AttributeSet;
 import android.util.Log;
+import android.view.View;
 import android.widget.EditText;
 
 import com.android.settings.search.Indexable;
 
-import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -73,14 +76,28 @@
         private static final String KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE =
                 "fingerprint_enable_keyguard_toggle";
 
+        private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000;
+        private static final int MSG_HIGHLIGHT_FINGERPRINT_ITEM = 1001;
+
         private static final int ADD_FINGERPRINT_REQUEST = 10;
 
         private static final boolean ENABLE_USAGE_CATEGORY = false;
 
         private FingerprintManager mFingerprintManager;
-        private HashMap<Preference, FingerprintItem> mFingerprintMap
-                = new HashMap<Preference, FingerprintManager.FingerprintItem>();
         private EditText mDialogTextField;
+        private PreferenceGroup mManageCategory;
+        private final Handler mHandler = new Handler() {
+            public void handleMessage(android.os.Message msg) {
+                switch (msg.what) {
+                    case MSG_REFRESH_FINGERPRINT_TEMPLATES:
+                        removeFingerprintPreference(msg.arg1);
+                    break;
+                    case MSG_HIGHLIGHT_FINGERPRINT_ITEM:
+                        highlightFingerprintItem(msg.arg1);
+                    break;
+                }
+            };
+        };
 
         @Override
         public void onCreate(Bundle savedInstanceState) {
@@ -90,17 +107,42 @@
             mFingerprintManager.startListening(new FingerprintManagerReceiver() {
                 @Override
                 public void onRemoved(int fingerprintId) {
-                    Log.v(TAG, "Fingerprint template " + fingerprintId + " removed");
-                    // TODO: this is a bit wasteful; just remove the fingerprint id item
-                    createPreferenceHierarchy();
+                    mHandler.obtainMessage(MSG_REFRESH_FINGERPRINT_TEMPLATES, fingerprintId, 0)
+                            .sendToTarget();
                 }
                 @Override
                 public void onProcessed(int fingerprintId) {
-                    Log.v(TAG, "Fingerprint " + fingerprintId + " detected");
+                    if (fingerprintId != 0) {
+                        mHandler.obtainMessage(MSG_HIGHLIGHT_FINGERPRINT_ITEM, fingerprintId, 0)
+                                .sendToTarget();
+                    }
                 }
             });
         }
 
+        protected void removeFingerprintPreference(int fingerprintId) {
+            String name = genKey(fingerprintId);
+            Preference prefToRemove = mManageCategory.findPreference(name);
+            if (prefToRemove != null) {
+                if (!mManageCategory.removePreference(prefToRemove)) {
+                    Log.w(TAG, "Failed to remove preference with key " + name);
+                }
+            } else {
+                Log.w(TAG, "Can't find preference to remove: " + name);
+            }
+        }
+
+        private void highlightFingerprintItem(int fpId) {
+            String prefName = genKey(fpId);
+            Preference pref = mManageCategory.findPreference(prefName);
+            if (pref instanceof FingerprintPreference) {
+                final FingerprintPreference fpref = (FingerprintPreference) pref;
+                fpref.highlight();
+            } else {
+                Log.w(TAG, "Wrong pref " + (pref != null ? pref.getKey() : "null"));
+            }
+        }
+
         /**
          * Important!
          *
@@ -116,10 +158,9 @@
             root = getPreferenceScreen();
 
             // Fingerprint items
-            PreferenceGroup manageCategory = (PreferenceGroup) root.findPreference(
-                    KEY_MANAGE_CATEGORY);
-            if (manageCategory != null) {
-                addFingerprintItemPreferences(manageCategory);
+            mManageCategory = (PreferenceGroup) root.findPreference(KEY_MANAGE_CATEGORY);
+            if (mManageCategory != null) {
+                addFingerprintItemPreferences(mManageCategory);
             }
 
             // Fingerprint usage options
@@ -142,15 +183,16 @@
             manageFingerprintCategory.removeAll();
             List<FingerprintItem> items = mFingerprintManager.getEnrolledFingerprints();
             final int fingerprintCount = items.size();
-            mFingerprintMap.clear();
             for (int i = 0; i < fingerprintCount; i++) {
-                Preference pref = new Preference(manageFingerprintCategory.getContext());
-                pref.setKey(KEY_FINGERPRINT_ITEM);
-                FingerprintItem item = items.get(i);
+                final FingerprintItem item = items.get(i);
+                FingerprintPreference pref = new FingerprintPreference(
+                        manageFingerprintCategory.getContext());
+                pref.setKey(genKey(item.id));
                 pref.setTitle(item.name);
+                pref.setFingerprintItem(item);
+                pref.setPersistent(false);
                 manageFingerprintCategory.addPreference(pref);
                 pref.setOnPreferenceChangeListener(this);
-                mFingerprintMap.put(pref, item);
             }
             Preference addPreference = new Preference(manageFingerprintCategory.getContext());
             addPreference.setKey(KEY_FINGERPRINT_ADD);
@@ -159,6 +201,10 @@
             addPreference.setOnPreferenceChangeListener(this);
         }
 
+        private static String genKey(int id) {
+            return KEY_FINGERPRINT_ITEM + "_" + id;
+        }
+
         @Override
         public void onResume() {
             super.onResume();
@@ -174,8 +220,9 @@
                 Intent intent = new Intent();
                 intent.setClassName("com.android.settings", FingerprintEnroll.class.getName());
                 startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
-            } else if (KEY_FINGERPRINT_ITEM.equals(key)) {
-                final FingerprintItem item = mFingerprintMap.get(pref);
+            } else if (pref instanceof FingerprintPreference) {
+                FingerprintPreference fpref = (FingerprintPreference) pref;
+                final FingerprintItem item =fpref.getFingerprintItem();
                 showRenameDeleteDialog(item.name, pref, item.id);
                 return super.onPreferenceTreeClick(preferenceScreen, pref);
             }
@@ -232,4 +279,67 @@
             return R.string.help_url_security;
         }
     }
+
+    public static class FingerprintPreference extends Preference {
+        private static final int RESET_HIGHLIGHT_DELAY_MS = 500;
+        private FingerprintItem mFingerprintItem;
+        private View mView;
+        private Drawable mHighlightDrawable;
+        private Context mContext;
+
+        public FingerprintPreference(Context context, AttributeSet attrs, int defStyleAttr,
+                int defStyleRes) {
+            super(context, attrs, defStyleAttr, defStyleRes);
+            mContext = context;
+        }
+        public FingerprintPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+            this(context, attrs, defStyleAttr, 0);
+        }
+
+        public FingerprintPreference(Context context, AttributeSet attrs) {
+            this(context, attrs, com.android.internal.R.attr.preferenceStyle);
+        }
+
+        public FingerprintPreference(Context context) {
+            this(context, null);
+        }
+
+        public void setFingerprintItem(FingerprintItem item) {
+            mFingerprintItem = item;
+        }
+
+        public FingerprintItem getFingerprintItem() {
+            return mFingerprintItem;
+        }
+
+        private Drawable getHighlightDrawable() {
+            if (mHighlightDrawable == null) {
+                mHighlightDrawable = mContext.getDrawable(R.drawable.preference_highlight);
+            }
+            return mHighlightDrawable;
+        }
+
+        public void highlight() {
+            Drawable highlight = getHighlightDrawable();
+            final View view = mView;
+            view.setBackground(highlight);
+            final int centerX = view.getWidth() / 2;
+            final int centerY = view.getHeight() / 2;
+            highlight.setHotspot(centerX, centerY);
+            view.setPressed(true);
+            view.postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    view.setPressed(false);
+                    view.setBackground(null);
+                }
+            }, RESET_HIGHLIGHT_DELAY_MS);
+        }
+
+        @Override
+        protected void onBindView(View view) {
+            super.onBindView(view);
+            mView = view;
+        }
+    };
 }
