diff --git a/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml b/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml
index edc253b..8362fd7 100644
--- a/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml
+++ b/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml
@@ -18,13 +18,13 @@
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="vertical">
-    <LinearLayout android:id="@+id/title_bar"
+    <LinearLayout android:id="@+id/mr_title_bar"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:paddingLeft="24dp"
                   android:paddingRight="24dp"
                   android:orientation="horizontal" >
-        <TextView android:id="@+id/route_name"
+        <TextView android:id="@+id/mr_name"
                   android:layout_width="0dp"
                   android:layout_height="72dp"
                   android:layout_weight="1"
@@ -32,7 +32,7 @@
                   android:singleLine="true"
                   android:ellipsize="end"
                   android:textAppearance="?attr/mediaRouteControllerTitleTextStyle" />
-        <ImageButton android:id="@+id/close"
+        <ImageButton android:id="@+id/mr_close"
                      android:layout_width="24dp"
                      android:layout_height="24dp"
                      android:layout_marginLeft="12dp"
@@ -41,7 +41,7 @@
                      android:src="?attr/mediaRouteCloseDrawable"
                      android:background="?attr/selectableItemBackgroundBorderless" />
     </LinearLayout>
-    <FrameLayout android:id="@+id/custom_control_frame"
+    <FrameLayout android:id="@+id/mr_custom_control"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:visibility="gone" />
@@ -74,11 +74,11 @@
               android:layout_height="wrap_content"
               android:background="?attr/colorPrimaryDark"
               android:visibility="gone" />
-    <LinearLayout android:id="@+id/buttons"
+    <LinearLayout android:id="@+id/mr_buttons"
                   android:layout_width="fill_parent"
                   android:layout_height="wrap_content"
                   android:orientation="horizontal">
-        <Button android:id="@+id/disconnect"
+        <Button android:id="@+id/mr_button_disconnect"
                 android:layout_width="0dp"
                 android:layout_height="48dp"
                 android:gravity="center"
@@ -86,7 +86,7 @@
                 android:background="?attr/selectableItemBackgroundBorderless"
                 android:text="@string/mr_controller_disconnect"
                 android:visibility="invisible" />
-        <Button android:id="@+id/stop"
+        <Button android:id="@+id/mr_button_stop"
                 android:layout_width="0dp"
                 android:layout_height="48dp"
                 android:gravity="center"
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index d78af8f..c856c1a 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -97,16 +97,25 @@
 
     private Button mDisconnectButton;
     private Button mStopCastingButton;
+    private ImageButton mPlayPauseButton;
     private ImageButton mCloseButton;
+    private ImageButton mGroupExpandCollapseButton;
 
-    private FrameLayout mCustomControlFrame;
+    private FrameLayout mCustomControlLayout;
     private ImageView mArtView;
+    private TextView mTitleView;
+    private TextView mSubtitleView;
     private TextView mRouteNameTextView;
 
     private boolean mVolumeControlEnabled = true;
-    private LinearLayout mControlView;
-    private MediaRouteControlHelper mControlHelper;
+    private LinearLayout mControlLayout;
+    private RelativeLayout mPlaybackControl;
+    private LinearLayout mVolumeControl;
+    private View mDividerView;
+
     private ListView mVolumeGroupList;
+    private SeekBar mVolumeSlider;
+    private boolean mVolumeSliderTouched;
 
     private MediaControllerCompat mMediaController;
     private MediaControllerCallback mControllerCallback;
@@ -176,7 +185,7 @@
         if (mVolumeControlEnabled != enable) {
             mVolumeControlEnabled = enable;
             if (mCreated) {
-                mControlHelper.updateVolumeControl();
+                updateVolumeControl();
             }
         }
     }
@@ -247,28 +256,98 @@
 
         ClickListener listener = new ClickListener();
 
-        mDisconnectButton = (Button) findViewById(R.id.disconnect);
+        mDisconnectButton = (Button) findViewById(R.id.mr_button_disconnect);
         mDisconnectButton.setOnClickListener(listener);
 
-        mStopCastingButton = (Button) findViewById(R.id.stop);
+        mStopCastingButton = (Button) findViewById(R.id.mr_button_stop);
         mStopCastingButton.setOnClickListener(listener);
 
-        mRouteNameTextView = (TextView) findViewById(R.id.route_name);
-        mCloseButton = (ImageButton) findViewById(R.id.close);
+        mRouteNameTextView = (TextView) findViewById(R.id.mr_name);
+        mCloseButton = (ImageButton) findViewById(R.id.mr_close);
         mCloseButton.setOnClickListener(listener);
