diff --git a/java/com/android/dialer/app/res/values/cm_strings.xml b/java/com/android/dialer/app/res/values/cm_strings.xml
new file mode 100644
index 0000000..90e6480
--- /dev/null
+++ b/java/com/android/dialer/app/res/values/cm_strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2013-2014 The CyanogenMod 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="incall_vibration_category_key" translatable="false">dialer_general_incall_vibration_category_key</string>
+    <string name="incall_vibration_category_title">In-call vibration</string>
+    <string name="incall_vibrate_outgoing_title">Vibrate on answer</string>
+    <string name="incall_vibrate_call_waiting_title">Vibrate on call waiting</string>
+    <string name="incall_vibrate_hangup_title">Vibrate on hang up</string>
+    <string name="incall_vibrate_45_title">Vibrate every minute</string>
+    <string name="incall_vibrate_45_summary">Vibrates at the 45 second mark of every minute during outgoing calls</string>
+</resources>
diff --git a/java/com/android/dialer/app/res/xml/sound_settings.xml b/java/com/android/dialer/app/res/xml/sound_settings.xml
index d9afb74..c0e78c2 100644
--- a/java/com/android/dialer/app/res/xml/sound_settings.xml
+++ b/java/com/android/dialer/app/res/xml/sound_settings.xml
@@ -43,4 +43,27 @@
     android:key="@string/dtmf_tone_length_preference_key"
     android:title="@string/dtmf_tone_length_title"/>
 
+  <PreferenceCategory
+    android:key="@string/incall_vibration_category_key"
+    android:title="@string/incall_vibration_category_title">
+
+    <CheckBoxPreference
+      android:key="incall_vibrate_outgoing"
+      android:title="@string/incall_vibrate_outgoing_title" />
+
+    <CheckBoxPreference
+      android:key="incall_vibrate_call_waiting"
+      android:title="@string/incall_vibrate_call_waiting_title" />
+
+    <CheckBoxPreference
+      android:key="incall_vibrate_hangup"
+      android:title="@string/incall_vibrate_hangup_title" />
+
+    <CheckBoxPreference
+      android:key="incall_vibrate_45secs"
+      android:title="@string/incall_vibrate_45_title"
+     android:summary="@string/incall_vibrate_45_summary" />
+
+  </PreferenceCategory>
+
 </PreferenceScreen>
diff --git a/java/com/android/dialer/app/settings/SoundSettingsFragment.java b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
index 9d56441..95f2a09 100644
--- a/java/com/android/dialer/app/settings/SoundSettingsFragment.java
+++ b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
@@ -96,7 +96,11 @@
     if (hasVibrator()) {
       vibrateWhenRinging.setOnPreferenceChangeListener(this);
     } else {
-      getPreferenceScreen().removePreference(vibrateWhenRinging);
+      PreferenceScreen ps = getPreferenceScreen();
+      Preference inCallVibration = findPreference(
+          context.getString(R.string.incall_vibration_category_key));
+      ps.removePreference(vibrateWhenRinging);
+      ps.removePreference(inCallVibration);
       vibrateWhenRinging = null;
     }
 
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 150499f..aecf891 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -127,6 +127,7 @@
 
   private StatusBarNotifier statusBarNotifier;
   private ExternalCallNotifier externalCallNotifier;
+  private InCallVibrationHandler vibrationHandler;
   private ContactInfoCache contactInfoCache;
   private Context context;
   private final OnCheckBlockedListener onCheckBlockedListener =
@@ -361,6 +362,9 @@
         .getEnrichedCallManager()
         .registerStateChangedListener(this.statusBarNotifier);
 
+    vibrationHandler = new InCallVibrationHandler(context);
+    addListener(vibrationHandler);
+
     this.proximitySensor = proximitySensor;
     addListener(this.proximitySensor);
 
@@ -1648,6 +1652,11 @@
       }
       statusBarNotifier = null;
 
