diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 412ca43..21999c0 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -61,8 +61,8 @@
 
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.accessibility.AccessibilitySettings;
+import com.android.settings.accessibility.CaptionPropertiesFragment;
 import com.android.settings.accessibility.ToggleAccessibilityServicePreferenceFragment;
-import com.android.settings.accessibility.ToggleCaptioningPreferenceFragment;
 import com.android.settings.accounts.AccountSyncSettings;
 import com.android.settings.accounts.AuthenticatorHelper;
 import com.android.settings.accounts.ManageAccountsSettings;
@@ -332,7 +332,7 @@
         PrivacySettings.class.getName(),
         DeviceAdminSettings.class.getName(),
         AccessibilitySettings.class.getName(),
-        ToggleCaptioningPreferenceFragment.class.getName(),
+        CaptionPropertiesFragment.class.getName(),
         com.android.settings.accessibility.ToggleInversionPreferenceFragment.class.getName(),
         com.android.settings.accessibility.ToggleContrastPreferenceFragment.class.getName(),
         com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.class.getName(),
diff --git a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
index b010ca8..07c4d84 100644
--- a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
+++ b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.accessibility;
 
+import android.app.ActionBar;
+import android.app.Activity;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.Resources;
@@ -24,22 +26,34 @@
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
+import android.preference.PreferenceFrameLayout;
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.provider.Settings;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
 import android.view.accessibility.CaptioningManager;
 import android.view.accessibility.CaptioningManager.CaptionStyle;
 
+import com.android.internal.widget.SubtitleView;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener;
+import com.android.settings.accessibility.ToggleSwitch.OnBeforeCheckedChangeListener;
+
+import java.util.Locale;
 
 /**
  * Settings fragment containing captioning properties.
  */
 public class CaptionPropertiesFragment extends SettingsPreferenceFragment
         implements OnPreferenceChangeListener, OnValueChangedListener {
-    private ToggleCaptioningPreferenceFragment mParent;
+    private static final float DEFAULT_FONT_SIZE = 48f;
+
     private CaptioningManager mCaptioningManager;
+    private SubtitleView mPreviewText;
 
     // Standard options.
     private LocalePreference mLocale;
@@ -70,13 +84,107 @@
         installUpdateListeners();
     }
 
