diff --git a/src/com/android/phone/CallController.java b/src/com/android/phone/CallController.java
index 11340aa..7b889de 100644
--- a/src/com/android/phone/CallController.java
+++ b/src/com/android/phone/CallController.java
@@ -271,9 +271,6 @@
                     inCallUiState.clearPendingCallStatusCode();
                 }
 
-                // Notify the phone app that a call is beginning so it can
-                // enable the proximity sensor
-                mApp.setBeginningCall(true);
                 break;
 
             default:
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 6900183..42c73ae 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -97,7 +97,7 @@
 
     private static final int BAD_EMERGENCY_NUMBER_DIALOG = 0;
 
-    private static final int USER_ACTIVITY_TIMEOUT_WHEN_NO_PROX_SENSOR = 15000; // millis
+    // private static final int USER_ACTIVITY_TIMEOUT_WHEN_NO_PROX_SENSOR = 15000; // millis
 
     EditText mDigits;
     private View mDialButton;
@@ -164,10 +164,11 @@
         // Allow this activity to be displayed in front of the keyguard / lockscreen.
         WindowManager.LayoutParams lp = getWindow().getAttributes();
         lp.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
-        if (!mApp.proximitySensorModeEnabled()) {
-            // When no proximity sensor is available, use a shorter timeout.
-            lp.userActivityTimeout = USER_ACTIVITY_TIMEOUT_WHEN_NO_PROX_SENSOR;
-        }
+
+        // When no proximity sensor is available, use a shorter timeout.
+        // TODO(klp): Do we enable this for non proximity devices any more?
+        // lp.userActivityTimeout = USER_ACTIVITY_TIMEOUT_WHEN_NO_PROX_SENSOR;
+
         getWindow().setAttributes(lp);
 
         setContentView(R.layout.emergency_dialer);
diff --git a/src/com/android/phone/InCallScreen.java b/src/com/android/phone/InCallScreen.java
index c672353..31f680b 100644
--- a/src/com/android/phone/InCallScreen.java
+++ b/src/com/android/phone/InCallScreen.java
@@ -235,7 +235,6 @@
     // current "activity lifecycle" state, we can remove these flags.
     private boolean mIsDestroyed = false;
     private boolean mIsForegroundActivity = false;
-    private boolean mIsForegroundActivityForProximity = false;
     private PowerManager mPowerManager;
 
     // For use with Pause/Wait dialogs
@@ -451,13 +450,6 @@
 
         WindowManager.LayoutParams lp = getWindow().getAttributes();
         lp.flags |= flags;
-        if (!mApp.proximitySensorModeEnabled()) {
-            // If we don't have a proximity sensor, then the in-call screen explicitly
-            // controls user activity.  This is to prevent spurious touches from waking
-            // the display.
-            lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
-        }
-        getWindow().setAttributes(lp);
 
         setPhone(mApp.phone);  // Sets mPhone
 
@@ -515,7 +507,6 @@
         super.onResume();
 
         mIsForegroundActivity = true;
-        mIsForegroundActivityForProximity = true;
 
         // The flag shouldn't be turned on when there are actual phone calls.
         if (mCM.hasActiveFgCall() || mCM.hasActiveBgCall() || mCM.hasActiveRingingCall()) {
@@ -738,11 +729,6 @@
         if (DBG) log("onPause()...");
         super.onPause();
 
-        if (mPowerManager.isScreenOn()) {
-            // Set to false when the screen went background *not* by screen turned off. Probably
-            // the user bailed out of the in-call screen (by pressing BACK, HOME, etc.)
-            mIsForegroundActivityForProximity = false;
-        }
         mIsForegroundActivity = false;
 
         // Force a clear of the provider info frame. Since the
@@ -754,10 +740,6 @@
         // We should never allow it to stay true after that.
         mApp.inCallUiState.showAlreadyDisconnectedState = false;
 
-        // A safety measure to disable proximity sensor in case call failed
-        // and the telephony state did not change.
-        mApp.setBeginningCall(false);
-
         // Make sure the "Manage conference" chronometer is stopped when
         // we move away from the foreground.
         mManageConferenceUtils.stopConferenceTime();
@@ -987,16 +969,6 @@
         return mIsForegroundActivity;
     }
 