+      if (vibrationHandler != null) {
+        removeListener(vibrationHandler);
+      }
+      vibrationHandler = null;
+
       if (callList != null) {
         callList.removeListener(this);
         callList.removeListener(spamCallListListener);
diff --git a/java/com/android/incallui/InCallVibrationHandler.java b/java/com/android/incallui/InCallVibrationHandler.java
new file mode 100644
index 0000000..067d6bf
--- /dev/null
+++ b/java/com/android/incallui/InCallVibrationHandler.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2014 The CyanogenMod 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.incallui;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Vibrator;
+import android.preference.PreferenceManager;
+import android.telecom.DisconnectCause;
+
+import com.android.incallui.call.CallList;
+import com.android.incallui.call.DialerCall;
+import com.android.incallui.call.state.DialerCallState;
+import com.android.incallui.InCallPresenter.InCallState;
+
+public class InCallVibrationHandler extends Handler implements
+    InCallPresenter.InCallStateListener {
+
+  private static final int MSG_VIBRATE_45_SEC = 1;
+
+  private static final String KEY_VIBRATE_CALL_WAITING = "incall_vibrate_call_waiting";
+  private static final String KEY_VIBRATE_OUTGOING = "incall_vibrate_outgoing";
+  private static final String KEY_VIBRATE_45SECS = "incall_vibrate_45secs";
+  private static final String KEY_VIBRATE_HANGUP = "incall_vibrate_hangup";
+
+  private SharedPreferences prefs;
+  private Vibrator vibrator;
+  private DialerCall activeCall;
+
+  public InCallVibrationHandler(Context context) {
+    prefs = PreferenceManager.getDefaultSharedPreferences(context);
+    vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+  }
+
+  @Override
+  public void handleMessage(Message msg) {
+    switch (msg.what) {
+      case MSG_VIBRATE_45_SEC:
+        vibrate(70, 0, 0);
+        sendEmptyMessageDelayed(MSG_VIBRATE_45_SEC, 60000);
+        break;
+    }
+  }
+
+  @Override
+  public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+    DialerCall activeCall = callList.getActiveCall();
+
+    if (activeCall != null && this.activeCall == null) {
+      Log.d(this, "Transition to active call " + activeCall);
+      if (activeCall.isOutgoing()) {
+        handleOutgoingCallVibration(activeCall);
+      }
+      this.activeCall = activeCall;
+    } else if (activeCall != null && callList.getIncomingCall() != null
+        && !callList.getIncomingCall().equals(activeCall)) {
+      Log.d(this, "New incoming call" + callList.getIncomingCall());
+      handleCallWaitingVibration(activeCall);
+    } else if (activeCall == null && this.activeCall != null) {
+      Log.d(this, "Transition from active call " + this.activeCall);
+      handleCallEnd(this.activeCall);
+      this.activeCall = null;
+    }
+  }
+
+  private void handleOutgoingCallVibration(DialerCall call) {
+    long durationMillis = System.currentTimeMillis() - call.getConnectTimeMillis();
+    Log.d(this, "Start outgoing call: duration = " + durationMillis);
+
+    if (prefs.getBoolean(KEY_VIBRATE_OUTGOING, false) && durationMillis < 200) {
+      vibrate(100, 200, 0);
+    }
+    if (prefs.getBoolean(KEY_VIBRATE_45SECS, false)) {
+      start45SecondVibration(durationMillis);
+    }
+  }
+
+  private void handleCallWaitingVibration(DialerCall call) {
+    Log.d(this, "Start call waiting vibration");
+    if (prefs.getBoolean(KEY_VIBRATE_CALL_WAITING, false)) {
+      vibrate(200, 300, 500);
+    }
+  }
+
+  private void handleCallEnd(DialerCall call) {
+    long durationMillis = System.currentTimeMillis() - call.getConnectTimeMillis();
+    DisconnectCause cause = call.getDisconnectCause();
+    boolean localDisconnect =
+        // Disconnection not yet processed
+        call.getState() == DialerCallState.DISCONNECTING ||
+        // Disconnection already processed
+        (cause != null && cause.getCode() == DisconnectCause.LOCAL);
+
+    Log.d(this, "Ending active call: duration = " + durationMillis
+        + ", locally disconnected = " + localDisconnect);
+
+    if (prefs.getBoolean(KEY_VIBRATE_HANGUP, false)
+        && !localDisconnect && durationMillis > 500) {
+      vibrate(50, 100, 50);
+    }
+    // Stop 45-second vibration
+    removeMessages(MSG_VIBRATE_45_SEC);
+  }
+
+  private void start45SecondVibration(long callDurationMillis) {
+    callDurationMillis = callDurationMillis % 60000;
+    Log.d(this, "vibrate start @" + callDurationMillis);
+    removeMessages(MSG_VIBRATE_45_SEC);
+
+    long timer;
+    if (callDurationMillis > 45000) {
+        // Schedule the alarm at the next minute + 45 secs
+        timer = 45000 + 60000 - callDurationMillis;
+    } else {
+        // Schedule the alarm at the first 45 second mark
+        timer = 45000 - callDurationMillis;
+    }
+    sendEmptyMessageDelayed(MSG_VIBRATE_45_SEC, timer);
+  }
+
+  private void vibrate(int v1, int p1, int v2) {
+    long[] pattern = new long[] {
+      0, v1, p1, v2
+    };
+    vibrator.vibrate(pattern, -1);
+  }
+}
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 1f4e49a..07cfe3f 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -171,6 +171,7 @@
 
   @Nullable private SpamStatus spamStatus;
   private boolean isBlocked;
+  private boolean isOutgoing;
 
   private boolean didShowCameraPermission;
   private boolean didDismissVideoChargesAlertDialog;
@@ -900,6 +901,8 @@
           logState.dialerConnectTimeMillisElapsedRealtime == 0
               ? 0
               : SystemClock.elapsedRealtime() - logState.dialerConnectTimeMillisElapsedRealtime;
+    } else if (state == DialerCallState.DIALING || state == DialerCallState.CONNECTING) {
+      isOutgoing = true;
     }
   }
 
@@ -908,6 +911,10 @@
     this.clock = clock;
   }
 
+  public boolean isOutgoing() {
+    return isOutgoing;
+  }
+
   public int getNumberPresentation() {
     return telecomCall == null ? -1 : telecomCall.getDetails().getHandlePresentation();
   }
