diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 7d4e2d0..8033909 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -755,6 +755,7 @@
             mSearchView.setText(mPendingSearchViewQuery);
             mPendingSearchViewQuery = null;
         }
+        mActionBarController.restoreActionBarOffset();
         return false;
     }
 
@@ -1155,7 +1156,7 @@
 
     @Override
     public void setActionBarHideOffset(int hideOffset) {
-        getActionBar().setHideOffset(hideOffset);
+        mActionBarController.setHideOffset(hideOffset);
     }
 
     /**
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index 8ca66cf..b214836 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -76,6 +76,7 @@
     public interface HostInterface {
         public void showCallHistory();
         public int getActionBarHeight();
+        public void setActionBarHideOffset(int offset);
     }
 
     private ActionBar mActionBar;
@@ -152,7 +153,8 @@
 
                 final int availableActionBarHeight =
                         Math.min(mActionBar.getHeight(), topPaneHeight);
-                mActionBar.setHideOffset(mActionBar.getHeight() - availableActionBarHeight);
+                ((HostInterface) getActivity()).setActionBarHideOffset(
+                        mActionBar.getHeight() - availableActionBarHeight);
 
                 if (!mActionBar.isShowing()) {
                     mActionBar.show();
diff --git a/src/com/android/dialer/widget/ActionBarController.java b/src/com/android/dialer/widget/ActionBarController.java
index 4f1e2e6..265c03f 100644
--- a/src/com/android/dialer/widget/ActionBarController.java
+++ b/src/com/android/dialer/widget/ActionBarController.java
@@ -4,6 +4,7 @@
 
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.app.ActionBar;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -31,12 +32,12 @@
     private final AnimationCallback mFadeOutCallback = new AnimationCallback() {
         @Override
         public void onAnimationEnd() {
-            slideActionBarUp(false);
+            slideActionBar(true /* slideUp */, false /* animate */);
         }
 
         @Override
         public void onAnimationCancel() {
-            slideActionBarUp(false);
+            slideActionBar(true /* slideUp */, false /* animate */);
         }
     };
 
@@ -45,8 +46,7 @@
         public boolean hasSearchQuery();
         public boolean shouldShowActionBar();
         public int getActionBarHeight();
-        public int getActionBarHideOffset();
-        public void setActionBarHideOffset(int hideOffset);
+        public ActionBar getActionBar();
     }
 
     public ActionBarController(ActivityUi activityUi, SearchEditTextLayout searchBox) {
@@ -55,13 +55,6 @@
     }
 
     /**
-     * @return The offset the action bar is being translated upwards by
-     */
-    public int getHideOffset() {
-        return mActivityUi.getActionBarHideOffset();
-    }
-
-    /**
      * @return Whether or not the action bar is currently showing (both slid down and visible)
      */
     public boolean isActionBarShowing() {
@@ -97,9 +90,9 @@
         }
 
         if (mActivityUi.shouldShowActionBar()) {
-            slideActionBarDown(false /* animate */);
+            slideActionBar(false /* slideUp */, false /* animate */);
         } else {
-            slideActionBarUp(false /* animate */);
+            slideActionBar(true /* slideUp */, false /* animate */);
         }
     }
 
@@ -122,7 +115,7 @@
                 if (!mSearchBox.isExpanded()) {
                     mSearchBox.expand(false /* animate */, false /* requestFocus */);
                 }
-                slideActionBarDown(true /* animate */);
+                slideActionBar(false /* slideUp */, true /* animate */);
             } else {
                 mSearchBox.fadeIn();
             }
@@ -138,59 +131,51 @@
             Log.d(TAG, "OnDialpadUp: isInSearchUi " + mActivityUi.isInSearchUi());
         }
         if (mActivityUi.isInSearchUi()) {
-            slideActionBarUp(true);
+            slideActionBar(true /* slideUp */, true /* animate */);
         } else {
             // From the lists fragment
             mSearchBox.fadeOut(mFadeOutCallback);
         }
     }
 
-    public void slideActionBarUp(boolean animate) {
+    public void slideActionBar(boolean slideUp, boolean animate) {
         if (DEBUG) {
-            Log.d(TAG, "Sliding actionBar up - animate: " + animate);
+            Log.d(TAG, "Sliding actionBar - up: " + slideUp + " animate: " + animate);
         }
         if (animate) {
-            ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
+            ValueAnimator animator =
+                    slideUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
             animator.addUpdateListener(new AnimatorUpdateListener() {
                 @Override
                 public void onAnimationUpdate(ValueAnimator animation) {
                     final float value = (float) animation.getAnimatedValue();
-                    mActivityUi.setActionBarHideOffset(
+                    setHideOffset(
                             (int) (mActivityUi.getActionBarHeight() * value));
                 }
             });
             animator.start();
         } else {
-           mActivityUi.setActionBarHideOffset(mActivityUi.getActionBarHeight());
+           setHideOffset(slideUp ? mActivityUi.getActionBarHeight() : 0);
         }
-        mIsActionBarSlidUp = true;
-    }
-
-    public void slideActionBarDown(boolean animate) {
-        if (DEBUG) {
-            Log.d(TAG, "Sliding actionBar down - animate: " + animate);
-        }
-        if (animate) {
-            ValueAnimator animator = ValueAnimator.ofFloat(1, 0);
-            animator.addUpdateListener(new AnimatorUpdateListener() {
-                @Override
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    final float value = (float) animation.getAnimatedValue();
-                    mActivityUi.setActionBarHideOffset(
-                            (int) (mActivityUi.getActionBarHeight() * value));
-                }
-            });
-            animator.start();
-        } else {
-            mActivityUi.setActionBarHideOffset(0);
-        }
-        mIsActionBarSlidUp = false;
+        mIsActionBarSlidUp = slideUp;
     }
 
     public void setAlpha(float alphaValue) {
         mSearchBox.animate().alpha(alphaValue).start();
     }
 
+    public void setHideOffset(int offset) {
+        mIsActionBarSlidUp = offset >= mActivityUi.getActionBarHeight();
+        mActivityUi.getActionBar().setHideOffset(offset);
+    }
+
+    /**
+     * @return The offset the action bar is being translated upwards by
+     */
+    public int getHideOffset() {
+        return mActivityUi.getActionBar().getHideOffset();
+    }
+
     /**
      * Saves the current state of the action bar into a provided {@link Bundle}
      */
@@ -201,15 +186,10 @@
     }
 
     /**
-     * Restores the action bar state from a provided {@link Bundle}
+     * Restores the action bar state from a provided {@link Bundle}.
      */
     public void restoreInstanceState(Bundle inState) {
         mIsActionBarSlidUp = inState.getBoolean(KEY_IS_SLID_UP);
-        if (mIsActionBarSlidUp) {
-            slideActionBarUp(false);
-        } else {
-            slideActionBarDown(false);
-        }
 
         final boolean isSearchBoxFadedOut = inState.getBoolean(KEY_IS_FADED_OUT);
         if (isSearchBoxFadedOut) {
@@ -230,6 +210,14 @@
         }
     }
 
+    /**
+     * This should be called after onCreateOptionsMenu has been called, when the actionbar has
+     * been laid out and actually has a height.
+     */
+    public void restoreActionBarOffset() {
+        slideActionBar(mIsActionBarSlidUp /* slideUp */, false /* animate */);
+    }
+
     @VisibleForTesting
     public boolean getIsActionBarSlidUp() {
         return mIsActionBarSlidUp;
