diff --git a/src/com/android/server/telecom/AudioRoute.java b/src/com/android/server/telecom/AudioRoute.java
index f402099..d469a43 100644
--- a/src/com/android/server/telecom/AudioRoute.java
+++ b/src/com/android/server/telecom/AudioRoute.java
@@ -256,10 +256,6 @@
             BluetoothRouteManager bluetoothRouteManager, boolean isScoAudioConnected) {
         Log.i(this, "onDestRouteAsPendingRoute: active (%b), type (%s)", active,
                 DEVICE_TYPE_STRINGS.get(mAudioRouteType));
-        if (mAudioRouteType == TYPE_BUS) {
-            Log.i(this, "onDestRouteAsPendingRoute: Ignore processing dest route for TYPE_BUS");
-            return;
-        }
         if (pendingAudioRoute.isActive() && !active) {
             clearCommunicationDevice(pendingAudioRoute, bluetoothRouteManager, audioManager);
         } else if (active) {
@@ -323,10 +319,6 @@
     void onOrigRouteAsPendingRoute(boolean active, PendingAudioRoute pendingAudioRoute,
             AudioManager audioManager, BluetoothRouteManager bluetoothRouteManager) {
         Log.i(this, "onOrigRouteAsPendingRoute: active (%b), type (%d)", active, mAudioRouteType);
-        if (mAudioRouteType == TYPE_BUS) {
-            Log.i(this, "onOrigRouteAsPendingRoute: Ignore processing dest route for TYPE_BUS");
-            return;
-        }
         if (active) {
             if (mAudioRouteType == TYPE_SPEAKER) {
                 pendingAudioRoute.addMessage(SPEAKER_OFF, null);
diff --git a/src/com/android/server/telecom/CallAudioRouteController.java b/src/com/android/server/telecom/CallAudioRouteController.java
index d07d554..ca9fe5b 100644
--- a/src/com/android/server/telecom/CallAudioRouteController.java
+++ b/src/com/android/server/telecom/CallAudioRouteController.java
@@ -360,18 +360,19 @@
             // Create speaker routes
             mSpeakerDockRoute = mAudioRouteFactory.create(AudioRoute.TYPE_SPEAKER, null,
                     mAudioManager);
-            // Todo(b/364562758): Represent TYPE_BUS as CallAudioState.ROUTE_SPEAKER (moving
-            // forward, we may rework this if audio fwk team decides to allow list this as a
-            // valid communication device.
-            if (mSpeakerDockRoute != null || hasBusAudioDevice()) {
-                if (mSpeakerDockRoute == null){
-                    mSpeakerDockRoute = new AudioRoute(AudioRoute.TYPE_BUS, null, null);
-                    audioRouteType = AudioRoute.TYPE_BUS;
-                }
+            if (mSpeakerDockRoute == null){
+                Log.i(this, "Can't find available audio device info for route TYPE_SPEAKER, trying"
+                        + " for TYPE_BUS");
+                mSpeakerDockRoute = mAudioRouteFactory.create(AudioRoute.TYPE_BUS, null,
+                        mAudioManager);
+                audioRouteType = AudioRoute.TYPE_BUS;
+            }
+            if (mSpeakerDockRoute != null) {
                 mTypeRoutes.put(audioRouteType, mSpeakerDockRoute);
                 updateAvailableRoutes(mSpeakerDockRoute, true);
             } else {
-                Log.w(this, "Can't find available audio device info for route TYPE_SPEAKER");
+                Log.w(this, "Can't find available audio device info for route TYPE_SPEAKER "
+                        + "or TYPE_BUS.");
             }
         }
 
@@ -1138,25 +1139,6 @@
         return mAudioManager.getPreferredDeviceForStrategy(strategy);
     }
 
-    /**
-     * For auto, there is no earpiece or speakerphone routes available. The audio is routed to the
-     * bus but because this isn't a valid communication device,
-     * {@link AudioManager#getCommunicationDevice()} will not provide this device even if audio fwk
-     * reports it as the active communication device (refer to
-     * AudioDeviceBroker#getCommunicationDeviceInt()}. Check if the device is the preferred device
-     * for strategy instead.
-     */
-    private boolean hasBusAudioDevice() {
-        AudioDeviceAttributes deviceAttr = getPreferredDeviceForStrategy();
-        if (deviceAttr == null) {
-            return false;
-        }
-        // Get corresponding audio route mapping
-        @AudioRoute.AudioRouteType int type = AudioRoute.DEVICE_INFO_TYPE_TO_AUDIO_ROUTE_TYPE.get(
-                deviceAttr.getType());
-        return type == AudioRoute.TYPE_BUS;
-    }
-
     private AudioRoute getPreferredAudioRouteFromDefault(boolean includeBluetooth,
             String btAddressToExclude) {
         boolean skipEarpiece;
