diff --git a/res/values/strings.xml b/res/values/strings.xml
index 455fd5d..5098369 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -776,9 +776,40 @@
 
     <!-- Dialer settings related strings-->
 
+    <!-- Label for the general dialer settings section [CHAR LIMIT=30]-->
+    <string name="general_settings_label">General settings</string>
+
+    <!-- Label for the general dialer settings section description [CHAR LIMIT=80]-->
+    <string name="general_settings_description">Contact display, sounds, and quick responses</string>
+
+    <!-- Title for "Contact display options" category, which is shown above options which
+         manipulate how contacts are shown. [CHAR LIMIT=40] -->
+    <string name="contact_display_options_category_title">Contact display options</string>
+
+    <!-- Title for the category "sounds", which is shown above sounds and vibration related
+         settings. [CHAR LIMIT=30] -->
+    <string name="sounds_and_vibrate_category_title">Sounds and Vibrate</string>
+
+    <!-- Setting option name to pick ringtone (a list dialog comes up). [CHAR LIMIT=30] -->
+    <string name="ringtone_title">Phone ringtone</string>
+
+    <!-- Setting option name to enable or disable vibration when ringing the phone.
+         [CHAR LIMIT=30] -->
+    <string name="vibrate_on_ring_title">Vibrate when ringing</string>
+
+    <!-- Setting option name to enable or disable DTMF tone sound [CHAR LIMIT=30] -->
+    <string name="dtmf_tone_enable_title">Dialpad touch tones</string>
+
+    <!-- Label for section of general call settings where miscellaneous settings are listed. -->
+    <string name="other_settings_title">Other</string>
+
+    <!-- Title of settings screen for managing the "Respond via SMS" feature. [CHAR LIMIT=30] -->
+    <string name="respond_via_sms_setting_title">Quick responses</string>
+
     <!-- Label for the call settings section [CHAR LIMIT=30]-->
-    <string name="call_settings_label">Call Settings</string>
+    <string name="call_settings_label">Call settings</string>
 
     <!-- Label for the call settings section description [CHAR LIMIT=80]-->
-    <string name="call_settings_description">Ringtones, voicemail settings, VoIP calling, etc</string>
+    <string name="call_settings_description">Voicemail, call waiting, and others</string>
+
 </resources>