-
-        mCustomControlFrame = (FrameLayout) findViewById(R.id.custom_control_frame);
+        mCustomControlLayout = (FrameLayout) findViewById(R.id.mr_custom_control);
         mArtView = (ImageView) findViewById(R.id.mr_art);
 
-        mControlView = (LinearLayout) findViewById(R.id.mr_control);
-        mControlHelper = new MediaRouteControlHelper(listener);
+        mControlLayout = (LinearLayout) findViewById(R.id.mr_control);
+        mDividerView = findViewById(R.id.mr_control_divider);
+
+        mPlaybackControl = (RelativeLayout) findViewById(R.id.mr_playback_control);
+        mTitleView = (TextView) findViewById(R.id.mr_control_title);
+        mSubtitleView = (TextView) findViewById(R.id.mr_control_subtitle);
+        mPlayPauseButton = (ImageButton) findViewById(R.id.mr_control_play_pause);
+        mPlayPauseButton.setOnClickListener(listener);
+
+        mVolumeControl = (LinearLayout) findViewById(R.id.mr_volume_control);
+        mVolumeSlider = (SeekBar) findViewById(R.id.mr_volume_slider);
+        mVolumeSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            private final Runnable mStopTrackingTouch = new Runnable() {
+                @Override
+                public void run() {
+                    if (mVolumeSliderTouched) {
+                        mVolumeSliderTouched = false;
+                        updateVolumeControl();
+                    }
+                }
+            };
+
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+                if (mVolumeSliderTouched) {
+                    mVolumeSlider.removeCallbacks(mStopTrackingTouch);
+                } else {
+                    mVolumeSliderTouched = true;
+                }
+            }
+
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+                // Defer resetting mVolumeSliderTouched to allow the media route provider
+                // a little time to settle into its new state and publish the final
+                // volume update.
+                mVolumeSlider.postDelayed(mStopTrackingTouch, VOLUME_UPDATE_DELAY_MILLIS);
+            }
+
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                if (fromUser) {
+                    mRoute.requestSetVolume(progress);
+                }
+            }
+        });
+
+        TypedArray styledAttributes = getContext().obtainStyledAttributes(new int[] {
+                R.attr.mediaRouteExpandGroupDrawable,
+                R.attr.mediaRouteCollapseGroupDrawable
+        });
+        final Drawable expandGroupDrawable = styledAttributes.getDrawable(0);
+        final Drawable collapseGroupDrawable = styledAttributes.getDrawable(1);
+        styledAttributes.recycle();
+
         mVolumeGroupList = (ListView)findViewById(R.id.mr_volume_group_list);
+        mGroupExpandCollapseButton = (ImageButton) findViewById(R.id.mr_group_expand_collapse);
+        mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
+            private boolean mIsExpanded;
+
+            @Override
+            public void onClick(View v) {
+                mIsExpanded = !mIsExpanded;
+                if (mIsExpanded) {
+                    mGroupExpandCollapseButton.setImageDrawable(collapseGroupDrawable);
+                    mVolumeGroupList.setVisibility(View.VISIBLE);
+                    mVolumeGroupList.setAdapter(
+                            new VolumeGroupAdapter(getContext(), getGroup().getRoutes()));
+                } else {
+                    mGroupExpandCollapseButton.setImageDrawable(expandGroupDrawable);
+                    mVolumeGroupList.setVisibility(View.GONE);
+                }
+            }
+        });
 
         mCreated = true;
         mCustomControlView = onCreateMediaControlView(savedInstanceState);
         if (mCustomControlView != null) {
-            mCustomControlFrame.addView(mCustomControlView);
-            mCustomControlFrame.setVisibility(View.VISIBLE);
+            mCustomControlLayout.addView(mCustomControlView);
+            mCustomControlLayout.setVisibility(View.VISIBLE);
             mArtView.setVisibility(View.GONE);
         }
         update();
@@ -351,8 +430,103 @@
             mFetchArtTask = new FetchArtTask();
             mFetchArtTask.execute();
         }