-    /**
-     * Returns true when the Activity is in foreground (between onResume() and onPause()),
-     * or, is in background due to user's bailing out of the screen, not by screen turning off.
-     *
-     * @see #isForegroundActivity()
-     */
-    /* package */ boolean isForegroundActivityForProximity() {
-        return mIsForegroundActivityForProximity;
-    }
-
     /* package */ void updateKeyguardPolicy(boolean dismissKeyguard) {
         if (dismissKeyguard) {
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
@@ -1881,13 +1853,12 @@
             // show "DISCONNECTED" state once, with appropriate elapsed time. After showing that
             // we *must* bail out of the screen again, showing screen lock if needed.
             //
-            // See also comments for isForegroundActivityForProximity()
             //
             // TODO: Consider moving this to CallNotifier. This code assumes the InCallScreen
             // never gets destroyed. For this exact case, it works (since InCallScreen won't be
             // destroyed), while technically this isn't right; Activity may be destroyed when
             // in background.
-            if (currentlyIdle && !isForegroundActivity() && isForegroundActivityForProximity()) {
+            if (currentlyIdle && !isForegroundActivity()) {
                 log("Force waking up the screen to let users see \"disconnected\" state");
                 if (call != null) {
                     mCallCard.updateElapsedTimeWidget(call);
@@ -2789,7 +2760,6 @@
         } else {
             openDialpadInternal(true);  // do the "opening" animation
         }
-        mApp.updateProximitySensorMode(mCM.getState());
     }
 
     /** Internal wrapper around {@link DTMFTwelveKeyDialer#openDialer(boolean)} */
@@ -4235,15 +4205,9 @@
      */
     private void updateExpandedViewState() {
         if (mIsForegroundActivity) {
-            if (mApp.proximitySensorModeEnabled()) {
-                // We should not enable notification's expanded view on RINGING state.
-                mApp.notificationMgr.statusBarHelper.enableExpandedView(
-                        mCM.getState() != PhoneConstants.State.RINGING);
-            } else {
-                // If proximity sensor is unavailable on the device, disable it to avoid false
-                // touches toward notifications.
-                mApp.notificationMgr.statusBarHelper.enableExpandedView(false);
-            }
+            // We should not enable notification's expanded view on RINGING state.
+            mApp.notificationMgr.statusBarHelper.enableExpandedView(
+                    mCM.getState() != PhoneConstants.State.RINGING);
         } else {
             mApp.notificationMgr.statusBarHelper.enableExpandedView(true);
         }
diff --git a/src/com/android/phone/PhoneApp.java b/src/com/android/phone/PhoneApp.java
index e3d3fa9..6b5aa11 100644
--- a/src/com/android/phone/PhoneApp.java
+++ b/src/com/android/phone/PhoneApp.java
@@ -38,12 +38,4 @@
             mPhoneGlobals.onCreate();
         }
     }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        if (mPhoneGlobals != null) {
-            mPhoneGlobals.onConfigurationChanged(newConfig);
-        }
-        super.onConfigurationChanged(newConfig);
-    }
 }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index b9cd6c3..9ed0470 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -67,7 +67,6 @@
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.telephony.cdma.TtyIntent;
 import com.android.phone.common.CallLogAsync;
-import com.android.phone.BluetoothManager.BluetoothIndicatorListener;
 import com.android.phone.OtaUtils.CdmaOtaScreenState;
 import com.android.phone.WiredHeadsetManager.WiredHeadsetListener;
 import com.android.server.sip.SipService;
@@ -77,10 +76,7 @@
  * Global state for the telephony subsystem when running in the primary
  * phone process.
  */
