diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index f0b4d82..7d7071e 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -32,7 +32,7 @@
     <string name="recentCalls_empty" msgid="247053222448663107">"Gesprekkenoverzicht is leeg"</string>
     <string name="clearCallLogConfirmation_title" msgid="6427524640461816332">"Oproeplog wissen?"</string>
     <string name="clearCallLogConfirmation" msgid="5043563133171583152">"Al uw oproepgegevens worden verwijderd."</string>
-    <string name="clearCallLogProgress_title" msgid="8365943000154295771">"Oproeplogboek wissen..."</string>
+    <string name="clearCallLogProgress_title" msgid="8365943000154295771">"Gesprekkenlijst wissen..."</string>
   <plurals name="notification_voicemail_title">
     <item quantity="one" msgid="1746619685488504230">"Voicemail"</item>
     <item quantity="other" msgid="5513481419205061254">"<xliff:g id="COUNT">%1$d</xliff:g> voicemails"</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 2717049..90ed648 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -24,12 +24,12 @@
     <string name="menu_sendTextMessage" msgid="6937343460284499306">"发送短信"</string>
     <string name="recentCalls_callNumber" msgid="1756372533999226126">"呼叫<xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"呼叫之前编辑号码"</string>
-    <string name="recentCalls_addToContact" msgid="1429899535546487008">"添加到“联系人”"</string>
+    <string name="recentCalls_addToContact" msgid="1429899535546487008">"添加到通讯录"</string>
     <string name="recentCalls_removeFromRecentList" msgid="401662244636511330">"从通话记录中删除"</string>
     <string name="recentCalls_deleteAll" msgid="6352364392762163704">"清除通话记录"</string>
     <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"删除语音邮件"</string>
     <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"分享语音邮件"</string>
-    <string name="recentCalls_empty" msgid="247053222448663107">"通话记录为空。"</string>
+    <string name="recentCalls_empty" msgid="247053222448663107">"没有通话记录。"</string>
     <string name="clearCallLogConfirmation_title" msgid="6427524640461816332">"要清除通话记录吗？"</string>
     <string name="clearCallLogConfirmation" msgid="5043563133171583152">"系统将删除您的所有通话记录。"</string>
     <string name="clearCallLogProgress_title" msgid="8365943000154295771">"正在清除通话记录..."</string>
@@ -89,7 +89,7 @@
     <string name="menu_show_missed_only" msgid="154473166059743996">"仅显示未接来电"</string>
     <string name="menu_show_voicemails_only" msgid="1898421289561435703">"只显示语音邮件"</string>
     <string name="menu_show_all_calls" msgid="7560347482073345885">"显示所有通话"</string>
-    <string name="add_2sec_pause" msgid="9214012315201040129">"暂停时间延长 2 秒"</string>
+    <string name="add_2sec_pause" msgid="9214012315201040129">"暂停时间延长2秒"</string>
     <string name="add_wait" msgid="3360818652790319634">"延长等待时间"</string>
     <string name="call_settings" msgid="7666474782093693667">"设置"</string>
     <string name="menu_newContact" msgid="1209922412763274638">"新建联系人"</string>
