diff --git a/java/com/android/dialer/app/res/values/cm_strings.xml b/java/com/android/dialer/app/res/values/cm_strings.xml
index 336c820..b33349a 100644
--- a/java/com/android/dialer/app/res/values/cm_strings.xml
+++ b/java/com/android/dialer/app/res/values/cm_strings.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
      Copyright (C) 2013-2014 The CyanogenMod Project
+     Copyright (C) 2018 The LineageOS Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -18,13 +19,6 @@
     <string name="incall_category_key" translatable="false">dialer_general_incall_category_key</string>
     <string name="incall_category_title">In-call</string>
     <string name="incall_enable_dnd_title">Enable Do Not Disturb during calls</string>
-    <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>
     <string name="incall_dnd_dialog_message">In order to enable Do Not Disturb, the Phone app needs to be granted the permission to control the Do Not Disturb status.\nPlease allow it.</string>
     <string name="allow">Allow</string>
     <string name="deny">Deny</string>
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 248a7ae..b862fd8 100644
--- a/java/com/android/dialer/app/res/xml/sound_settings.xml
+++ b/java/com/android/dialer/app/res/xml/sound_settings.xml
@@ -44,31 +44,14 @@
     android:title="@string/dtmf_tone_length_title"/>
 
   <PreferenceCategory
-    android:key="@string/incall_vibration_category_key"
-    android:title="@string/incall_vibration_category_title">
+    android:key="@string/incall_category_key"
+    android:title="@string/incall_category_title">
 
     <SwitchPreference
         android:defaultValue="false"
         android:key="incall_enable_dnd"
         android:title="@string/incall_enable_dnd_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>
 
   <PreferenceCategory
diff --git a/java/com/android/dialer/app/settings/SoundSettingsFragment.java b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
index 8afffd4..634f993 100644
--- a/java/com/android/dialer/app/settings/SoundSettingsFragment.java
+++ b/java/com/android/dialer/app/settings/SoundSettingsFragment.java
@@ -105,11 +105,7 @@
     if (hasVibrator()) {
       vibrateWhenRinging.setOnPreferenceChangeListener(this);
     } else {
-      PreferenceScreen ps = getPreferenceScreen();
-      Preference inCallVibration = findPreference(
-          context.getString(R.string.incall_vibration_category_key));
-      ps.removePreference(vibrateWhenRinging);
-      ps.removePreference(inCallVibration);
+      getPreferenceScreen().removePreference(vibrateWhenRinging);
       vibrateWhenRinging = null;
     }
 
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 83ec9ab..4e90eb6 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -127,7 +127,6 @@
 
   private StatusBarNotifier statusBarNotifier;
   private ExternalCallNotifier externalCallNotifier;
-  private InCallVibrationHandler vibrationHandler;
   private InCallDndHandler dndHandler;
   private ContactInfoCache contactInfoCache;
   private Context context;
@@ -363,8 +362,6 @@
         .getEnrichedCallManager()
         .registerStateChangedListener(this.statusBarNotifier);
 
-    vibrationHandler = new InCallVibrationHandler(context);
-    addListener(vibrationHandler);
 
     dndHandler = new InCallDndHandler(context);
     addListener(dndHandler);
@@ -1656,11 +1653,6 @@
       }
       statusBarNotifier = null;
 
-      if (vibrationHandler != null) {
-        removeListener(vibrationHandler);
-      }
-      vibrationHandler = null;
-
       if (dndHandler != null) {
         removeListener(dndHandler);
       }
diff --git a/java/com/android/incallui/InCallVibrationHandler.java b/java/com/android/incallui/InCallVibrationHandler.java
deleted file mode 100644
index 067d6bf..0000000
--- a/java/com/android/incallui/InCallVibrationHandler.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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 07cfe3f..1f4e49a 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -171,7 +171,6 @@
 
   @Nullable private SpamStatus spamStatus;
   private boolean isBlocked;
-  private boolean isOutgoing;
 
   private boolean didShowCameraPermission;
   private boolean didDismissVideoChargesAlertDialog;
@@ -901,8 +900,6 @@
           logState.dialerConnectTimeMillisElapsedRealtime == 0
               ? 0
               : SystemClock.elapsedRealtime() - logState.dialerConnectTimeMillisElapsedRealtime;
-    } else if (state == DialerCallState.DIALING || state == DialerCallState.CONNECTING) {
-      isOutgoing = true;
     }
   }
 
@@ -911,10 +908,6 @@
     this.clock = clock;
   }
 
-  public boolean isOutgoing() {
-    return isOutgoing;
-  }
-
   public int getNumberPresentation() {
     return telecomCall == null ? -1 : telecomCall.getDetails().getHandlePresentation();
   }