-public class PhoneGlobals extends ContextWrapper
-        implements AccelerometerListener.OrientationListener,
-                   BluetoothIndicatorListener,
-                   WiredHeadsetListener {
+public class PhoneGlobals extends ContextWrapper implements WiredHeadsetListener {
     /* package */ static final String LOG_TAG = "PhoneApp";
 
     /**
@@ -204,10 +200,6 @@
     private boolean mIsSimPinEnabled;
     private String mCachedSimPin;
 
-    // True if the keyboard is currently *not* hidden
-    // Gets updated whenever there is a Configuration change
-    private boolean mIsHardKeyboardOpen;
-
     // True if we are beginning a call, but the phone state has not changed yet
     private boolean mBeginningCall;
 
@@ -220,10 +212,7 @@
     private IPowerManager mPowerManagerService;
     private PowerManager.WakeLock mWakeLock;
     private PowerManager.WakeLock mPartialWakeLock;
-    private PowerManager.WakeLock mProximityWakeLock;
     private KeyguardManager mKeyguardManager;
-    private AccelerometerListener mAccelerometerListener;
-    private int mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
 
     private UpdateLock mUpdateLock;
 
@@ -469,18 +458,6 @@
             // lock used to keep the processor awake, when we don't care for the display.
             mPartialWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
                     | PowerManager.ON_AFTER_RELEASE, LOG_TAG);
-            // Wake lock used to control proximity sensor behavior.
-            if (mPowerManager.isWakeLockLevelSupported(
-                    PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
-                mProximityWakeLock = mPowerManager.newWakeLock(
-                        PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG);
-            }
-            if (DBG) Log.d(LOG_TAG, "onCreate: mProximityWakeLock: " + mProximityWakeLock);
-
-            // create mAccelerometerListener only if we are using the proximity sensor
-            if (proximitySensorModeEnabled()) {
-                mAccelerometerListener = new AccelerometerListener(this, this);
-            }
 
             mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
 
@@ -529,7 +506,6 @@
 
             // Bluetooth manager
             bluetoothManager = new BluetoothManager(this, mCM, callModeler);
-            bluetoothManager.addBluetoothIndicatorListener(this);
 
             ringer = Ringer.init(this, bluetoothManager);
 
@@ -650,17 +626,6 @@
         }
    }
 
-    public void onConfigurationChanged(Configuration newConfig) {
-        if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
-            mIsHardKeyboardOpen = true;
-        } else {
-            mIsHardKeyboardOpen = false;
-        }
-
-        // Update the Proximity sensor based on keyboard state
-        updateProximitySensorMode(mCM.getState());
-    }
-
     /**
      * Returns the singleton instance of the PhoneApp.
      */
@@ -835,35 +800,6 @@
     }
 
     /**
-     * @return true if the in-call UI is running as the foreground activity, or,
-     * it went to background due to screen being turned off. This might be useful
-     * to determine if the in-call screen went to background because of other
-     * activities, or its proximity sensor state or manual power-button press.
-     *
-     * Here are some examples.
-     *
-     * - If you want to know if the activity is in foreground or screen is turned off
-     *   from the in-call UI (i.e. though it is not "foreground" anymore it will become
-     *   so after screen being turned on), check
-     *   {@link #isShowingCallScreenForProximity()} is true or not.
-     *   {@link #updateProximitySensorMode(com.android.internal.telephony.PhoneConstants.State)} is
-     *   doing this.
-     *
-     * - If you want to know if the activity is not in foreground just because screen
-     *   is turned off (not due to other activity's interference), check
-     *   {@link #isShowingCallScreen()} is false *and* {@link #isShowingCallScreenForProximity()}
-     *   is true. InCallScreen#onDisconnect() is doing this check.
-     *
-     * @see #isShowingCallScreen()
-     *
-     * TODO: come up with better naming..
-     */
-    boolean isShowingCallScreenForProximity() {
-        if (mInCallScreen == null) return false;
-        return mInCallScreen.isForegroundActivityForProximity();
-    }
-
-    /**
      * Dismisses the in-call UI.
      *
      * This also ensures that you won't be able to get back to the in-call
@@ -1113,125 +1049,13 @@
     }
 
     /**
-     * Set when a new outgoing call is beginning, so we can update
-     * the proximity sensor state.
-     * Cleared when the InCallScreen is no longer in the foreground,
-     * in case the call fails without changing the telephony state.
-     */
-    /* package */ void setBeginningCall(boolean beginning) {
-        // Note that we are beginning a new call, for proximity sensor support
-        mBeginningCall = beginning;
-        // Update the Proximity sensor based on mBeginningCall state
-        updateProximitySensorMode(mCM.getState());
-    }
-
-    /**
-     * Updates the wake lock used to control proximity sensor behavior,
-     * based on the current state of the phone.  This method is called
-     * from the CallNotifier on any phone state change.
-     *
-     * On devices that have a proximity sensor, to avoid false touches
-     * during a call, we hold a PROXIMITY_SCREEN_OFF_WAKE_LOCK wake lock
-     * whenever the phone is off hook.  (When held, that wake lock causes
-     * the screen to turn off automatically when the sensor detects an
-     * object close to the screen.)
-     *
-     * This method is a no-op for devices that don't have a proximity
-     * sensor.
-     *
-     * Note this method doesn't care if the InCallScreen is the foreground
-     * activity or not.  That's because we want the proximity sensor to be
-     * enabled any time the phone is in use, to avoid false cheek events
-     * for whatever app you happen to be running.
-     *
-     * Proximity wake lock will *not* be held if any one of the
-     * conditions is true while on a call:
-     * 1) If the audio is routed via Bluetooth
-     * 2) If a wired headset is connected
-     * 3) if the speaker is ON
-     * 4) If the slider is open(i.e. the hardkeyboard is *not* hidden)
-     *
-     * @param state current state of the phone (see {@link Phone#State})
-     */
-    /* package */ void updateProximitySensorMode(PhoneConstants.State state) {
-        if (VDBG) Log.d(LOG_TAG, "updateProximitySensorMode: state = " + state);
-
-        if (proximitySensorModeEnabled()) {
-            synchronized (mProximityWakeLock) {
-                // turn proximity sensor off and turn screen on immediately if
-                // we are using a headset, the keyboard is open, or the device
-                // is being held in a horizontal position.
-                boolean screenOnImmediately = (wiredHeadsetManager.isHeadsetPlugged()
-                                               || PhoneUtils.isSpeakerOn(this)
-                                               || bluetoothManager.isBluetoothHeadsetAudioOn()
-                                               || mIsHardKeyboardOpen);
-
-                // We do not keep the screen off when the user is outside in-call screen and we are
-                // horizontal, but we do not force it on when we become horizontal until the
-                // proximity sensor goes negative.
-                boolean horizontal =
-                        (mOrientation == AccelerometerListener.ORIENTATION_HORIZONTAL);
-                screenOnImmediately |= !isShowingCallScreenForProximity() && horizontal;
-
-                // We do not keep the screen off when dialpad is visible, we are horizontal, and
-                // the in-call screen is being shown.
-                // At that moment we're pretty sure users want to use it, instead of letting the
-                // proximity sensor turn off the screen by their hands.
-                boolean dialpadVisible = false;
-                if (mInCallScreen != null) {
-                    dialpadVisible =
-                            mInCallScreen.getUpdatedInCallControlState().dialpadEnabled
-                            && mInCallScreen.getUpdatedInCallControlState().dialpadVisible
-                            && isShowingCallScreen();
-                }
-                screenOnImmediately |= dialpadVisible && horizontal;
-
-                if (((state == PhoneConstants.State.OFFHOOK) || mBeginningCall) && !screenOnImmediately) {
-                    // Phone is in use!  Arrange for the screen to turn off
-                    // automatically when the sensor detects a close object.
-                    if (!mProximityWakeLock.isHeld()) {
-                        if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: acquiring...");
-                        mProximityWakeLock.acquire();
-                    } else {
-                        if (VDBG) Log.d(LOG_TAG, "updateProximitySensorMode: lock already held.");
-                    }
-                } else {
-                    // Phone is either idle, or ringing.  We don't want any
-                    // special proximity sensor behavior in either case.
-                    if (mProximityWakeLock.isHeld()) {
-                        if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: releasing...");
-                        // Wait until user has moved the phone away from his head if we are
-                        // releasing due to the phone call ending.
-                        // Qtherwise, turn screen on immediately
-                        int flags =
-                            (screenOnImmediately ? 0 : PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE);
-                        mProximityWakeLock.release(flags);
-                    } else {
-                        if (VDBG) {
-                            Log.d(LOG_TAG, "updateProximitySensorMode: lock already released.");
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void orientationChanged(int orientation) {
-        mOrientation = orientation;
-        updateProximitySensorMode(mCM.getState());
-    }
-
-    /**
      * Notifies the phone app when the phone state changes.
      *
-     * This method will updates various states inside Phone app (e.g. proximity sensor mode,
-     * accelerometer listener state, update-lock state, etc.)
+     * This method will updates various states inside Phone app (e.g. update-lock state, etc.)
      */
     /* package */ void updatePhoneState(PhoneConstants.State state) {
         if (state != mLastPhoneState) {
             mLastPhoneState = state;
-            updateProximitySensorMode(state);
 
             // Try to acquire or release UpdateLock.
             //
@@ -1255,13 +1079,6 @@
                 }
             }
 
-            if (mAccelerometerListener != null) {
-                // use accelerometer to augment proximity sensor when in call
-                mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
-                mAccelerometerListener.enable(state == PhoneConstants.State.OFFHOOK);
-            }
-            // clear our beginning call flag
-            mBeginningCall = false;
             // While we are in call, the in-call screen should dismiss the keyguard.
             // This allows the user to press Home to go directly home without going through
             // an insecure lock screen.
@@ -1284,14 +1101,6 @@
         return mUpdateLock;
     }
 
-    /**
-     * @return true if this device supports the "proximity sensor
-     * auto-lock" feature while in-call (see updateProximitySensorMode()).
-     */
-    /* package */ boolean proximitySensorModeEnabled() {
-        return (mProximityWakeLock != null);
-    }
-
     KeyguardManager getKeyguardManager() {
         return mKeyguardManager;
     }
@@ -1356,28 +1165,12 @@
 
 
     /**
-     * This needs to be called any time the bluetooth headset state or the
-     * telephony state changes.
-     * TODO(klp): See about a ProximityManager-type class listening to bluetooth
-     * state changes instead of having this global method
-     */
-
-    @Override
-    public void onBluetoothIndicationChange(boolean showAsConnected, BluetoothManager manager) {
-        // Update the Proximity sensor based on Bluetooth audio state
-        updateProximitySensorMode(mCM.getState());
-    }
-
-    /**
      * This is called when the wired headset state changes.
      */
     @Override
     public void onWiredHeadsetConnection(boolean pluggedIn) {
         PhoneConstants.State phoneState = mCM.getState();
 
-        // Update the Proximity sensor based on headset state
-        updateProximitySensorMode(phoneState);
-
         // Force TTY state update according to new headset state
         if (mTtyEnabled) {
             mHandler.sendMessage(mHandler.obtainMessage(EVENT_TTY_PREFERRED_MODE_CHANGED, 0));
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index 93f3002..9671c17 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -1835,9 +1835,6 @@
         // in use.
         app.updateWakeState();
 
-        // Update the Proximity sensor based on speaker state
-        app.updateProximitySensorMode(app.mCM.getState());
-
         app.mCM.setEchoSuppressionEnabled(flag);
     }
 