diff --git a/src/com/android/dialer/list/PhoneFavoriteDragAndDropListeners.java b/src/com/android/dialer/list/PhoneFavoriteDragAndDropListeners.java
deleted file mode 100644
index f0e97ac..0000000
--- a/src/com/android/dialer/list/PhoneFavoriteDragAndDropListeners.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.dialer.list;
-
-import android.graphics.Rect;
-import android.util.Log;
-import android.view.DragEvent;
-import android.view.View;
-import android.view.View.OnDragListener;
-
-import com.android.dialer.list.PhoneFavoritesTileAdapter.ContactTileRow;
-
-/**
- * Implements the OnLongClickListener and OnDragListener for phone's favorite tiles and rows.
- */
-public class PhoneFavoriteDragAndDropListeners {
-
-    private static final String TAG = PhoneFavoriteDragAndDropListeners.class.getSimpleName();
-    private static final boolean DEBUG = false;
-
-    /**
-     * Implements the OnDragListener to handle drag events.
-     */
-    public static class PhoneFavoriteDragListener implements OnDragListener {
-        /** Location of the drag event. */
-        private float mX = 0;
-        private float mY = 0;
-        private final ContactTileRow mContactTileRow;
-        private final PhoneFavoritesTileAdapter mTileAdapter;
-
-        public PhoneFavoriteDragListener(ContactTileRow contactTileRow,
-                PhoneFavoritesTileAdapter tileAdapter) {
-            super();
-            mContactTileRow = contactTileRow;
-            mTileAdapter = tileAdapter;
-        }
-
-        /**
-         * @return The item index in {@link #mTileAdapter} for the given {@link DragEvent}.
-         *     Returns -1 if {@link #mTileAdapter} is not in dragging or index can not be found.
-         */
-        private int getDragItemIndex(DragEvent event) {
-            int itemIndex = -1;
-            if (mTileAdapter != null && mContactTileRow != null
-                    && !mTileAdapter.getInDragging()) {
-                mX = event.getX();
-                mY = event.getY();
-                if (DEBUG) {
-                    Log.v(TAG, String.valueOf(mX) + "; " + String.valueOf(mY));
-                }
-
-                final int[] rowLocation = new int[2];
-                mContactTileRow.getLocationOnScreen(rowLocation);
-
-                final Rect locationRect = new Rect(rowLocation[0], rowLocation[1],
-                        rowLocation[0] + mContactTileRow.getWidth(),
-                        rowLocation[1] + mContactTileRow.getHeight());
-
-                if (locationRect.contains((int) mX, (int) mY)) {
-                    // Finds out which item is being dragged.
-                    // Computes relative coordinates as we get absolute coordinates.
-                    itemIndex = mContactTileRow.getItemIndex(
-                            mX - rowLocation[0], mY - rowLocation[1]);
-                    if (DEBUG) {
-                        Log.v(TAG, "Start dragging " + String.valueOf(itemIndex));
-                    }
-                }
-            }
-            return itemIndex;
-        }
-
-        @Override
-        public boolean onDrag(View v, DragEvent event) {
-            if (DEBUG) {
-                Log.v(TAG, event.toString());
-            }
-            // Handles drag events.
-            switch (event.getAction()) {
-                case DragEvent.ACTION_DRAG_STARTED:
-                    final int itemIndex = getDragItemIndex(event);
-                    if (itemIndex != -1) {
-                        // Indicates a drag has started.
-                        mTileAdapter.setInDragging(true);
-
-                        // Temporarily pops out the Contact entry.
-                        mTileAdapter.popContactEntry(itemIndex);
-                    }
-                    break;
-                case DragEvent.ACTION_DRAG_ENTERED:
-                    break;
-                case DragEvent.ACTION_DRAG_EXITED:
-                    break;
-                case DragEvent.ACTION_DROP:
-                    // Indicates a drag has finished.
-                    if (mTileAdapter != null && mContactTileRow != null) {
-                        mTileAdapter.setInDragging(false);
-                        // The drop to position has been reported to the adapter
-                        // via {@link DragEvent#ACTION_DRAG_LOCATION} events in ListView.
-                        mTileAdapter.handleDrop();
-                    }
-                    break;
-                case DragEvent.ACTION_DRAG_ENDED:
-                    if (mTileAdapter != null && mTileAdapter.getInDragging()) {
-                        // If the drag and drop ends when the drop happens outside of any rows,
-                        // we will end the drag here and put the item back to where it was dragged
-                        // from before.
-                        mTileAdapter.setInDragging(false);
-                        mTileAdapter.handleDrop();
-                    }
-                    break;
-                case DragEvent.ACTION_DRAG_LOCATION:
-                    break;
-                default:
-                    break;
-            }
-            return true;
-        }
-    }
-}
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java
index 270ed63..d8179e7 100644
--- a/src/com/android/dialer/list/PhoneFavoriteFragment.java
+++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java
@@ -211,6 +211,7 @@
         mListView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_RIGHT);
         mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
         mListView.setOnItemSwipeListener(mContactTileAdapter);
+        mListView.setOnDragDropListener(mContactTileAdapter);
 
         mEmptyView = inflater.inflate(R.layout.phone_no_favorites, mListView, false);
 
diff --git a/src/com/android/dialer/list/PhoneFavoriteListView.java b/src/com/android/dialer/list/PhoneFavoriteListView.java
index 00f645a..4ce5df1 100644
--- a/src/com/android/dialer/list/PhoneFavoriteListView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteListView.java
@@ -19,6 +19,9 @@
 
 import android.content.Context;
 import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
 import android.os.Handler;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -47,6 +50,7 @@
     private boolean mEnableSwipe = true;
 
     private OnItemGestureListener mOnItemGestureListener;