-    /**
-     * Sets the parent fragment, which is used to update the live preview.
-     *
-     * @param parent the parent fragment
-     */
-    public void setParent(ToggleCaptioningPreferenceFragment parent) {
-        mParent = parent;
+    @Override
+    public View onCreateView(
+            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        final View rootView = inflater.inflate(R.layout.captioning_preview, container, false);
+
+        // We have to do this now because PreferenceFrameLayout looks at it
+        // only when the view is added.
+        if (container instanceof PreferenceFrameLayout) {
+            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
+        }
+
+        final View content = super.onCreateView(inflater, container, savedInstanceState);
+        ((ViewGroup) rootView.findViewById(R.id.properties_fragment)).addView(
+                content, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+
+        return rootView;
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        mPreviewText = (SubtitleView) view.findViewById(R.id.preview_text);
+
+        installActionBarToggleSwitch();
+        refreshPreviewText();
+    }
+
+    private void refreshPreviewText() {
+        final Context context = getActivity();
+        if (context == null) {
+            // We've been destroyed, abort!
+            return;
+        }
+
+        final SubtitleView preview = mPreviewText;
+        if (preview != null) {
+            final int styleId = mCaptioningManager.getRawUserStyle();
+            applyCaptionProperties(mCaptioningManager, preview, styleId);
+
+            final Locale locale = mCaptioningManager.getLocale();
+            if (locale != null) {
+                final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
+                        context, locale, R.string.captioning_preview_text);
+                preview.setText(localizedText);
+            } else {
+                preview.setText(R.string.captioning_preview_text);
+            }
+        }
+    }
+
+    public static void applyCaptionProperties(
+            CaptioningManager manager, SubtitleView previewText, int styleId) {
+        previewText.setStyle(styleId);
+
+        final Context context = previewText.getContext();
+        final ContentResolver cr = context.getContentResolver();
+        final float fontScale = manager.getFontScale();
+        previewText.setTextSize(fontScale * DEFAULT_FONT_SIZE);
+
+        final Locale locale = manager.getLocale();
+        if (locale != null) {
+            final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
+                    context, locale, R.string.captioning_preview_characters);
+            previewText.setText(localizedText);
+        } else {
+            previewText.setText(R.string.captioning_preview_characters);
+        }
+    }
+
+    private void installActionBarToggleSwitch() {
+        final Activity activity = getActivity();
+        final ToggleSwitch toggleSwitch = new ToggleSwitch(activity);
+
+        final int padding = getResources().getDimensionPixelSize(
+                R.dimen.action_bar_switch_padding);
+        toggleSwitch.setPaddingRelative(0, 0, padding, 0);
+
+        final ActionBar actionBar = activity.getActionBar();
+        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
+
+        final ActionBar.LayoutParams params = new ActionBar.LayoutParams(
+                ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,
+                        Gravity.CENTER_VERTICAL | Gravity.END);
+        actionBar.setCustomView(toggleSwitch, params);
+
+        final boolean enabled = mCaptioningManager.isEnabled();
+        getPreferenceScreen().setEnabled(enabled);
+        mPreviewText.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
+        toggleSwitch.setCheckedInternal(enabled);
+        toggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() {
+            @Override
+            public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
+                toggleSwitch.setCheckedInternal(checked);
+                Settings.Secure.putInt(getActivity().getContentResolver(),
+                        Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, checked ? 1 : 0);
+                getPreferenceScreen().setEnabled(checked);
+                mPreviewText.setVisibility(checked ? View.VISIBLE : View.INVISIBLE);
+                return false;
+            }
+        });
     }
 
     private void initializeAllPreferences() {
@@ -171,12 +279,6 @@
         mLocale.setValue(rawLocale == null ? "" : rawLocale);
     }
 