diff --git a/res/xml/general_settings.xml b/res/xml/general_settings.xml
new file mode 100644
index 0000000..ecccdfd
--- /dev/null
+++ b/res/xml/general_settings.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  ~ 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
+  -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <PreferenceCategory
+        android:key="dialer_contact_display_options_category_key"
+        android:title="@string/contact_display_options_category_title"
+        android:persistent="false">
+
+        <com.android.contacts.common.preference.SortOrderPreference
+            android:key="sortOrder"
+            android:title="@string/display_options_sort_list_by"
+            android:dialogTitle="@string/display_options_sort_list_by" />
+
+        <com.android.contacts.common.preference.DisplayOrderPreference
+            android:key="displayOrder"
+            android:title="@string/display_options_view_names_as"
+            android:dialogTitle="@string/display_options_view_names_as" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:key="dialer_general_sounds_category_key"
+        android:title="@string/sounds_and_vibrate_category_title"
+        android:persistent="false">
+
+        <com.android.dialer.settings.DefaultRingtonePreference
+            android:key="button_ringtone_key"
+            android:title="@string/ringtone_title"
+            android:dialogTitle="@string/ringtone_title"
+            android:persistent="false"
+            android:ringtoneType="ringtone" />
+
+        <CheckBoxPreference
+            android:key="button_vibrate_on_ring"
+            android:title="@string/vibrate_on_ring_title"
+            android:persistent="false"
+            android:defaultValue="false" />
+
+        <CheckBoxPreference
+            android:key="button_play_dtmf_tone"
+            android:title="@string/dtmf_tone_enable_title"
+            android:persistent="false"
+            android:defaultValue="true" />
+
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:key="dialer_general_other_settings_category_key"
+        android:title="@string/other_settings_title"
+        android:persistent="false" >
+
+        <PreferenceScreen
+            android:key="button_respond_via_sms_key"
+            android:title="@string/respond_via_sms_setting_title"
+            android:persistent="false">
+
+            <intent
+                android:action="android.intent.action.MAIN"
+                android:targetPackage="com.android.telecomm"
+                android:targetClass="com.android.telecomm.RespondViaSmsSettings$Settings" />
+
+        </PreferenceScreen>
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/dialer/settings/DefaultRingtonePreference.java b/src/com/android/dialer/settings/DefaultRingtonePreference.java
new file mode 100644
index 0000000..c12e717
--- /dev/null
+++ b/src/com/android/dialer/settings/DefaultRingtonePreference.java
@@ -0,0 +1,54 @@
+/*
+ * 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.settings;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.preference.RingtonePreference;
+import android.util.AttributeSet;
+
+/**
+ * RingtonePreference which doesn't show default ringtone setting.
+ */
+public class DefaultRingtonePreference extends RingtonePreference {
+    public DefaultRingtonePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onPrepareRingtonePickerIntent(Intent ringtonePickerIntent) {
+        super.onPrepareRingtonePickerIntent(ringtonePickerIntent);
+
+        /*
+         * Since this preference is for choosing the default ringtone, it
+         * doesn't make sense to show a 'Default' item.
+         */
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
+    }
+
+    @Override
+    protected void onSaveRingtone(Uri ringtoneUri) {
+        RingtoneManager.setActualDefaultRingtoneUri(getContext(), getRingtoneType(), ringtoneUri);
+    }
+
+    @Override
+    protected Uri onRestoreRingtone() {
+        return RingtoneManager.getActualDefaultRingtoneUri(getContext(), getRingtoneType());
+    }
+}
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index b47a4ed..db45135 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -19,7 +19,6 @@
 import android.widget.ListAdapter;
 import android.widget.TextView;
 
-import com.android.contacts.common.preference.DisplayOptionsPreferenceFragment;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.R;
 import com.android.dialerbind.analytics.AnalyticsPreferenceActivity;