+    private OnDragDropListener mOnDragDropListener;
 
     private float mDensityScale;
     private float mTouchSlop;
@@ -60,7 +64,22 @@
     private final int DRAG_SCROLL_PX_UNIT = 10;
 
     private boolean mIsDragScrollerRunning = false;
+    private int mTouchDownForDragStartX;
     private int mTouchDownForDragStartY;
+    private Bitmap mDragShadowBitmap;
+
+    // X and Y offsets inside the item from where the user grabbed to the
+    // child's left coordinate. This is used to aid in the drawing of the drag shadow.
+    private int mTouchOffsetToChildLeft;
+    private int mTouchOffsetToChildTop;
+
+    private int mDragShadowLeft;
+    private int mDragShadowTop;
+    private int mDragShadowWidth;
+    private int mDragShadowHeight;
+
+    private final int DRAG_SHADOW_ALPHA = 180;
+    private final Paint mPaint = new Paint();
 
     /**
      * {@link #mTopScrollBound} and {@link mBottomScrollBound} will be
@@ -95,6 +114,7 @@
         mSwipeHelper = new SwipeHelper(context, SwipeHelper.X, this,
                 mDensityScale, mTouchSlop);
         setItemsCanFocus(true);
+        mPaint.setAlpha(DRAG_SHADOW_ALPHA);
     }
 
     @Override
@@ -121,9 +141,14 @@
         mOnItemGestureListener = listener;
     }
 
+    public void setOnDragDropListener(OnDragDropListener listener) {
+        mOnDragDropListener = listener;
+    }
+
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+            mTouchDownForDragStartX = (int) ev.getX();
             mTouchDownForDragStartY = (int) ev.getY();
         }
         if (isSwipeEnabled()) {
@@ -147,24 +172,13 @@
 
     @Override
     public View getChildAtPosition(MotionEvent ev) {
-        // find the view under the pointer, accounting for GONE views
-        final int count = getChildCount();
-        final int touchY = (int) ev.getY();
-        View slidingChild;
-        for (int childIdx = 0; childIdx < count; childIdx++) {
-            slidingChild = getChildAt(childIdx);
-            if (slidingChild.getVisibility() == GONE) {
-                continue;
-            }
-            if (touchY >= slidingChild.getTop() && touchY <= slidingChild.getBottom()) {
-                if (SwipeHelper.isSwipeable(slidingChild)) {
-                    // If this view is swipable in this listview, then return it. Otherwise
-                    // return a null view, which will simply be ignored by the swipe helper.
-                    return slidingChild;
-                } else {
-                    return null;
-                }
-            }
+        final View view = getViewAtPosition((int) ev.getX(), (int) ev.getY());
+        if (view != null &&
+                SwipeHelper.isSwipeable(view) &&
+                view.getVisibility() != GONE) {
+            // If this view is swipable in this listview, then return it. Otherwise
+            // return a null view, which will simply be ignored by the swipe helper.
+            return view;
         }
         return null;
     }
@@ -205,10 +219,18 @@
 
     @Override
     public boolean dispatchDragEvent(DragEvent event) {
-        switch (event.getAction()) {
+        final int action = event.getAction();
+        final int eX = (int) event.getX();
+        final int eY = (int) event.getY();
+        switch (action) {
+            case DragEvent.ACTION_DRAG_STARTED:
+                if (!handleDragStarted(mTouchDownForDragStartX, mTouchDownForDragStartY)) {
+                    return false;
+                };
+                break;
             case DragEvent.ACTION_DRAG_LOCATION:
-                mLastDragY = (int) event.getY();
-                handleDrag((int) event.getX(), mLastDragY);
+                mLastDragY = eY;
+                handleDragHovered(eX, eY);
                 // Kick off {@link #mScrollHandler} if it's not started yet.
                 if (!mIsDragScrollerRunning &&
                         // And if the distance traveled while dragging exceeds the touch slop
@@ -229,13 +251,39 @@
                 ensureScrollHandler();
                 mScrollHandler.removeCallbacks(mDragScroller);
                 mIsDragScrollerRunning = false;
+                if (action != DragEvent.ACTION_DRAG_EXITED) {
+                    handleDragFinished(eX, eY);
+                }
                 break;
-            case DragEvent.ACTION_DRAG_STARTED:
-                // Not a receiver
             default:
                 break;
         }
-        return super.dispatchDragEvent(event);
+        // This ListView will consumer the drag events on behalf of its children.
+        return true;
+    }
+
+    @Override
+    public void dispatchDraw(Canvas canvas) {
+        super.dispatchDraw(canvas);
+        // Draw the drag shadow at its last known location if the drag shadow exists.
+        if (mDragShadowBitmap != null) {
+            canvas.drawBitmap(mDragShadowBitmap, mDragShadowLeft, mDragShadowTop, mPaint);
+        }
+    }
+
+    /**
+     * Find the view under the pointer.
+     */
+    private View getViewAtPosition(int x, int y) {
+        final int count = getChildCount();
+        View child;
+        for (int childIdx = 0; childIdx < count; childIdx++) {
+            child = getChildAt(childIdx);
+            if (y >= child.getTop() && y <= child.getBottom()) {
+                return child;
+            }
+        }
+        return null;
     }
 
     private void ensureScrollHandler() {
@@ -244,29 +292,112 @@
         }
     }
 