-    private void refreshPreviewText() {
-        if (mParent != null) {
-            mParent.refreshPreviewText();
-        }
-    }
-
     private void refreshShowingCustom() {
         final boolean customPreset = mPreset.getValue() == CaptionStyle.PRESET_CUSTOM;
         if (!customPreset && mShowingCustom) {
diff --git a/src/com/android/settings/accessibility/PresetPreference.java b/src/com/android/settings/accessibility/PresetPreference.java
index c091f71..84aba6c 100644
--- a/src/com/android/settings/accessibility/PresetPreference.java
+++ b/src/com/android/settings/accessibility/PresetPreference.java
@@ -51,7 +51,7 @@
     protected void onBindListItem(View view, int index) {
         final SubtitleView previewText = (SubtitleView) view.findViewById(R.id.preview);
         final int value = getValueAt(index);
-        ToggleCaptioningPreferenceFragment.applyCaptionProperties(
+        CaptionPropertiesFragment.applyCaptionProperties(
                 mCaptioningManager, previewText, value);
 
         previewText.setTextSize(DEFAULT_FONT_SIZE);
diff --git a/src/com/android/settings/accessibility/ToggleCaptioningPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleCaptioningPreferenceFragment.java
deleted file mode 100644
index f3c8b1c..0000000
--- a/src/com/android/settings/accessibility/ToggleCaptioningPreferenceFragment.java
+++ /dev/null
@@ -1,152 +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.settings.accessibility;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.app.Fragment;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.Bundle;
-import android.preference.PreferenceFrameLayout;
-import android.provider.Settings;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.CaptioningManager;
-
-import com.android.internal.widget.SubtitleView;
-import com.android.settings.R;
-import com.android.settings.accessibility.ToggleSwitch.OnBeforeCheckedChangeListener;
-
-import java.util.Locale;
-
-public class ToggleCaptioningPreferenceFragment extends Fragment {
-    private static final float DEFAULT_FONT_SIZE = 48f;
-
-    private CaptionPropertiesFragment mPropsFragment;
-    private SubtitleView mPreviewText;
-    private CaptioningManager mCaptioningManager;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mCaptioningManager = (CaptioningManager) getActivity()
-                .getSystemService(Context.CAPTIONING_SERVICE);
-    }
-
-    @Override
-    public View onCreateView(
-            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        final View rootView = inflater.inflate(R.layout.captioning_preview, container, false);
-
-        // We have to do this now because PreferenceFrameLayout looks at it
-        // only when the view is added.
-        if (container instanceof PreferenceFrameLayout) {
-            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
-        }
-
-        return rootView;
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-
-        mPropsFragment = ((CaptionPropertiesFragment) getFragmentManager()
-                .findFragmentById(R.id.properties_fragment));
-        mPropsFragment.setParent(this);
-
-        mPreviewText = (SubtitleView) view.findViewById(R.id.preview_text);
-
-        installActionBarToggleSwitch();
-        refreshPreviewText();
-    }
-
-    public void refreshPreviewText() {
-        final SubtitleView preview = mPreviewText;
-        if (preview != null) {
-            final Activity activity = getActivity();
-            final ContentResolver cr = activity.getContentResolver();
-            final int styleId = mCaptioningManager.getRawUserStyle();
-            applyCaptionProperties(mCaptioningManager, preview, styleId);
-
-            final Locale locale = mCaptioningManager.getLocale();
-            if (locale != null) {
-                final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
-                        activity, locale, R.string.captioning_preview_text);
-                preview.setText(localizedText);
-            } else {
-                preview.setText(R.string.captioning_preview_text);
-            }
-        }
-    }
-
-    public static void applyCaptionProperties(
-            CaptioningManager manager, SubtitleView previewText, int styleId) {
-        previewText.setStyle(styleId);
-
-        final Context context = previewText.getContext();
-        final ContentResolver cr = context.getContentResolver();
-        final float fontScale = manager.getFontScale();
-        previewText.setTextSize(fontScale * DEFAULT_FONT_SIZE);
-
-        final Locale locale = manager.getLocale();
-        if (locale != null) {
-            final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
-                    context, locale, R.string.captioning_preview_characters);
-            previewText.setText(localizedText);
-        } else {
-            previewText.setText(R.string.captioning_preview_characters);
-        }
-    }
-
-    private void installActionBarToggleSwitch() {
-        final Activity activity = getActivity();
-        final ToggleSwitch toggleSwitch = new ToggleSwitch(activity);
-
-        final int padding = getResources().getDimensionPixelSize(
-                R.dimen.action_bar_switch_padding);
-        toggleSwitch.setPaddingRelative(0, 0, padding, 0);
-
-        final ActionBar actionBar = activity.getActionBar();
-        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
-
-        final ActionBar.LayoutParams params = new ActionBar.LayoutParams(
-                ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,
-                        Gravity.CENTER_VERTICAL | Gravity.END);
-        actionBar.setCustomView(toggleSwitch, params);
-
-        final boolean enabled = mCaptioningManager.isEnabled();
-        mPropsFragment.getPreferenceScreen().setEnabled(enabled);
-        mPreviewText.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
-        toggleSwitch.setCheckedInternal(enabled);
-        toggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() {
-            @Override
-            public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
-                toggleSwitch.setCheckedInternal(checked);
-                Settings.Secure.putInt(getActivity().getContentResolver(),
-                        Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, checked ? 1 : 0);
-                mPropsFragment.getPreferenceScreen().setEnabled(checked);
-                mPreviewText.setVisibility(checked ? View.VISIBLE : View.INVISIBLE);
-                return false;
-            }
-        });
-    }
-}