@@ -44,10 +43,11 @@
 
     @Override
     public void onBuildHeaders(List<Header> target) {
-        final Header contactDisplayHeader = new Header();
-        contactDisplayHeader.titleRes = R.string.settings_contact_display_options_title;
-        contactDisplayHeader.fragment = DisplayOptionsPreferenceFragment.class.getName();
-        target.add(contactDisplayHeader);
+        final Header generalSettingsHeader = new Header();
+        generalSettingsHeader.titleRes = R.string.general_settings_label;
+        generalSettingsHeader.summaryRes = R.string.general_settings_description;
+        generalSettingsHeader.fragment = GeneralSettingsFragment.class.getName();
+        target.add(generalSettingsHeader);
 
         // Only add the call settings header if the current user is the primary/owner user.
         if (isPrimaryUser()) {
diff --git a/src/com/android/dialer/settings/GeneralSettingsFragment.java b/src/com/android/dialer/settings/GeneralSettingsFragment.java
new file mode 100644
index 0000000..d04fae3
--- /dev/null
+++ b/src/com/android/dialer/settings/GeneralSettingsFragment.java
@@ -0,0 +1,159 @@
+/*
+ * 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.settings;
+
+import android.content.Context;
+import android.media.RingtoneManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Vibrator;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+
+import com.android.dialer.R;
+import com.android.phone.common.util.SettingsUtil;
+
+import java.lang.Boolean;
+import java.lang.CharSequence;
+import java.lang.Object;
+import java.lang.Override;
+import java.lang.Runnable;
+import java.lang.String;
+import java.lang.Thread;
+
+public class GeneralSettingsFragment extends PreferenceFragment
+        implements Preference.OnPreferenceChangeListener {
+    private static final String CATEGORY_SOUNDS_KEY    = "dialer_general_sounds_category_key";
+    private static final String BUTTON_RINGTONE_KEY    = "button_ringtone_key";
+    private static final String BUTTON_VIBRATE_ON_RING = "button_vibrate_on_ring";
+    private static final String BUTTON_PLAY_DTMF_TONE  = "button_play_dtmf_tone";
+    private static final String BUTTON_RESPOND_VIA_SMS_KEY = "button_respond_via_sms_key";
+
+    private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
+
+    private Context mContext;
+
+    private Preference mRingtonePreference;
+    private CheckBoxPreference mVibrateWhenRinging;
+    private CheckBoxPreference mPlayDtmfTone;
+    private Preference mRespondViaSms;
+
+    private Runnable mRingtoneLookupRunnable;
+    private final Handler mRingtoneLookupComplete = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_UPDATE_RINGTONE_SUMMARY:
+                    mRingtonePreference.setSummary((CharSequence) msg.obj);
+                    break;
+            }
+        }
+    };
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mContext = getActivity().getApplicationContext();
+
+        addPreferencesFromResource(R.xml.general_settings);
+
+        mRingtonePreference = findPreference(BUTTON_RINGTONE_KEY);
+        mVibrateWhenRinging = (CheckBoxPreference) findPreference(BUTTON_VIBRATE_ON_RING);
+        mPlayDtmfTone = (CheckBoxPreference) findPreference(BUTTON_PLAY_DTMF_TONE);
+        mRespondViaSms = findPreference(BUTTON_RESPOND_VIA_SMS_KEY);
+
+        PreferenceCategory soundCategory = (PreferenceCategory) findPreference(CATEGORY_SOUNDS_KEY);
+        if (mVibrateWhenRinging != null) {
+            Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+            if (vibrator != null && vibrator.hasVibrator()) {
+                mVibrateWhenRinging.setOnPreferenceChangeListener(this);
+            } else {
+                soundCategory.removePreference(mVibrateWhenRinging);
+                mVibrateWhenRinging = null;
+            }
+        }
+
+        if (mPlayDtmfTone != null) {
+            mPlayDtmfTone.setOnPreferenceChangeListener(this);
+            mPlayDtmfTone.setChecked(Settings.System.getInt(mContext.getContentResolver(),
+                    Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);
+        }
+
+        mRingtoneLookupRunnable = new Runnable() {
+            @Override
+            public void run() {
+                if (mRingtonePreference != null) {
+                    SettingsUtil.updateRingtoneName(
+                            mContext,
+                            mRingtoneLookupComplete,
+                            RingtoneManager.TYPE_RINGTONE,
+                            mRingtonePreference,
+                            MSG_UPDATE_RINGTONE_SUMMARY);
+                }
+            }
+        };
+    }
+
+    /**
+     * Supports onPreferenceChangeListener to look for preference changes.
+     *
+     * @param preference The preference to be changed
+     * @param objValue The value of the selection, NOT its localized display value.
+     */
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object objValue) {
+        if (preference == mVibrateWhenRinging) {
+            boolean doVibrate = (Boolean) objValue;
+            Settings.System.putInt(mContext.getContentResolver(),
+                    Settings.System.VIBRATE_WHEN_RINGING, doVibrate ? 1 : 0);
+        }
+        return true;
+    }
+
+    /**
+     * Click listener for toggle events.
+     */
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+        if (preference == mPlayDtmfTone) {
+            Settings.System.putInt(mContext.getContentResolver(),
+                    Settings.System.DTMF_TONE_WHEN_DIALING, mPlayDtmfTone.isChecked() ? 1 : 0);
+        } else if (preference == mRespondViaSms) {
+            // Needs to return false for the intent to launch.
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        if (mVibrateWhenRinging != null) {
+            mVibrateWhenRinging.setChecked(SettingsUtil.getVibrateWhenRingingSetting(mContext));
+        }
+
+        // Lookup the ringtone name asynchronously.
+        new Thread(mRingtoneLookupRunnable).start();
+    }
+}