-        mControlHelper.updateVolumeControl();
-        mControlHelper.updatePlaybackControl();
+        updateVolumeControl();
+        updatePlaybackControl();
+    }
+
+    private void updateVolumeControl() {
+        if (!mVolumeSliderTouched) {
+            if (isVolumeControlAvailable()) {
+                mVolumeControl.setVisibility(View.VISIBLE);
+                mVolumeSlider.setMax(mRoute.getVolumeMax());
+                mVolumeSlider.setProgress(mRoute.getVolume());
+                if (USE_GROUP) {
+                    if (getGroup() == null) {
+                        mGroupExpandCollapseButton.setVisibility(View.GONE);
+                    } else {
+                        mGroupExpandCollapseButton.setVisibility(View.VISIBLE);
+                        VolumeGroupAdapter adapter =
+                                (VolumeGroupAdapter) mVolumeGroupList.getAdapter();
+                        if (adapter != null) {
+                            adapter.notifyDataSetChanged();
+                        }
+                    }
+                }
+            } else {
+                mVolumeControl.setVisibility(View.GONE);
+            }
+            adjustControlLayoutHeight();
+        }
+    }
+
+    private void updatePlaybackControl() {
+        if (mCustomControlView == null && (mDescription != null || mState != null)) {
+            mPlaybackControl.setVisibility(View.VISIBLE);
+            CharSequence title = mDescription == null ? null : mDescription.getTitle();
+            boolean hasTitle = !TextUtils.isEmpty(title);
+
+            CharSequence subtitle = mDescription == null ? null : mDescription.getSubtitle();
+            boolean hasSubtitle = !TextUtils.isEmpty(subtitle);
+
+            if (!hasTitle && !hasSubtitle) {
+                if (mRoute.getPresentationDisplayId()
+                        != MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE) {
+                    // The user is currently casting screen.
+                    mTitleView.setText(R.string.mr_controller_casting_screen);
+                } else {
+                    mTitleView.setText((mState == null
+                            || mState.getState() == PlaybackStateCompat.STATE_NONE)
+                                    ? R.string.mr_controller_no_media_selected
+                                    : R.string.mr_controller_no_info_available);
+                }
+                mTitleView.setEnabled(false);
+                mTitleView.setVisibility(View.VISIBLE);
+                mSubtitleView.setVisibility(View.GONE);
+            } else {
+                mTitleView.setText(title);
+                mTitleView.setEnabled(hasTitle);
+                mTitleView.setVisibility(hasTitle ? View.VISIBLE : View.GONE);
+                mSubtitleView.setText(subtitle);
+                mSubtitleView.setVisibility(hasSubtitle ? View.VISIBLE : View.GONE);
+            }
+            if (mState != null) {
+                boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING
+                        || mState.getState() == PlaybackStateCompat.STATE_PLAYING;
+                boolean supportsPlay = (mState.getActions() & (PlaybackStateCompat.ACTION_PLAY
+                        | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
+                boolean supportsPause = (mState.getActions() & (PlaybackStateCompat.ACTION_PAUSE
+                        | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
+                if (isPlaying && supportsPause) {
+                    mPlayPauseButton.setVisibility(View.VISIBLE);
+                    mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
+                            getContext(), R.attr.mediaRoutePauseDrawable));
+                    mPlayPauseButton.setContentDescription(getContext().getResources()
+                            .getText(R.string.mr_controller_pause));
+                } else if (!isPlaying && supportsPlay) {
+                    mPlayPauseButton.setVisibility(View.VISIBLE);
+                    mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
+                            getContext(), R.attr.mediaRoutePlayDrawable));
+                    mPlayPauseButton.setContentDescription(getContext().getResources()
+                            .getText(R.string.mr_controller_play));
+                } else {
+                    mPlayPauseButton.setVisibility(View.GONE);
+                }
+            }
+        } else {
+            mPlaybackControl.setVisibility(View.GONE);
+        }
+        adjustControlLayoutHeight();
+    }
+
+    private void adjustControlLayoutHeight() {
+        // TODO: Adjust the top and bottom padding of the control layout according to the display
+        // height.
+        mDividerView.setVisibility((mVolumeControl.getVisibility() == View.VISIBLE
+                && mPlaybackControl.getVisibility() == View.VISIBLE)
+                ? View.VISIBLE : View.GONE);
+        mControlLayout.setVisibility((mVolumeControl.getVisibility() == View.GONE
+                && mPlaybackControl.getVisibility() == View.GONE)
+                ? View.GONE : View.VISIBLE);
     }
 
     private boolean isVolumeControlAvailable() {
@@ -419,7 +593,7 @@
         @Override
         public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
             if (route == mRoute) {
-                mControlHelper.updateVolumeControl();
+                updateVolumeControl();
             }
         }
     }