-    private void handleDrag(int x, int y) {
-        // find the view under the pointer, accounting for GONE views
-        final int count = getChildCount();
-        View slidingChild;
-        for (int childIdx = 0; childIdx < count; childIdx++) {
-            slidingChild = getChildAt(childIdx);
-            if (slidingChild.getVisibility() == GONE) {
-                continue;
+    /**
+     * @return True if the drag is started.
+     */
+    private boolean handleDragStarted(int x, int y) {
+        final View child = getViewAtPosition(x, y);
+        if (!(child instanceof ContactTileRow)) {
+            // Bail early.
+            return false;
+        }
+
+        final ContactTileRow tile = (ContactTileRow) child;
+        final int itemIndex = tile.getItemIndex(x, y);
+        if (itemIndex != -1 && mOnDragDropListener != null) {
+            final PhoneFavoriteTileView tileView =
+                    (PhoneFavoriteTileView) tile.getViewAtPosition(x, y);
+            mDragShadowBitmap = createDraggedChildBitmap(tileView);
+            if (mDragShadowBitmap == null) {
+                return false;
             }
-            if (y >= slidingChild.getTop() &&
-                    y <= slidingChild.getBottom() &&
-                    slidingChild instanceof ContactTileRow) {
-                final ContactTileRow tile = (ContactTileRow) slidingChild;
-                reportDragEnteredItemIndex(tile.getItemIndex(x, y));
+
+            if (tileView instanceof PhoneFavoriteRegularRowView) {
+                mDragShadowLeft = tile.getLeft();
+                mDragShadowTop = tile.getTop();
+            } else {
+                // Square tile is relative to the contact tile,
+                // and contact tile is relative to this list view.
+                mDragShadowLeft = tileView.getLeft() + tileView.getParentRow().getLeft();
+                mDragShadowTop = tileView.getTop() + tileView.getParentRow().getTop();
             }
+            mDragShadowWidth = tileView.getWidth();
+            mDragShadowHeight = tileView.getHeight();
+
+            // x and y passed in are the coordinates of where the user has touched down, calculate
+            // the offset to the top left coordinate of the dragged child.  This will be used for
+            // drawing the drag shadow.
+            mTouchOffsetToChildLeft = x - mDragShadowLeft;
+            mTouchOffsetToChildTop = y - mDragShadowTop;
+
+            // invalidate to trigger a redraw of the drag shadow.
+            invalidate();
+
+            mOnDragDropListener.onDragStarted(itemIndex);
+        }
+
+        return true;
+    }
+
+    private void handleDragHovered(int x, int y) {
+        final View child = getViewAtPosition(x, y);
+        if (!(child instanceof ContactTileRow)) {
+            // Bail early.
+            return;
+        }
+
+        // Update the drag shadow location.
+        mDragShadowLeft = x - mTouchOffsetToChildLeft;
+        mDragShadowTop = y - mTouchOffsetToChildTop;
+
+        // invalidate to trigger a redraw of the drag shadow.
+        invalidate();
+
+        final ContactTileRow tile = (ContactTileRow) child;
+        final int itemIndex = tile.getItemIndex(x, y);
+        if (itemIndex != -1 && mOnDragDropListener != null) {
+            mOnDragDropListener.onDragHovered(itemIndex);
         }
     }
 
-    private void reportDragEnteredItemIndex(int itemIndex) {
-        final PhoneFavoriteMergedAdapter adapter =
-                (PhoneFavoriteMergedAdapter) getAdapter();
-        if (adapter != null) {
-            adapter.reportDragEnteredItemIndex(itemIndex);
+    private void handleDragFinished(int x, int y) {
+        // Update the drag shadow location.
+        mDragShadowLeft = x - mTouchOffsetToChildLeft;
+        mDragShadowTop = y - mTouchOffsetToChildTop;
+
+        if (mDragShadowBitmap != null) {
+            mDragShadowBitmap.recycle();
+            mDragShadowBitmap = null;
         }
+
+        if (mOnDragDropListener != null) {
+            mOnDragDropListener.onDragFinished();
+        }
+    }
+
+    private Bitmap createDraggedChildBitmap(View view) {
+        view.setDrawingCacheEnabled(true);
+        final Bitmap cache = view.getDrawingCache();
+
+        Bitmap bitmap = null;
+        if (cache != null) {
+            try {
+                bitmap = cache.copy(Bitmap.Config.ARGB_8888, false);
+            } catch (final OutOfMemoryError e) {
+                Log.w(LOG_TAG, "Failed to copy bitmap from Drawing cache", e);
+                bitmap = null;
+            }
+        }
+
+        view.destroyDrawingCache();
+        view.setDrawingCacheEnabled(false);
+
+        return bitmap;
+    }
+
+    public interface OnDragDropListener {
+        public void onDragStarted(int itemIndex);
+        public void onDragHovered(int itemIndex);
+        public void onDragFinished();
     }
 }
diff --git a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
index 084a34e..c7554e2 100644
--- a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
@@ -346,10 +346,4 @@
             mOnItemSwipeListener = listener;
         }
     }
-
-    public void reportDragEnteredItemIndex(int itemIndex) {
-        if (mContactTileAdapter != null) {
-            mContactTileAdapter.reportDragEnteredItemIndex(itemIndex);
-        }
-    }
 }
diff --git a/src/com/android/dialer/list/PhoneFavoriteRegularRowView.java b/src/com/android/dialer/list/PhoneFavoriteRegularRowView.java
index 374f733..efe7bdd 100644
--- a/src/com/android/dialer/list/PhoneFavoriteRegularRowView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteRegularRowView.java
@@ -23,7 +23,6 @@
 
 import com.android.contacts.common.util.ViewUtil;
 import com.android.dialer.R;
-import com.android.dialer.list.PhoneFavoriteDragAndDropListeners.PhoneFavoriteDragListener;
 
 import com.android.dialer.list.PhoneFavoritesTileAdapter.ContactTileRow;
 
diff --git a/src/com/android/dialer/list/PhoneFavoriteTileView.java b/src/com/android/dialer/list/PhoneFavoriteTileView.java
index 76a0e35..5a3f4e5 100644
--- a/src/com/android/dialer/list/PhoneFavoriteTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteTileView.java
@@ -20,7 +20,6 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
-import android.content.ClipData;
 import android.content.Context;
 import android.text.TextUtils;
 import android.util.AttributeSet;
@@ -32,7 +31,6 @@
 import com.android.contacts.common.MoreContactUtils;
 import com.android.contacts.common.list.ContactEntry;
 import com.android.contacts.common.list.ContactTileView;
-import com.android.dialer.list.PhoneFavoriteDragAndDropListeners.PhoneFavoriteDragListener;
 import com.android.dialer.list.PhoneFavoritesTileAdapter.ContactTileRow;
 import com.android.dialer.list.PhoneFavoritesTileAdapter.ViewTypes;
 
@@ -94,20 +92,17 @@
             public boolean onLongClick(View v) {
                 setPressed(false);
                 final PhoneFavoriteTileView view = (PhoneFavoriteTileView) v;
-                final ClipData data = ClipData.newPlainText("", "");
+                // NOTE The drag shadow is handled in the ListView.
                 if (view instanceof PhoneFavoriteRegularRowView) {
-                    // If the view is regular row, start drag the row view.
-                    final View.DragShadowBuilder shadowBuilder =
-                            new View.DragShadowBuilder(view.getParentRow());
                     final ContactTileRow parent = (ContactTileRow) view.getParentRow();
+                    // If the view is regular row, start drag the row view.
                     // Drag is not available for the item exceeds the PIN_LIMIT.
                     if (parent.getRegularRowItemIndex() < PhoneFavoritesTileAdapter.PIN_LIMIT) {
-                        view.getParentRow().startDrag(data, shadowBuilder, null, 0);
+                        parent.startDrag(null, new View.DragShadowBuilder(), null, 0);
                     }
                 } else {
                     // If the view is a tile view, start drag the tile.
-                    final View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
-                    view.startDrag(data, shadowBuilder, null, 0);
+                    view.startDrag(null, new View.DragShadowBuilder(), null, 0);
                 }
                 return true;
             }
@@ -205,8 +200,6 @@
     @Override
     protected void onAttachedToWindow() {
         mParentRow = (ContactTileRow) getParent();
-        mParentRow.setOnDragListener(new PhoneFavoriteDragListener(mParentRow,
-                mParentRow.getTileAdapter()));
     }
 
     @Override
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index 4eaeaf5..779b15d 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -62,7 +62,7 @@
  *
  */
 public class PhoneFavoritesTileAdapter extends BaseAdapter implements
-        SwipeHelper.OnItemGestureListener {
+        SwipeHelper.OnItemGestureListener, PhoneFavoriteListView.OnDragDropListener {
     private static final String TAG = PhoneFavoritesTileAdapter.class.getSimpleName();
     private static final boolean DEBUG = false;
 
@@ -634,6 +634,7 @@
                         PinnedPositions.STAR_WHEN_PINNING, "true").build();
                 // update the database here with the new pinned positions
                 mContext.getContentResolver().update(pinUri, cv, null, null);
+                notifyDataSetChanged();
             }
             mDraggedEntry = null;
         }
@@ -970,27 +971,32 @@
             return mPosition;
         }
 
