diff --git a/src/com/android/car/hvac/DataStore.java b/src/com/android/car/hvac/DataStore.java
index 83ed5d3..75e8801 100644
--- a/src/com/android/car/hvac/DataStore.java
+++ b/src/com/android/car/hvac/DataStore.java
@@ -32,7 +32,7 @@
  * them, keeping the application's view of the world sane.
  */
 public class DataStore {
-    private static final long COALESCE_TIME_MS = 50L;
+    private static final long COALESCE_TIME_MS = 0L;
 
     @GuardedBy("mTemperature")
     private SparseArray<Float> mTemperature = new SparseArray<Float>();
diff --git a/src/com/android/car/hvac/HvacController.java b/src/com/android/car/hvac/HvacController.java
index c9ae8a4..66c4da4 100644
--- a/src/com/android/car/hvac/HvacController.java
+++ b/src/com/android/car/hvac/HvacController.java
@@ -29,8 +29,8 @@
 import android.os.IBinder;
 import android.os.SystemProperties;
 import android.support.car.Car;
-import android.support.car.CarNotConnectedException;
 import android.support.car.CarConnectionCallback;
+import android.support.car.CarNotConnectedException;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -51,9 +51,7 @@
             (CarHvacManager.FAN_DIRECTION_FACE | CarHvacManager.FAN_DIRECTION_FLOOR)
     };
     // Hardware specific value for the front seats
-    public static final int SEAT_ALL = VehicleAreaSeat.SEAT_ROW_1_LEFT |
-            VehicleAreaSeat.SEAT_ROW_1_RIGHT | VehicleAreaSeat.SEAT_ROW_2_LEFT |
-            VehicleAreaSeat.SEAT_ROW_2_CENTER | VehicleAreaSeat.SEAT_ROW_2_RIGHT;
+    public static final int SEAT_ALL = DRIVER_ZONE_ID | PASSENGER_ZONE_ID;
 
     /**
      * Callback for receiving updates from the hvac manager. A Callback can be
@@ -94,7 +92,7 @@
         public void onAutoModeChange(boolean isOn) {
         }
 
-        public void onHvacPowerChange(boolean isOn){
+        public void onHvacPowerChange(boolean isOn) {
         }
     }
 
@@ -356,23 +354,24 @@
 
     private void handleTempUpdate(CarPropertyValue value) {
         final int zone = value.getAreaId();
-        final float temp = (Float)value.getValue();
+        final float temp = (Float) value.getValue();
         final boolean available = value.getStatus() == CarPropertyValue.STATUS_AVAILABLE;
         boolean shouldPropagate = mDataStore.shouldPropagateTempUpdate(zone, temp, available);
         if (Log.isLoggable(TAG, Log.DEBUG)) {
             Log.d(TAG, "Temp Update, zone: " + zone + " temp: " + temp +
-                "available: " + available + " should propagate: " + shouldPropagate);
+                    "available: " + available + " should propagate: " + shouldPropagate);
         }
         if (shouldPropagate) {
-            int userTemperature =  mPolicy.hardwareToUserTemp(temp);
             synchronized (mCallbacks) {
                 for (int i = 0; i < mCallbacks.size(); i++) {
-                    if (zone == VehicleAreaSeat.SEAT_ROW_1_LEFT) {
+                    if (zone == DRIVER_ZONE_ID) {
                         mCallbacks.get(i)
                                 .onDriverTemperatureChange(value);
-                    } else {
+                    } else if (zone == PASSENGER_ZONE_ID) {
                         mCallbacks.get(i)
                                 .onPassengerTemperatureChange(value);
+                    } else {
+                        Log.w(TAG, "Unknown temperature set area id: " + zone);
                     }
                 }
             }
@@ -417,8 +416,7 @@
                 fetchFanSpeed();
                 fetchDefrosterState(VehicleAreaWindow.WINDOW_FRONT_WINDSHIELD);
                 fetchDefrosterState(VehicleAreaWindow.WINDOW_REAR_WINDSHIELD);
-                fetchAirflow(DRIVER_ZONE_ID);
-                fetchAirflow(PASSENGER_ZONE_ID);
+                fetchAirflow();
                 fetchAcState();
                 fetchAirCirculation();
                 fetchHvacPowerState();
@@ -462,9 +460,9 @@
         if (mHvacManager != null) {
             try {
                 float value = mHvacManager.getFloatProperty(
-                    CarHvacManager.ID_ZONED_TEMP_SETPOINT, zone);
+                        CarHvacManager.ID_ZONED_TEMP_SETPOINT, zone);
                 boolean available = mHvacManager.isPropertyAvailable(
-                    CarHvacManager.ID_ZONED_TEMP_SETPOINT, zone);
+                        CarHvacManager.ID_ZONED_TEMP_SETPOINT, zone);
                 mDataStore.setTemperature(zone, value, available);
             } catch (android.car.CarNotConnectedException e) {
                 Log.e(TAG, "Car not connected in fetchTemperature");
@@ -473,19 +471,19 @@
     }
 
     public int getDriverTemperature() {
-        return mPolicy.hardwareToUserTemp(mDataStore.getTemperature(DRIVER_ZONE_ID));
+        return Float.valueOf(mDataStore.getTemperature(DRIVER_ZONE_ID)).intValue();
     }
 
     public int getPassengerTemperature() {
-        return mPolicy.hardwareToUserTemp(mDataStore.getTemperature(PASSENGER_ZONE_ID));
+        return Float.valueOf(mDataStore.getTemperature(PASSENGER_ZONE_ID)).intValue();
     }
 
     public void setDriverTemperature(int temperature) {
-        setTemperature(DRIVER_ZONE_ID, mPolicy.userToHardwareTemp(temperature));
+        setTemperature(DRIVER_ZONE_ID, temperature);
     }
 
     public void setPassengerTemperature(int temperature) {
-        setTemperature(PASSENGER_ZONE_ID, mPolicy.userToHardwareTemp(temperature));
+        setTemperature(PASSENGER_ZONE_ID, temperature);
     }
 
     public void setTemperature(final int zone, final float temperature) {
@@ -515,7 +513,7 @@
                 if (mHvacManager != null) {
                     try {
                         mHvacManager.setBooleanProperty(CarHvacManager.ID_ZONED_HVAC_POWER_ON,
-                            SEAT_ALL, state);
+                                SEAT_ALL, state);
                         // if the set() succeeds, consider the property available
                         mDataStore.setHvacPowerState(state);
                     } catch (android.car.CarNotConnectedException e) {
@@ -695,12 +693,12 @@
         return AIRFLOW_STATES[0];
     }
 
-    private void fetchAirflow(int zone) {
+    private void fetchAirflow() {
         if (mHvacManager != null) {
-            zone = SEAT_ALL; // Car specific workaround.
             try {
-                int val = mHvacManager.getIntProperty(CarHvacManager.ID_ZONED_FAN_DIRECTION, zone);
-                mDataStore.setAirflow(zone, fanPositionToAirflowIndex(val));
+                int val = mHvacManager.getIntProperty(CarHvacManager.ID_ZONED_FAN_DIRECTION,
+                        SEAT_ALL);
+                mDataStore.setAirflow(SEAT_ALL, fanPositionToAirflowIndex(val));
             } catch (android.car.CarNotConnectedException e) {
                 Log.e(TAG, "Car not connected in fetchAirFlow");
             }
