diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 4ea9651..922b383 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -48,6 +48,7 @@
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewTreeObserver;
 import android.view.View.OnDragListener;
 import android.view.View.OnTouchListener;
 import android.view.animation.AccelerateInterpolator;
@@ -88,6 +89,7 @@
 import com.android.dialer.list.SearchFragment;
 import com.android.dialer.list.SmartDialSearchFragment;
 import com.android.dialer.widget.ActionBarController;
+import com.android.dialer.widget.FloatingActionButtonController;
 import com.android.dialer.widget.SearchEditTextLayout;
 import com.android.dialer.widget.SearchEditTextLayout.OnBackButtonClickedListener;
 import com.android.dialerbind.DatabaseHelperManager;
@@ -180,18 +182,10 @@
     };
 
     /**
-     * Set to true if the device is in landscape orientation.
-     */
-    private boolean mIsLandscape;
-
-    /**
      * Fragment containing the speed dial list, recents list, and all contacts list.
      */
     private ListsFragment mListsFragment;
 
-    private View mFloatingActionButtonContainer;
-    private ImageButton mFloatingActionButton;
-
     private boolean mInDialpadSearch;
     private boolean mInRegularSearch;
     private boolean mClearSearchOnPause;
@@ -199,6 +193,11 @@
     private boolean mShowDialpadOnResume;
 
     /**
+     * Whether or not the device is in landscape orientation.
+     */
+    private boolean mIsLandscape;
+
+    /**
      * The position of the currently selected tab in the attached {@link ListsFragment}.
      */
     private int mCurrentTabPosition = 0;
@@ -235,10 +234,9 @@
     private DialerDatabaseHelper mDialerDatabaseHelper;
     private DragDropController mDragDropController;
     private ActionBarController mActionBarController;
+    private FloatingActionButtonController mFloatingActionButtonController;
 
     private int mActionBarHeight;
-    private int mFloatingActionButtonMarginBottom;
-    private int mFloatingActionButtonDialpadMarginBottom;
 
     private class OptionsPopupMenu extends PopupMenu {
         public OptionsPopupMenu(Context context, View anchor) {
@@ -352,10 +350,6 @@
 
         final Resources resources = getResources();
         mActionBarHeight = resources.getDimensionPixelSize(R.dimen.action_bar_height);
-        mFloatingActionButtonMarginBottom = resources.getDimensionPixelOffset(
-                R.dimen.floating_action_button_margin_bottom);
-        mFloatingActionButtonDialpadMarginBottom = resources.getDimensionPixelOffset(
-                R.dimen.floating_action_button_dialpad_margin_bottom);
 
         setContentView(R.layout.dialtacts_activity);
         getWindow().setBackgroundDrawable(null);
@@ -383,6 +377,14 @@
             }
         });
 
+        boolean mIsLandscape = getResources().getConfiguration().orientation
+                == Configuration.ORIENTATION_LANDSCAPE;
+        View floatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
+        ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
+        floatingActionButton.setOnClickListener(this);
+        mFloatingActionButtonController = new FloatingActionButtonController(this, mIsLandscape,
+                floatingActionButtonContainer);
+
         ImageButton optionsMenuButton = (ImageButton) mSearchEditTextLayout.findViewById(
                 R.id.dialtacts_options_menu_button);
         optionsMenuButton.setOnClickListener(this);
@@ -403,9 +405,8 @@
             mFirstLaunch = savedInstanceState.getBoolean(KEY_FIRST_LAUNCH);
             mShowDialpadOnResume = savedInstanceState.getBoolean(KEY_IS_DIALPAD_SHOWN);
             mActionBarController.restoreInstanceState(savedInstanceState);
+            mFloatingActionButtonController.restoreInstanceState(savedInstanceState);
         }
-        mIsLandscape = getResources().getConfiguration().orientation ==
-                Configuration.ORIENTATION_LANDSCAPE;
 
         mSlideIn = AnimationUtils.loadAnimation(this,
                 mIsLandscape ? R.anim.slide_in_right : R.anim.slide_in);
@@ -417,15 +418,18 @@
         parentLayout = (RelativeLayout) findViewById(R.id.dialtacts_mainlayout);
         parentLayout.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
         parentLayout.setOnDragListener(new LayoutOnDragListener());