-        @Override
-        public View getChildAtPosition(MotionEvent ev) {
+        /**
+         * Find the view under the pointer.
+         */
+        public View getViewAtPosition(int x, int y) {
             // find the view under the pointer, accounting for GONE views
             final int count = getChildCount();
-            final int touchX = (int) ev.getX();
-            View slidingChild;
+            View view;
             for (int childIdx = 0; childIdx < count; childIdx++) {
-                slidingChild = getChildAt(childIdx);
-                if (slidingChild.getVisibility() == GONE) {
-                    continue;
+                view = getChildAt(childIdx);
+                if (x >= view.getLeft() && x <= view.getRight()) {
+                    return view;
                 }
-                if (touchX >= slidingChild.getLeft() && touchX <= slidingChild.getRight()) {
-                    if (SwipeHelper.isSwipeable(slidingChild)) {
-                        // If this view is swipable, then return it. If not, because the removal
-                        // dialog is currently showing, then return a null view, which will simply
-                        // be ignored by the swipe helper.
-                        return slidingChild;
-                    } else {
-                        return null;
-                    }
-                }
+            }
+            return null;
+        }
+
+        @Override
+        public View getChildAtPosition(MotionEvent ev) {
+            final View view = getViewAtPosition((int) ev.getX(), (int) ev.getY());
+            if (view != null &&
+                    SwipeHelper.isSwipeable(view) &&
+                    view.getVisibility() != GONE) {
+                // If this view is swipable, then return it. If not, because the removal
+                // dialog is currently showing, then return a null view, which will simply
+                // be ignored by the swipe helper.
+                return view;
             }
             return null;
         }
@@ -1192,11 +1198,14 @@
         return !mAwaitingRemove;
     }
 
-    public void setEmptyView(View emptyView) {
-        mEmptyView = emptyView;
+    @Override
+    public void onDragStarted(int itemIndex) {
+        setInDragging(true);
+        popContactEntry(itemIndex);
     }
 
-    public void reportDragEnteredItemIndex(int itemIndex) {
+    @Override
+    public void onDragHovered(int itemIndex) {
         if (mInDragging &&
                 mDragEnteredEntryIndex != itemIndex &&
                 isIndexInBound(itemIndex) &&
@@ -1204,4 +1213,14 @@
             markDropArea(itemIndex);
         }
     }
+
+    @Override
+    public void onDragFinished() {
+        setInDragging(false);
+        handleDrop();
+    }
+
+    public void setEmptyView(View emptyView) {
+        mEmptyView = emptyView;
+    }
 }