@@ -450,9 +624,9 @@
         @Override
         public void onClick(View v) {
             int id = v.getId();
-            if (id == R.id.stop || id == R.id.disconnect) {
+            if (id == R.id.mr_button_stop || id == R.id.mr_button_disconnect) {
                 if (mRoute.isSelected()) {
-                    mRouter.unselect(id == R.id.stop ?
+                    mRouter.unselect(id == R.id.mr_button_stop ?
                             MediaRouter.UNSELECT_REASON_STOPPED :
                             MediaRouter.UNSELECT_REASON_DISCONNECTED);
                 }
@@ -465,194 +639,12 @@
                         mMediaController.getTransportControls().play();
                     }
                 }
-            } else if (id == R.id.close) {
+            } else if (id == R.id.mr_close) {
                 dismiss();
             }
         }
     }
 
-    private class MediaRouteControlHelper {
-        private RelativeLayout mPlaybackControl;
-        private TextView mTitleView;
-        private TextView mSubtitleView;
-        private ImageButton mPlayPauseButton;
-
-        private LinearLayout mVolumeControl;
-        private SeekBar mVolumeSlider;
-        private ImageButton mGroupExpandCollapseButton;
-        private boolean mVolumeSliderTouched;
-
-        private View mDividerView;
-
-        public MediaRouteControlHelper(ClickListener listener) {
-            mPlaybackControl = (RelativeLayout) findViewById(R.id.mr_playback_control);
-            mTitleView = (TextView) findViewById(R.id.mr_control_title);
-            mSubtitleView = (TextView) findViewById(R.id.mr_control_subtitle);
-            mPlayPauseButton = (ImageButton) findViewById(R.id.mr_control_play_pause);
-            mPlayPauseButton.setOnClickListener(listener);
-
-            mVolumeControl = (LinearLayout) findViewById(R.id.mr_volume_control);
-            mVolumeSlider = (SeekBar) findViewById(R.id.mr_volume_slider);
-            mVolumeSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
-                private final Runnable mStopTrackingTouch = new Runnable() {
-                    @Override
-                    public void run() {
-                        if (mVolumeSliderTouched) {
-                            mVolumeSliderTouched = false;
-                            updateVolumeControl();
-                        }
-                    }
-                };
-
-                @Override
-                public void onStartTrackingTouch(SeekBar seekBar) {
-                    if (mVolumeSliderTouched) {
-                        mVolumeSlider.removeCallbacks(mStopTrackingTouch);
-                    } else {
-                        mVolumeSliderTouched = true;
-                    }
-                }
-
-                @Override
-                public void onStopTrackingTouch(SeekBar seekBar) {
-                    // Defer resetting mVolumeSliderTouched to allow the media route provider
-                    // a little time to settle into its new state and publish the final
-                    // volume update.
-                    mVolumeSlider.postDelayed(mStopTrackingTouch, VOLUME_UPDATE_DELAY_MILLIS);
-                }
-
-                @Override
-                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                    if (fromUser) {
-                        mRoute.requestSetVolume(progress);
-                    }
-                }
-            });
-
-            TypedArray styledAttributes = getContext().obtainStyledAttributes(new int[] {
-                    R.attr.mediaRouteExpandGroupDrawable,
-                    R.attr.mediaRouteCollapseGroupDrawable
-            });
-            final Drawable expandGroupDrawable = styledAttributes.getDrawable(0);
-            final Drawable collapseGroupDrawable = styledAttributes.getDrawable(1);
-            styledAttributes.recycle();
-
-            mGroupExpandCollapseButton = (ImageButton) findViewById(R.id.mr_group_expand_collapse);
-            mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
-                private boolean mIsExpanded;
-
-                @Override
-                public void onClick(View v) {
-                    mIsExpanded = !mIsExpanded;
-                    if (mIsExpanded) {
-                        mGroupExpandCollapseButton.setImageDrawable(collapseGroupDrawable);
-                        mVolumeGroupList.setVisibility(View.VISIBLE);
-                        mVolumeGroupList.setAdapter(
-                                new VolumeGroupAdapter(getContext(), getGroup().getRoutes()));
-                    } else {
-                        mGroupExpandCollapseButton.setImageDrawable(expandGroupDrawable);
-                        mVolumeGroupList.setVisibility(View.GONE);
-                    }
-                }
-            });
-
-            mDividerView = findViewById(R.id.mr_control_divider);
-        }
-
-        public void updateVolumeControl() {
-            if (!mVolumeSliderTouched) {
-                if (isVolumeControlAvailable()) {
-                    mVolumeControl.setVisibility(View.VISIBLE);
-                    mVolumeSlider.setMax(mRoute.getVolumeMax());
-                    mVolumeSlider.setProgress(mRoute.getVolume());
-                    if (USE_GROUP) {
-                        if (getGroup() == null) {
-                            mGroupExpandCollapseButton.setVisibility(View.GONE);
-                        } else {
-                            mGroupExpandCollapseButton.setVisibility(View.VISIBLE);
-                            VolumeGroupAdapter adapter =
-                                    (VolumeGroupAdapter) mVolumeGroupList.getAdapter();
-                            if (adapter != null) {
-                                adapter.notifyDataSetChanged();
-                            }
-                        }
-                    }
-                } else {
-                    mVolumeControl.setVisibility(View.GONE);
-                }
-                adjustControlViewVisibilities();
-            }
-        }
-
-        public void updatePlaybackControl() {
-            if (mCustomControlView == null && (mDescription != null || mState != null)) {
-                mPlaybackControl.setVisibility(View.VISIBLE);
-                CharSequence title = mDescription == null ? null : mDescription.getTitle();
-                boolean hasTitle = !TextUtils.isEmpty(title);
-
-                CharSequence subtitle = mDescription == null ? null : mDescription.getSubtitle();
-                boolean hasSubtitle = !TextUtils.isEmpty(subtitle);
-
-                if (!hasTitle && !hasSubtitle) {
-                    if (mRoute.getPresentationDisplayId()
-                            != MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE) {
-                        // The user is currently casting screen.
-                        mTitleView.setText(R.string.mr_controller_casting_screen);
-                    } else {
-                        mTitleView.setText((mState == null
-                                || mState.getState() == PlaybackStateCompat.STATE_NONE)
-                                        ? R.string.mr_controller_no_media_selected
-                                        : R.string.mr_controller_no_info_available);
-                    }
-                    mTitleView.setEnabled(false);
-                    mTitleView.setVisibility(View.VISIBLE);
-                    mSubtitleView.setVisibility(View.GONE);
-                } else {
-                    mTitleView.setText(title);
-                    mTitleView.setEnabled(hasTitle);
-                    mTitleView.setVisibility(hasTitle ? View.VISIBLE : View.GONE);
-                    mSubtitleView.setText(subtitle);
-                    mSubtitleView.setVisibility(hasSubtitle ? View.VISIBLE : View.GONE);
-                }
-                if (mState != null) {
-                    boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING
-                            || mState.getState() == PlaybackStateCompat.STATE_PLAYING;
-                    boolean supportsPlay = (mState.getActions() & (PlaybackStateCompat.ACTION_PLAY
-                            | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
-                    boolean supportsPause = (mState.getActions() & (PlaybackStateCompat.ACTION_PAUSE
-                            | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
-                    if (isPlaying && supportsPause) {
-                        mPlayPauseButton.setVisibility(View.VISIBLE);
-                        mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
-                                getContext(), R.attr.mediaRoutePauseDrawable));
-                        mPlayPauseButton.setContentDescription(getContext().getResources()
-                                .getText(R.string.mr_controller_pause));
-                    } else if (!isPlaying && supportsPlay) {
-                        mPlayPauseButton.setVisibility(View.VISIBLE);
-                        mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
-                                getContext(), R.attr.mediaRoutePlayDrawable));
-                        mPlayPauseButton.setContentDescription(getContext().getResources()
-                                .getText(R.string.mr_controller_play));
-                    } else {
-                        mPlayPauseButton.setVisibility(View.GONE);
-                    }
-                }
-            } else {
-                mPlaybackControl.setVisibility(View.GONE);
-            }
-            adjustControlViewVisibilities();
-        }
-
-        private void adjustControlViewVisibilities() {
-            mDividerView.setVisibility((mVolumeControl.getVisibility() == View.VISIBLE
-                    && mPlaybackControl.getVisibility() == View.VISIBLE)
-                            ? View.VISIBLE : View.GONE);
-            mControlView.setVisibility((mVolumeControl.getVisibility() == View.GONE
-                    && mPlaybackControl.getVisibility() == View.GONE)
-                            ? View.GONE : View.VISIBLE);
-        }
-    }
-
     private class VolumeGroupAdapter extends ArrayAdapter<MediaRouter.RouteInfo> {
         final static float DISABLED_ALPHA = .3f;
 