+        parentLayout.getViewTreeObserver().addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        int screenWidth = parentLayout.getWidth();
+                        mFloatingActionButtonController.setScreenWidth(screenWidth);
+                        parentLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                    }
+                });
 
         setupActivityOverlay();
 
-        mFloatingActionButtonContainer = findViewById(R.id.floating_action_button_container);
-        ViewUtil.setupFloatingActionButton(mFloatingActionButtonContainer, getResources());
-
-        mFloatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
-        mFloatingActionButton.setOnClickListener(this);
-
         mRemoveViewContainer = findViewById(R.id.remove_view_container);
 
         mDialerDatabaseHelper = DatabaseHelperManager.getDatabaseHelper(this);
@@ -480,6 +484,7 @@
         outState.putBoolean(KEY_FIRST_LAUNCH, mFirstLaunch);
         outState.putBoolean(KEY_IS_DIALPAD_SHOWN, mIsDialpadShown);
         mActionBarController.saveInstanceState(outState);
+        mFloatingActionButtonController.saveInstanceState(outState);
     }
 
     @Override
@@ -630,7 +635,7 @@
      * Callback from child DialpadFragment when the dialpad is shown.
      */
     public void onDialpadShown() {
-        updateFloatingActionButton();
+        mFloatingActionButtonController.updateByDialpadVisibility(true);
         if (mDialpadFragment.getAnimate()) {
             mDialpadFragment.getView().startAnimation(mSlideIn);
         } else {
@@ -659,7 +664,7 @@
         mDialpadFragment.setAnimate(animate);
 
         updateSearchFragmentPosition();
-        updateFloatingActionButton();
+        mFloatingActionButtonController.updateByDialpadVisibility(false);
         if (animate) {
             mDialpadFragment.getView().startAnimation(mSlideOut);
         } else {
@@ -993,7 +998,7 @@
 
     @Override
     public void setFloatingActionButtonVisible(boolean visible) {
-        mFloatingActionButtonContainer.setVisibility(visible ? View.VISIBLE : View.GONE);
+        mFloatingActionButtonController.setVisible(visible);
     }
 
     private boolean phoneIsInUse() {
@@ -1091,72 +1096,19 @@
 
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-
+        mFloatingActionButtonController.onPageScrolled(position, positionOffset);
     }
 
     @Override
     public void onPageSelected(int position) {
         mCurrentTabPosition = position;
-        // If the dialpad is showing, the floating action button should always be middle aligned.
-        if (!mIsDialpadShown) {
-            alignFloatingActionButtonByTab(mCurrentTabPosition);
-        }
+        mFloatingActionButtonController.updateByTab(position);
     }
 
     @Override
     public void onPageScrollStateChanged(int state) {
     }
 
-    private void updateFloatingActionButton() {
-        if (mIsDialpadShown) {
-            mFloatingActionButton.setImageResource(R.drawable.fab_ic_call);
-            mFloatingActionButton.setContentDescription(
-                    getResources().getString(R.string.description_dial_button));
-            alignFloatingActionButtonMiddle();
-        } else {
-            mFloatingActionButton.setImageResource(R.drawable.fab_ic_dial);
-            mFloatingActionButton.setContentDescription(
-                    getResources().getString(R.string.action_menu_dialpad_button));
-            alignFloatingActionButtonByTab(mCurrentTabPosition);
-        }
-    }
-
-    private void alignFloatingActionButtonByTab(int position) {
-        if (position == ListsFragment.TAB_INDEX_SPEED_DIAL) {
-            alignFloatingActionButtonMiddle();
-        } else {
-            alignFloatingActionButtonRight();
-        }
-    }
-
-    private void alignFloatingActionButtonRight() {
-        final RelativeLayout.LayoutParams params =
-                (RelativeLayout.LayoutParams) mFloatingActionButtonContainer.getLayoutParams();
-        params.removeRule(RelativeLayout.CENTER_HORIZONTAL);
-        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
-        updateFloatingActionButtonMargin(params);
-        mFloatingActionButtonContainer.setLayoutParams(params);
-    }
-
-    private void alignFloatingActionButtonMiddle() {
-        final RelativeLayout.LayoutParams params =
-                (RelativeLayout.LayoutParams) mFloatingActionButtonContainer.getLayoutParams();
-        params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
-        params.addRule(RelativeLayout.CENTER_HORIZONTAL);
-        updateFloatingActionButtonMargin(params);
-        mFloatingActionButtonContainer.setLayoutParams(params);
-    }
-
-    private void updateFloatingActionButtonMargin(RelativeLayout.LayoutParams params) {
-        params.setMarginsRelative(
-                params.getMarginStart(),
-                params.topMargin,
-                params.getMarginEnd(),
-                mIsDialpadShown ?
-                        mFloatingActionButtonDialpadMarginBottom :
-                        mFloatingActionButtonMarginBottom);
-    }
-
     private TelephonyManager getTelephonyManager() {
         return (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
     }
diff --git a/src/com/android/dialer/widget/FloatingActionButtonController.java b/src/com/android/dialer/widget/FloatingActionButtonController.java
new file mode 100644
index 0000000..3f59153
--- /dev/null
+++ b/src/com/android/dialer/widget/FloatingActionButtonController.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2014 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.widget;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+import android.view.View;
+import android.widget.ImageButton;
+
+import com.android.contacts.common.util.ViewUtil;
+import com.android.dialer.R;
+import com.android.dialer.list.ListsFragment;
+
+/**
+ * Controls the movement and appearance of the FAB.
+ */
+public class FloatingActionButtonController {
+    private static final String KEY_IS_DIALPAD_VISIBLE = "key_is_dialpad_visible";
+    private static final String KEY_CURRENT_TAB_POSITION = "key_current_tab_position";
+    private static final int ANIMATION_DURATION = 250;
+
+    private int mScreenWidth;
+
+    private int mCurrentTabPosition;
+
+    private ImageButton mFloatingActionButton;
+    private View mFloatingActionButtonContainer;
+
+    private boolean mIsLandscape;
+    private boolean mIsDialpadVisible;
+    private boolean mAnimateFloatingActionButton;
+
+    private String mDescriptionDialButtonStr;
+    private String mActionMenuDialpadButtonStr;
+
+    /**
+     * Interpolator for FAB animations.
+     */
+    private Interpolator mFabInterpolator;
+
+    /**
+     * Additional offset for FAB to be lowered when dialpad is open.
+     */
+    private int mFloatingActionButtonDialpadMarginBottomOffset;
+
+    public FloatingActionButtonController(Activity activity, boolean isLandscape,
+                View container) {
+        Resources resources = activity.getResources();
+        mIsLandscape = isLandscape;
+        mFabInterpolator = AnimationUtils.loadInterpolator(activity,
+                android.R.interpolator.fast_out_slow_in);
+        mFloatingActionButtonDialpadMarginBottomOffset = resources.getDimensionPixelOffset(
+                R.dimen.floating_action_button_dialpad_margin_bottom_offset);
+        mFloatingActionButton = (ImageButton) activity.
+                findViewById(R.id.floating_action_button);
+        mDescriptionDialButtonStr = resources.getString(R.string.description_dial_button);
+        mActionMenuDialpadButtonStr = resources.getString(R.string.action_menu_dialpad_button);
+        mFloatingActionButtonContainer = container;
+        ViewUtil.setupFloatingActionButton(mFloatingActionButtonContainer, resources);
+    }
+
+    /**
+     * Passes the screen width into the class. Necessary for translation calculations.
+     *
+     * @param screenWidth the width of the screen
+     */
+    public void setScreenWidth(int screenWidth) {
+        mScreenWidth = screenWidth;
+        updateByDialpadVisibility(mIsDialpadVisible);
+    }
+
+    public void setVisible(boolean visible) {
+        mFloatingActionButtonContainer.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
+
+    /**
+     * Updates the FAB location (middle to right position) as the PageView scrolls.
+     *
+     * @param position tab position to align for
+     * @param positionOffset a fraction used to calculate position of the FAB during page scroll
+     */
+    public void onPageScrolled(int position, float positionOffset) {
+        // As the page is scrolling, if we're on the first tab, update the FAB position so it
+        // moves along with it.
+        if (position == ListsFragment.TAB_INDEX_SPEED_DIAL) {
+            mFloatingActionButtonContainer.setTranslationX(
+                    (int) (positionOffset * (mScreenWidth / 2f
+                            - mFloatingActionButton.getWidth())));
+            mFloatingActionButtonContainer.setTranslationY(0);
+        }
+    }
+
+    /**
+     * Updates the FAB location given a tab position.
+     *
+     * @param position tab position to align for
+     */
+    public void updateByTab(int position) {
+        // If the screen width hasn't been set yet, don't do anything.
+        if (mScreenWidth == 0 || mIsDialpadVisible) return;
+        alignFloatingActionButtonByTab(position, false);
+        mAnimateFloatingActionButton = true;
+    }
+
+    /**
+     * Updates the FAB location to the proper location given whether or not the dialer is open.
+     *
+     * @param dialpadVisible whether or not the dialpad is currently open
+     */
+    public void updateByDialpadVisibility(boolean dialpadVisible) {
+        // If the screen width hasn't been set yet, don't do anything.
+        if (mScreenWidth == 0) return;
+        mIsDialpadVisible = dialpadVisible;
+
+        moveFloatingActionButton(mAnimateFloatingActionButton);
+        mAnimateFloatingActionButton = true;
+    }
+
+    /**
+     * Moves the FAB to the best known location given what the class currently knows.
+     *
+     * @param animate whether or not to smoothly animate the button
+     */
+    private void moveFloatingActionButton(boolean animate) {
+        if (mIsDialpadVisible) {
+            mFloatingActionButton.setImageResource(R.drawable.fab_ic_call);
+            mFloatingActionButton.setContentDescription(mDescriptionDialButtonStr);
+            alignFloatingActionButton(animate);
+        } else {
+            mFloatingActionButton.setImageResource(R.drawable.fab_ic_dial);
+            mFloatingActionButton.setContentDescription(mActionMenuDialpadButtonStr);
+            alignFloatingActionButtonByTab(mCurrentTabPosition, mAnimateFloatingActionButton);
+        }
+    }
+
+    /**
+     * Aligns the FAB to the position for the indicated tab.
+     *
+     * @param position tab position to align for
+     * @param animate whether or not to smoothly animate the button
+     */
+    private void alignFloatingActionButtonByTab(int position, boolean animate) {
+        mCurrentTabPosition = position;
+        alignFloatingActionButton(animate);
+    }
+
+    /**
+     * Aligns the FAB to the correct position.
+     *
+     * @param animate whether or not to smoothly animate the button
+     */
+    private void alignFloatingActionButton(boolean animate) {
+        int translationX = calculateTranslationX();
+        int translationY = mIsDialpadVisible ? mFloatingActionButtonDialpadMarginBottomOffset : 0;
+        if (animate) {
+            mFloatingActionButtonContainer.animate()
+                    .translationX(translationX)
+                    .translationY(translationY)
+                    .setInterpolator(mFabInterpolator)
+                    .setDuration(ANIMATION_DURATION).start();
+        } else {
+            mFloatingActionButtonContainer.setTranslationX(translationX);
+            mFloatingActionButtonContainer.setTranslationY(translationY);
+        }
+    }
+
+    /**
+     * Calculates the translationX distance for the FAB.
+     */
+    private int calculateTranslationX() {
+        if (mIsDialpadVisible) {
+            return mIsLandscape ? mScreenWidth / 4 : 0;
+        }
+        if (mCurrentTabPosition == ListsFragment.TAB_INDEX_SPEED_DIAL) {
+            return 0;
+        }
+        return mScreenWidth / 2 - mFloatingActionButton.getWidth();
+    }
+
+    /**
+     * Saves the current state of the floating action button into a provided {@link Bundle}
+     */
+    public void saveInstanceState(Bundle outState) {
+        outState.putBoolean(KEY_IS_DIALPAD_VISIBLE, mIsDialpadVisible);
+        outState.putInt(KEY_CURRENT_TAB_POSITION, mCurrentTabPosition);
+    }
+
+    /**
+     * Restores the floating action button state from a provided {@link Bundle}
+     */
+    public void restoreInstanceState(Bundle inState) {
+        mIsDialpadVisible = inState.getBoolean(KEY_IS_DIALPAD_VISIBLE);
+        mCurrentTabPosition = inState.getInt(KEY_CURRENT_TAB_POSITION);
+    }
+}
