Snap for 4448085 from 3c33e34de6f28d1b58b36bad081a9446b98f4c0b to oc-m3-release

Change-Id: Ib4ae3fc253ecd8fad68c641db8984292ef307f5e
diff --git a/CleanSpec.mk b/CleanSpec.mk
index d828faa..67d5bef 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -57,6 +57,9 @@
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android.car_intermediates/src/android/car/hardware/ICarDiagnostic*.java)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android.car7_intermediates/src/android/car/hardware/ICarDiagnostic*.java)
 
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android.car7_intermediates/)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android.car_intermediates/)
+
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
 # ************************************************
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index c0b83f7..9a9e531 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -32,7 +32,6 @@
 import android.car.navigation.CarNavigationStatusManager;
 import android.car.CarBluetoothManager;
 import android.car.test.CarTestManagerBinderWrapper;
-import android.car.vms.VmsSubscriberManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -135,12 +134,6 @@
     public static final String BLUETOOTH_SERVICE = "car_bluetooth";
 
     /**
-     * @FutureFeature Cannot drop due to usage in non-flag protected place.
-     * @hide
-     */
-    public static final String VMS_SUBSCRIBER_SERVICE = "vehicle_map_subscriber_service";
-
-    /**
      * Service for testing. This is system app only feature.
      * Service name for {@link CarTestManager}, to be used in {@link #getCarManager(String)}.
      * @hide
@@ -261,22 +254,6 @@
             "android.car.permission.CAR_TEST_SERVICE";
 
     /**
-     * Permissions necessary to access VMS publisher APIs.
-     *
-     * @hide
-     */
-    @FutureFeature
-    public static final String PERMISSION_VMS_PUBLISHER = "android.car.permission.VMS_PUBLISHER";
-
-    /**
-     * Permissions necessary to access VMS subscriber APIs.
-     *
-     * @hide
-     */
-    @FutureFeature
-    public static final String PERMISSION_VMS_SUBSCRIBER = "android.car.permission.VMS_SUBSCRIBER";
-
-    /**
      * Permissions necessary to read diagnostic information, including vendor-specific bits.
      *
      * @hide
@@ -654,11 +631,6 @@
                  * only pass binder wrapper so that CarTestManager can be constructed outside. */
                 manager = new CarTestManagerBinderWrapper(binder);
                 break;
-            case VMS_SUBSCRIBER_SERVICE:
-                if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-                    manager = new VmsSubscriberManager(binder, mEventHandler);
-                }
-                break;
             case BLUETOOTH_SERVICE:
                 manager = new CarBluetoothManager(binder, mContext);
         }
diff --git a/car-lib/src/android/car/vms/IVmsPublisherClient.aidl b/car-lib/src/android/car/vms/IVmsPublisherClient.aidl
deleted file mode 100644
index 96b993b..0000000
--- a/car-lib/src/android/car/vms/IVmsPublisherClient.aidl
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.vms.IVmsPublisherService;
-import android.car.vms.VmsSubscriptionState;
-
-/**
- * @hide
- */
-interface IVmsPublisherClient {
-    /**
-    * Once the VmsPublisherService is bound to the client, this callback is used to set the
-    * binder that the client can use to invoke publisher services. This also gives the client
-    * the token it should use when calling the service.
-    */
-    oneway void setVmsPublisherService(in IBinder token, IVmsPublisherService service) = 0;
-
-    /**
-     * The VmsPublisherService uses this callback to notify about subscription changes.
-     * @param subscriptionState all the layers that have subscribers and a sequence number,
-     *                          clients should ignore any packet with a sequence number that is less
-     *                          than the highest sequence number they have seen thus far.
-     */
-    oneway void onVmsSubscriptionChange(in VmsSubscriptionState subscriptionState) = 1;
-}
diff --git a/car-lib/src/android/car/vms/IVmsPublisherService.aidl b/car-lib/src/android/car/vms/IVmsPublisherService.aidl
deleted file mode 100644
index 3c26a1b..0000000
--- a/car-lib/src/android/car/vms/IVmsPublisherService.aidl
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsLayersOffering;
-import android.car.vms.VmsSubscriptionState;
-
-/**
- * Exposes publisher services to VMS clients.
- *
- * @hide
- */
-interface IVmsPublisherService {
-    /**
-     * Client call to publish a message.
-     */
-    oneway void publish(in IBinder token, in VmsLayer layer, int publisherId, in byte[] message) = 0;
-
-    /**
-     * Returns the list of VmsLayers that has any clients subscribed to it.
-     */
-    VmsSubscriptionState getSubscriptions() = 1;
-
-    /**
-     * Sets which layers the publisher can publish under which dependencties.
-     */
-    oneway void setLayersOffering(in IBinder token, in VmsLayersOffering offering) = 2;
-
-    /**
-     * The first time a publisher calls this API it will store the publisher info and assigns the
-     * publisher an ID. Between reboots, subsequent calls with the same publisher info will
-     * return the same ID so that a restarting process can obtain the same ID as it had before.
-     */
-    int getPublisherId(in byte[] publisherInfo) = 3;
-}
diff --git a/car-lib/src/android/car/vms/IVmsSubscriberClient.aidl b/car-lib/src/android/car/vms/IVmsSubscriberClient.aidl
deleted file mode 100644
index d5b5606..0000000
--- a/car-lib/src/android/car/vms/IVmsSubscriberClient.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-
-/**
- * @hide
- */
-oneway interface IVmsSubscriberClient {
-    /**
-     * A VmsService uses this callback to pass messages to subscribers.
-     */
-    void onVmsMessageReceived(in VmsLayer layer, in byte[] payload) = 0;
-
-    void onLayersAvailabilityChanged(in List<VmsAssociatedLayer> availableLayers) = 1;
-}
diff --git a/car-lib/src/android/car/vms/IVmsSubscriberService.aidl b/car-lib/src/android/car/vms/IVmsSubscriberService.aidl
deleted file mode 100644
index d10a6e4..0000000
--- a/car-lib/src/android/car/vms/IVmsSubscriberService.aidl
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.vms.IVmsSubscriberClient;
-import android.car.vms.VmsLayer;
-
-/**
- * @hide
- */
-interface IVmsSubscriberService {
-    /**
-     * Adds a subscriber to notifications only.
-     * Should be called when a subscriber registers its callback, and before any subscription to a
-     * layer is made.
-     */
-    void addVmsSubscriberToNotifications(
-            in IVmsSubscriberClient subscriber) = 0;
-
-    /**
-     * Adds a subscriber to a VMS layer.
-     */
-    void addVmsSubscriber(
-            in IVmsSubscriberClient subscriber,
-            in VmsLayer layer) = 1;
-
-    /**
-     * Adds a subscriber to all actively broadcasted layers.
-     * Publishers will not be notified regarding this request so the state of the service will not
-     * change.
-     */
-    void addVmsSubscriberPassive(in IVmsSubscriberClient subscriber) = 2;
-
-    /**
-     * Adds a subscriber to a VMS layer from a specific publisher.
-     */
-    void addVmsSubscriberToPublisher(
-            in IVmsSubscriberClient subscriber,
-            in VmsLayer layer,
-            int publisherId) = 3;
-
-    /**
-     * Removes a subscriber to notifications only.
-     * Should be called when a subscriber unregisters its callback, and after all subscriptions to
-     * layers are removed.
-     */
-    void removeVmsSubscriberToNotifications(
-            in IVmsSubscriberClient subscriber) = 4;
-
-    /**
-     * Removes a subscriber to a VMS layer.
-     */
-    void removeVmsSubscriber(
-            in IVmsSubscriberClient subscriber,
-            in VmsLayer layer) = 5;
-
-    /**
-     * Removes a subscriber to all actively broadcasted layers.
-     * Publishers will not be notified regarding this request so the state of the service will not
-     * change.
-     */
-    void removeVmsSubscriberPassive(
-            in IVmsSubscriberClient subscriber) = 6;
-
-    /**
-     * Removes a subscriber to a VMS layer from a specific publisher.
-     */
-    void removeVmsSubscriberToPublisher(
-            in IVmsSubscriberClient subscriber,
-            in VmsLayer layer,
-            int publisherId) = 7;
-
-    /**
-     * Returns a list of available layers from the closure of the publishers offerings.
-     */
-    List<VmsLayer> getAvailableLayers() = 8;
-
-    /**
-     *  Returns a the publisher information for a publisher ID.
-     */
-    byte[] getPublisherInfo(in int publisherId) = 9;
-}
diff --git a/car-lib/src/android/car/vms/VmsAssociatedLayer.aidl b/car-lib/src/android/car/vms/VmsAssociatedLayer.aidl
deleted file mode 100644
index c2cf271..0000000
--- a/car-lib/src/android/car/vms/VmsAssociatedLayer.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-parcelable VmsAssociatedLayer;
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsAssociatedLayer.java b/car-lib/src/android/car/vms/VmsAssociatedLayer.java
deleted file mode 100644
index 023fd9c..0000000
--- a/car-lib/src/android/car/vms/VmsAssociatedLayer.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.annotation.FutureFeature;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.*;
-
-/**
- * A VMS Layer with a list of publisher IDs it is associated with.
- *
- * @hide
- */
-@FutureFeature
-public final class VmsAssociatedLayer implements Parcelable {
-
-    // The VmsLayer.
-    private final VmsLayer mLayer;
-
-    // The IDs of the publishers that can publish this VmsLayer.
-    private final Set<Integer> mPublisherIds;
-
-    public VmsAssociatedLayer(VmsLayer layer, Set<Integer> publisherIds) {
-        mLayer = layer;
-        mPublisherIds = Collections.unmodifiableSet(publisherIds);
-    }
-
-    public VmsLayer getVmsLayer() {
-        return mLayer;
-    }
-
-    public Set<Integer> getPublisherIds() {
-        return mPublisherIds;
-    }
-
-    @Override
-    public String toString() {
-        return "VmsAssociatedLayer{ VmsLayer: " + mLayer + ", Publishers: " + mPublisherIds + "}";
-    }
-
-    // Parcelable related methods.
-    public static final Parcelable.Creator<VmsAssociatedLayer> CREATOR =
-            new Parcelable.Creator<VmsAssociatedLayer>() {
-                public VmsAssociatedLayer createFromParcel(Parcel in) {
-                    return new VmsAssociatedLayer(in);
-                }
-
-                public VmsAssociatedLayer[] newArray(int size) {
-                    return new VmsAssociatedLayer[size];
-                }
-            };
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeParcelable(mLayer, flags);
-        out.writeArray(mPublisherIds.toArray());
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof VmsAssociatedLayer)) {
-            return false;
-        }
-        VmsAssociatedLayer p = (VmsAssociatedLayer) o;
-        return Objects.equals(p.mLayer, mLayer) && p.mPublisherIds.equals(mPublisherIds);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mLayer, mPublisherIds);
-    }
-
-    private VmsAssociatedLayer(Parcel in) {
-        mLayer = in.readParcelable(VmsLayer.class.getClassLoader());
-
-        mPublisherIds = Collections.unmodifiableSet(
-                new HashSet<>(Arrays.asList(
-                        (Integer[]) in.readArray(Integer.class.getClassLoader()))));
-    }
-}
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsLayer.aidl b/car-lib/src/android/car/vms/VmsLayer.aidl
deleted file mode 100644
index ff0768a..0000000
--- a/car-lib/src/android/car/vms/VmsLayer.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-parcelable VmsLayer;
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsLayer.java b/car-lib/src/android/car/vms/VmsLayer.java
deleted file mode 100644
index 9125796..0000000
--- a/car-lib/src/android/car/vms/VmsLayer.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.annotation.FutureFeature;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * A VMS Layer which can be subscribed to by VMS clients.
- *
- * @hide
- */
-@FutureFeature
-public final class VmsLayer implements Parcelable {
-
-    // The layer Type.
-    private int mType;
-
-    // The layer Subtype.
-    private int mSubtype;
-
-    // The layer version.
-    private int mVersion;
-
-    public VmsLayer(int type, int subtype, int version) {
-        mType = type;
-        mSubtype = subtype;
-        mVersion = version;
-    }
-
-    public int getType() {
-        return mType;
-    }
-
-    public int getSubtype() {
-        return mSubtype;
-    }
-
-    public int getVersion() {
-        return mVersion;
-    }
-
-    /**
-     * Checks the two objects for equality by comparing their IDs and Versions.
-     *
-     * @param o the {@link VmsLayer} to which this one is to be checked for equality
-     * @return true if the underlying objects of the VmsLayer are both considered equal
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof VmsLayer)) {
-            return false;
-        }
-        VmsLayer p = (VmsLayer) o;
-        return Objects.equals(p.mType, mType) &&
-            Objects.equals(p.mSubtype, mSubtype) &&
-            Objects.equals(p.mVersion, mVersion);
-    }
-
-    /**
-     * Compute a hash code similarly tp {@link android.util.Pair}
-     *
-     * @return a hashcode of the Pair
-     */
-    @Override
-    public int hashCode() {
-        return Objects.hash(mType, mSubtype, mVersion);
-    }
-
-    @Override
-    public String toString() {
-        return "VmsLayer{ Type: " + mType + ", Sub type: " + mSubtype + ", Version: " + mVersion + "}";
-    }
-
-
-    // Parcelable related methods.
-    public static final Parcelable.Creator<VmsLayer> CREATOR = new
-            Parcelable.Creator<VmsLayer>() {
-                public VmsLayer createFromParcel(Parcel in) {
-                    return new VmsLayer(in);
-                }
-
-                public VmsLayer[] newArray(int size) {
-                    return new VmsLayer[size];
-                }
-            };
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mType);
-        out.writeInt(mSubtype);
-        out.writeInt(mVersion);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    private VmsLayer(Parcel in) {
-        readFromParcel(in);
-    }
-
-    private void readFromParcel(Parcel in) {
-        mType = in.readInt();
-        mSubtype = in.readInt();
-        mVersion = in.readInt();
-    }
-}
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsLayerDependency.aidl b/car-lib/src/android/car/vms/VmsLayerDependency.aidl
deleted file mode 100644
index 3e64001..0000000
--- a/car-lib/src/android/car/vms/VmsLayerDependency.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-parcelable VmsLayerDependency;
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsLayerDependency.java b/car-lib/src/android/car/vms/VmsLayerDependency.java
deleted file mode 100644
index 3b82775..0000000
--- a/car-lib/src/android/car/vms/VmsLayerDependency.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.annotation.FutureFeature;
-import android.os.Parcel;
-import android.os.Parcelable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A dependency for a VMS layer on other VMS layers.
- *
- * @hide
- */
-@FutureFeature
-public final class VmsLayerDependency implements Parcelable {
-    private final VmsLayer mLayer;
-    private final Set<VmsLayer> mDependency;
-
-    /**
-     * Construct a dependency for layer on other layers.
-     */
-    public VmsLayerDependency(VmsLayer layer, Set<VmsLayer> dependencies) {
-        mLayer = layer;
-        mDependency = Collections.unmodifiableSet(dependencies);
-    }
-
-    /**
-     * Constructs a layer without a dependency.
-     */
-    public VmsLayerDependency(VmsLayer layer) {
-        mLayer = layer;
-        mDependency = Collections.emptySet();
-    }
-
-    public VmsLayer getLayer() {
-        return mLayer;
-    }
-
-    /**
-     * Returns the dependencies.
-     */
-    public Set<VmsLayer> getDependencies() {
-        return mDependency;
-    }
-
-    public static final Parcelable.Creator<VmsLayerDependency> CREATOR = new
-        Parcelable.Creator<VmsLayerDependency>() {
-            public VmsLayerDependency createFromParcel(Parcel in) {
-                return new VmsLayerDependency(in);
-            }
-            public VmsLayerDependency[] newArray(int size) {
-                return new VmsLayerDependency[size];
-            }
-        };
-
-    public String toString() {
-        return "VmsLayerDependency{ Layer: " + mLayer + " Dependency: " + mDependency + "}";
-    }
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeParcelable(mLayer, flags);
-        out.writeParcelableList(new ArrayList<VmsLayer>(mDependency), flags);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    private VmsLayerDependency(Parcel in) {
-        mLayer = in.readParcelable(VmsLayer.class.getClassLoader());
-        List<VmsLayer> dependency = new ArrayList<>();
-        in.readParcelableList(dependency, VmsLayer.class.getClassLoader());
-        mDependency = Collections.unmodifiableSet(new HashSet<VmsLayer>(dependency));
-    }
-}
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsLayersOffering.aidl b/car-lib/src/android/car/vms/VmsLayersOffering.aidl
deleted file mode 100644
index 4231f2d..0000000
--- a/car-lib/src/android/car/vms/VmsLayersOffering.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-parcelable VmsLayersOffering;
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsLayersOffering.java b/car-lib/src/android/car/vms/VmsLayersOffering.java
deleted file mode 100644
index 6abffc6..0000000
--- a/car-lib/src/android/car/vms/VmsLayersOffering.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.annotation.FutureFeature;
-import android.os.Parcel;
-import android.os.Parcelable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The state of dependencies for a single publisher.
- *
- * @hide
- */
-@FutureFeature
-public final class VmsLayersOffering implements Parcelable {
-
-    private final Set<VmsLayerDependency> mDependencies;
-
-    private final int mPublisherId;
-
-    public VmsLayersOffering(Set<VmsLayerDependency> dependencies, int publisherId) {
-        mDependencies = Collections.unmodifiableSet(dependencies);
-        mPublisherId = publisherId;
-    }
-
-    /**
-     * Returns the dependencies.
-     */
-    public Set<VmsLayerDependency> getDependencies() {
-        return mDependencies;
-    }
-
-    public int getPublisherId() {
-        return mPublisherId;
-    }
-
-    public static final Parcelable.Creator<VmsLayersOffering> CREATOR = new
-        Parcelable.Creator<VmsLayersOffering>() {
-            public VmsLayersOffering createFromParcel(Parcel in) {
-                return new VmsLayersOffering(in);
-            }
-            public VmsLayersOffering[] newArray(int size) {
-                return new VmsLayersOffering[size];
-            }
-        };
-
-    @Override
-    public String toString() {
-        return "VmsLayersOffering{" + mDependencies+ "}";
-    }
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-
-        out.writeParcelableList(new ArrayList(mDependencies), flags);
-        out.writeInt(mPublisherId);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    private VmsLayersOffering(Parcel in) {
-        List<VmsLayerDependency> dependencies = new ArrayList<>();
-        in.readParcelableList(dependencies, VmsLayerDependency.class.getClassLoader());
-        mDependencies = Collections.unmodifiableSet(new HashSet<>(dependencies));
-        mPublisherId = in.readInt();
-    }
-}
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsOperationRecorder.java b/car-lib/src/android/car/vms/VmsOperationRecorder.java
deleted file mode 100644
index c873dce..0000000
--- a/car-lib/src/android/car/vms/VmsOperationRecorder.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package android.car.vms;
-
-import android.car.annotation.FutureFeature;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/**
- * Records VMS operations using the Android Log.
- *
- * This class records VMS operations. The recorded messages include the VMS operations and its
- * arguments encoded as JSON text so that the string can be both read as a log message and easily
- * parsed. VmsOperationRecorder is intended to be called after successful state change.
- *
- * Access the VmsOperationRecorder using the {@link #get()} method, which returns a singleton
- * instance. Each VMS operation has a corresponding VmsOperationRecorder method. For instance:
- * <pre>{@code
- *   VmsOperationRecorder.get().subscribe(layer);
- * }</pre>
- *
- * @hide
- */
-@FutureFeature
-public final class VmsOperationRecorder {
-    private static final String TAG = "VmsOperationRecorder";
-    private static final VmsOperationRecorder INSTANCE = new VmsOperationRecorder(new Writer());
-    private final Writer mWriter;
-
-    @VisibleForTesting
-    public VmsOperationRecorder(Writer writer) {
-        mWriter = writer;
-    }
-
-    /** Return the singleton instance. */
-    public static VmsOperationRecorder get() {
-        return INSTANCE;
-    }
-
-    // VMS Client operations.
-
-    public void subscribe(VmsLayer layer) {
-        recordOp("subscribe", layer);
-    }
-
-    public void unsubscribe(VmsLayer layer) {
-        recordOp("unsubscribe", layer);
-    }
-
-    public void subscribe(VmsLayer layer, int publisherId) {
-        recordOp("subscribe", "publisherId", publisherId, layer);
-    }
-
-    public void unsubscribe(VmsLayer layer, int publisherId) {
-        recordOp("unsubscribe", "publisherId", publisherId, layer);
-    }
-
-    public void startMonitoring() {
-        recordOp("startMonitoring");
-    }
-
-    public void stopMonitoring() {
-        recordOp("stopMonitoring");
-    }
-
-    public void setLayersOffering(VmsLayersOffering layersOffering) {
-        recordOp("setLayersOffering", layersOffering);
-    }
-
-    public void getPublisherId(int publisherId) {
-        recordOp("getPublisherId", "publisherId", publisherId);
-    }
-
-    // VMS Service operations.
-
-    public void addSubscription(int sequenceNumber, VmsLayer layer) {
-        recordOp("addSubscription", "sequenceNumber", sequenceNumber, layer);
-    }
-
-    public void removeSubscription(int sequenceNumber, VmsLayer layer) {
-        recordOp("removeSubscription", "sequenceNumber", sequenceNumber, layer);
-    }
-
-    public void addPromiscuousSubscription(int sequenceNumber) {
-        recordOp("addPromiscuousSubscription", "sequenceNumber", sequenceNumber);
-    }
-
-    public void removePromiscuousSubscription(int sequenceNumber) {
-        recordOp("removePromiscuousSubscription", "sequenceNumber", sequenceNumber);
-    }
-
-    public void addHalSubscription(int sequenceNumber, VmsLayer layer) {
-        recordOp("addHalSubscription", "sequenceNumber", sequenceNumber, layer);
-    }
-
-    public void removeHalSubscription(int sequenceNumber, VmsLayer layer) {
-        recordOp("removeHalSubscription", "sequenceNumber", sequenceNumber, layer);
-    }
-
-    public void setPublisherLayersOffering(VmsLayersOffering layersOffering) {
-        recordOp("setPublisherLayersOffering", layersOffering);
-    }
-
-    public void setHalPublisherLayersOffering(VmsLayersOffering layersOffering) {
-        recordOp("setHalPublisherLayersOffering", layersOffering);
-    }
-
-    private void recordOp(String operation) {
-        if (isEnabled()) {
-            try {
-                write(new JSONObject().put(operation, new JSONObject()));
-            } catch (JSONException e) {
-                Log.e(TAG, e.toString());
-            }
-        }
-    }
-
-    private void recordOp(String operation, VmsLayer layer) {
-        if (isEnabled()) {
-            try {
-                recordOp(operation, new JSONObject().put("layer", toJson(layer)));
-            } catch (JSONException e) {
-                Log.e(TAG, e.toString());
-            }
-        }
-    }
-
-    private void recordOp(String operation, VmsLayersOffering layersOffering) {
-        if (isEnabled()) {
-            try {
-                JSONObject args = new JSONObject();
-                JSONArray offering = toJson(layersOffering);
-                if (offering.length() > 0) {
-                    args.put("layerDependency", offering);
-                }
-                recordOp(operation, args);
-            } catch (JSONException e) {
-                Log.e(TAG, e.toString());
-            }
-        }
-    }
-
-    private void recordOp(String operation, String intArgName, int arg) {
-        if (isEnabled()) {
-            try {
-                recordOp(operation, new JSONObject().put(intArgName, arg));
-            } catch (JSONException e) {
-                Log.e(TAG, e.toString());
-            }
-        }
-    }
-
-    private void recordOp(String operation, String intArgName, int arg, VmsLayer layer) {
-        if (isEnabled()) {
-            try {
-                recordOp(operation,
-                        new JSONObject().put(intArgName, arg).put("layer", toJson(layer)));
-            } catch (JSONException e) {
-                Log.e(TAG, e.toString());
-            }
-        }
-    }
-
-    private void recordOp(String operation, JSONObject args) {
-        if (isEnabled()) {
-            try {
-                write(new JSONObject().put(operation, args));
-            } catch (JSONException e) {
-                Log.e(TAG, e.toString());
-            }
-        }
-    }
-
-    private static JSONObject toJson(VmsLayer layer) throws JSONException {
-        return new JSONObject()
-                .put("type", layer.getType())
-                .put("subtype", layer.getSubtype())
-                .put("version", layer.getVersion());
-    }
-
-    private static JSONObject toJson(VmsLayerDependency layerDependency) throws JSONException {
-        JSONObject dep = new JSONObject();
-        dep.put("layer", toJson(layerDependency.getLayer()));
-        if (!layerDependency.getDependencies().isEmpty()) {
-            JSONArray dependencies = new JSONArray();
-            for (VmsLayer dependency : layerDependency.getDependencies()) {
-                dependencies.put(toJson(dependency));
-            }
-            dep.put("dependency", dependencies);
-        }
-        return dep;
-    }
-
-    private static JSONArray toJson(VmsLayersOffering layersOffering) throws JSONException {
-        JSONArray offerings = new JSONArray();
-        for (VmsLayerDependency layerDependency : layersOffering.getDependencies()) {
-            offerings.put(toJson(layerDependency));
-        }
-        return offerings;
-    }
-
-    private boolean isEnabled() {
-        return mWriter.isEnabled();
-    }
-
-    private void write(JSONObject object) {
-        mWriter.write(object.toString());
-    }
-
-    /** @hide */
-    @VisibleForTesting
-    public static class Writer {
-        private static final String TAG = "VMS.RECORD.EVENT";
-        private static final int LEVEL = Log.DEBUG;
-
-        public boolean isEnabled() {
-            return Log.isLoggable(TAG, LEVEL);
-        }
-
-        public void write(String msg) {
-            Log.println(LEVEL, TAG, msg);
-        }
-    }
-}
diff --git a/car-lib/src/android/car/vms/VmsPublisherClientService.java b/car-lib/src/android/car/vms/VmsPublisherClientService.java
deleted file mode 100644
index 33ca1f3..0000000
--- a/car-lib/src/android/car/vms/VmsPublisherClientService.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-
-import android.app.Service;
-import android.car.annotation.FutureFeature;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.annotation.Nullable;
-import android.util.Log;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Services that need VMS publisher services need to inherit from this class and also need to be
- * declared in the array vmsPublisherClients located in
- * packages/services/Car/service/res/values/config.xml (most likely, this file will be in an overlay
- * of the target product.
- *
- * The {@link com.android.car.VmsPublisherService} will start this service. The callback
- * {@link #onVmsPublisherServiceReady()} notifies when VMS publisher services can be used, and the
- * publisher can request a publisher ID in order to start publishing.
- *
- * SystemApi candidate.
- *
- * @hide
- */
-@FutureFeature
-public abstract class VmsPublisherClientService extends Service {
-    private static final boolean DBG = true;
-    private static final String TAG = "VmsPublisherClient";
-
-    private final Object mLock = new Object();
-
-    private Handler mHandler = new VmsEventHandler(this);
-    private final VmsPublisherClientBinder mVmsPublisherClient = new VmsPublisherClientBinder(this);
-    private volatile IVmsPublisherService mVmsPublisherService = null;
-    @GuardedBy("mLock")
-    private IBinder mToken = null;
-
-    @Override
-    public final IBinder onBind(Intent intent) {
-        if (DBG) {
-            Log.d(TAG, "onBind, intent: " + intent);
-        }
-        return mVmsPublisherClient.asBinder();
-    }
-
-    @Override
-    public final boolean onUnbind(Intent intent) {
-        if (DBG) {
-            Log.d(TAG, "onUnbind, intent: " + intent);
-        }
-        stopSelf();
-        return super.onUnbind(intent);
-    }
-
-    private void setToken(IBinder token) {
-        synchronized (mLock) {
-            mToken = token;
-        }
-    }
-
-    /**
-     * Notifies that the publisher services are ready.
-     */
-    protected abstract void onVmsPublisherServiceReady();
-
-    /**
-     * Publishers need to implement this method to receive notifications of subscription changes.
-     *
-     * @param subscriptionState the state of the subscriptions.
-     */
-    public abstract void onVmsSubscriptionChange(VmsSubscriptionState subscriptionState);
-
-    /**
-     * Uses the VmsPublisherService binder to publish messages.
-     *
-     * @param layer   the layer to publish to.
-     * @param payload the message to be sent.
-     * @param publisherId the ID that got assigned to the publisher that published the message by
-     *                    VMS core.
-     * @return if the call to the method VmsPublisherService.publish was successful.
-     */
-    public final void publish(VmsLayer layer, int publisherId, byte[] payload) {
-        if (DBG) {
-            Log.d(TAG, "Publishing for layer : " + layer);
-        }
-
-        IBinder token = getTokenForPublisherServiceThreadSafe();
-
-        try {
-            mVmsPublisherService.publish(token, layer, publisherId, payload);
-        } catch (RemoteException e) {
-            Log.e(TAG, "unable to publish message: " + payload, e);
-        }
-    }
-
-    /**
-     * Uses the VmsPublisherService binder to set the layers offering.
-     *
-     * @param offering the layers that the publisher may publish.
-     * @return if the call to VmsPublisherService.setLayersOffering was successful.
-     */
-    public final void setLayersOffering(VmsLayersOffering offering) {
-        if (DBG) {
-            Log.d(TAG, "Setting layers offering : " + offering);
-        }
-
-        IBinder token = getTokenForPublisherServiceThreadSafe();
-
-        try {
-            mVmsPublisherService.setLayersOffering(token, offering);
-            VmsOperationRecorder.get().setLayersOffering(offering);
-        } catch (RemoteException e) {
-            Log.e(TAG, "unable to set layers offering: " + offering, e);
-        }
-    }
-
-    private IBinder getTokenForPublisherServiceThreadSafe() {
-        if (mVmsPublisherService == null) {
-            throw new IllegalStateException("VmsPublisherService not set.");
-        }
-
-        IBinder token;
-        synchronized (mLock) {
-            token = mToken;
-        }
-        if (token == null) {
-            throw new IllegalStateException("VmsPublisherService does not have a valid token.");
-        }
-        return token;
-    }
-
-    public final int getPublisherId(byte[] publisherInfo) {
-        if (mVmsPublisherService == null) {
-            throw new IllegalStateException("VmsPublisherService not set.");
-        }
-        Integer publisherId = null;
-        try {
-            Log.i(TAG, "Getting publisher static ID");
-            publisherId = mVmsPublisherService.getPublisherId(publisherInfo);
-        } catch (RemoteException e) {
-            Log.e(TAG, "unable to invoke binder method.", e);
-        }
-        if (publisherId == null) {
-            throw new IllegalStateException("VmsPublisherService cannot get a publisher static ID.");
-        } else {
-            VmsOperationRecorder.get().getPublisherId(publisherId);
-        }
-        return publisherId;
-    }
-
-    /**
-     * Uses the VmsPublisherService binder to get the state of the subscriptions.
-     *
-     * @return list of layer/version or null in case of error.
-     */
-    public final @Nullable VmsSubscriptionState getSubscriptions() {
-        if (mVmsPublisherService == null) {
-            throw new IllegalStateException("VmsPublisherService not set.");
-        }
-        try {
-            return mVmsPublisherService.getSubscriptions();
-        } catch (RemoteException e) {
-            Log.e(TAG, "unable to invoke binder method.", e);
-        }
-        return null;
-    }
-
-    private void setVmsPublisherService(IVmsPublisherService service) {
-        mVmsPublisherService = service;
-        onVmsPublisherServiceReady();
-    }
-
-    /**
-     * Implements the interface that the VMS service uses to communicate with this client.
-     */
-    private static class VmsPublisherClientBinder extends IVmsPublisherClient.Stub {
-        private final WeakReference<VmsPublisherClientService> mVmsPublisherClientService;
-        @GuardedBy("mSequenceLock")
-        private long mSequence = -1;
-        private final Object mSequenceLock = new Object();
-
-        public VmsPublisherClientBinder(VmsPublisherClientService vmsPublisherClientService) {
-            mVmsPublisherClientService = new WeakReference<>(vmsPublisherClientService);
-        }
-
-        @Override
-        public void setVmsPublisherService(IBinder token, IVmsPublisherService service)
-                throws RemoteException {
-            VmsPublisherClientService vmsPublisherClientService = mVmsPublisherClientService.get();
-            if (vmsPublisherClientService == null) return;
-            if (DBG) {
-                Log.d(TAG, "setting VmsPublisherService.");
-            }
-            Handler handler = vmsPublisherClientService.mHandler;
-            handler.sendMessage(
-                    handler.obtainMessage(VmsEventHandler.SET_SERVICE_CALLBACK, service));
-            vmsPublisherClientService.setToken(token);
-        }
-
-        @Override
-        public void onVmsSubscriptionChange(VmsSubscriptionState subscriptionState)
-                throws RemoteException {
-            VmsPublisherClientService vmsPublisherClientService = mVmsPublisherClientService.get();
-            if (vmsPublisherClientService == null) return;
-            if (DBG) {
-                Log.d(TAG, "subscription event: " + subscriptionState);
-            }
-            synchronized (mSequenceLock) {
-                if (subscriptionState.getSequenceNumber() <= mSequence) {
-                    Log.w(TAG, "Sequence out of order. Current sequence = " + mSequence
-                            + "; expected new sequence = " + subscriptionState.getSequenceNumber());
-                    // Do not propagate old notifications.
-                    return;
-                } else {
-                    mSequence = subscriptionState.getSequenceNumber();
-                }
-            }
-            Handler handler = vmsPublisherClientService.mHandler;
-            handler.sendMessage(
-                    handler.obtainMessage(VmsEventHandler.ON_SUBSCRIPTION_CHANGE_EVENT,
-                            subscriptionState));
-        }
-    }
-
-    /**
-     * Receives events from the binder thread and dispatches them.
-     */
-    private final static class VmsEventHandler extends Handler {
-        /** Constants handled in the handler */
-        private static final int ON_SUBSCRIPTION_CHANGE_EVENT = 0;
-        private static final int SET_SERVICE_CALLBACK = 1;
-
-        private final WeakReference<VmsPublisherClientService> mVmsPublisherClientService;
-
-        VmsEventHandler(VmsPublisherClientService service) {
-            super(Looper.getMainLooper());
-            mVmsPublisherClientService = new WeakReference<>(service);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            VmsPublisherClientService service = mVmsPublisherClientService.get();
-            if (service == null) return;
-            switch (msg.what) {
-                case ON_SUBSCRIPTION_CHANGE_EVENT:
-                    VmsSubscriptionState subscriptionState = (VmsSubscriptionState) msg.obj;
-                    service.onVmsSubscriptionChange(subscriptionState);
-                    break;
-                case SET_SERVICE_CALLBACK:
-                    service.setVmsPublisherService((IVmsPublisherService) msg.obj);
-                    break;
-                default:
-                    Log.e(TAG, "Event type not handled:  " + msg.what);
-                    break;
-            }
-        }
-    }
-}
diff --git a/car-lib/src/android/car/vms/VmsSubscriberManager.java b/car-lib/src/android/car/vms/VmsSubscriberManager.java
deleted file mode 100644
index 6f6377c..0000000
--- a/car-lib/src/android/car/vms/VmsSubscriberManager.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.Car;
-import android.car.CarManagerBase;
-import android.car.CarNotConnectedException;
-import android.car.annotation.FutureFeature;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.lang.ref.WeakReference;
-import java.util.List;
-
-/**
- * API for interfacing with the VmsSubscriberService. It supports a single client callback that can
- * (un)subscribe to different layers. Getting notifactions and managing subscriptions is enabled
- * after setting the client callback with #registerClientCallback.
- * SystemApi candidate
- *
- * @hide
- */
-@FutureFeature
-public final class VmsSubscriberManager implements CarManagerBase {
-    private static final boolean DBG = true;
-    private static final String TAG = "VmsSubscriberManager";
-
-    private final Handler mHandler;
-    private final IVmsSubscriberService mVmsSubscriberService;
-    private final IVmsSubscriberClient mSubscriberManagerClient;
-    private final Object mClientCallbackLock = new Object();
-    @GuardedBy("mClientCallbackLock")
-    private VmsSubscriberClientCallback mClientCallback;
-
-    /**
-     * Interface exposed to VMS subscribers: it is a wrapper of IVmsSubscriberClient.
-     */
-    public interface VmsSubscriberClientCallback {
-        /**
-         * Called when the property is updated
-         */
-        void onVmsMessageReceived(VmsLayer layer, byte[] payload);
-
-        /**
-         * Called when layers availability change
-         */
-        void onLayersAvailabilityChanged(List<VmsLayer> availableLayers);
-    }
-
-    /**
-     * Allows to asynchronously dispatch onVmsMessageReceived events.
-     */
-    private final static class VmsEventHandler extends Handler {
-        /**
-         * Constants handled in the handler
-         */
-        private static final int ON_RECEIVE_MESSAGE_EVENT = 0;
-        private static final int ON_AVAILABILITY_CHANGE_EVENT = 1;
-
-        private final WeakReference<VmsSubscriberManager> mMgr;
-
-        VmsEventHandler(VmsSubscriberManager mgr, Looper looper) {
-            super(looper);
-            mMgr = new WeakReference<>(mgr);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            VmsSubscriberManager mgr = mMgr.get();
-            switch (msg.what) {
-                case ON_RECEIVE_MESSAGE_EVENT:
-                    if (mgr != null) {
-                        // Parse the message
-                        VmsDataMessage vmsDataMessage = (VmsDataMessage) msg.obj;
-
-                        // Dispatch the parsed message
-                        mgr.dispatchOnReceiveMessage(vmsDataMessage.getLayer(),
-                                vmsDataMessage.getPayload());
-                    }
-                    break;
-                case ON_AVAILABILITY_CHANGE_EVENT:
-                    if (mgr != null) {
-                        // Parse the message
-                        List<VmsLayer> vmsAvailabilityChangeMessage = (List<VmsLayer>) msg.obj;
-
-                        // Dispatch the parsed message
-                        mgr.dispatchOnAvailabilityChangeMessage(vmsAvailabilityChangeMessage);
-                    }
-                    break;
-
-                default:
-                    Log.e(VmsSubscriberManager.TAG, "Event type not handled:  " + msg.what);
-                    break;
-            }
-        }
-    }
-
-    public VmsSubscriberManager(IBinder service, Handler handler) {
-        mVmsSubscriberService = IVmsSubscriberService.Stub.asInterface(service);
-        mHandler = new VmsEventHandler(this, handler.getLooper());
-        mSubscriberManagerClient = new IVmsSubscriberClient.Stub() {
-            @Override
-            public void onVmsMessageReceived(VmsLayer layer, byte[] payload)
-                    throws RemoteException {
-                // Create the data message
-                VmsDataMessage vmsDataMessage = new VmsDataMessage(layer, payload);
-                mHandler.sendMessage(
-                        mHandler.obtainMessage(
-                                VmsEventHandler.ON_RECEIVE_MESSAGE_EVENT,
-                                vmsDataMessage));
-            }
-
-            @Override
-            public void onLayersAvailabilityChanged(List<VmsAssociatedLayer> availableLayers) {
-                mHandler.sendMessage(
-                        mHandler.obtainMessage(
-                                VmsEventHandler.ON_AVAILABILITY_CHANGE_EVENT,
-                                availableLayers));
-            }
-        };
-    }
-
-    /**
-     * Registers the client callback in order to enable communication with the client.
-     * By registering, the client will start getting notifications, and will be able to subscribe
-     * to layers.
-     * <p>
-     *
-     * @param clientCallback subscriber callback that will handle onVmsMessageReceived events.
-     * @throws IllegalStateException if the client callback was already set.
-     */
-    public void registerClientCallback(VmsSubscriberClientCallback clientCallback)
-            throws CarNotConnectedException {
-        synchronized (mClientCallbackLock) {
-            if (mClientCallback != null) {
-                throw new IllegalStateException("Client callback is already configured.");
-            }
-            mClientCallback = clientCallback;
-        }
-        try {
-            mVmsSubscriberService.addVmsSubscriberToNotifications(mSubscriberManagerClient);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not connect: ", e);
-            throw new CarNotConnectedException(e);
-        }
-    }
-
-    /**
-     * Unregisters the client callback which disables communication with the client.
-     * @throws CarNotConnectedException, IllegalStateException
-     */
-    public void unregisterClientCallback()
-            throws CarNotConnectedException {
-
-        try {
-            mVmsSubscriberService.removeVmsSubscriberToNotifications(mSubscriberManagerClient);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not connect: ", e);
-            throw new CarNotConnectedException(e);
-        } catch (IllegalStateException e) {
-            Log.e(TAG, "Could not unsubscribe from notifications");
-            throw e;
-        }
-
-        synchronized (mClientCallbackLock) {
-            mClientCallback = null;
-        }
-    }
-
-    /**
-     * Returns a serialized publisher information for a publisher ID.
-     */
-    public byte[] getPublisherInfo(int publisherId)
-            throws CarNotConnectedException, IllegalStateException {
-        try {
-            return mVmsSubscriberService.getPublisherInfo(publisherId);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not connect: ", e);
-            throw new CarNotConnectedException(e);
-        } catch (IllegalStateException ex) {
-            Car.checkCarNotConnectedExceptionFromCarService(ex);
-            throw new IllegalStateException(ex);
-        }
-    }
-
-    /**
-     * Subscribes to listen to the layer specified.
-     *
-     * @param layer the layer to subscribe to.
-     * @throws IllegalStateException if the client callback was not set via
-     *                               {@link #registerClientCallback}.
-     */
-    public void subscribe(VmsLayer layer) throws CarNotConnectedException {
-        verifySubscriptionIsAllowed();
-        try {
-            mVmsSubscriberService.addVmsSubscriber(mSubscriberManagerClient, layer);
-            VmsOperationRecorder.get().subscribe(layer);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not connect: ", e);
-            throw new CarNotConnectedException(e);
-        } catch (IllegalStateException ex) {
-            Car.checkCarNotConnectedExceptionFromCarService(ex);
-        }
-    }
-
-    /**
-     * Subscribes to listen to the layer specified from the publisher specified.
-     *
-     * @param layer       the layer to subscribe to.
-     * @param publisherId the publisher of the layer.
-     * @throws IllegalStateException if the client callback was not set via
-     *                               {@link #registerClientCallback}.
-     */
-    public void subscribe(VmsLayer layer, int publisherId) throws CarNotConnectedException {
-        verifySubscriptionIsAllowed();
-        try {
-            mVmsSubscriberService.addVmsSubscriberToPublisher(
-                    mSubscriberManagerClient, layer, publisherId);
-            VmsOperationRecorder.get().subscribe(layer, publisherId);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not connect: ", e);
-            throw new CarNotConnectedException(e);
-        } catch (IllegalStateException ex) {
-            Car.checkCarNotConnectedExceptionFromCarService(ex);
-        }
-    }
-
-    public void startMonitoring() throws CarNotConnectedException {
-        verifySubscriptionIsAllowed();
-        try {
-            mVmsSubscriberService.addVmsSubscriberPassive(mSubscriberManagerClient);
-            VmsOperationRecorder.get().startMonitoring();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Could not connect: ", e);
-            throw new CarNotConnectedException(e);
-        } catch (IllegalStateException ex) {
-            Car.checkCarNotConnectedExceptionFromCarService(ex);
-        }
-    }
-
-    /**
-     * Unsubscribes from the layer/version specified.
-     *
-     * @param layer the layer to unsubscribe from.
-     * @throws IllegalStateException if the client callback was not set via
-     *                               {@link #registerClientCallback}.
-     */
-    public void unsubscribe(VmsLayer layer) {
-        verifySubscriptionIsAllowed();
-        try {
-            mVmsSubscriberService.removeVmsSubscriber(mSubscriberManagerClient, layer);
-            VmsOperationRecorder.get().unsubscribe(layer);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to unregister subscriber", e);
-            // ignore
-        } catch (IllegalStateException ex) {
-            Car.hideCarNotConnectedExceptionFromCarService(ex);
-        }
-    }
-
-    /**
-     * Unsubscribes from the layer/version specified.
-     *
-     * @param layer       the layer to unsubscribe from.
-     * @param publisherId the pubisher of the layer.
-     * @throws IllegalStateException if the client callback was not set via
-     *                               {@link #registerClientCallback}.
-     */
-    public void unsubscribe(VmsLayer layer, int publisherId) {
-        try {
-            mVmsSubscriberService.removeVmsSubscriberToPublisher(
-                    mSubscriberManagerClient, layer, publisherId);
-            VmsOperationRecorder.get().unsubscribe(layer, publisherId);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to unregister subscriber", e);
-            // ignore
-        } catch (IllegalStateException ex) {
-            Car.hideCarNotConnectedExceptionFromCarService(ex);
-        }
-    }
-
-    public void stopMonitoring() {
-        try {
-            mVmsSubscriberService.removeVmsSubscriberPassive(mSubscriberManagerClient);
-            VmsOperationRecorder.get().stopMonitoring();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to unregister subscriber ", e);
-            // ignore
-        } catch (IllegalStateException ex) {
-            Car.hideCarNotConnectedExceptionFromCarService(ex);
-        }
-    }
-
-    private void dispatchOnReceiveMessage(VmsLayer layer, byte[] payload) {
-        VmsSubscriberClientCallback clientCallback = getClientCallbackThreadSafe();
-        if (clientCallback == null) {
-            Log.e(TAG, "Cannot dispatch received message.");
-            return;
-        }
-        clientCallback.onVmsMessageReceived(layer, payload);
-    }
-
-    private void dispatchOnAvailabilityChangeMessage(List<VmsLayer> availableLayers) {
-        VmsSubscriberClientCallback clientCallback = getClientCallbackThreadSafe();
-        if (clientCallback == null) {
-            Log.e(TAG, "Cannot dispatch availability change message.");
-            return;
-        }
-        clientCallback.onLayersAvailabilityChanged(availableLayers);
-    }
-
-    private VmsSubscriberClientCallback getClientCallbackThreadSafe() {
-        VmsSubscriberClientCallback clientCallback;
-        synchronized (mClientCallbackLock) {
-            clientCallback = mClientCallback;
-        }
-        if (clientCallback == null) {
-            Log.e(TAG, "client callback not set.");
-        }
-        return clientCallback;
-    }
-
-    /*
-     * Verifies that the subscriber is in a state where it is allowed to subscribe.
-     */
-    private void verifySubscriptionIsAllowed() {
-        VmsSubscriberClientCallback clientCallback = getClientCallbackThreadSafe();
-        if (clientCallback == null) {
-            throw new IllegalStateException("Cannot subscribe.");
-        }
-    }
-
-    /**
-     * @hide
-     */
-    @Override
-    public void onCarDisconnected() {
-    }
-
-    private static final class VmsDataMessage {
-        private final VmsLayer mLayer;
-        private final byte[] mPayload;
-
-        public VmsDataMessage(VmsLayer layer, byte[] payload) {
-            mLayer = layer;
-            mPayload = payload;
-        }
-
-        public VmsLayer getLayer() {
-            return mLayer;
-        }
-
-        public byte[] getPayload() {
-            return mPayload;
-        }
-    }
-}
diff --git a/car-lib/src/android/car/vms/VmsSubscriptionState.aidl b/car-lib/src/android/car/vms/VmsSubscriptionState.aidl
deleted file mode 100644
index b5ce8ff..0000000
--- a/car-lib/src/android/car/vms/VmsSubscriptionState.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-parcelable VmsSubscriptionState;
\ No newline at end of file
diff --git a/car-lib/src/android/car/vms/VmsSubscriptionState.java b/car-lib/src/android/car/vms/VmsSubscriptionState.java
deleted file mode 100644
index ea433f7..0000000
--- a/car-lib/src/android/car/vms/VmsSubscriptionState.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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 android.car.vms;
-
-import android.car.annotation.FutureFeature;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-
-/**
- * The list of layers with subscribers.
- *
- * @hide
- */
-@FutureFeature
-public final class VmsSubscriptionState implements Parcelable {
-    private final int mSequenceNumber;
-    private final Set<VmsLayer> mLayers;
-    private final Set<VmsAssociatedLayer> mSubscribedLayersFromPublishers;
-
-    /**
-     * Construcs a summary of the state of the current subscriptions for publishers to consume
-     * and adjust which layers that the are publishing.
-     */
-    public VmsSubscriptionState(int sequenceNumber,
-                                Set<VmsLayer> subscribedLayers,
-                                Set<VmsAssociatedLayer> layersFromPublishers) {
-        mSequenceNumber = sequenceNumber;
-        mLayers = Collections.unmodifiableSet(subscribedLayers);
-        mSubscribedLayersFromPublishers = Collections.unmodifiableSet(layersFromPublishers);
-    }
-
-    /**
-     * Returns the sequence number assigned by the VMS service. Sequence numbers are
-     * monotonically increasing and help clients ignore potential out-of-order states.
-     */
-    public int getSequenceNumber() {
-        return mSequenceNumber;
-    }
-
-    public Set<VmsLayer> getLayers() {
-        return mLayers;
-    }
-
-    public Set<VmsAssociatedLayer> getAssociatedLayers() {
-        return mSubscribedLayersFromPublishers;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("sequence number=").append(mSequenceNumber);
-        sb.append("; layers={");
-        for (VmsLayer layer : mLayers) {
-            sb.append(layer).append(",");
-        }
-        sb.append("}");
-        sb.append("; associatedLayers={");
-        for (VmsAssociatedLayer layer : mSubscribedLayersFromPublishers) {
-            sb.append(layer).append(",");
-        }
-        sb.append("}");
-        return sb.toString();
-    }
-
-    public static final Parcelable.Creator<VmsSubscriptionState> CREATOR = new
-            Parcelable.Creator<VmsSubscriptionState>() {
-                public VmsSubscriptionState createFromParcel(Parcel in) {
-                    return new VmsSubscriptionState(in);
-                }
-
-                public VmsSubscriptionState[] newArray(int size) {
-                    return new VmsSubscriptionState[size];
-                }
-            };
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mSequenceNumber);
-        out.writeParcelableList(new ArrayList(mLayers), flags);
-        out.writeParcelableList(new ArrayList(mSubscribedLayersFromPublishers), flags);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    private VmsSubscriptionState(Parcel in) {
-        mSequenceNumber = in.readInt();
-
-        List<VmsLayer> layers = new ArrayList<>();
-        in.readParcelableList(layers, VmsLayer.class.getClassLoader());
-        mLayers = Collections.unmodifiableSet(new HashSet(layers));
-
-        List<VmsAssociatedLayer> associatedLayers = new ArrayList<>();
-        in.readParcelableList(associatedLayers, VmsAssociatedLayer.class.getClassLoader());
-        mSubscribedLayersFromPublishers = Collections.unmodifiableSet(new HashSet(associatedLayers));
-    }
-}
\ No newline at end of file
diff --git a/car_product/bootanimations/bootanimation-832.zip b/car_product/bootanimations/bootanimation-832.zip
new file mode 100644
index 0000000..76b9c82
--- /dev/null
+++ b/car_product/bootanimations/bootanimation-832.zip
Binary files differ
diff --git a/car_product/bootanimations/square_280/bootanimation.zip b/car_product/bootanimations/square_280/bootanimation.zip
deleted file mode 100644
index ab4d79f..0000000
--- a/car_product/bootanimations/square_280/bootanimation.zip
+++ /dev/null
Binary files differ
diff --git a/car_product/bootanimations/square_320/bootanimation.zip b/car_product/bootanimations/square_320/bootanimation.zip
deleted file mode 100644
index f621ad8..0000000
--- a/car_product/bootanimations/square_320/bootanimation.zip
+++ /dev/null
Binary files differ
diff --git a/car_product/bootanimations/square_360/bootanimation.zip b/car_product/bootanimations/square_360/bootanimation.zip
deleted file mode 100644
index 3cb32f4..0000000
--- a/car_product/bootanimations/square_360/bootanimation.zip
+++ /dev/null
Binary files differ
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
index c492210..9984726 100644
--- a/car_product/build/car.mk
+++ b/car_product/build/car.mk
@@ -93,7 +93,7 @@
 
 # Boot animation
 PRODUCT_COPY_FILES += \
-    packages/services/Car/car_product/bootanimations/square_280/bootanimation.zip:system/media/bootanimation.zip
+    packages/services/Car/car_product/bootanimations/bootanimation-832.zip:system/media/bootanimation.zip
 
 PRODUCT_PROPERTY_OVERRIDES += \
     fmas.spkr_6ch=35,20,110 \
diff --git a/car_product/build/car_base.mk b/car_product/build/car_base.mk
index f637378..511d9ff 100644
--- a/car_product/build/car_base.mk
+++ b/car_product/build/car_base.mk
@@ -17,7 +17,7 @@
 # Base platform for car builds
 # car packages should be added to car.mk instead of here
 
-PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay
+PRODUCT_PACKAGE_OVERLAYS += packages/services/Car/car_product/overlay
 
 PRODUCT_PACKAGES += \
     ContactsProvider \
@@ -95,5 +95,9 @@
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.type.automotive.xml:system/etc/permissions/android.hardware.type.automotive.xml
 
+# Default permission grant exceptions
+PRODUCT_COPY_FILES += \
+    packages/services/Car/car_product/build/default-car-permissions.xml:system/etc/default-permissions/default-car-permissions.xml
+
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk)
 
diff --git a/car_product/build/default-car-permissions.xml b/car_product/build/default-car-permissions.xml
new file mode 100644
index 0000000..c36f78c
--- /dev/null
+++ b/car_product/build/default-car-permissions.xml
@@ -0,0 +1,54 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+
+<!-- Copyright (C) 2017 The Android Open Source 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.
+-->
+
+<!--
+    This file contains permissions to be granted by default. Default
+    permissions are granted to special platform components and to apps
+    that are approved to get default grants. The special components
+    are apps that are expected tto work out-of-the-box as they provide
+    core use cases such as default dialer, default email, etc. These
+    grants are managed by the platform. The apps that are additionally
+    approved for default grants are ones that provide carrier specific
+    functionality, ones legally required at some location, ones providing
+    alternative disclosure and opt-out UI, ones providing highlight features
+    of a dedicated device, etc. This file contains only the latter exceptions.
+    Fixed permissions cannot be controlled by the user and need a special
+    approval. Typically these are to ensure either legally mandated functions
+    or the app is considered a part of the OS.
+-->
+
+<exceptions>
+
+    <!-- This is an example of an exception:
+    <exception
+        package="foo.bar.permission"
+      <permission name="android.permission.READ_CONTACTS" fixed="true"/>
+      <permission name="android.permission.READ_CALENDAR" fixed="false"/>
+    </exception>
+    -->
+
+    <exception
+            package="com.android.car.messenger">
+        <!-- Contacts -->
+        <permission name="android.permission.READ_CONTACTS" fixed="false"/>
+
+        <!-- SMS -->
+        <permission name="android.permission.SEND_SMS" fixed="false"/>
+        <permission name="android.permission.READ_SMS" fixed="false"/>
+    </exception>
+
+</exceptions>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/config.xml b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
index 7f0a6e0..ca8a8d8 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
@@ -66,4 +66,7 @@
 
     <!-- The action buttons should always take the default color. -->
     <bool name="config_tintNotificationActionButtons">false</bool>
+
+    <!-- Home screen(Launcher) app presence -->
+    <bool name="config_noHomeScreen">true</bool>
 </resources>
diff --git a/car_product/sepolicy/priv_app.te b/car_product/sepolicy/priv_app.te
index de6077e..e6b5292 100644
--- a/car_product/sepolicy/priv_app.te
+++ b/car_product/sepolicy/priv_app.te
@@ -1,3 +1 @@
 hal_client_domain(priv_app, hal_vehicle)
-
-get_prop(priv_app, opengles_prop)
diff --git a/car_product/sepolicy/property.te b/car_product/sepolicy/property.te
index 0f4e53f..64340e7 100644
--- a/car_product/sepolicy/property.te
+++ b/car_product/sepolicy/property.te
@@ -1,6 +1,3 @@
 type hw_cabl_prop, property_type;
 type wlan_driver_prop, property_type;
-
-type opengles_prop, property_type;
-
 type car_prop, property_type;
diff --git a/car_product/sepolicy/property_contexts b/car_product/sepolicy/property_contexts
index f27be18..3b680cb 100644
--- a/car_product/sepolicy/property_contexts
+++ b/car_product/sepolicy/property_contexts
@@ -2,5 +2,3 @@
 wlan.driver.               u:object_r:wlan_driver_prop:s0
 
 boot.car_service_created u:object_r:car_prop:s0
-ro.opengles.            u:object_r:opengles_prop:s0
-
diff --git a/car_product/sepolicy/system_server.te b/car_product/sepolicy/system_server.te
index 4e0da64..b6785c1 100644
--- a/car_product/sepolicy/system_server.te
+++ b/car_product/sepolicy/system_server.te
@@ -1,6 +1,4 @@
 # Set wlan.driver.* properties.
 set_prop(system_server, wlan_driver_prop)
 
-get_prop(system_server opengles_prop)
-
 dontaudit system_server self:capability sys_module;
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index e39fb9e..5c4dfaa 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -101,17 +101,6 @@
       android:protectionLevel="system|signature"
       android:label="@string/car_permission_label_diag_clear"
       android:description="@string/car_permission_desc_diag_clear" />
-    <permission
-        android:name="android.car.permission.VMS_PUBLISHER"
-        android:protectionLevel="system|signature"
-        android:label="@string/car_permission_label_vms_publisher"
-        android:description="@string/car_permission_desc_vms_publisher" />
-    <permission
-        android:name="android.car.permission.VMS_SUBSCRIBER"
-        android:protectionLevel="system|signature"
-        android:label="@string/car_permission_label_vms_subscriber"
-        android:description="@string/car_permission_desc_vms_subscriber" />
-
     <!--  may replace this with system permission if proper one is defined. -->
     <permission
         android:name="android.car.permission.CONTROL_APP_BLOCKING"
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index 61cef59..73028cb 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -74,11 +74,4 @@
     <string name="defauiltActivityWhitelist">android,com.android.systemui</string>
     <!-- Default home activity -->
     <string name="defaultHomeActivity">com.android.car.overview/com.android.car.overview.StreamOverviewActivity</string>
-    <!--  The com.android.car.VmsPublisherService will bind to this list of clients -->
-    <string-array translatable="false" name="vmsPublisherClients">
-    </string-array>
-    <!--  Permissions that the com.android.car.VmsPublisherService is allowed to grant to publishers -->
-    <string-array translatable="false" name="vmsSafePermissions">
-        <item>"android.permission.ACCESS_FINE_LOCATION"</item>
-    </string-array>
 </resources>
diff --git a/service/res/values/strings.xml b/service/res/values/strings.xml
index 6cfff9a..7f826d4 100644
--- a/service/res/values/strings.xml
+++ b/service/res/values/strings.xml
@@ -116,13 +116,4 @@
     <!-- Permission text: apps can clear diagnostic data from the car [CHAR LIMIT=NONE] -->
     <string name="car_permission_desc_diag_clear">Clear diagnostic data from the car</string>
 
-    <!-- Permission text: apps can publish VMS data [CHAR LIMIT=NONE] -->
-    <string name="car_permission_label_vms_publisher">VMS publisher</string>
-    <!-- Permission text: apps can send VMS messages to the car [CHAR LIMIT=NONE] -->
-    <string name="car_permission_desc_vms_publisher">Publish vms messages</string>
-
-    <!-- Permission text: apps can subscribe to VMS data [CHAR LIMIT=NONE] -->
-    <string name="car_permission_label_vms_subscriber">VMS subscriber</string>
-    <!-- Permission text: apps can receive VMS messages from the car [CHAR LIMIT=NONE] -->
-    <string name="car_permission_desc_vms_subscriber">Subscribe to vms messages</string>
 </resources>
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index bd42454..bbb86f6 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -72,10 +72,6 @@
     private final CarBluetoothService mCarBluetoothService;
     private final PerUserCarServiceHelper mPerUserCarServiceHelper;
     private CarDiagnosticService mCarDiagnosticService;
-    @FutureFeature
-    private VmsSubscriberService mVmsSubscriberService;
-    @FutureFeature
-    private VmsPublisherService mVmsPublisherService;
 
     private final CarServiceBase[] mAllServices;
 
@@ -121,10 +117,6 @@
         mPerUserCarServiceHelper = new PerUserCarServiceHelper(serviceContext);
         mCarBluetoothService = new CarBluetoothService(serviceContext, mCarCabinService,
                 mCarSensorService, mPerUserCarServiceHelper);
-        if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-            mVmsSubscriberService = new VmsSubscriberService(serviceContext, mHal.getVmsHal());
-            mVmsPublisherService = new VmsPublisherService(serviceContext, mHal.getVmsHal());
-        }
         mCarDiagnosticService = new CarDiagnosticService(serviceContext, mHal.getDiagnosticHal());
 
         // Be careful with order. Service depending on other service should be inited later.
@@ -150,10 +142,6 @@
                 mCarDiagnosticService,
                 mPerUserCarServiceHelper
         ));
-        if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-            allServices.add(mVmsSubscriberService);
-            allServices.add(mVmsPublisherService);
-        }
         mAllServices = allServices.toArray(new CarServiceBase[0]);
     }
 
@@ -233,12 +221,6 @@
             case Car.VENDOR_EXTENSION_SERVICE:
                 assertVendorExtensionPermission(mContext);
                 return mCarVendorExtensionService;
-            case Car.VMS_SUBSCRIBER_SERVICE:
-                FeatureUtil.assertFeature(FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE);
-                if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-                    assertVmsSubscriberPermission(mContext);
-                    return mVmsSubscriberService;
-                }
             case Car.TEST_SERVICE: {
                 assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
                 synchronized (this) {
@@ -312,16 +294,6 @@
                 Car.PERMISSION_CAR_DIAGNOSTIC_CLEAR);
     }
 
-    @FutureFeature
-    public static void assertVmsPublisherPermission(Context context) {
-        assertPermission(context, Car.PERMISSION_VMS_PUBLISHER);
-    }
-
-    @FutureFeature
-    public static void assertVmsSubscriberPermission(Context context) {
-        assertPermission(context, Car.PERMISSION_VMS_SUBSCRIBER);
-    }
-
     public static void assertPermission(Context context, String permission) {
         if (context.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
             throw new SecurityException("requires " + permission);
diff --git a/service/src/com/android/car/VmsLayersAvailability.java b/service/src/com/android/car/VmsLayersAvailability.java
deleted file mode 100644
index 93b917c..0000000
--- a/service/src/com/android/car/VmsLayersAvailability.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsLayerDependency;
-import android.car.vms.VmsLayersOffering;
-import android.util.Log;
-import com.android.internal.annotations.GuardedBy;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Manages VMS availability for layers.
- * <p>
- * Each VMS publisher sets its layers offering which are a list of layers the publisher claims
- * it might publish. VmsLayersAvailability calculates from all the offering what are the
- * available layers.
- */
-
-@FutureFeature
-public class VmsLayersAvailability {
-
-    private static final boolean DBG = true;
-    private static final String TAG = "VmsLayersAvailability";
-
-    private final Object mLock = new Object();
-    @GuardedBy("mLock")
-    private final Map<VmsLayer, Set<Set<VmsLayer>>> mPotentialLayersAndDependencies =
-            new HashMap<>();
-    @GuardedBy("mLock")
-    private Set<VmsAssociatedLayer> mAvailableAssociatedLayers = Collections.EMPTY_SET;
-    @GuardedBy("mLock")
-    private Set<VmsAssociatedLayer> mUnavailableAssociatedLayers = Collections.EMPTY_SET;
-    @GuardedBy("mLock")
-    private Map<VmsLayer, Set<Integer>> mPotentialLayersAndPublishers = new HashMap<>();
-
-    /**
-     * Setting the current layers offerings as reported by publishers.
-     */
-    public void setPublishersOffering(Collection<VmsLayersOffering> publishersLayersOfferings) {
-        synchronized (mLock) {
-            reset();
-
-            for (VmsLayersOffering offering : publishersLayersOfferings) {
-                for (VmsLayerDependency dependency : offering.getDependencies()) {
-                    VmsLayer layer = dependency.getLayer();
-
-                    // Associate publishers with layers.
-                    Set<Integer> curPotentialLayerAndPublishers =
-                            mPotentialLayersAndPublishers.get(layer);
-                    if (curPotentialLayerAndPublishers == null) {
-                        curPotentialLayerAndPublishers = new HashSet<>();
-                        mPotentialLayersAndPublishers.put(layer, curPotentialLayerAndPublishers);
-                    }
-                    curPotentialLayerAndPublishers.add(offering.getPublisherId());
-
-                    // Add dependencies for availability calculation.
-                    Set<Set<VmsLayer>> curDependencies =
-                            mPotentialLayersAndDependencies.get(layer);
-                    if (curDependencies == null) {
-                        curDependencies = new HashSet<>();
-                        mPotentialLayersAndDependencies.put(layer, curDependencies);
-                    }
-                    curDependencies.add(dependency.getDependencies());
-                }
-            }
-            calculateLayers();
-        }
-    }
-
-    /**
-     * Returns a collection of all the layers which may be published.
-     */
-    public Set<VmsAssociatedLayer> getAvailableLayers() {
-        synchronized (mLock) {
-            return mAvailableAssociatedLayers;
-        }
-    }
-
-    /**
-     * Returns a collection of all the layers which publishers could have published if the
-     * dependencies were satisfied.
-     */
-    public Set<VmsAssociatedLayer> getUnavailableLayers() {
-        synchronized (mLock) {
-            return mUnavailableAssociatedLayers;
-        }
-    }
-
-    private void reset() {
-        synchronized (mLock) {
-            mPotentialLayersAndDependencies.clear();
-            mPotentialLayersAndPublishers.clear();
-            mAvailableAssociatedLayers = Collections.EMPTY_SET;
-            mUnavailableAssociatedLayers = Collections.EMPTY_SET;
-        }
-    }
-
-    private void calculateLayers() {
-        synchronized (mLock) {
-            Set<VmsLayer> availableLayersSet = new HashSet<>();
-            Set<VmsLayer> cyclicAvoidanceAuxiliarySet = new HashSet<>();
-
-            for (VmsLayer layer : mPotentialLayersAndDependencies.keySet()) {
-                addLayerToAvailabilityCalculationLocked(layer,
-                        availableLayersSet,
-                        cyclicAvoidanceAuxiliarySet);
-            }
-
-            mAvailableAssociatedLayers = Collections.unmodifiableSet(
-                    availableLayersSet
-                            .stream()
-                            .map(l -> new VmsAssociatedLayer(l, mPotentialLayersAndPublishers.get(l)))
-                            .collect(Collectors.toSet()));
-
-            mUnavailableAssociatedLayers = Collections.unmodifiableSet(
-                    mPotentialLayersAndDependencies.keySet()
-                            .stream()
-                            .filter(l -> !availableLayersSet.contains(l))
-                            .map(l -> new VmsAssociatedLayer(l, mPotentialLayersAndPublishers.get(l)))
-                            .collect(Collectors.toSet()));
-        }
-    }
-
-    private void addLayerToAvailabilityCalculationLocked(VmsLayer layer,
-                                                         Set<VmsLayer> currentAvailableLayers,
-                                                         Set<VmsLayer> cyclicAvoidanceSet) {
-        if (DBG) {
-            Log.d(TAG, "addLayerToAvailabilityCalculationLocked: checking layer: " + layer);
-        }
-        // If we already know that this layer is supported then we are done.
-        if (currentAvailableLayers.contains(layer)) {
-            return;
-        }
-        // If there is no offering for this layer we're done.
-        if (!mPotentialLayersAndDependencies.containsKey(layer)) {
-            return;
-        }
-        // Avoid cyclic dependency.
-        if (cyclicAvoidanceSet.contains(layer)) {
-            Log.e(TAG, "Detected a cyclic dependency: " + cyclicAvoidanceSet + " -> " + layer);
-            return;
-        }
-        // A layer may have multiple dependency sets. The layer is available if any dependency
-        // set is satisfied
-        for (Set<VmsLayer> dependencies : mPotentialLayersAndDependencies.get(layer)) {
-            // If layer does not have any dependencies then add to supported.
-            if (dependencies == null || dependencies.isEmpty()) {
-                currentAvailableLayers.add(layer);
-                return;
-            }
-            // Add the layer to cyclic avoidance set
-            cyclicAvoidanceSet.add(layer);
-
-            boolean isSupported = true;
-            for (VmsLayer dependency : dependencies) {
-                addLayerToAvailabilityCalculationLocked(dependency,
-                        currentAvailableLayers,
-                        cyclicAvoidanceSet);
-
-                if (!currentAvailableLayers.contains(dependency)) {
-                    isSupported = false;
-                    break;
-                }
-            }
-            cyclicAvoidanceSet.remove(layer);
-
-            if (isSupported) {
-                currentAvailableLayers.add(layer);
-                return;
-            }
-        }
-        return;
-    }
-}
diff --git a/service/src/com/android/car/VmsPublisherService.java b/service/src/com/android/car/VmsPublisherService.java
deleted file mode 100644
index 8a293e5..0000000
--- a/service/src/com/android/car/VmsPublisherService.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.annotation.FutureFeature;
-import android.car.vms.IVmsSubscriberClient;
-import android.car.vms.IVmsPublisherClient;
-import android.car.vms.IVmsPublisherService;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsLayersOffering;
-import android.car.vms.VmsSubscriptionState;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.text.TextUtils;
-import android.util.Log;
-import com.android.car.hal.VmsHalService;
-import com.android.internal.annotations.GuardedBy;
-import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * + Receives HAL updates by implementing VmsHalService.VmsHalListener.
- * + Binds to publishers and configures them to use this service.
- * + Notifies publishers of subscription changes.
- */
-@FutureFeature
-public class VmsPublisherService extends IVmsPublisherService.Stub
-        implements CarServiceBase, VmsHalService.VmsHalPublisherListener {
-    private static final boolean DBG = true;
-    private static final String TAG = "VmsPublisherService";
-
-    private final Context mContext;
-    private final VmsHalService mHal;
-    private final VmsPublisherManager mPublisherManager;
-    private Set<String> mSafePermissions;
-
-    public VmsPublisherService(Context context, VmsHalService hal) {
-        mContext = context;
-        mHal = hal;
-        mPublisherManager = new VmsPublisherManager(this);
-    }
-
-    // Implements CarServiceBase interface.
-    @Override
-    public void init() {
-        mHal.addPublisherListener(this);
-        // Load permissions that can be granted to publishers.
-        mSafePermissions = new HashSet<>(
-                Arrays.asList(mContext.getResources().getStringArray(R.array.vmsSafePermissions)));
-        // Launch publishers.
-        String[] publisherNames = mContext.getResources().getStringArray(
-                R.array.vmsPublisherClients);
-        for (String publisherName : publisherNames) {
-            if (TextUtils.isEmpty(publisherName)) {
-                Log.e(TAG, "empty publisher name");
-                continue;
-            }
-            ComponentName name = ComponentName.unflattenFromString(publisherName);
-            if (name == null) {
-                Log.e(TAG, "invalid publisher name: " + publisherName);
-            }
-            mPublisherManager.bind(name);
-        }
-    }
-
-    @Override
-    public void release() {
-        mPublisherManager.release();
-        mHal.removePublisherListener(this);
-    }
-
-    @Override
-    public void dump(PrintWriter writer) {
-    }
-
-    @Override
-    public void setLayersOffering(IBinder token, VmsLayersOffering offering) {
-        mHal.setPublisherLayersOffering(token, offering);
-    }
-
-    // Implements IVmsPublisherService interface.
-    @Override
-    public void publish(IBinder token, VmsLayer layer, int publisherId, byte[] payload) {
-        if (DBG) {
-            Log.d(TAG, "Publishing for layer: " + layer);
-        }
-        ICarImpl.assertVmsPublisherPermission(mContext);
-
-        // Send the message to application listeners.
-        Set<IVmsSubscriberClient> listeners =
-                mHal.getSubscribersForLayerFromPublisher(layer, publisherId);
-
-        if (DBG) {
-            Log.d(TAG, "Number of subscribed apps: " + listeners.size());
-        }
-        for (IVmsSubscriberClient listener : listeners) {
-            try {
-                listener.onVmsMessageReceived(layer, payload);
-            } catch (RemoteException ex) {
-                Log.e(TAG, "unable to publish to listener: " + listener);
-            }
-        }
-
-        // Send the message to HAL
-        if (mHal.isHalSubscribed(layer)) {
-            Log.d(TAG, "HAL is subscribed");
-            mHal.setDataMessage(layer, payload);
-        } else {
-            Log.d(TAG, "HAL is NOT subscribed");
-        }
-    }
-
-    @Override
-    public VmsSubscriptionState getSubscriptions() {
-        ICarImpl.assertVmsPublisherPermission(mContext);
-        return mHal.getSubscriptionState();
-    }
-
-    @Override
-    public int getPublisherId(byte[] publisherInfo) {
-        ICarImpl.assertVmsPublisherPermission(mContext);
-        return mHal.getPublisherId(publisherInfo);
-    }
-
-    // Implements VmsHalListener interface
-    /**
-     * This method is only invoked by VmsHalService.notifyPublishers which is synchronized.
-     * Therefore this method only sees a non-decreasing sequence.
-     */
-    @Override
-    public void onChange(VmsSubscriptionState subscriptionState) {
-        // Send the message to application listeners.
-        for (IVmsPublisherClient client : mPublisherManager.getClients()) {
-            try {
-                client.onVmsSubscriptionChange(subscriptionState);
-            } catch (RemoteException ex) {
-                Log.e(TAG, "unable to send notification to: " + client, ex);
-            }
-        }
-    }
-
-    /**
-     * Keeps track of publishers that are using this service.
-     */
-    private static class VmsPublisherManager {
-        /**
-         * Allows to modify mPublisherMap and mPublisherConnectionMap as a single unit.
-         */
-        private final Object mLock = new Object();
-        @GuardedBy("mLock")
-        private final Map<String, PublisherConnection> mPublisherConnectionMap = new HashMap<>();
-        @GuardedBy("mLock")
-        private final Map<String, IVmsPublisherClient> mPublisherMap = new HashMap<>();
-        private final WeakReference<VmsPublisherService> mPublisherService;
-
-        public VmsPublisherManager(VmsPublisherService publisherService) {
-            mPublisherService = new WeakReference<>(publisherService);
-        }
-
-        /**
-         * Tries to bind to a publisher.
-         *
-         * @param name publisher component name (e.g. android.car.vms.logger/.LoggingService).
-         */
-        public void bind(ComponentName name) {
-            VmsPublisherService publisherService = mPublisherService.get();
-            if (publisherService == null) return;
-            String publisherName = name.flattenToString();
-            if (DBG) {
-                Log.d(TAG, "binding to: " + publisherName);
-            }
-            synchronized (mLock) {
-                if (mPublisherConnectionMap.containsKey(publisherName)) {
-                    // Already registered, nothing to do.
-                    return;
-                }
-                grantPermissions(name);
-                Intent intent = new Intent();
-                intent.setComponent(name);
-                PublisherConnection connection = new PublisherConnection();
-                if (publisherService.mContext.bindServiceAsUser(intent, connection,
-                        Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
-                    mPublisherConnectionMap.put(publisherName, connection);
-                } else {
-                    Log.e(TAG, "unable to bind to: " + publisherName);
-                }
-            }
-        }
-
-        /**
-         * Removes the publisher and associated connection.
-         *
-         * @param name publisher component name (e.g. android.car.vms.Logger).
-         */
-        public void unbind(ComponentName name) {
-            VmsPublisherService publisherService = mPublisherService.get();
-            if (publisherService == null) return;
-            String publisherName = name.flattenToString();
-            if (DBG) {
-                Log.d(TAG, "unbinding from: " + publisherName);
-            }
-            synchronized (mLock) {
-                boolean found = mPublisherMap.remove(publisherName) != null;
-                if (found) {
-                    PublisherConnection connection = mPublisherConnectionMap.get(publisherName);
-                    publisherService.mContext.unbindService(connection);
-                    mPublisherConnectionMap.remove(publisherName);
-                } else {
-                    Log.e(TAG, "unbind: unknown publisher." + publisherName);
-                }
-            }
-        }
-
-        /**
-         * Returns the list of publishers currently registered.
-         *
-         * @return list of publishers.
-         */
-        public List<IVmsPublisherClient> getClients() {
-            synchronized (mLock) {
-                return new ArrayList<>(mPublisherMap.values());
-            }
-        }
-
-        public void release() {
-            VmsPublisherService publisherService = mPublisherService.get();
-            if (publisherService == null) return;
-            for (PublisherConnection connection : mPublisherConnectionMap.values()) {
-                publisherService.mContext.unbindService(connection);
-            }
-            mPublisherConnectionMap.clear();
-            mPublisherMap.clear();
-        }
-
-        private void grantPermissions(ComponentName component) {
-            VmsPublisherService publisherService = mPublisherService.get();
-            if (publisherService == null) return;
-            final PackageManager packageManager = publisherService.mContext.getPackageManager();
-            final String packageName = component.getPackageName();
-            PackageInfo packageInfo;
-            try {
-                packageInfo = packageManager.getPackageInfo(packageName,
-                        PackageManager.GET_PERMISSIONS);
-            } catch (PackageManager.NameNotFoundException e) {
-                Log.e(TAG, "Error getting package info for " + packageName, e);
-                return;
-            }
-            if (packageInfo.requestedPermissions == null) return;
-            for (String permission : packageInfo.requestedPermissions) {
-                if (!publisherService.mSafePermissions.contains(permission)) {
-                    continue;
-                }
-                if (packageManager.checkPermission(permission, packageName)
-                        == PackageManager.PERMISSION_GRANTED) {
-                    continue;
-                }
-                try {
-                    packageManager.grantRuntimePermission(packageName, permission,
-                            UserHandle.SYSTEM);
-                    Log.d(TAG, "Permission " + permission + " granted to " + packageName);
-                } catch (SecurityException | IllegalArgumentException e) {
-                    Log.e(TAG, "Error while trying to grant " + permission + " to " + packageName,
-                            e);
-                }
-            }
-        }
-
-        class PublisherConnection implements ServiceConnection {
-
-            private final IBinder mToken = new Binder();
-
-            /**
-             * Once the service binds to a publisher service, the publisher binder is added to
-             * mPublisherMap
-             * and the publisher is configured to use this service.
-             */
-            @Override
-            public void onServiceConnected(ComponentName name, IBinder binder) {
-                VmsPublisherService publisherService = mPublisherService.get();
-                if (publisherService == null) return;
-                if (DBG) {
-                    Log.d(TAG, "onServiceConnected, name: " + name + ", binder: " + binder);
-                }
-                IVmsPublisherClient service = IVmsPublisherClient.Stub.asInterface(binder);
-                synchronized (mLock) {
-                    mPublisherMap.put(name.flattenToString(), service);
-                }
-                try {
-                    service.setVmsPublisherService(mToken, publisherService);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "unable to configure publisher: " + name);
-                }
-            }
-
-            /**
-             * Tries to rebind to the publisher service.
-             */
-            @Override
-            public void onServiceDisconnected(ComponentName name) {
-                String publisherName = name.flattenToString();
-                Log.d(TAG, "onServiceDisconnected, name: " + publisherName);
-                VmsPublisherManager.this.unbind(name);
-                VmsPublisherManager.this.bind(name);
-            }
-        }
-    }
-}
diff --git a/service/src/com/android/car/VmsPublishersInfo.java b/service/src/com/android/car/VmsPublishersInfo.java
deleted file mode 100644
index 04ee82f..0000000
--- a/service/src/com/android/car/VmsPublishersInfo.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-
-import android.car.annotation.FutureFeature;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
-import com.android.internal.annotations.GuardedBy;
-import android.util.Log;
-
-@FutureFeature
-public class VmsPublishersInfo {
-    private static final String TAG = "VmsPublishersInfo";
-    private static final boolean DBG = true;
-    private final Object mLock = new Object();
-    @GuardedBy("mLock")
-    private final Map<InfoWrapper, Integer> mPublishersIds = new HashMap();
-    @GuardedBy("mLock")
-    private final Map<Integer, byte[]> mPublishersInfo = new HashMap();
-
-    private static class InfoWrapper {
-        private final byte[] mInfo;
-
-        public InfoWrapper(byte[] info) {
-            mInfo = info;
-        }
-
-        public byte[] getInfo() {
-            return mInfo;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (!(o instanceof InfoWrapper)) {
-                return false;
-            }
-            InfoWrapper p = (InfoWrapper) o;
-            return Arrays.equals(this.mInfo, p.mInfo);
-        }
-
-        @Override
-        public int hashCode() {
-            return Arrays.hashCode(mInfo);
-        }
-    }
-
-    /**
-     * Returns the ID associated with the publisher info. When called for the first time for a
-     * publisher info will store the info and assign an ID
-     */
-    public int getIdForInfo(byte[] publisherInfo) {
-        Integer publisherId;
-        InfoWrapper wrappedPublisherInfo = new InfoWrapper(publisherInfo);
-        synchronized (mLock) {
-            maybeAddPublisherInfoLocked(wrappedPublisherInfo);
-            publisherId = mPublishersIds.get(wrappedPublisherInfo);
-        }
-        if (DBG) {
-            Log.i(TAG, "Publisher ID is: " + publisherId);
-        }
-        return publisherId;
-    }
-
-    public byte[] getPublisherInfo(int publisherId) {
-        synchronized (mLock) {
-            return mPublishersInfo.get(publisherId).clone();
-        }
-    }
-
-    private void maybeAddPublisherInfoLocked(InfoWrapper wrappedPublisherInfo) {
-        if (!mPublishersIds.containsKey(wrappedPublisherInfo)) {
-            // Assign ID to the info
-            Integer publisherId = mPublishersIds.size();
-
-            mPublishersIds.put(wrappedPublisherInfo, publisherId);
-            mPublishersInfo.put(publisherId, wrappedPublisherInfo.getInfo());
-        }
-    }
-}
-
diff --git a/service/src/com/android/car/VmsRouting.java b/service/src/com/android/car/VmsRouting.java
deleted file mode 100644
index 2e66781..0000000
--- a/service/src/com/android/car/VmsRouting.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.annotation.FutureFeature;
-import android.car.vms.IVmsSubscriberClient;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsOperationRecorder;
-import android.car.vms.VmsSubscriptionState;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Manages all the VMS subscriptions:
- * + Subscriptions to data messages of individual layer + version.
- * + Subscriptions to all data messages.
- * + HAL subscriptions to layer + version.
- */
-@FutureFeature
-public class VmsRouting {
-    private final Object mLock = new Object();
-    // A map of Layer + Version to subscribers.
-    @GuardedBy("mLock")
-    private Map<VmsLayer, Set<IVmsSubscriberClient>> mLayerSubscriptions = new HashMap<>();
-
-    @GuardedBy("mLock")
-    private Map<VmsLayer, Map<Integer, Set<IVmsSubscriberClient>>> mLayerSubscriptionsToPublishers =
-            new HashMap<>();
-    // A set of subscribers that are interested in any layer + version.
-    @GuardedBy("mLock")
-    private Set<IVmsSubscriberClient> mPromiscuousSubscribers = new HashSet<>();
-
-    // A set of all the layers + versions the HAL is subscribed to.
-    @GuardedBy("mLock")
-    private Set<VmsLayer> mHalSubscriptions = new HashSet<>();
-
-    @GuardedBy("mLock")
-    private Map<VmsLayer, Set<Integer>> mHalSubscriptionsToPublishers = new HashMap<>();
-    // A sequence number that is increased every time the subscription state is modified. Note that
-    // modifying the list of promiscuous subscribers does not affect the subscription state.
-    @GuardedBy("mLock")
-    private int mSequenceNumber = 0;
-
-    /**
-     * Add a subscriber subscription to data messages from a VMS layer.
-     *
-     * @param subscriber a VMS subscriber.
-     * @param layer      the layer subscribing to.
-     */
-    public void addSubscription(IVmsSubscriberClient subscriber, VmsLayer layer) {
-        //TODO(b/36902947): revise if need to sync, and return value.
-        synchronized (mLock) {
-            ++mSequenceNumber;
-            // Get or create the list of subscribers for layer and version.
-            Set<IVmsSubscriberClient> subscribers = mLayerSubscriptions.get(layer);
-
-            if (subscribers == null) {
-                subscribers = new HashSet<>();
-                mLayerSubscriptions.put(layer, subscribers);
-            }
-            // Add the subscriber to the list.
-            subscribers.add(subscriber);
-            VmsOperationRecorder.get().addSubscription(mSequenceNumber, layer);
-        }
-    }
-
-    /**
-     * Add a subscriber subscription to all data messages.
-     *
-     * @param subscriber a VMS subscriber.
-     */
-    public void addSubscription(IVmsSubscriberClient subscriber) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-            mPromiscuousSubscribers.add(subscriber);
-            VmsOperationRecorder.get().addPromiscuousSubscription(mSequenceNumber);
-        }
-    }
-
-    /**
-     * Add a subscriber subscription to data messages from a VMS layer from a specific publisher.
-     *
-     * @param subscriber  a VMS subscriber.
-     * @param layer       the layer to subscribing to.
-     * @param publisherId the publisher ID.
-     */
-    public void addSubscription(IVmsSubscriberClient subscriber, VmsLayer layer, int publisherId) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-
-            Map<Integer, Set<IVmsSubscriberClient>> publisherIdsToSubscribersForLayer =
-                    mLayerSubscriptionsToPublishers.get(layer);
-
-            if (publisherIdsToSubscribersForLayer == null) {
-                publisherIdsToSubscribersForLayer = new HashMap<>();
-                mLayerSubscriptionsToPublishers.put(layer, publisherIdsToSubscribersForLayer);
-            }
-
-            Set<IVmsSubscriberClient> subscribersForPublisher =
-                    publisherIdsToSubscribersForLayer.get(publisherId);
-
-            if (subscribersForPublisher == null) {
-                subscribersForPublisher = new HashSet<>();
-                publisherIdsToSubscribersForLayer.put(publisherId, subscribersForPublisher);
-            }
-
-            // Add the subscriber to the list.
-            subscribersForPublisher.add(subscriber);
-        }
-    }
-
-    /**
-     * Remove a subscription for a layer + version and make sure to remove the key if there are no
-     * more subscribers.
-     *
-     * @param subscriber to remove.
-     * @param layer      of the subscription.
-     */
-    public void removeSubscription(IVmsSubscriberClient subscriber, VmsLayer layer) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-            Set<IVmsSubscriberClient> subscribers = mLayerSubscriptions.get(layer);
-
-            // If there are no subscribers we are done.
-            if (subscribers == null) {
-                return;
-            }
-            subscribers.remove(subscriber);
-            VmsOperationRecorder.get().removeSubscription(mSequenceNumber, layer);
-
-            // If there are no more subscribers then remove the list.
-            if (subscribers.isEmpty()) {
-                mLayerSubscriptions.remove(layer);
-            }
-        }
-    }
-
-    /**
-     * Remove a subscriber subscription to all data messages.
-     *
-     * @param subscriber a VMS subscriber.
-     */
-    public void removeSubscription(IVmsSubscriberClient subscriber) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-            mPromiscuousSubscribers.remove(subscriber);
-            VmsOperationRecorder.get().removePromiscuousSubscription(mSequenceNumber);
-        }
-    }
-
-    /**
-     * Remove a subscription to data messages from a VMS layer from a specific publisher.
-     *
-     * @param subscriber  a VMS subscriber.
-     * @param layer       the layer to unsubscribing from.
-     * @param publisherId the publisher ID.
-     */
-    public void removeSubscription(IVmsSubscriberClient subscriber,
-                                   VmsLayer layer,
-                                   int publisherId) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-
-            Map<Integer, Set<IVmsSubscriberClient>> subscribersToPublishers =
-                    mLayerSubscriptionsToPublishers.get(layer);
-
-            if (subscribersToPublishers == null) {
-                return;
-            }
-
-            Set<IVmsSubscriberClient> subscribers = subscribersToPublishers.get(publisherId);
-
-            if (subscribers == null) {
-                return;
-            }
-            subscribers.remove(subscriber);
-
-            if (subscribers.isEmpty()) {
-                subscribersToPublishers.remove(publisherId);
-            }
-
-            if (subscribersToPublishers.isEmpty()) {
-                mLayerSubscriptionsToPublishers.remove(layer);
-            }
-        }
-    }
-
-    /**
-     * Remove a subscriber from all routes (optional operation).
-     *
-     * @param subscriber a VMS subscriber.
-     */
-    public void removeDeadSubscriber(IVmsSubscriberClient subscriber) {
-        synchronized (mLock) {
-            // Remove the subscriber from all the routes.
-            for (VmsLayer layer : mLayerSubscriptions.keySet()) {
-                removeSubscription(subscriber, layer);
-            }
-            // Remove the subscriber from the loggers.
-            removeSubscription(subscriber);
-        }
-    }
-
-    /**
-     * Returns a list of all the subscribers for a layer from a publisher. This includes
-     * subscribers that subscribed to this layer from all publishers, subscribed to this layer
-     * from a specific publisher, and the promiscuous subscribers.
-     *
-     * @param layer       The layer of the message.
-     * @param publisherId the ID of the client that published the message to be routed.
-     * @return a list of the subscribers.
-     */
-    public Set<IVmsSubscriberClient> getSubscribersForLayerFromPublisher(VmsLayer layer,
-                                                                         int publisherId) {
-        Set<IVmsSubscriberClient> subscribers = new HashSet<>();
-        synchronized (mLock) {
-            // Add the subscribers which explicitly subscribed to this layer
-            if (mLayerSubscriptions.containsKey(layer)) {
-                subscribers.addAll(mLayerSubscriptions.get(layer));
-            }
-
-            // Add the subscribers which explicitly subscribed to this layer and publisher
-            if (mLayerSubscriptionsToPublishers.containsKey(layer)) {
-                if (mLayerSubscriptionsToPublishers.get(layer).containsKey(publisherId)) {
-                    subscribers.addAll(mLayerSubscriptionsToPublishers.get(layer).get(publisherId));
-                }
-            }
-
-            // Add the promiscuous subscribers.
-            subscribers.addAll(mPromiscuousSubscribers);
-        }
-        return subscribers;
-    }
-
-    /**
-     * Returns a list with all the subscribers.
-     */
-    public Set<IVmsSubscriberClient> getAllSubscribers() {
-        Set<IVmsSubscriberClient> subscribers = new HashSet<>();
-        synchronized (mLock) {
-            for (VmsLayer layer : mLayerSubscriptions.keySet()) {
-                subscribers.addAll(mLayerSubscriptions.get(layer));
-            }
-            // Add the promiscuous subscribers.
-            subscribers.addAll(mPromiscuousSubscribers);
-        }
-        return subscribers;
-    }
-
-    /**
-     * Checks if a subscriber is subscribed to any messages.
-     *
-     * @param subscriber that may have subscription.
-     * @return true if the subscriber uis subscribed to messages.
-     */
-    public boolean containsSubscriber(IVmsSubscriberClient subscriber) {
-        synchronized (mLock) {
-            // Check if subscriber is subscribed to a layer.
-            for (Set<IVmsSubscriberClient> layerSubscribers : mLayerSubscriptions.values()) {
-                if (layerSubscribers.contains(subscriber)) {
-                    return true;
-                }
-            }
-            // Check is subscriber is subscribed to all data messages.
-            return mPromiscuousSubscribers.contains(subscriber);
-        }
-    }
-
-    /**
-     * Add a layer and version to the HAL subscriptions.
-     *
-     * @param layer the HAL subscribes to.
-     */
-    public void addHalSubscription(VmsLayer layer) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-            mHalSubscriptions.add(layer);
-            VmsOperationRecorder.get().addHalSubscription(mSequenceNumber, layer);
-        }
-    }
-
-    public void addHalSubscriptionToPublisher(VmsLayer layer, int publisherId) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-
-            Set<Integer> publisherIdsForLayer = mHalSubscriptionsToPublishers.get(layer);
-            if (publisherIdsForLayer == null) {
-                publisherIdsForLayer = new HashSet<>();
-                mHalSubscriptionsToPublishers.put(layer, publisherIdsForLayer);
-            }
-            publisherIdsForLayer.add(publisherId);
-        }
-    }
-
-    /**
-     * remove a layer and version to the HAL subscriptions.
-     *
-     * @param layer the HAL unsubscribes from.
-     */
-    public void removeHalSubscription(VmsLayer layer) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-            mHalSubscriptions.remove(layer);
-            VmsOperationRecorder.get().removeHalSubscription(mSequenceNumber, layer);
-        }
-    }
-
-    public void removeHalSubscriptionToPublisher(VmsLayer layer, int publisherId) {
-        synchronized (mLock) {
-            ++mSequenceNumber;
-
-            Set<Integer> publisherIdsForLayer = mHalSubscriptionsToPublishers.get(layer);
-            if (publisherIdsForLayer == null) {
-                return;
-            }
-            publisherIdsForLayer.remove(publisherId);
-
-            if (publisherIdsForLayer.isEmpty()) {
-                mHalSubscriptionsToPublishers.remove(layer);
-            }
-        }
-    }
-
-    /**
-     * checks if the HAL is subscribed to a layer.
-     *
-     * @param layer
-     * @return true if the HAL is subscribed to layer.
-     */
-    public boolean isHalSubscribed(VmsLayer layer) {
-        synchronized (mLock) {
-            return mHalSubscriptions.contains(layer);
-        }
-    }
-
-    /**
-     * checks if there are subscribers to a layer.
-     *
-     * @param layer
-     * @return true if there are subscribers to layer.
-     */
-    public boolean hasLayerSubscriptions(VmsLayer layer) {
-        synchronized (mLock) {
-            return mLayerSubscriptions.containsKey(layer) || mHalSubscriptions.contains(layer);
-        }
-    }
-
-    /**
-     * returns true if there is already a subscription for the layer from publisherId.
-     *
-     * @param layer
-     * @param publisherId
-     * @return
-     */
-    public boolean hasLayerFromPublisherSubscriptions(VmsLayer layer, int publisherId) {
-        synchronized (mLock) {
-            boolean hasClientSubscription =
-                    mLayerSubscriptionsToPublishers.containsKey(layer) &&
-                            mLayerSubscriptionsToPublishers.get(layer).containsKey(publisherId);
-
-            boolean hasHalSubscription = mHalSubscriptionsToPublishers.containsKey(layer) &&
-                    mHalSubscriptionsToPublishers.get(layer).contains(publisherId);
-
-            return hasClientSubscription || hasHalSubscription;
-        }
-    }
-
-    /**
-     * @return a Set of layers and versions which VMS clients are subscribed to.
-     */
-    public VmsSubscriptionState getSubscriptionState() {
-        synchronized (mLock) {
-            Set<VmsLayer> layers = new HashSet<>();
-            layers.addAll(mLayerSubscriptions.keySet());
-            layers.addAll(mHalSubscriptions);
-
-
-            Set<VmsAssociatedLayer> layersFromPublishers = new HashSet<>();
-            layersFromPublishers.addAll(mLayerSubscriptionsToPublishers.entrySet()
-                    .stream()
-                    .map(e -> new VmsAssociatedLayer(e.getKey(), e.getValue().keySet()))
-                    .collect(Collectors.toSet()));
-            layersFromPublishers.addAll(mHalSubscriptionsToPublishers.entrySet()
-                    .stream()
-                    .map(e -> new VmsAssociatedLayer(e.getKey(), e.getValue()))
-                    .collect(Collectors.toSet()));
-
-            return new VmsSubscriptionState(mSequenceNumber, layers, layersFromPublishers);
-        }
-    }
-}
\ No newline at end of file
diff --git a/service/src/com/android/car/VmsSubscriberService.java b/service/src/com/android/car/VmsSubscriberService.java
deleted file mode 100644
index 94f0844..0000000
--- a/service/src/com/android/car/VmsSubscriberService.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.Car;
-import android.car.annotation.FutureFeature;
-import android.car.vms.IVmsSubscriberClient;
-import android.car.vms.IVmsSubscriberService;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.content.Context;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.car.hal.VmsHalService;
-import com.android.internal.annotations.GuardedBy;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * + Receives HAL updates by implementing VmsHalService.VmsHalListener.
- * + Offers subscriber/publisher services by implementing IVmsService.Stub.
- */
-@FutureFeature
-public class VmsSubscriberService extends IVmsSubscriberService.Stub
-        implements CarServiceBase, VmsHalService.VmsHalSubscriberListener {
-    private static final boolean DBG = true;
-    private static final String PERMISSION = Car.PERMISSION_VMS_SUBSCRIBER;
-    private static final String TAG = "VmsSubscriberService";
-
-    private final Context mContext;
-    private final VmsHalService mHal;
-
-    @GuardedBy("mSubscriberServiceLock")
-    private final VmsSubscribersManager mSubscribersManager = new VmsSubscribersManager();
-    private final Object mSubscriberServiceLock = new Object();
-
-    /**
-     * Keeps track of subscribers of this service.
-     */
-    class VmsSubscribersManager {
-        /**
-         * Allows to modify mSubscriberMap and mListenerDeathRecipientMap as a single unit.
-         */
-        private final Object mListenerManagerLock = new Object();
-        @GuardedBy("mListenerManagerLock")
-        private final Map<IBinder, ListenerDeathRecipient> mListenerDeathRecipientMap =
-                new HashMap<>();
-        @GuardedBy("mListenerManagerLock")
-        private final Map<IBinder, IVmsSubscriberClient> mSubscriberMap = new HashMap<>();
-
-        class ListenerDeathRecipient implements IBinder.DeathRecipient {
-            private IBinder mSubscriberBinder;
-
-            ListenerDeathRecipient(IBinder subscriberBinder) {
-                mSubscriberBinder = subscriberBinder;
-            }
-
-            /**
-             * Listener died. Remove it from this service.
-             */
-            @Override
-            public void binderDied() {
-                if (DBG) {
-                    Log.d(TAG, "binderDied " + mSubscriberBinder);
-                }
-
-                // Get the Listener from the Binder
-                IVmsSubscriberClient subscriber = mSubscriberMap.get(mSubscriberBinder);
-
-                // Remove the subscriber subscriptions.
-                if (subscriber != null) {
-                    Log.d(TAG, "Removing subscriptions for dead subscriber: " + subscriber);
-                    mHal.removeDeadSubscriber(subscriber);
-                } else {
-                    Log.d(TAG, "Handling dead binder with no matching subscriber");
-
-                }
-
-                // Remove binder
-                VmsSubscribersManager.this.removeListener(mSubscriberBinder);
-            }
-
-            void release() {
-                mSubscriberBinder.unlinkToDeath(this, 0);
-            }
-        }
-
-        public void release() {
-            for (ListenerDeathRecipient recipient : mListenerDeathRecipientMap.values()) {
-                recipient.release();
-            }
-            mListenerDeathRecipientMap.clear();
-            mSubscriberMap.clear();
-        }
-
-        /**
-         * Adds the subscriber and a death recipient associated to it.
-         *
-         * @param subscriber to be added.
-         * @throws IllegalArgumentException if the subscriber is null.
-         * @throws IllegalStateException    if it was not possible to link a death recipient to the
-         *                                  subscriber.
-         */
-        public void add(IVmsSubscriberClient subscriber) {
-            ICarImpl.assertPermission(mContext, PERMISSION);
-            if (subscriber == null) {
-                Log.e(TAG, "register: subscriber is null.");
-                throw new IllegalArgumentException("subscriber cannot be null.");
-            }
-            if (DBG) {
-                Log.d(TAG, "register: " + subscriber);
-            }
-            IBinder subscriberBinder = subscriber.asBinder();
-            synchronized (mListenerManagerLock) {
-                if (mSubscriberMap.containsKey(subscriberBinder)) {
-                    // Already registered, nothing to do.
-                    return;
-                }
-                ListenerDeathRecipient deathRecipient =
-                        new ListenerDeathRecipient(subscriberBinder);
-                try {
-                    subscriberBinder.linkToDeath(deathRecipient, 0);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Failed to link death for recipient. ", e);
-                    throw new IllegalStateException(Car.CAR_NOT_CONNECTED_EXCEPTION_MSG);
-                }
-                mListenerDeathRecipientMap.put(subscriberBinder, deathRecipient);
-                mSubscriberMap.put(subscriberBinder, subscriber);
-            }
-        }
-
-        /**
-         * Removes the subscriber and associated death recipient.
-         *
-         * @param subscriber to be removed.
-         * @throws IllegalArgumentException if subscriber is null.
-         */
-        public void remove(IVmsSubscriberClient subscriber) {
-            if (DBG) {
-                Log.d(TAG, "unregisterListener");
-            }
-            ICarImpl.assertPermission(mContext, PERMISSION);
-            if (subscriber == null) {
-                Log.e(TAG, "unregister: subscriber is null.");
-                throw new IllegalArgumentException("Listener is null");
-            }
-            IBinder subscriberBinder = subscriber.asBinder();
-            removeListener(subscriberBinder);
-        }
-
-        // Removes the subscriberBinder from the current state.
-        // The function assumes that binder will exist both in subscriber and death recipients list.
-        private void removeListener(IBinder subscriberBinder) {
-            synchronized (mListenerManagerLock) {
-                boolean found = mSubscriberMap.remove(subscriberBinder) != null;
-                if (found) {
-                    mListenerDeathRecipientMap.get(subscriberBinder).release();
-                    mListenerDeathRecipientMap.remove(subscriberBinder);
-                } else {
-                    Log.e(TAG, "removeListener: subscriber was not previously registered.");
-                }
-            }
-        }
-
-        /**
-         * Returns list of subscribers currently registered.
-         *
-         * @return list of subscribers.
-         */
-        public List<IVmsSubscriberClient> getListeners() {
-            synchronized (mListenerManagerLock) {
-                return new ArrayList<>(mSubscriberMap.values());
-            }
-        }
-    }
-
-    public VmsSubscriberService(Context context, VmsHalService hal) {
-        mContext = context;
-        mHal = hal;
-    }
-
-    // Implements CarServiceBase interface.
-    @Override
-    public void init() {
-        mHal.addSubscriberListener(this);
-    }
-
-    @Override
-    public void release() {
-        mSubscribersManager.release();
-        mHal.removeSubscriberListener(this);
-    }
-
-    @Override
-    public void dump(PrintWriter writer) {
-    }
-
-    // Implements IVmsService interface.
-    @Override
-    public void addVmsSubscriberToNotifications(IVmsSubscriberClient subscriber) {
-        synchronized (mSubscriberServiceLock) {
-            // Add the subscriber so it can subscribe.
-            mSubscribersManager.add(subscriber);
-        }
-    }
-
-    @Override
-    public void removeVmsSubscriberToNotifications(IVmsSubscriberClient subscriber) {
-        synchronized (mSubscriberServiceLock) {
-            if (mHal.containsSubscriber(subscriber)) {
-                throw new IllegalArgumentException("Subscriber has active subscriptions.");
-            }
-            mSubscribersManager.remove(subscriber);
-        }
-    }
-
-    @Override
-    public void addVmsSubscriber(IVmsSubscriberClient subscriber, VmsLayer layer) {
-        synchronized (mSubscriberServiceLock) {
-            // Add the subscriber so it can subscribe.
-            mSubscribersManager.add(subscriber);
-
-            // Add the subscription for the layer.
-            mHal.addSubscription(subscriber, layer);
-        }
-    }
-
-    @Override
-    public void removeVmsSubscriber(IVmsSubscriberClient subscriber, VmsLayer layer) {
-        synchronized (mSubscriberServiceLock) {
-            // Remove the subscription.
-            mHal.removeSubscription(subscriber, layer);
-        }
-    }
-
-    @Override
-    public void addVmsSubscriberToPublisher(IVmsSubscriberClient subscriber,
-                                                  VmsLayer layer,
-                                                  int publisherId) {
-        synchronized (mSubscriberServiceLock) {
-            // Add the subscriber so it can subscribe.
-            mSubscribersManager.add(subscriber);
-
-            // Add the subscription for the layer.
-            mHal.addSubscription(subscriber, layer, publisherId);
-        }
-    }
-
-    @Override
-    public void removeVmsSubscriberToPublisher(IVmsSubscriberClient subscriber,
-                                                     VmsLayer layer,
-                                                     int publisherId) {
-        synchronized (mSubscriberServiceLock) {
-            // Remove the subscription.
-            mHal.removeSubscription(subscriber, layer, publisherId);
-        }
-    }
-
-    @Override
-    public void addVmsSubscriberPassive(IVmsSubscriberClient subscriber) {
-        synchronized (mSubscriberServiceLock) {
-            mSubscribersManager.add(subscriber);
-            mHal.addSubscription(subscriber);
-        }
-    }
-
-    @Override
-    public void removeVmsSubscriberPassive(IVmsSubscriberClient subscriber) {
-        synchronized (mSubscriberServiceLock) {
-            // Remove the subscription.
-            mHal.removeSubscription(subscriber);
-        }
-    }
-
-    @Override
-    public byte[] getPublisherInfo(int publisherId) {
-        synchronized (mSubscriberServiceLock) {
-            return mHal.getPublisherInfo(publisherId);
-        }
-    }
-
-    @Override
-    public List<VmsLayer> getAvailableLayers() {
-        //TODO(asafro): return the list of available layers once logic is implemented.
-        return Collections.emptyList();
-    }
-
-    // Implements VmsHalSubscriberListener interface
-    @Override
-    public void onDataMessage(VmsLayer layer, int publisherId, byte[] payload) {
-        if (DBG) {
-            Log.d(TAG, "Publishing a message for layer: " + layer);
-        }
-
-        Set<IVmsSubscriberClient> subscribers =
-                mHal.getSubscribersForLayerFromPublisher(layer, publisherId);
-
-        for (IVmsSubscriberClient subscriber : subscribers) {
-            try {
-                subscriber.onVmsMessageReceived(layer, payload);
-            } catch (RemoteException e) {
-                // If we could not send a record, its likely the connection snapped. Let the binder
-                // death handle the situation.
-                Log.e(TAG, "onVmsMessageReceived calling failed: ", e);
-            }
-        }
-    }
-
-    @Override
-    public void onLayersAvaiabilityChange(List<VmsAssociatedLayer> availableLayers) {
-        if (DBG) {
-            Log.d(TAG, "Publishing layers availability change: " + availableLayers);
-        }
-
-        Set<IVmsSubscriberClient> subscribers;
-        synchronized (mSubscriberServiceLock) {
-            subscribers = new HashSet<>(mSubscribersManager.getListeners());
-        }
-
-        for (IVmsSubscriberClient subscriber : subscribers) {
-            try {
-                subscriber.onLayersAvailabilityChanged(availableLayers);
-            } catch (RemoteException e) {
-                // If we could not send a record, its likely the connection snapped. Let the binder
-                // death handle the situation.
-                Log.e(TAG, "onLayersAvailabilityChanged calling failed: ", e);
-            }
-        }
-    }
-}
diff --git a/service/src/com/android/car/hal/VehicleHal.java b/service/src/com/android/car/hal/VehicleHal.java
index 21f8f51..44c81d7 100644
--- a/service/src/com/android/car/hal/VehicleHal.java
+++ b/service/src/com/android/car/hal/VehicleHal.java
@@ -80,8 +80,6 @@
     private final VendorExtensionHalService mVendorExtensionHal;
     private DiagnosticHalService mDiagnosticHal = null;
 
-    @FutureFeature
-    private VmsHalService mVmsHal;
 
 
     /** Might be re-assigned if Vehicle HAL is reconnected. */
@@ -108,9 +106,6 @@
         mHvacHal = new HvacHalService(this);
         mInputHal = new InputHalService(this);
         mVendorExtensionHal = new VendorExtensionHalService(this);
-        if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-            mVmsHal = new VmsHalService(this);
-        }
         mDiagnosticHal = new DiagnosticHalService(this);
         mAllServices.addAll(Arrays.asList(mPowerHal,
                 mSensorHal,
@@ -122,9 +117,6 @@
                 mInputHal,
                 mVendorExtensionHal,
                 mDiagnosticHal));
-        if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-            mAllServices.add(mVmsHal);
-        }
 
         mHalClient = new HalClient(vehicle, mHandlerThread.getLooper(), this /*IVehicleCallback*/);
     }
@@ -146,10 +138,6 @@
         mVendorExtensionHal = null;
         mDiagnosticHal = null;
 
-        if (FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-            mVmsHal = null;
-        }
-
         mHalClient = halClient;
     }
 
@@ -169,7 +157,6 @@
             mHvacHal = hvacHal;
             mInputHal = null;
             mVendorExtensionHal = null;
-            mVmsHal = null;
             mHalClient = halClient;
             mDiagnosticHal = diagnosticHal;
     }
@@ -281,9 +268,6 @@
         return mVendorExtensionHal;
     }
 
-    @FutureFeature
-    public VmsHalService getVmsHal() { return mVmsHal; }
-
     private void assertServiceOwnerLocked(HalServiceBase service, int property) {
         if (service != mPropertyHandlers.get(property)) {
             throw new IllegalArgumentException("Property 0x" + toHexString(property)
diff --git a/service/src/com/android/car/hal/VmsHalService.java b/service/src/com/android/car/hal/VmsHalService.java
deleted file mode 100644
index d20a453..0000000
--- a/service/src/com/android/car/hal/VmsHalService.java
+++ /dev/null
@@ -1,850 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.hal;
-
-import static com.android.car.CarServiceUtils.toByteArray;
-import static java.lang.Integer.toHexString;
-
-import android.car.VehicleAreaType;
-import android.car.annotation.FutureFeature;
-import android.car.vms.IVmsSubscriberClient;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayerDependency;
-import android.car.vms.VmsLayersOffering;
-import android.car.vms.VmsOperationRecorder;
-import android.car.vms.VmsSubscriptionState;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropConfig;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerAndPublisherIdIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsOfferingMessageIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerIntegerValuesIndex;
-import android.os.Binder;
-import android.os.IBinder;
-import android.util.Log;
-import com.android.car.CarLog;
-import com.android.car.VmsLayersAvailability;
-import com.android.car.VmsPublishersInfo;
-import com.android.car.VmsRouting;
-import com.android.internal.annotations.GuardedBy;
-
-import java.io.PrintWriter;
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-/**
- * This is a glue layer between the VehicleHal and the VmsService. It sends VMS properties back and
- * forth.
- */
-@FutureFeature
-public class VmsHalService extends HalServiceBase {
-
-    private static final boolean DBG = true;
-    private static final int HAL_PROPERTY_ID = VehicleProperty.VEHICLE_MAP_SERVICE;
-    private static final String TAG = "VmsHalService";
-
-    private final static List<Integer> AVAILABILITY_MESSAGE_TYPES = Collections.unmodifiableList(
-            Arrays.asList(
-                    VmsMessageType.AVAILABILITY_RESPONSE,
-                    VmsMessageType.AVAILABILITY_CHANGE));
-
-    private boolean mIsSupported = false;
-    private CopyOnWriteArrayList<VmsHalPublisherListener> mPublisherListeners =
-            new CopyOnWriteArrayList<>();
-    private CopyOnWriteArrayList<VmsHalSubscriberListener> mSubscriberListeners =
-            new CopyOnWriteArrayList<>();
-
-    private final IBinder mHalPublisherToken = new Binder();
-    private final VehicleHal mVehicleHal;
-
-    private final Object mLock = new Object();
-    private final VmsRouting mRouting = new VmsRouting();
-    @GuardedBy("mLock")
-    private final Map<IBinder, VmsLayersOffering> mOfferings = new HashMap<>();
-    @GuardedBy("mLock")
-    private final VmsLayersAvailability mAvailableLayers = new VmsLayersAvailability();
-    private final VmsPublishersInfo mPublishersInfo = new VmsPublishersInfo();
-
-    /**
-     * The VmsPublisherService implements this interface to receive data from the HAL.
-     */
-    public interface VmsHalPublisherListener {
-        void onChange(VmsSubscriptionState subscriptionState);
-    }
-
-    /**
-     * The VmsSubscriberService implements this interface to receive data from the HAL.
-     */
-    public interface VmsHalSubscriberListener {
-        // Notifies the listener on a data Message from a publisher.
-        void onDataMessage(VmsLayer layer, int publisherId, byte[] payload);
-
-        // Notifies the listener on a change in available layers.
-        void onLayersAvaiabilityChange(List<VmsAssociatedLayer> availableLayers);
-    }
-
-    /**
-     * The VmsService implements this interface to receive data from the HAL.
-     */
-    protected VmsHalService(VehicleHal vehicleHal) {
-        mVehicleHal = vehicleHal;
-        if (DBG) {
-            Log.d(TAG, "started VmsHalService!");
-        }
-    }
-
-    public void addPublisherListener(VmsHalPublisherListener listener) {
-        mPublisherListeners.add(listener);
-    }
-
-    public void addSubscriberListener(VmsHalSubscriberListener listener) {
-        mSubscriberListeners.add(listener);
-    }
-
-    public void removePublisherListener(VmsHalPublisherListener listener) {
-        mPublisherListeners.remove(listener);
-    }
-
-    public void removeSubscriberListener(VmsHalSubscriberListener listener) {
-        mSubscriberListeners.remove(listener);
-    }
-
-    public void addSubscription(IVmsSubscriberClient listener, VmsLayer layer) {
-        boolean firstSubscriptionForLayer = false;
-        synchronized (mLock) {
-            // Check if publishers need to be notified about this change in subscriptions.
-            firstSubscriptionForLayer = !mRouting.hasLayerSubscriptions(layer);
-
-            // Add the listeners subscription to the layer
-            mRouting.addSubscription(listener, layer);
-        }
-        if (firstSubscriptionForLayer) {
-            notifyHalPublishers(layer, true);
-            notifyClientPublishers();
-        }
-    }
-
-    public void removeSubscription(IVmsSubscriberClient listener, VmsLayer layer) {
-        boolean layerHasSubscribers = true;
-        synchronized (mLock) {
-            if (!mRouting.hasLayerSubscriptions(layer)) {
-                Log.i(TAG, "Trying to remove a layer with no subscription: " + layer);
-                return;
-            }
-
-            // Remove the listeners subscription to the layer
-            mRouting.removeSubscription(listener, layer);
-
-            // Check if publishers need to be notified about this change in subscriptions.
-            layerHasSubscribers = mRouting.hasLayerSubscriptions(layer);
-        }
-        if (!layerHasSubscribers) {
-            notifyHalPublishers(layer, false);
-            notifyClientPublishers();
-        }
-    }
-
-    public void addSubscription(IVmsSubscriberClient listener) {
-        synchronized (mLock) {
-            mRouting.addSubscription(listener);
-        }
-    }
-
-    public void removeSubscription(IVmsSubscriberClient listener) {
-        synchronized (mLock) {
-            mRouting.removeSubscription(listener);
-        }
-    }
-
-    public void addSubscription(IVmsSubscriberClient listener, VmsLayer layer, int publisherId) {
-        boolean firstSubscriptionForLayer = false;
-        synchronized (mLock) {
-            // Check if publishers need to be notified about this change in subscriptions.
-            firstSubscriptionForLayer = !(mRouting.hasLayerSubscriptions(layer) ||
-                    mRouting.hasLayerFromPublisherSubscriptions(layer, publisherId));
-
-            // Add the listeners subscription to the layer
-            mRouting.addSubscription(listener, layer, publisherId);
-        }
-        if (firstSubscriptionForLayer) {
-            notifyHalPublishers(layer, true);
-            notifyClientPublishers();
-        }
-    }
-
-    public void removeSubscription(IVmsSubscriberClient listener, VmsLayer layer, int publisherId) {
-        boolean layerHasSubscribers = true;
-        synchronized (mLock) {
-            if (!mRouting.hasLayerFromPublisherSubscriptions(layer, publisherId)) {
-                Log.i(TAG, "Trying to remove a layer with no subscription: " +
-                        layer + ", publisher ID:" + publisherId);
-                return;
-            }
-
-            // Remove the listeners subscription to the layer
-            mRouting.removeSubscription(listener, layer, publisherId);
-
-            // Check if publishers need to be notified about this change in subscriptions.
-            layerHasSubscribers = mRouting.hasLayerSubscriptions(layer) ||
-                    mRouting.hasLayerFromPublisherSubscriptions(layer, publisherId);
-        }
-        if (!layerHasSubscribers) {
-            notifyHalPublishers(layer, false);
-            notifyClientPublishers();
-        }
-    }
-
-    public void removeDeadSubscriber(IVmsSubscriberClient listener) {
-        synchronized (mLock) {
-            mRouting.removeDeadSubscriber(listener);
-        }
-    }
-
-    public Set<IVmsSubscriberClient> getSubscribersForLayerFromPublisher(VmsLayer layer,
-                                                                         int publisherId) {
-        synchronized (mLock) {
-            return mRouting.getSubscribersForLayerFromPublisher(layer, publisherId);
-        }
-    }
-
-    public Set<IVmsSubscriberClient> getAllSubscribers() {
-        synchronized (mLock) {
-            return mRouting.getAllSubscribers();
-        }
-    }
-
-    public boolean isHalSubscribed(VmsLayer layer) {
-        synchronized (mLock) {
-            return mRouting.isHalSubscribed(layer);
-        }
-    }
-
-    public VmsSubscriptionState getSubscriptionState() {
-        synchronized (mLock) {
-            return mRouting.getSubscriptionState();
-        }
-    }
-
-    /**
-     * Assigns an idempotent ID for publisherInfo and stores it. The idempotency in this case means
-     * that the same publisherInfo will always, within a trip of the vehicle, return the same ID.
-     * The publisherInfo should be static for a binary and should only change as part of a software
-     * update. The publisherInfo is a serialized proto message which VMS clients can interpret.
-     */
-    public int getPublisherId(byte[] publisherInfo) {
-        if (DBG) {
-            Log.i(TAG, "Getting publisher static ID");
-        }
-        synchronized (mLock) {
-            return mPublishersInfo.getIdForInfo(publisherInfo);
-        }
-    }
-
-    public byte[] getPublisherInfo(int publisherId) {
-        if (DBG) {
-            Log.i(TAG, "Getting information for publisher ID: " + publisherId);
-        }
-        synchronized (mLock) {
-            return mPublishersInfo.getPublisherInfo(publisherId);
-        }
-    }
-
-    private void addHalSubscription(VmsLayer layer) {
-        boolean firstSubscriptionForLayer = true;
-        synchronized (mLock) {
-            // Check if publishers need to be notified about this change in subscriptions.
-            firstSubscriptionForLayer = !mRouting.hasLayerSubscriptions(layer);
-
-            // Add the listeners subscription to the layer
-            mRouting.addHalSubscription(layer);
-        }
-        if (firstSubscriptionForLayer) {
-            notifyHalPublishers(layer, true);
-            notifyClientPublishers();
-        }
-    }
-
-    private void addHalSubscriptionToPublisher(VmsLayer layer, int publisherId) {
-        boolean firstSubscriptionForLayer = true;
-        synchronized (mLock) {
-            // Check if publishers need to be notified about this change in subscriptions.
-            firstSubscriptionForLayer = !(mRouting.hasLayerSubscriptions(layer) ||
-                    mRouting.hasLayerFromPublisherSubscriptions(layer, publisherId));
-
-            // Add the listeners subscription to the layer
-            mRouting.addHalSubscriptionToPublisher(layer, publisherId);
-        }
-        if (firstSubscriptionForLayer) {
-            notifyHalPublishers(layer, publisherId, true);
-            notifyClientPublishers();
-        }
-    }
-
-    private void removeHalSubscription(VmsLayer layer) {
-        boolean layerHasSubscribers = true;
-        synchronized (mLock) {
-            if (!mRouting.hasLayerSubscriptions(layer)) {
-                Log.i(TAG, "Trying to remove a layer with no subscription: " + layer);
-                return;
-            }
-
-            // Remove the listeners subscription to the layer
-            mRouting.removeHalSubscription(layer);
-
-            // Check if publishers need to be notified about this change in subscriptions.
-            layerHasSubscribers = mRouting.hasLayerSubscriptions(layer);
-        }
-        if (!layerHasSubscribers) {
-            notifyHalPublishers(layer, false);
-            notifyClientPublishers();
-        }
-    }
-
-    public void removeHalSubscriptionFromPublisher(VmsLayer layer, int publisherId) {
-        boolean layerHasSubscribers = true;
-        synchronized (mLock) {
-            if (!mRouting.hasLayerSubscriptions(layer)) {
-                Log.i(TAG, "Trying to remove a layer with no subscription: " + layer);
-                return;
-            }
-
-            // Remove the listeners subscription to the layer
-            mRouting.removeHalSubscriptionToPublisher(layer, publisherId);
-
-            // Check if publishers need to be notified about this change in subscriptions.
-            layerHasSubscribers = mRouting.hasLayerSubscriptions(layer) ||
-                    mRouting.hasLayerFromPublisherSubscriptions(layer, publisherId);
-        }
-        if (!layerHasSubscribers) {
-            notifyHalPublishers(layer, publisherId, false);
-            notifyClientPublishers();
-        }
-    }
-
-    public boolean containsSubscriber(IVmsSubscriberClient subscriber) {
-        synchronized (mLock) {
-            return mRouting.containsSubscriber(subscriber);
-        }
-    }
-
-    public void setPublisherLayersOffering(IBinder publisherToken, VmsLayersOffering offering) {
-        Set<VmsAssociatedLayer> availableLayers = Collections.EMPTY_SET;
-        synchronized (mLock) {
-            updateOffering(publisherToken, offering);
-            VmsOperationRecorder.get().setPublisherLayersOffering(offering);
-            availableLayers = mAvailableLayers.getAvailableLayers();
-        }
-        notifyOfAvailabilityChange(availableLayers);
-    }
-
-    public Set<VmsAssociatedLayer> getAvailableLayers() {
-        //TODO(b/36872877): wrap available layers in VmsAvailabilityState similar to VmsSubscriptionState.
-        synchronized (mLock) {
-            return mAvailableLayers.getAvailableLayers();
-        }
-    }
-
-    /**
-     * Notify all the publishers and the HAL on subscription changes regardless of who triggered
-     * the change.
-     *
-     * @param layer          layer which is being subscribed to or unsubscribed from.
-     * @param hasSubscribers indicates if the notification is for subscription or unsubscription.
-     */
-    private void notifyHalPublishers(VmsLayer layer, boolean hasSubscribers) {
-        // notify the HAL
-        setSubscriptionRequest(layer, hasSubscribers);
-    }
-
-    private void notifyHalPublishers(VmsLayer layer, int publisherId, boolean hasSubscribers) {
-        // notify the HAL
-        setSubscriptionToPublisherRequest(layer, publisherId, hasSubscribers);
-    }
-
-    private void notifyClientPublishers() {
-        // Notify the App publishers
-        for (VmsHalPublisherListener listener : mPublisherListeners) {
-            // Besides the list of layers, also a timestamp is provided to the clients.
-            // They should ignore any notification with a timestamp that is older than the most
-            // recent timestamp they have seen.
-            listener.onChange(getSubscriptionState());
-        }
-    }
-
-    /**
-     * Notify all the subscribers and the HAL on layers availability change.
-     *
-     * @param availableLayers the layers which publishers claim they made publish.
-     */
-    private void notifyOfAvailabilityChange(Set<VmsAssociatedLayer> availableLayers) {
-        // notify the HAL
-        notifyAvailabilityChangeToHal(availableLayers);
-
-        // Notify the App subscribers
-        for (VmsHalSubscriberListener listener : mSubscriberListeners) {
-            listener.onLayersAvaiabilityChange(new ArrayList<>(availableLayers));
-        }
-    }
-
-    @Override
-    public void init() {
-        if (DBG) {
-            Log.d(TAG, "init()");
-        }
-        if (mIsSupported) {
-            mVehicleHal.subscribeProperty(this, HAL_PROPERTY_ID);
-        }
-    }
-
-    @Override
-    public void release() {
-        if (DBG) {
-            Log.d(TAG, "release()");
-        }
-        if (mIsSupported) {
-            mVehicleHal.unsubscribeProperty(this, HAL_PROPERTY_ID);
-        }
-        mPublisherListeners.clear();
-        mSubscriberListeners.clear();
-    }
-
-    @Override
-    public Collection<VehiclePropConfig> takeSupportedProperties(
-            Collection<VehiclePropConfig> allProperties) {
-        List<VehiclePropConfig> taken = new LinkedList<>();
-        for (VehiclePropConfig p : allProperties) {
-            if (p.prop == HAL_PROPERTY_ID) {
-                taken.add(p);
-                mIsSupported = true;
-                if (DBG) {
-                    Log.d(TAG, "takeSupportedProperties: " + toHexString(p.prop));
-                }
-                break;
-            }
-        }
-        return taken;
-    }
-
-    /**
-     * Consumes/produces HAL messages. The format of these messages is defined in:
-     * hardware/interfaces/automotive/vehicle/2.1/types.hal
-     */
-    @Override
-    public void handleHalEvents(List<VehiclePropValue> values) {
-        if (DBG) {
-            Log.d(TAG, "Handling a VMS property change");
-        }
-        for (VehiclePropValue v : values) {
-            ArrayList<Integer> vec = v.value.int32Values;
-            int messageType = vec.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE);
-
-            if (DBG) {
-                Log.d(TAG, "Handling VMS message type: " + messageType);
-            }
-            switch (messageType) {
-                case VmsMessageType.DATA:
-                    handleDataEvent(vec, toByteArray(v.value.bytes));
-                    break;
-                case VmsMessageType.SUBSCRIBE:
-                    handleSubscribeEvent(vec);
-                    break;
-                case VmsMessageType.UNSUBSCRIBE:
-                    handleUnsubscribeEvent(vec);
-                    break;
-                case VmsMessageType.SUBSCRIBE_TO_PUBLISHER:
-                    handleSubscribeToPublisherEvent(vec);
-                    break;
-                case VmsMessageType.UNSUBSCRIBE_TO_PUBLISHER:
-                    handleUnsubscribeFromPublisherEvent(vec);
-                    break;
-                case VmsMessageType.OFFERING:
-                    handleOfferingEvent(vec);
-                    break;
-                case VmsMessageType.AVAILABILITY_REQUEST:
-                    handleHalAvailabilityRequestEvent();
-                    break;
-                case VmsMessageType.SUBSCRIPTIONS_REQUEST:
-                    handleSubscriptionRequestEvent();
-                    break;
-                default:
-                    throw new IllegalArgumentException("Unexpected message type: " + messageType);
-            }
-        }
-    }
-
-    private VmsLayer parseVmsLayerFromSimpleMessageIntegerValues(List<Integer> integerValues) {
-        return new VmsLayer(integerValues.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_TYPE),
-                integerValues.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_SUBTYPE),
-                integerValues.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_VERSION));
-    }
-
-    private VmsLayer parseVmsLayerFromDataMessageIntegerValues(List<Integer> integerValues) {
-        return parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
-    }
-
-    private int parsePublisherIdFromDataMessageIntegerValues(List<Integer> integerValues) {
-        return integerValues.get(VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.PUBLISHER_ID);
-    }
-
-
-    /**
-     * Data message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Layer id.
-     * <li>Layer version.
-     * <li>Layer subtype.
-     * <li>Publisher ID.
-     * <li>Payload.
-     * </ul>
-     */
-    private void handleDataEvent(List<Integer> integerValues, byte[] payload) {
-        VmsLayer vmsLayer = parseVmsLayerFromDataMessageIntegerValues(integerValues);
-        int publisherId = parsePublisherIdFromDataMessageIntegerValues(integerValues);
-        if (DBG) {
-            Log.d(TAG, "Handling a data event for Layer: " + vmsLayer);
-        }
-
-        // Send the message.
-        for (VmsHalSubscriberListener listener : mSubscriberListeners) {
-            listener.onDataMessage(vmsLayer, publisherId, payload);
-        }
-    }
-
-    /**
-     * Subscribe message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Layer id.
-     * <li>Layer version.
-     * <li>Layer subtype.
-     * </ul>
-     */
-    private void handleSubscribeEvent(List<Integer> integerValues) {
-        VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
-        if (DBG) {
-            Log.d(TAG, "Handling a subscribe event for Layer: " + vmsLayer);
-        }
-        addHalSubscription(vmsLayer);
-    }
-
-    /**
-     * Subscribe message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Layer id.
-     * <li>Layer version.
-     * <li>Layer subtype.
-     * <li>Publisher ID
-     * </ul>
-     */
-    private void handleSubscribeToPublisherEvent(List<Integer> integerValues) {
-        VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
-        if (DBG) {
-            Log.d(TAG, "Handling a subscribe event for Layer: " + vmsLayer);
-        }
-        int publisherId =
-                integerValues.get(VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.PUBLISHER_ID);
-        addHalSubscriptionToPublisher(vmsLayer, publisherId);
-    }
-
-    /**
-     * Unsubscribe message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Layer id.
-     * <li>Layer version.
-     * </ul>
-     */
-    private void handleUnsubscribeEvent(List<Integer> integerValues) {
-        VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
-        if (DBG) {
-            Log.d(TAG, "Handling an unsubscribe event for Layer: " + vmsLayer);
-        }
-        removeHalSubscription(vmsLayer);
-    }
-
-    /**
-     * Unsubscribe message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Layer id.
-     * <li>Layer version.
-     * </ul>
-     */
-    private void handleUnsubscribeFromPublisherEvent(List<Integer> integerValues) {
-        VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
-        int publisherId =
-                integerValues.get(VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.PUBLISHER_ID);
-        if (DBG) {
-            Log.d(TAG, "Handling an unsubscribe event for Layer: " + vmsLayer);
-        }
-        removeHalSubscriptionFromPublisher(vmsLayer, publisherId);
-    }
-
-    private static int NUM_INTEGERS_IN_VMS_LAYER = 3;
-
-    private VmsLayer parseVmsLayerFromIndex(List<Integer> integerValues, int index) {
-        int layerType = integerValues.get(index++);
-        int layerSutype = integerValues.get(index++);
-        int layerVersion = integerValues.get(index++);
-        return new VmsLayer(layerType, layerSutype, layerVersion);
-    }
-
-    /**
-     * Offering message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Publisher ID.
-     * <li>Number of offerings.
-     * <li>Each offering consists of:
-     * <ul>
-     * <li>Layer id.
-     * <li>Layer version.
-     * <li>Number of layer dependencies.
-     * <li>Layer type/subtype/version.
-     * </ul>
-     * </ul>
-     */
-    private void handleOfferingEvent(List<Integer> integerValues) {
-        int publisherId = integerValues.get(VmsOfferingMessageIntegerValuesIndex.PUBLISHER_ID);
-        int numLayersDependencies =
-                integerValues.get(
-                        VmsOfferingMessageIntegerValuesIndex.NUMBER_OF_OFFERS);
-        int idx = VmsOfferingMessageIntegerValuesIndex.OFFERING_START;
-
-        Set<VmsLayerDependency> offeredLayers = new HashSet<>();
-
-        // An offering is layerId, LayerVersion, LayerType, NumDeps, <LayerId, LayerVersion> X NumDeps.
-        for (int i = 0; i < numLayersDependencies; i++) {
-            VmsLayer offeredLayer = parseVmsLayerFromIndex(integerValues, idx);
-            idx += NUM_INTEGERS_IN_VMS_LAYER;
-
-            int numDependenciesForLayer = integerValues.get(idx++);
-            if (numDependenciesForLayer == 0) {
-                offeredLayers.add(new VmsLayerDependency(offeredLayer));
-            } else {
-                Set<VmsLayer> dependencies = new HashSet<>();
-
-                for (int j = 0; j < numDependenciesForLayer; j++) {
-                    VmsLayer dependantLayer = parseVmsLayerFromIndex(integerValues, idx);
-                    idx += NUM_INTEGERS_IN_VMS_LAYER;
-                    dependencies.add(dependantLayer);
-                }
-                offeredLayers.add(new VmsLayerDependency(offeredLayer, dependencies));
-            }
-        }
-        // Store the HAL offering.
-        VmsLayersOffering offering = new VmsLayersOffering(offeredLayers, publisherId);
-        synchronized (mLock) {
-            updateOffering(mHalPublisherToken, offering);
-            VmsOperationRecorder.get().setHalPublisherLayersOffering(offering);
-        }
-    }
-
-    /**
-     * Availability message format:
-     * <ul>
-     * <li>Message type.
-     * <li>Number of layers.
-     * <li>Layer type/subtype/version.
-     * </ul>
-     */
-    private void handleHalAvailabilityRequestEvent() {
-        synchronized (mLock) {
-            Collection<VmsAssociatedLayer> availableLayers = mAvailableLayers.getAvailableLayers();
-            VehiclePropValue vehiclePropertyValue =
-                    toAvailabilityUpdateVehiclePropValue(
-                            availableLayers,
-                            VmsMessageType.AVAILABILITY_RESPONSE);
-
-            setPropertyValue(vehiclePropertyValue);
-        }
-    }
-
-    /**
-     * VmsSubscriptionRequestFormat:
-     * <ul>
-     * <li>Message type.
-     * </ul>
-     * <p>
-     * VmsSubscriptionResponseFormat:
-     * <ul>
-     * <li>Message type.
-     * <li>Sequence number.
-     * <li>Number of layers.
-     * <li>Layer type/subtype/version.
-     * </ul>
-     */
-    private void handleSubscriptionRequestEvent() {
-        VmsSubscriptionState subscription = getSubscriptionState();
-        VehiclePropValue vehicleProp =
-                toTypedVmsVehiclePropValue(VmsMessageType.SUBSCRIPTIONS_RESPONSE);
-        VehiclePropValue.RawValue v = vehicleProp.value;
-        v.int32Values.add(subscription.getSequenceNumber());
-        Set<VmsLayer> layers = subscription.getLayers();
-        v.int32Values.add(layers.size());
-
-        //TODO(asafro): get the real number of associated layers in the subscriptions
-        //              state and send the associated layers themselves.
-        v.int32Values.add(0);
-
-        for (VmsLayer layer : layers) {
-            v.int32Values.add(layer.getType());
-            v.int32Values.add(layer.getSubtype());
-            v.int32Values.add(layer.getVersion());
-        }
-        setPropertyValue(vehicleProp);
-    }
-
-    private void updateOffering(IBinder publisherToken, VmsLayersOffering offering) {
-        Set<VmsAssociatedLayer> availableLayers = Collections.EMPTY_SET;
-        synchronized (mLock) {
-            mOfferings.put(publisherToken, offering);
-
-            // Update layers availability.
-            mAvailableLayers.setPublishersOffering(mOfferings.values());
-
-            availableLayers = mAvailableLayers.getAvailableLayers();
-        }
-        notifyOfAvailabilityChange(availableLayers);
-    }
-
-    @Override
-    public void dump(PrintWriter writer) {
-        writer.println(TAG);
-        writer.println("VmsProperty " + (mIsSupported ? "" : "not") + " supported.");
-    }
-
-    /**
-     * Updates the VMS HAL property with the given value.
-     *
-     * @param layer          layer data to update the hal property.
-     * @param hasSubscribers if it is a subscribe or unsubscribe message.
-     * @return true if the call to the HAL to update the property was successful.
-     */
-    public boolean setSubscriptionRequest(VmsLayer layer, boolean hasSubscribers) {
-        VehiclePropValue vehiclePropertyValue = toTypedVmsVehiclePropValueWithLayer(
-                hasSubscribers ? VmsMessageType.SUBSCRIBE : VmsMessageType.UNSUBSCRIBE, layer);
-        return setPropertyValue(vehiclePropertyValue);
-    }
-
-    public boolean setSubscriptionToPublisherRequest(VmsLayer layer,
-                                                     int publisherId,
-                                                     boolean hasSubscribers) {
-        VehiclePropValue vehiclePropertyValue = toTypedVmsVehiclePropValueWithLayer(
-                hasSubscribers ?
-                        VmsMessageType.SUBSCRIBE_TO_PUBLISHER :
-                        VmsMessageType.UNSUBSCRIBE_TO_PUBLISHER, layer);
-        vehiclePropertyValue.value.int32Values.add(publisherId);
-        return setPropertyValue(vehiclePropertyValue);
-    }
-
-    public boolean setDataMessage(VmsLayer layer, byte[] payload) {
-        VehiclePropValue vehiclePropertyValue =
-                toTypedVmsVehiclePropValueWithLayer(VmsMessageType.DATA, layer);
-        VehiclePropValue.RawValue v = vehiclePropertyValue.value;
-        v.bytes.ensureCapacity(payload.length);
-        for (byte b : payload) {
-            v.bytes.add(b);
-        }
-        return setPropertyValue(vehiclePropertyValue);
-    }
-
-    public boolean notifyAvailabilityChangeToHal(Collection<VmsAssociatedLayer> availableLayers) {
-        VehiclePropValue vehiclePropertyValue =
-                toAvailabilityUpdateVehiclePropValue(
-                        availableLayers,
-                        VmsMessageType.AVAILABILITY_CHANGE);
-
-        return setPropertyValue(vehiclePropertyValue);
-    }
-
-    public boolean setPropertyValue(VehiclePropValue vehiclePropertyValue) {
-        try {
-            mVehicleHal.set(vehiclePropertyValue);
-            return true;
-        } catch (PropertyTimeoutException e) {
-            Log.e(CarLog.TAG_PROPERTY, "set, property not ready 0x" + toHexString(HAL_PROPERTY_ID));
-        }
-        return false;
-    }
-
-    private static VehiclePropValue toTypedVmsVehiclePropValue(int messageType) {
-        VehiclePropValue vehicleProp = new VehiclePropValue();
-        vehicleProp.prop = HAL_PROPERTY_ID;
-        vehicleProp.areaId = VehicleAreaType.VEHICLE_AREA_TYPE_NONE;
-        VehiclePropValue.RawValue v = vehicleProp.value;
-
-        v.int32Values.add(messageType);
-        return vehicleProp;
-    }
-
-    /**
-     * Creates a {@link VehiclePropValue}
-     */
-    private static VehiclePropValue toTypedVmsVehiclePropValueWithLayer(
-            int messageType, VmsLayer layer) {
-        VehiclePropValue vehicleProp = toTypedVmsVehiclePropValue(messageType);
-        VehiclePropValue.RawValue v = vehicleProp.value;
-        v.int32Values.add(layer.getType());
-        v.int32Values.add(layer.getSubtype());
-        v.int32Values.add(layer.getVersion());
-        return vehicleProp;
-    }
-
-    private static VehiclePropValue toAvailabilityUpdateVehiclePropValue(
-            Collection<VmsAssociatedLayer> availableAssociatedLayers, int messageType) {
-
-        if (!AVAILABILITY_MESSAGE_TYPES.contains(messageType)) {
-            throw new IllegalArgumentException("Unsupported availability type: " + messageType);
-        }
-        VehiclePropValue vehicleProp =
-                toTypedVmsVehiclePropValue(messageType);
-        populateAvailabilityPropValueFields(availableAssociatedLayers, vehicleProp);
-        return vehicleProp;
-
-    }
-
-    private static void populateAvailabilityPropValueFields(
-            Collection<VmsAssociatedLayer> availableAssociatedLayers,
-            VehiclePropValue vehicleProp) {
-        VehiclePropValue.RawValue v = vehicleProp.value;
-        int numLayers = availableAssociatedLayers.size();
-        v.int32Values.add(numLayers);
-        for (VmsAssociatedLayer layer : availableAssociatedLayers) {
-            v.int32Values.add(layer.getVmsLayer().getType());
-            v.int32Values.add(layer.getVmsLayer().getSubtype());
-            v.int32Values.add(layer.getVmsLayer().getVersion());
-            v.int32Values.add(layer.getPublisherIds().size());
-            for (int publisherId : layer.getPublisherIds()) {
-                v.int32Values.add(publisherId);
-            }
-        }
-    }
-}
diff --git a/tests/VmsPublisherClientSample/Android.mk b/tests/VmsPublisherClientSample/Android.mk
deleted file mode 100644
index 2aa6c40..0000000
--- a/tests/VmsPublisherClientSample/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2017 The Android Open Source 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.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := VmsPublisherClientSample
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_CERTIFICATE := testkey
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/VmsPublisherClientSample/AndroidManifest.xml b/tests/VmsPublisherClientSample/AndroidManifest.xml
deleted file mode 100644
index fdc1a31..0000000
--- a/tests/VmsPublisherClientSample/AndroidManifest.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.google.android.car.vms.publisher">
-
-    <uses-permission android:name="android.car.permission.VMS_PUBLISHER" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-    <uses-permission android:name="android.permission.CAMERA"/>
-
-    <uses-sdk android:minSdkVersion="25" android:targetSdkVersion='25'/>
-
-    <application android:label="@string/app_name"
-                 android:icon="@mipmap/ic_launcher"
-                 android:directBootAware="true">
-        <service android:name=".VmsPublisherClientSampleService"
-                 android:exported="true"
-                 android:singleUser="true">
-        </service>
-    </application>
-</manifest>
diff --git a/tests/VmsPublisherClientSample/res/mipmap-hdpi/ic_launcher.png b/tests/VmsPublisherClientSample/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/tests/VmsPublisherClientSample/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsPublisherClientSample/res/mipmap-mdpi/ic_launcher.png b/tests/VmsPublisherClientSample/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/tests/VmsPublisherClientSample/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsPublisherClientSample/res/mipmap-xhdpi/ic_launcher.png b/tests/VmsPublisherClientSample/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/tests/VmsPublisherClientSample/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsPublisherClientSample/res/mipmap-xxhdpi/ic_launcher.png b/tests/VmsPublisherClientSample/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/tests/VmsPublisherClientSample/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsPublisherClientSample/res/mipmap-xxxhdpi/ic_launcher.png b/tests/VmsPublisherClientSample/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/tests/VmsPublisherClientSample/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsPublisherClientSample/res/values/strings.xml b/tests/VmsPublisherClientSample/res/values/strings.xml
deleted file mode 100644
index df8bf05..0000000
--- a/tests/VmsPublisherClientSample/res/values/strings.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source 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>
-  <string name="app_name">VmsPublisherClientSample</string>
-</resources>
diff --git a/tests/VmsPublisherClientSample/src/com/google/android/car/vms/publisher/VmsPublisherClientSampleService.java b/tests/VmsPublisherClientSample/src/com/google/android/car/vms/publisher/VmsPublisherClientSampleService.java
deleted file mode 100644
index e235f1e..0000000
--- a/tests/VmsPublisherClientSample/src/com/google/android/car/vms/publisher/VmsPublisherClientSampleService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.google.android.car.vms.publisher;
-
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsPublisherClientService;
-import android.car.vms.VmsSubscriptionState;
-import android.os.Handler;
-import android.os.Message;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * This service is launched during the initialization of the VMS publisher service.
- * Once onVmsPublisherServiceReady is invoked, it starts publishing a single byte every second.
- */
-public class VmsPublisherClientSampleService extends VmsPublisherClientService {
-    public static final int PUBLISH_EVENT = 0;
-    public static final VmsLayer TEST_LAYER = new VmsLayer(0, 0, 0);
-    public static final int PUBLISHER_ID = 1;
-
-    private byte mCounter = 0;
-    private AtomicBoolean mInitialized = new AtomicBoolean(false);
-
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == PUBLISH_EVENT && mInitialized.get()) {
-                periodicPublish();
-            }
-        }
-    };
-
-    /**
-     * Notifies that the publisher services are ready to be used: {@link #publish(VmsLayer, byte[])}
-     * and {@link #getSubscriptions()}.
-     */
-    @Override
-    public void onVmsPublisherServiceReady() {
-        VmsSubscriptionState subscriptionState = getSubscriptions();
-        onVmsSubscriptionChange(subscriptionState);
-    }
-
-    @Override
-    public void onVmsSubscriptionChange(VmsSubscriptionState subscriptionState) {
-        if (mInitialized.compareAndSet(false, true)) {
-            for (VmsLayer layer : subscriptionState.getLayers()) {
-                if (layer.equals(TEST_LAYER)) {
-                    mHandler.sendEmptyMessage(PUBLISH_EVENT);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mInitialized.set(false);
-        mHandler.removeMessages(PUBLISH_EVENT);
-    }
-
-    private void periodicPublish() {
-        publish(TEST_LAYER, PUBLISHER_ID, new byte[]{mCounter});
-        ++mCounter;
-        mHandler.sendEmptyMessageDelayed(PUBLISH_EVENT, 1000);
-    }
-}
diff --git a/tests/VmsSubscriberClientSample/Android.mk b/tests/VmsSubscriberClientSample/Android.mk
deleted file mode 100644
index f59e267..0000000
--- a/tests/VmsSubscriberClientSample/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2017 The Android Open Source 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.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := VmsSubscriberClientSample
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_CERTIFICATE := platform
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-include packages/services/Car/car-support-lib/car-support.mk
-
-include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/VmsSubscriberClientSample/AndroidManifest.xml b/tests/VmsSubscriberClientSample/AndroidManifest.xml
deleted file mode 100644
index bc798d7..0000000
--- a/tests/VmsSubscriberClientSample/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
-          package="com.google.android.car.vms.subscriber"
-          android:sharedUserId="android.uid.system">
-    <uses-sdk android:minSdkVersion="25" android:targetSdkVersion='25'/>
-
-    <application android:label="@string/app_name"
-                 android:icon="@mipmap/ic_launcher">
-        <meta-data
-            android:name="android.car.application"
-            android:resource="@xml/automotive_app_desc"/>
-        <activity android:name=".VmsSubscriberClientSampleActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
\ No newline at end of file
diff --git a/tests/VmsSubscriberClientSample/res/layout/activity_main.xml b/tests/VmsSubscriberClientSample/res/layout/activity_main.xml
deleted file mode 100644
index ce05a4d..0000000
--- a/tests/VmsSubscriberClientSample/res/layout/activity_main.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/activity_main"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingTop="@dimen/activity_vertical_margin"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    android:paddingLeft="@dimen/activity_horizontal_margin"
-    android:paddingRight="@dimen/activity_horizontal_margin"
-    tools:context="vms.apps.android.google.com.java.myapplication.MainActivity">
-
-    <TextView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:attr/textAppearanceLarge"
-        android:text=""
-        android:id="@+id/textview"/>
-</RelativeLayout>
diff --git a/tests/VmsSubscriberClientSample/res/mipmap-hdpi/ic_launcher.png b/tests/VmsSubscriberClientSample/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/tests/VmsSubscriberClientSample/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsSubscriberClientSample/res/mipmap-mdpi/ic_launcher.png b/tests/VmsSubscriberClientSample/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/tests/VmsSubscriberClientSample/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsSubscriberClientSample/res/mipmap-xhdpi/ic_launcher.png b/tests/VmsSubscriberClientSample/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/tests/VmsSubscriberClientSample/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsSubscriberClientSample/res/mipmap-xxhdpi/ic_launcher.png b/tests/VmsSubscriberClientSample/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/tests/VmsSubscriberClientSample/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsSubscriberClientSample/res/mipmap-xxxhdpi/ic_launcher.png b/tests/VmsSubscriberClientSample/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/tests/VmsSubscriberClientSample/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/VmsSubscriberClientSample/res/values-w820dp/dimens.xml b/tests/VmsSubscriberClientSample/res/values-w820dp/dimens.xml
deleted file mode 100644
index 308a194..0000000
--- a/tests/VmsSubscriberClientSample/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-  <!-- Example customization of dimensions originally defined in res/values/dimens.xml
-         (such as screen margins) for screens with more than 820dp of available width. This
-         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
-  <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/tests/VmsSubscriberClientSample/res/values/colors.xml b/tests/VmsSubscriberClientSample/res/values/colors.xml
deleted file mode 100644
index 5a077b3..0000000
--- a/tests/VmsSubscriberClientSample/res/values/colors.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-  <color name="colorPrimary">#3F51B5</color>
-  <color name="colorPrimaryDark">#303F9F</color>
-  <color name="colorAccent">#FF4081</color>
-</resources>
diff --git a/tests/VmsSubscriberClientSample/res/values/dimens.xml b/tests/VmsSubscriberClientSample/res/values/dimens.xml
deleted file mode 100644
index acf94cc..0000000
--- a/tests/VmsSubscriberClientSample/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
-  <!-- Default screen margins, per the Android Design guidelines. -->
-  <dimen name="activity_horizontal_margin">16dp</dimen>
-  <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/tests/VmsSubscriberClientSample/res/values/strings.xml b/tests/VmsSubscriberClientSample/res/values/strings.xml
deleted file mode 100644
index 24df55e..0000000
--- a/tests/VmsSubscriberClientSample/res/values/strings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<resources>
-  <string name="app_name">VmsSubscriberClientSample</string>
-</resources>
diff --git a/tests/VmsSubscriberClientSample/res/values/styles.xml b/tests/VmsSubscriberClientSample/res/values/styles.xml
deleted file mode 100644
index a7a0615..0000000
--- a/tests/VmsSubscriberClientSample/res/values/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<resources>
-
-  <!-- Base application theme. -->
-  <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
-    <!-- Customize your theme here. -->
-  </style>
-
-</resources>
diff --git a/tests/VmsSubscriberClientSample/res/xml/automotive_app_desc.xml b/tests/VmsSubscriberClientSample/res/xml/automotive_app_desc.xml
deleted file mode 100644
index b10ddd0..0000000
--- a/tests/VmsSubscriberClientSample/res/xml/automotive_app_desc.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source 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.
--->
-<automotiveApp>
-    <uses name="service" />
-    <uses name="projection" />
-    <uses name="activity" class="com.google.android.car.vms.subscriber.VmsSubscriberClientSampleActivity" />
-</automotiveApp>
diff --git a/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java b/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java
deleted file mode 100644
index 3ac0707..0000000
--- a/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.google.android.car.vms.subscriber;
-
-import android.app.Activity;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsSubscriberManager;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
-import android.util.Log;
-import android.widget.TextView;
-
-import java.util.List;
-
-/**
- * Connects to the Car service during onCreate. CarConnectionCallback.onConnected is invoked when
- * the connection is ready. Then, it subscribes to a VMS layer/version and updates the TextView when
- * a message is received.
- */
-public class VmsSubscriberClientSampleActivity extends Activity {
-    private static final String TAG = "VmsSampleActivity";
-    // The layer id and version should match the ones defined in
-    // com.google.android.car.vms.publisher.VmsPublisherClientSampleService
-    public static final VmsLayer TEST_LAYER = new VmsLayer(0, 0, 0);
-
-    private Car mCarApi;
-    private TextView mTextView;
-    private VmsSubscriberManager mVmsSubscriberManager;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
-        mTextView = (TextView) findViewById(R.id.textview);
-        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
-            mCarApi = Car.createCar(this, mCarConnectionCallback);
-            mCarApi.connect();
-        } else {
-            Log.d(TAG, "No automotive feature.");
-        }
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        if (mCarApi != null) {
-            mCarApi.disconnect();
-        }
-        Log.i(TAG, "onDestroy");
-    }
-
-    private final CarConnectionCallback mCarConnectionCallback = new CarConnectionCallback() {
-        @Override
-        public void onConnected(Car car) {
-            Log.d(TAG, "Connected to Car Service");
-            mVmsSubscriberManager = getVmsSubscriberManager();
-            configureSubscriptions(mVmsSubscriberManager);
-        }
-
-        @Override
-        public void onDisconnected(Car car) {
-            Log.d(TAG, "Disconnect from Car Service");
-        }
-
-        private VmsSubscriberManager getVmsSubscriberManager() {
-            try {
-                return (VmsSubscriberManager) mCarApi.getCarManager(
-                        android.car.Car.VMS_SUBSCRIBER_SERVICE);
-            } catch (android.support.car.CarNotConnectedException e) {
-                Log.e(TAG, "Car is not connected!", e);
-            }
-            return null;
-        }
-
-        private void configureSubscriptions(VmsSubscriberManager vmsSubscriberManager) {
-            try {
-                vmsSubscriberManager.registerClientCallback(mClientCallback);
-                vmsSubscriberManager.subscribe(TEST_LAYER);
-            } catch (android.car.CarNotConnectedException e) {
-                Log.e(TAG, "Car is not connected!", e);
-            }
-        }
-    };
-
-    private final VmsSubscriberManager.VmsSubscriberClientCallback mClientCallback =
-            new VmsSubscriberManager.VmsSubscriberClientCallback() {
-                @Override
-                public void onVmsMessageReceived(VmsLayer layer, byte[] payload) {
-                    mTextView.setText(String.valueOf(payload[0]));
-                }
-
-                @Override
-                public void onLayersAvailabilityChanged(List<VmsLayer> availableLayers) {
-                    mTextView.setText(String.valueOf(availableLayers));
-                }
-            };
-}
diff --git a/tests/carservice_test/AndroidManifest.xml b/tests/carservice_test/AndroidManifest.xml
index 6f7ba34..6a1e2bf 100644
--- a/tests/carservice_test/AndroidManifest.xml
+++ b/tests/carservice_test/AndroidManifest.xml
@@ -43,9 +43,5 @@
             android:process="com.android.car.carservicetest.activityC"/>
         <activity android:name="com.android.car.test.SystemActivityMonitoringServiceTest$BlockingActivity"
             android:taskAffinity="com.android.car.carservicetest.block"/>
-        <service android:name=".SimpleVmsPublisherClientService"
-                 android:exported="true"
-        />
-        <service android:name=".VmsPublisherClientMockService" android:exported="true" />
     </application>
 </manifest>
diff --git a/tests/carservice_test/src/com/android/car/test/SimpleVmsPublisherClientService.java b/tests/carservice_test/src/com/android/car/test/SimpleVmsPublisherClientService.java
deleted file mode 100644
index c3c15f5..0000000
--- a/tests/carservice_test/src/com/android/car/test/SimpleVmsPublisherClientService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsPublisherClientService;
-import android.car.vms.VmsSubscriptionState;
-
-/**
- * This service is launched during the tests in VmsPublisherClientServiceTest.
- */
-@FutureFeature
-public class SimpleVmsPublisherClientService extends VmsPublisherClientService {
-    @Override
-    public void onVmsSubscriptionChange(VmsSubscriptionState subscriptionState) {
-
-    }
-
-    @Override
-    public void onVmsPublisherServiceReady() {
-        // Publish a property that is going to be verified in the test.
-        publish(VmsPublisherClientServiceTest.MOCK_PUBLISHER_LAYER,
-                VmsPublisherClientServiceTest.MOCK_PUBLISHER_ID,
-                VmsPublisherClientServiceTest.PAYLOAD);
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/test/VmsHalServiceSubscriptionEventTest.java b/tests/carservice_test/src/com/android/car/test/VmsHalServiceSubscriptionEventTest.java
deleted file mode 100644
index cad3086..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsHalServiceSubscriptionEventTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import static org.junit.Assume.assumeTrue;
-
-import android.car.VehicleAreaType;
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsLayer;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
-import android.hardware.automotive.vehicle.V2_0.VmsSubscriptionsStateIntegerValuesIndex;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import com.android.car.vehiclehal.VehiclePropValueBuilder;
-import com.android.car.vehiclehal.test.MockedVehicleHal;
-import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@FutureFeature
-@MediumTest
-public class VmsHalServiceSubscriptionEventTest extends MockedCarTestBase {
-    private static final String TAG = "VmsHalServiceTest";
-
-    private HalHandler mHalHandler;
-    private MockedVehicleHal mHal;
-    // Used to block until the HAL property is updated in HalHandler.onPropertySet.
-    private Semaphore mHalHandlerSemaphore;
-
-    @Override
-    protected synchronized void configureMockedHal() {
-        mHalHandler = new HalHandler();
-        addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler)
-                .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE)
-                .setAccess(VehiclePropertyAccess.READ_WRITE)
-                .setSupportedAreas(VehicleAreaType.VEHICLE_AREA_TYPE_NONE);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.setUp();
-        mHal = getMockedVehicleHal();
-        mHalHandlerSemaphore = new Semaphore(0);
-    }
-
-    @Override
-    protected synchronized void tearDown() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.tearDown();
-    }
-
-    public void testEmptySubscriptions() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        List<VmsLayer> layers = new ArrayList<>();
-        subscriptionTestLogic(layers);
-    }
-
-    public void testOneSubscription() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        List<VmsLayer> layers = Arrays.asList(new VmsLayer(8, 0, 3));
-        subscriptionTestLogic(layers);
-    }
-
-    public void testManySubscriptions() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        List<VmsLayer> layers = Arrays.asList(
-                new VmsLayer(8, 1, 3),
-                new VmsLayer(5, 2, 1),
-                new VmsLayer(3, 3, 9),
-                new VmsLayer(2, 4, 7),
-                new VmsLayer(9, 5, 3));
-        subscriptionTestLogic(layers);
-    }
-
-    /**
-     * First, it subscribes to the given layers. Then it validates that a subscription request
-     * responds with the same layers.
-     */
-    private void subscriptionTestLogic(List<VmsLayer> layers) throws Exception {
-        for (VmsLayer layer : layers) {
-            subscribeViaHal(layer);
-        }
-        // Send subscription request.
-        mHal.injectEvent(createHalSubscriptionRequest());
-        // Wait for response.
-        assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        // Validate response.
-        ArrayList<Integer> v = mHalHandler.getValues();
-        int messageType = v.get(VmsSubscriptionsStateIntegerValuesIndex.MESSAGE_TYPE);
-        int sequenceNumber = v.get(VmsSubscriptionsStateIntegerValuesIndex.SEQUENCE_NUMBER);
-        int numberLayers = v.get(VmsSubscriptionsStateIntegerValuesIndex.NUMBER_OF_LAYERS);
-        assertEquals(VmsMessageType.SUBSCRIPTIONS_RESPONSE, messageType);
-        //TODO(asafro): This assertion makes no sense. need to fix.
-        //assertEquals(layers.size(), sequenceNumber);
-        assertEquals(layers.size(), numberLayers);
-        List<VmsLayer> receivedLayers = new ArrayList<>();
-        int start = VmsSubscriptionsStateIntegerValuesIndex.SUBSCRIPTIONS_START;
-        int end = VmsSubscriptionsStateIntegerValuesIndex.SUBSCRIPTIONS_START + 3 * numberLayers;
-        while (start < end) {
-            int type = v.get(start++);
-            int subtype = v.get(start++);
-            int version = v.get(start++);
-            receivedLayers.add(new VmsLayer(type, subtype, version));
-        }
-        assertEquals(new HashSet<>(layers), new HashSet<>(receivedLayers));
-    }
-
-    /**
-     * Subscribes to a layer, waits for the event to propagate back to the HAL layer and validates
-     * the propagated message.
-     */
-    private void subscribeViaHal(VmsLayer layer) throws Exception {
-        // Send subscribe request.
-        mHal.injectEvent(createHalSubscribeRequest(layer));
-        // Wait for response.
-        assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        // Validate response.
-        ArrayList<Integer> v = mHalHandler.getValues();
-        int messsageType = v.get(VmsMessageWithLayerIntegerValuesIndex.MESSAGE_TYPE);
-        int layerId = v.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_TYPE);
-        int layerVersion = v.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_VERSION);
-        int fused = v.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_SUBTYPE);
-        assertEquals(VmsMessageType.SUBSCRIBE, messsageType);
-        assertEquals(layer.getType(), layerId);
-        assertEquals(layer.getVersion(), layerVersion);
-    }
-
-    private VehiclePropValue createHalSubscribeRequest(VmsLayer layer) {
-        return VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .addIntValue(VmsMessageType.SUBSCRIBE)
-                .addIntValue(layer.getType())
-                .addIntValue(layer.getSubtype())
-                .addIntValue(layer.getVersion())
-                .build();
-    }
-
-    private VehiclePropValue createHalSubscriptionRequest() {
-        return VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .addIntValue(VmsMessageType.SUBSCRIPTIONS_REQUEST)
-                .build();
-    }
-
-    private class HalHandler implements VehicleHalPropertyHandler {
-        private ArrayList<Integer> mValues;
-
-        @Override
-        public synchronized void onPropertySet(VehiclePropValue value) {
-            mValues = value.value.int32Values;
-            mHalHandlerSemaphore.release();
-        }
-
-        public ArrayList<Integer> getValues() {
-            return mValues;
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/carservice_test/src/com/android/car/test/VmsOperationRecorderTest.java b/tests/carservice_test/src/com/android/car/test/VmsOperationRecorderTest.java
deleted file mode 100644
index a00ec68..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsOperationRecorderTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsLayerDependency;
-import android.car.vms.VmsLayersOffering;
-import android.car.vms.VmsOperationRecorder;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import junit.framework.TestCase;
-
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-
-@MediumTest
-public class VmsOperationRecorderTest extends TestCase {
-
-    /**
-     * Capture messages that VmsOperationRecorder.Writer would normally pass to Log.d(...).
-     */
-    class TestWriter extends VmsOperationRecorder.Writer {
-        public String mMsg;
-
-        @Override
-        public boolean isEnabled() {
-            return true;
-        }
-
-        @Override
-        public void write(String msg) {
-            super.write(msg);
-            mMsg = msg;
-        }
-    }
-
-    private TestWriter mWriter;
-    private VmsOperationRecorder mRecorder;
-
-    private static final VmsLayer layer1 = new VmsLayer(1, 3, 2);
-    private static final VmsLayer layer2 = new VmsLayer(2, 4, 3);
-    private static final VmsLayer layer3 = new VmsLayer(3, 5, 4);
-
-    private static final VmsLayerDependency layerDependency1 = new VmsLayerDependency(layer3);
-    private static final VmsLayerDependency layerDependency2 = new VmsLayerDependency(layer1,
-            new HashSet<VmsLayer>(Arrays.asList(layer2, layer3)));
-
-    private static final VmsLayersOffering layersOffering0 = new VmsLayersOffering(
-            new HashSet<VmsLayerDependency>(), 66);
-    private static final VmsLayersOffering layersOffering1 = new VmsLayersOffering(
-            new HashSet<>(Arrays.asList(layerDependency1)), 66);
-    private static final VmsLayersOffering layersOffering2 = new VmsLayersOffering(
-            new HashSet<>(Arrays.asList(layerDependency1, layerDependency2)), 66);
-
-    public void setUp() {
-        mWriter = new TestWriter();
-        mRecorder = new VmsOperationRecorder(mWriter);
-    }
-
-    public void testSubscribe() throws Exception {
-        mRecorder.subscribe(layer1);
-        assertJsonMsgEquals("{'subscribe':{'layer':{'type':1,'subtype':3,'version':2}}}");
-    }
-
-    public void testUnsubscribe() throws Exception {
-        mRecorder.unsubscribe(layer1);
-        assertJsonMsgEquals("{'unsubscribe':{'layer':{'type':1,'subtype':3,'version':2}}}");
-    }
-
-    public void testStartMonitoring() throws Exception {
-        mRecorder.startMonitoring();
-        assertJsonMsgEquals("{'startMonitoring':{}}");
-    }
-
-    public void testStopMonitoring() throws Exception {
-        mRecorder.stopMonitoring();
-        assertJsonMsgEquals("{'stopMonitoring':{}}");
-    }
-
-    public void testSetLayersOffering0() throws Exception {
-        mRecorder.setLayersOffering(layersOffering0);
-        assertJsonMsgEquals("{'setLayersOffering':{}}");
-    }
-
-    public void testSetLayersOffering2() throws Exception {
-        mRecorder.setLayersOffering(layersOffering2);
-        assertJsonMsgEquals("{'setLayersOffering':{'layerDependency':["
-                + "{'layer':{'type':3,'subtype':5,'version':4}},"
-                + "{'layer':{'type':1,'subtype':3,'version':2},'dependency':["
-                + "{'type':2,'subtype':4,'version':3},{'type':3,'subtype':5,'version':4}]}"
-                + "]}}");
-    }
-
-    public void testGetPublisherId() throws Exception {
-        mRecorder.getPublisherId(9);
-        assertJsonMsgEquals("{'getPublisherId':{'publisherId':9}}");
-    }
-
-    public void testAddSubscription() throws Exception {
-        mRecorder.addSubscription(42, layer1);
-        assertJsonMsgEquals(
-                "{'addSubscription':{'sequenceNumber':42,'layer':{'type':1,'subtype':3,'version':2}}}"
-        );
-    }
-
-    public void testRemoveSubscription() throws Exception {
-        mRecorder.removeSubscription(42, layer1);
-        assertJsonMsgEquals("{'removeSubscription':"
-                + "{'sequenceNumber':42,'layer':{'type':1,'subtype':3,'version':2}}}");
-    }
-
-    public void testAddPromiscuousSubscription() throws Exception {
-        mRecorder.addPromiscuousSubscription(42);
-        assertJsonMsgEquals("{'addPromiscuousSubscription':{'sequenceNumber':42}}");
-    }
-
-    public void testRemovePromiscuousSubscription() throws Exception {
-        mRecorder.removePromiscuousSubscription(42);
-        assertJsonMsgEquals("{'removePromiscuousSubscription':{'sequenceNumber':42}}");
-    }
-
-    public void testAddHalSubscription() throws Exception {
-        mRecorder.addHalSubscription(42, layer1);
-        assertJsonMsgEquals("{'addHalSubscription':"
-                + "{'sequenceNumber':42,'layer':{'type':1,'subtype':3,'version':2}}}");
-    }
-
-    public void testRemoveHalSubscription() throws Exception {
-        mRecorder.removeHalSubscription(42, layer1);
-        assertJsonMsgEquals("{'removeHalSubscription':"
-                + "{'sequenceNumber':42,'layer':{'type':1,'subtype':3,'version':2}}}");
-    }
-
-    public void testSetPublisherLayersOffering() throws Exception {
-        mRecorder.setPublisherLayersOffering(layersOffering1);
-        assertJsonMsgEquals("{'setPublisherLayersOffering':{'layerDependency':["
-                + "{'layer':{'type':3,'subtype':5,'version':4}}]}}");
-    }
-
-    public void testSetHalPublisherLayersOffering() throws Exception {
-        mRecorder.setHalPublisherLayersOffering(layersOffering1);
-        assertJsonMsgEquals("{'setHalPublisherLayersOffering':{'layerDependency':["
-                + "{'layer':{'type':3,'subtype':5,'version':4}}]}}");
-    }
-
-    public void testSubscribeToPublisher() throws Exception {
-        mRecorder.subscribe(layer1, 99);
-        assertJsonMsgEquals(
-                "{'subscribe':{'publisherId':99, 'layer':{'type':1,'subtype':3,'version':2}}}");
-    }
-
-    public void testUnsubscribeToPublisher() throws Exception {
-        mRecorder.unsubscribe(layer1, 99);
-        assertJsonMsgEquals(
-                "{'unsubscribe':{'publisherId':99, 'layer':{'type':1,'subtype':3,'version':2}}}}");
-    }
-
-    private void assertJsonMsgEquals(String expectJson) throws Exception {
-        // Escaping double quotes in a JSON string is really noisy. The test data uses single
-        // quotes instead, which gets replaced here.
-        JSONObject expect = new JSONObject(expectJson.replace("'", "\""));
-        JSONObject got = new JSONObject(mWriter.mMsg);
-        // Comparing the JSON strings works and is not flakey only because the JSON library
-        // generates a consistent string representation when object construction is consistent.
-        assertEquals(expect.toString(), got.toString());
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/test/VmsPublisherClientMockService.java b/tests/carservice_test/src/com/android/car/test/VmsPublisherClientMockService.java
deleted file mode 100644
index 0d5c427..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsPublisherClientMockService.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsLayerDependency;
-import android.car.vms.VmsLayersOffering;
-import android.car.vms.VmsPublisherClientService;
-import android.car.vms.VmsSubscriptionState;
-import android.util.Log;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * This service is launched during the tests in VmsPublisherSubscriberTest. It publishes a property
- * that is going to be verified in the test.
- *
- * The service makes offering for pre-defined layers which verifies availability notifications for
- * subscribers without them actively being subscribed to a layer, and also echos all the
- * subscription requests with an offering for that layer.
- * For example, without any subscription request from any client, this service will make offering
- * to layer X. If a client will subscribe later to layer Y, this service will respond with offering
- * to both layers X and Y.
- *
- * Note that the subscriber can subscribe before the publisher finishes initialization. To cover
- * both potential scenarios, this service publishes the test message in onVmsSubscriptionChange
- * and in onVmsPublisherServiceReady. See comments below.
- */
-@FutureFeature
-public class VmsPublisherClientMockService extends VmsPublisherClientService {
-    private static final String TAG = "VmsPublisherClientMockService";
-
-    @Override
-    public void onVmsSubscriptionChange(VmsSubscriptionState subscriptionState) {
-        // Case when the publisher finished initialization before the subscription request.
-        initializeMockPublisher(subscriptionState);
-    }
-
-    @Override
-    public void onVmsPublisherServiceReady() {
-        // Case when the subscription request was sent before the publisher was ready.
-        VmsSubscriptionState subscriptionState = getSubscriptions();
-        initializeMockPublisher(subscriptionState);
-    }
-
-    private void initializeMockPublisher(VmsSubscriptionState subscriptionState) {
-        Log.d(TAG, "Initializing Mock publisher");
-        int publisherId = getPublisherId(VmsPublisherSubscriberTest.PAYLOAD);
-        publishIfNeeded(subscriptionState);
-        declareOffering(subscriptionState, publisherId);
-    }
-
-    private void publishIfNeeded(VmsSubscriptionState subscriptionState) {
-        for (VmsLayer layer : subscriptionState.getLayers()) {
-            if (layer.equals(VmsPublisherSubscriberTest.LAYER)) {
-                publish(VmsPublisherSubscriberTest.LAYER,
-                        VmsPublisherSubscriberTest.EXPECTED_PUBLISHER_ID,
-                        VmsPublisherSubscriberTest.PAYLOAD);
-            }
-        }
-    }
-
-    private void declareOffering(VmsSubscriptionState subscriptionState, int publisherId) {
-        Set<VmsLayerDependency> dependencies = new HashSet<>();
-
-        // Add all layers from the subscription state.
-        for( VmsLayer layer : subscriptionState.getLayers()) {
-            dependencies.add(new VmsLayerDependency(layer));
-        }
-
-        // Add default test layers.
-        dependencies.add(new VmsLayerDependency(VmsPublisherSubscriberTest.LAYER));
-
-        VmsLayersOffering offering = new VmsLayersOffering(dependencies, publisherId);
-        setLayersOffering(offering);
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/test/VmsPublisherClientServiceTest.java b/tests/carservice_test/src/com/android/car/test/VmsPublisherClientServiceTest.java
deleted file mode 100644
index 053bab7..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsPublisherClientServiceTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import android.annotation.ArrayRes;
-import android.car.VehicleAreaType;
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsLayer;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-
-import com.android.car.R;
-import com.android.car.vehiclehal.VehiclePropValueBuilder;
-import com.android.car.vehiclehal.test.MockedVehicleHal;
-import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@FutureFeature
-@MediumTest
-public class VmsPublisherClientServiceTest extends MockedCarTestBase {
-    private static final String TAG = "VmsPublisherTest";
-    private static final int MOCK_PUBLISHER_LAYER_ID = 12;
-    private static final int MOCK_PUBLISHER_LAYER_VERSION = 34;
-    private static final int MOCK_PUBLISHER_LAYER_SUBTYPE = 56;
-    public static final int MOCK_PUBLISHER_ID = 1234;
-    public static final VmsLayer MOCK_PUBLISHER_LAYER =
-            new VmsLayer(MOCK_PUBLISHER_LAYER_ID,
-                    MOCK_PUBLISHER_LAYER_SUBTYPE,
-                    MOCK_PUBLISHER_LAYER_VERSION);
-    public static final byte[] PAYLOAD = new byte[]{1, 1, 2, 3, 5, 8, 13};
-
-    private HalHandler mHalHandler;
-    // Used to block until the HAL property is updated in HalHandler.onPropertySet.
-    private Semaphore mHalHandlerSemaphore;
-
-    @Override
-    protected synchronized void configureMockedHal() {
-        mHalHandler = new HalHandler();
-        addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler)
-                .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE)
-                .setAccess(VehiclePropertyAccess.READ_WRITE)
-                .setSupportedAreas(VehicleAreaType.VEHICLE_AREA_TYPE_NONE);
-    }
-
-    /**
-     * Creates a context with the resource vmsPublisherClients overridden. The overridden value
-     * contains the name of the test service defined also in this test package.
-     */
-    @Override
-    protected Context getCarServiceContext() throws PackageManager.NameNotFoundException {
-        Context context = getContext()
-                .createPackageContext("com.android.car", Context.CONTEXT_IGNORE_SECURITY);
-        Resources resources = new Resources(context.getAssets(),
-                context.getResources().getDisplayMetrics(),
-                context.getResources().getConfiguration()) {
-            @Override
-            public String[] getStringArray(@ArrayRes int id) throws NotFoundException {
-                if (id == R.array.vmsPublisherClients) {
-                    return new String[]{"com.android.car.test/.SimpleVmsPublisherClientService"};
-                }
-                return super.getStringArray(id);
-            }
-        };
-        ContextWrapper wrapper = new ContextWrapper(context) {
-            @Override
-            public Resources getResources() {
-                return resources;
-            }
-        };
-        return wrapper;
-    }
-
-    private VehiclePropValue getHalSubscriptionRequest() {
-        return VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .addIntValue(VmsMessageType.SUBSCRIBE)
-                .addIntValue(MOCK_PUBLISHER_LAYER_ID)
-                .addIntValue(MOCK_PUBLISHER_LAYER_SUBTYPE)
-                .addIntValue(MOCK_PUBLISHER_LAYER_VERSION)
-                .build();
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        /**
-         * First init the semaphore, setUp will start a series of events that will ultimately
-         * update the HAL layer and release this semaphore.
-         */
-        mHalHandlerSemaphore = new Semaphore(0);
-        super.setUp();
-
-        // Inject a subscribe event which simulates the HAL is subscribed to the Mock Publisher.
-        MockedVehicleHal mHal = getMockedVehicleHal();
-        mHal.injectEvent(getHalSubscriptionRequest());
-    }
-
-    @Override
-    protected synchronized void tearDown() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.tearDown();
-    }
-
-    /**
-     * The method setUp initializes all the Car services, including the VmsPublisherService.
-     * The VmsPublisherService will start and configure its list of clients. This list was
-     * overridden in the method getCarServiceContext.
-     * Therefore, only SimpleVmsPublisherClientService will be started.
-     * The service SimpleVmsPublisherClientService will publish one message, which is validated in
-     * this test.
-     */
-    public void testPublish() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        //TODO: This test is using minial synchronisation between clients.
-        //      If more complexity is added this may result in publisher
-        //      publishing before the subscriber subscribed, in which case
-        //      the semaphore will not be released.
-        assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        VehiclePropValue.RawValue rawValue = mHalHandler.getValue().value;
-        int messageType = rawValue.int32Values.get(VmsMessageWithLayerIntegerValuesIndex.MESSAGE_TYPE);
-        int layerId = rawValue.int32Values.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_TYPE);
-        int layerVersion = rawValue.int32Values.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_VERSION);
-        byte[] payload = new byte[rawValue.bytes.size()];
-        for (int i = 0; i < rawValue.bytes.size(); ++i) {
-            payload[i] = rawValue.bytes.get(i);
-        }
-        assertEquals(VmsMessageType.DATA, messageType);
-        assertEquals(MOCK_PUBLISHER_LAYER_ID, layerId);
-        assertEquals(MOCK_PUBLISHER_LAYER_VERSION, layerVersion);
-        assertTrue(Arrays.equals(PAYLOAD, payload));
-    }
-
-    private class HalHandler implements VehicleHalPropertyHandler {
-        private VehiclePropValue mValue;
-
-        @Override
-        public synchronized void onPropertySet(VehiclePropValue value) {
-            mValue = value;
-
-            // If this is the data message release the semaphone so the test can continue.
-            ArrayList<Integer> int32Values = value.value.int32Values;
-            if (int32Values.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE) ==
-                    VmsMessageType.DATA) {
-                mHalHandlerSemaphore.release();
-            }
-        }
-
-        @Override
-        public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
-            return mValue != null ? mValue : value;
-        }
-
-        @Override
-        public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
-            Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate);
-        }
-
-        @Override
-        public synchronized void onPropertyUnsubscribe(int property) {
-            Log.d(TAG, "onPropertyUnSubscribe property " + property);
-        }
-
-        public VehiclePropValue getValue() {
-            return mValue;
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/carservice_test/src/com/android/car/test/VmsPublisherPermissionsTest.java b/tests/carservice_test/src/com/android/car/test/VmsPublisherPermissionsTest.java
deleted file mode 100644
index 1d14c57..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsPublisherPermissionsTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import android.annotation.ArrayRes;
-import android.car.VehicleAreaType;
-import android.car.annotation.FutureFeature;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import com.android.car.R;
-import com.android.car.vehiclehal.VehiclePropValueBuilder;
-import com.android.car.vehiclehal.test.MockedVehicleHal;
-import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
-
-import java.util.ArrayList;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@FutureFeature
-@MediumTest
-public class VmsPublisherPermissionsTest extends MockedCarTestBase {
-    private static final String TAG = "VmsPublisherTest";
-    private static final int MOCK_PUBLISHER_LAYER_ID = 0;
-    private static final int MOCK_PUBLISHER_LAYER_VERSION = 0;
-    private static final int MOCK_PUBLISHER_LAYER_FUSION_INT_VALUE = 0;
-
-    private HalHandler mHalHandler;
-    // Used to block until the HAL property is updated in HalHandler.onPropertySet.
-    private Semaphore mHalHandlerSemaphore;
-
-    @Override
-    protected synchronized void configureMockedHal() {
-        mHalHandler = new HalHandler();
-        addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler)
-                .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE)
-                .setAccess(VehiclePropertyAccess.READ_WRITE)
-                .setSupportedAreas(VehicleAreaType.VEHICLE_AREA_TYPE_NONE);
-    }
-
-    /**
-     * Creates a context with the resource vmsPublisherClients overridden. The overridden value
-     * contains the name of the test service defined also in this test package.
-     */
-    @Override
-    protected Context getCarServiceContext() throws PackageManager.NameNotFoundException {
-        Context context = getContext()
-                .createPackageContext("com.android.car", Context.CONTEXT_IGNORE_SECURITY);
-        Resources resources = new Resources(context.getAssets(),
-                context.getResources().getDisplayMetrics(),
-                context.getResources().getConfiguration()) {
-            @Override
-            public String[] getStringArray(@ArrayRes int id) throws NotFoundException {
-                if (id == R.array.vmsPublisherClients) {
-                    return new String[]{
-                            "com.google.android.car.vms.publisher/"
-                                    + ".VmsPublisherClientSampleService"};
-                } else if (id == R.array.vmsSafePermissions) {
-                    return new String[]{"android.permission.ACCESS_FINE_LOCATION"};
-                }
-                return super.getStringArray(id);
-            }
-        };
-        ContextWrapper wrapper = new ContextWrapper(context) {
-            @Override
-            public Resources getResources() {
-                return resources;
-            }
-        };
-        return wrapper;
-    }
-
-    private VehiclePropValue getHalSubscriptionRequest() {
-        return VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .addIntValue(VmsMessageType.SUBSCRIBE)
-                .addIntValue(MOCK_PUBLISHER_LAYER_ID)
-                .addIntValue(MOCK_PUBLISHER_LAYER_VERSION)
-                .addIntValue(MOCK_PUBLISHER_LAYER_FUSION_INT_VALUE)
-                .build();
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        /**
-         * First init the semaphore, setUp will start a series of events that will ultimately
-         * update the HAL layer and release this semaphore.
-         */
-        mHalHandlerSemaphore = new Semaphore(0);
-        super.setUp();
-
-        // Inject a subscribe event which simulates the HAL is subscribed to the Sample Publisher.
-        MockedVehicleHal mHal = getMockedVehicleHal();
-        mHal.injectEvent(getHalSubscriptionRequest());
-    }
-
-    @Override
-    protected synchronized void tearDown() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.tearDown();
-    }
-
-    /**
-     * The method setUp initializes all the Car services, including the VmsPublisherService.
-     * The VmsPublisherService will start and configure its list of clients. This list was
-     * overridden in the method getCarServiceContext.
-     * Therefore, only VmsPublisherClientSampleService will be started.
-     * The service VmsPublisherClientSampleService will publish one message, which is validated in
-     * this test.
-     */
-    public void testPermissions() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        // At this point the client initialization finished. Let's validate the permissions.
-        // The VMS service is only allowed to grant ACCESS_FINE_LOCATION but not CAMERA.
-        assertTrue(
-                getContext().getPackageManager().checkPermission(
-                        "android.permission.ACCESS_FINE_LOCATION",
-                        "com.google.android.car.vms.publisher")
-                        == PackageManager.PERMISSION_GRANTED);
-        assertFalse(getContext().getPackageManager().checkPermission(
-                "android.permission.CAMERA", "com.google.android.car.vms.publisher")
-                == PackageManager.PERMISSION_GRANTED);
-    }
-
-    private class HalHandler implements VehicleHalPropertyHandler {
-        @Override
-        public synchronized void onPropertySet(VehiclePropValue value) {
-            // If this is the data message release the semaphore so the test can continue.
-            ArrayList<Integer> int32Values = value.value.int32Values;
-            if (int32Values.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE) ==
-                    VmsMessageType.DATA) {
-                mHalHandlerSemaphore.release();
-            }
-        }
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/test/VmsPublisherSubscriberTest.java b/tests/carservice_test/src/com/android/car/test/VmsPublisherSubscriberTest.java
deleted file mode 100644
index 5b387d2..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsPublisherSubscriberTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import android.annotation.ArrayRes;
-import android.car.Car;
-import android.car.VehicleAreaType;
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsSubscriberManager;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import com.android.car.vehiclehal.test.MockedVehicleHal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@FutureFeature
-@MediumTest
-public class VmsPublisherSubscriberTest extends MockedCarTestBase {
-    private static final int LAYER_ID = 88;
-    private static final int LAYER_VERSION = 19;
-    private static final int LAYER_SUBTYPE = 55;
-    private static final String TAG = "VmsPubSubTest";
-
-    // The expected publisher ID is 0 since it the expected assigned ID from the VMS core.
-    public static final int EXPECTED_PUBLISHER_ID = 0;
-    public static final VmsLayer LAYER = new VmsLayer(LAYER_ID, LAYER_SUBTYPE, LAYER_VERSION);
-    public static final VmsAssociatedLayer ASSOCIATED_LAYER =
-            new VmsAssociatedLayer(LAYER, new HashSet<>(Arrays.asList(EXPECTED_PUBLISHER_ID)));
-    public static final byte[] PAYLOAD = new byte[]{2, 3, 5, 7, 11, 13, 17};
-
-    private static final List<VmsAssociatedLayer> AVAILABLE_ASSOCIATED_LAYERS =
-            new ArrayList<>(Arrays.asList(ASSOCIATED_LAYER));
-
-
-    private static final int SUBSCRIBED_LAYER_ID = 89;
-    public static final VmsLayer SUBSCRIBED_LAYER =
-            new VmsLayer(SUBSCRIBED_LAYER_ID, LAYER_SUBTYPE, LAYER_VERSION);
-    public static final VmsAssociatedLayer ASSOCIATED_SUBSCRIBED_LAYER =
-            new VmsAssociatedLayer(SUBSCRIBED_LAYER, new HashSet<>(Arrays.asList(EXPECTED_PUBLISHER_ID)));
-    private static final List<VmsAssociatedLayer> AVAILABLE_ASSOCIATED_LAYERS_WITH_SUBSCRIBED_LAYER =
-            new ArrayList<>(Arrays.asList(ASSOCIATED_LAYER, ASSOCIATED_SUBSCRIBED_LAYER));
-
-
-    private HalHandler mHalHandler;
-    // Used to block until a value is propagated to the TestClientCallback.onVmsMessageReceived.
-    private Semaphore mSubscriberSemaphore;
-    private Semaphore mAvailabilitySemaphore;
-
-    @Override
-    protected synchronized void configureMockedHal() {
-        mHalHandler = new HalHandler();
-        addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler)
-                .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE)
-                .setAccess(VehiclePropertyAccess.READ_WRITE)
-                .setSupportedAreas(VehicleAreaType.VEHICLE_AREA_TYPE_NONE);
-    }
-
-    /**
-     * Creates a context with the resource vmsPublisherClients overridden. The overridden value
-     * contains the name of the test service defined also in this test package.
-     */
-    @Override
-    protected Context getCarServiceContext() throws PackageManager.NameNotFoundException {
-        Context context = getContext()
-                .createPackageContext("com.android.car", Context.CONTEXT_IGNORE_SECURITY);
-        Resources resources = new Resources(context.getAssets(),
-                context.getResources().getDisplayMetrics(),
-                context.getResources().getConfiguration()) {
-            @Override
-            public String[] getStringArray(@ArrayRes int id) throws NotFoundException {
-                if (id == com.android.car.R.array.vmsPublisherClients) {
-                    return new String[]{"com.android.car.test/.VmsPublisherClientMockService"};
-                }
-                return super.getStringArray(id);
-            }
-        };
-        ContextWrapper wrapper = new ContextWrapper(context) {
-            @Override
-            public Resources getResources() {
-                return resources;
-            }
-        };
-        return wrapper;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.setUp();
-        mSubscriberSemaphore = new Semaphore(0);
-        mAvailabilitySemaphore = new Semaphore(0);
-    }
-
-    @Override
-    protected synchronized void tearDown() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.tearDown();
-    }
-
-    /**
-     * The method setUp initializes all the Car services, including the VmsPublisherService.
-     * The VmsPublisherService will start and configure its list of clients. This list was
-     * overridden in the method getCarServiceContext. Therefore, only VmsPublisherClientMockService
-     * will be started. This test method subscribes to a layer and triggers
-     * VmsPublisherClientMockService.onVmsSubscriptionChange. In turn, the mock service will publish
-     * a message, which is validated in this test.
-     */
-    public void testPublisherToSubscriber() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(LAYER);
-
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertEquals(LAYER, clientCallback.getLayer());
-        assertTrue(Arrays.equals(PAYLOAD, clientCallback.getPayload()));
-    }
-
-    /**
-     * The Mock service will get a publisher ID by sending its information when it will get
-     * ServiceReady as well as on SubscriptionChange. Since clients are not notified when
-     * publishers are assigned IDs, this test waits until the availability is changed which indicates
-     * that the Mock service has gotten its ServiceReady and publisherId.
-     */
-    public void testPublisherInfo() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        // Subscribe to layer as a way to make sure the mock client completed setting the information.
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(LAYER);
-
-        assertTrue(mAvailabilitySemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-
-        byte[] info = vmsSubscriberManager.getPublisherInfo(EXPECTED_PUBLISHER_ID);
-        assertTrue(Arrays.equals(PAYLOAD, info));
-    }
-
-    /**
-     * The Mock service offers all the subscribed layers as available layers.
-     * In this test the client subscribes to a layer and verifies that it gets the
-     * notification that it is available.
-     */
-    public void testAvailabilityWithSubscription() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-            Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIBED_LAYER);
-
-        assertTrue(mAvailabilitySemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertEquals(AVAILABLE_ASSOCIATED_LAYERS_WITH_SUBSCRIBED_LAYER, clientCallback.getAvailalbeLayers());
-    }
-
-    /**
-     * The Mock service offers all the subscribed layers as available layers, so in this
-     * test the client subscribes to a layer and verifies that it gets the notification that it
-     * is available.
-     */
-    public void testAvailabilityWithoutSubscription() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-
-        assertTrue(mAvailabilitySemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertEquals(AVAILABLE_ASSOCIATED_LAYERS, clientCallback.getAvailalbeLayers());
-    }
-
-    private class HalHandler implements MockedVehicleHal.VehicleHalPropertyHandler {
-    }
-
-    private class TestClientCallback implements VmsSubscriberManager.VmsSubscriberClientCallback {
-        private VmsLayer mLayer;
-        private byte[] mPayload;
-        private List<VmsLayer> mAvailableLayers;
-
-        @Override
-        public void onVmsMessageReceived(VmsLayer layer, byte[] payload) {
-            assertEquals(LAYER, layer);
-            assertTrue(Arrays.equals(PAYLOAD, payload));
-            mLayer = layer;
-            mPayload = payload;
-            mSubscriberSemaphore.release();
-        }
-
-        @Override
-        public void onLayersAvailabilityChanged(List<VmsLayer> availableLayers) {
-            mAvailableLayers = availableLayers;
-            mAvailabilitySemaphore.release();
-        }
-
-        public VmsLayer getLayer() {
-            return mLayer;
-        }
-
-        public byte[] getPayload() {
-            return mPayload;
-        }
-
-        public List<VmsLayer> getAvailalbeLayers() {
-            return mAvailableLayers;
-        }
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/test/VmsSubscriberManagerTest.java b/tests/carservice_test/src/com/android/car/test/VmsSubscriberManagerTest.java
deleted file mode 100644
index 8e0c91b..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsSubscriberManagerTest.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car.test;
-
-import static org.junit.Assume.assumeTrue;
-
-import android.car.Car;
-import android.car.VehicleAreaType;
-import android.car.annotation.FutureFeature;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsSubscriberManager;
-import android.car.vms.VmsSubscriberManager.VmsSubscriberClientCallback;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
-import android.os.SystemClock;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-import com.android.car.vehiclehal.VehiclePropValueBuilder;
-import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@FutureFeature
-@MediumTest
-public class VmsSubscriberManagerTest extends MockedCarTestBase {
-    private static final String TAG = "VmsSubscriberManagerTest";
-    private static final int PUBLISHER_ID = 17;
-    private static final int WRONG_PUBLISHER_ID = 26;
-    private static final Set<Integer> PUBLISHERS_LIST = new HashSet<Integer>(Arrays.asList(PUBLISHER_ID));
-
-    private static final int SUBSCRIPTION_LAYER_ID = 2;
-    private static final int SUBSCRIPTION_LAYER_VERSION = 3;
-    private static final int MOCK_PUBLISHER_LAYER_SUBTYPE = 444;
-    private static final VmsLayer SUBSCRIPTION_LAYER = new VmsLayer(SUBSCRIPTION_LAYER_ID,
-            MOCK_PUBLISHER_LAYER_SUBTYPE,
-            SUBSCRIPTION_LAYER_VERSION);
-    private static final VmsAssociatedLayer SUBSCRIPTION_ASSOCIATED_LAYER =
-            new VmsAssociatedLayer(SUBSCRIPTION_LAYER, PUBLISHERS_LIST);
-
-    private static final int SUBSCRIPTION_DEPENDANT_LAYER_ID_1 = 4;
-    private static final int SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1 = 5;
-    private static final VmsLayer SUBSCRIPTION_DEPENDANT_LAYER_1 =
-            new VmsLayer(SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
-                    MOCK_PUBLISHER_LAYER_SUBTYPE,
-                    SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1);
-
-    private static final VmsAssociatedLayer SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1 =
-            new VmsAssociatedLayer(SUBSCRIPTION_DEPENDANT_LAYER_1, PUBLISHERS_LIST);
-
-    private static final int SUBSCRIPTION_DEPENDANT_LAYER_ID_2 = 6;
-    private static final int SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2 = 7;
-    private static final VmsLayer SUBSCRIPTION_DEPENDANT_LAYER_2 =
-            new VmsLayer(SUBSCRIPTION_DEPENDANT_LAYER_ID_2,
-                    MOCK_PUBLISHER_LAYER_SUBTYPE,
-                    SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2);
-
-    private static final VmsAssociatedLayer SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_2 =
-            new VmsAssociatedLayer(SUBSCRIPTION_DEPENDANT_LAYER_2, PUBLISHERS_LIST);
-
-    private static final int SUBSCRIPTION_UNSUPPORTED_LAYER_ID = 100;
-    private static final int SUBSCRIPTION_UNSUPPORTED_LAYER_VERSION = 200;
-
-
-    private HalHandler mHalHandler;
-    // Used to block until the HAL property is updated in HalHandler.onPropertySet.
-    private Semaphore mHalHandlerSemaphore;
-    // Used to block until a value is propagated to the TestClientCallback.onVmsMessageReceived.
-    private Semaphore mSubscriberSemaphore;
-
-    @Override
-    protected synchronized void configureMockedHal() {
-        mHalHandler = new HalHandler();
-        addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler)
-                .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE)
-                .setAccess(VehiclePropertyAccess.READ_WRITE)
-                .setSupportedAreas(VehicleAreaType.VEHICLE_AREA_TYPE_NONE);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.setUp();
-        mSubscriberSemaphore = new Semaphore(0);
-        mHalHandlerSemaphore = new Semaphore(0);
-    }
-
-    @Override
-    protected synchronized void tearDown() throws Exception {
-        if (!VmsTestUtils.canRunTest(TAG)) return;
-        super.tearDown();
-    }
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber.
-    public void testSubscribe() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER);
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE);
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertEquals(SUBSCRIPTION_LAYER, clientCallback.getLayer());
-        byte[] expectedPayload = {(byte) 0xa, (byte) 0xb};
-        assertTrue(Arrays.equals(expectedPayload, clientCallback.getPayload()));
-    }
-
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber.
-    public void testSubscribeToPublisher() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE);
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(WRONG_PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-
-        assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-    }
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber.
-    public void testSubscribeFromPublisher() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE); //<-
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertEquals(SUBSCRIPTION_LAYER, clientCallback.getLayer());
-        byte[] expectedPayload = {(byte) 0xa, (byte) 0xb};
-        assertTrue(Arrays.equals(expectedPayload, clientCallback.getPayload()));
-    }
-
-    // Test injecting a value in the HAL and verifying it does not propagate to a subscriber.
-    public void testUnsubscribe() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER);
-        vmsSubscriberManager.unsubscribe(SUBSCRIPTION_LAYER);
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE);
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-    }
-
-    // Test injecting a value in the HAL and verifying it does not propagate to a subscriber.
-    public void testSubscribeFromWrongPublisher() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE);
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(WRONG_PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-    }
-
-    // Test injecting a value in the HAL and verifying it does not propagate to a subscriber.
-    public void testUnsubscribeFromPublisher() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
-        vmsSubscriberManager.unsubscribe(SUBSCRIPTION_LAYER, PUBLISHER_ID);
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE);
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-    }
-
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber.
-    public void testSubscribeAll() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.startMonitoring();
-
-        // Inject a value and wait for its callback in TestClientCallback.onVmsMessageReceived.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        v.value.int32Values.add(VmsMessageType.DATA); // MessageType
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_ID);
-        v.value.int32Values.add(MOCK_PUBLISHER_LAYER_SUBTYPE);
-        v.value.int32Values.add(SUBSCRIPTION_LAYER_VERSION);
-        v.value.int32Values.add(PUBLISHER_ID);
-        v.value.bytes.add((byte) 0xa);
-        v.value.bytes.add((byte) 0xb);
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertEquals(SUBSCRIPTION_LAYER, clientCallback.getLayer());
-        byte[] expectedPayload = {(byte) 0xa, (byte) 0xb};
-        assertTrue(Arrays.equals(expectedPayload, clientCallback.getPayload()));
-    }
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber.
-    public void testSimpleAvailableLayers() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-
-        // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        /*
-        Offering:
-        Layer             | Dependency
-        ===============================
-        (2, 3, 444), [17] | {}
-
-        Expected availability:
-        {(2, 3, 444 [17])}
-         */
-        v.value.int32Values.addAll(
-                Arrays.asList(
-                        VmsMessageType.OFFERING, // MessageType
-                        PUBLISHER_ID,
-                        1, // Number of offered layers
-
-                        SUBSCRIPTION_LAYER_ID,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_LAYER_VERSION,
-                        0 // number of dependencies for layer
-                )
-        );
-
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        List<VmsAssociatedLayer> expectedAvailableLayers =
-                new ArrayList<>(Arrays.asList(SUBSCRIPTION_ASSOCIATED_LAYER));
-        assertTrue(expectedAvailableLayers.containsAll(clientCallback.getAvailableLayers()));
-        assertEquals(expectedAvailableLayers.size(), clientCallback.getAvailableLayers().size());
-    }
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber after it has
-    // subscribed to a layer.
-    public void testSimpleAvailableLayersAfterSubscription() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER);
-
-        // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        /*
-        Offering:
-        Layer             | Dependency
-        ===============================
-        (2, 3, 444), [17] | {}
-
-        Expected availability:
-        {(2, 3, 444 [17])}
-         */
-        v.value.int32Values.addAll(
-                Arrays.asList(
-                        VmsMessageType.OFFERING, // MessageType
-                        PUBLISHER_ID,
-                        1, // Number of offered layers
-
-                        SUBSCRIPTION_LAYER_ID,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_LAYER_VERSION,
-                        0 // number of dependencies for layer
-                )
-        );
-
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        getMockedVehicleHal().injectEvent(v);
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        List<VmsAssociatedLayer> expectedAvailableLayers =
-                new ArrayList<>(Arrays.asList(SUBSCRIPTION_ASSOCIATED_LAYER));
-        assertTrue(expectedAvailableLayers.containsAll(clientCallback.getAvailableLayers()));
-        assertEquals(expectedAvailableLayers.size(), clientCallback.getAvailableLayers().size());
-    }
-
-    // Test injecting a value in the HAL and verifying it does not propagates to a subscriber after
-    // it has unregistered its callback.
-    public void testSimpleAvailableLayersAfterUnregister() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.unregisterClientCallback();
-
-
-        // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        /*
-        Offering:
-        Layer             | Dependency
-        ===============================
-        (2, 3, 444), [17] | {}
-
-        Expected availability:
-        {(2, 3, 444 [17])}
-         */
-        v.value.int32Values.addAll(
-                Arrays.asList(
-                        VmsMessageType.OFFERING, // MessageType
-                        PUBLISHER_ID,
-                        1, // Number of offered layers
-
-                        SUBSCRIPTION_LAYER_ID,
-                        SUBSCRIPTION_LAYER_VERSION,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        0 // number of dependencies for layer
-                )
-        );
-
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-        getMockedVehicleHal().injectEvent(v);
-        assertFalse(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-    }
-
-    // Test injecting a value in the HAL and verifying it does not propagates to a subscriber after
-    // it has unregistered its callback.
-    public void testSomething() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-        vmsSubscriberManager.subscribe(SUBSCRIPTION_LAYER);
-        try {
-            vmsSubscriberManager.unregisterClientCallback();
-        } catch (IllegalArgumentException e) {
-            return;
-        }
-        fail();
-    }
-
-
-    // Test injecting a value in the HAL and verifying it propagates to a subscriber.
-    public void testComplexAvailableLayers() throws Exception {
-        assumeTrue(VmsTestUtils.canRunTest(TAG));
-        VmsSubscriberManager vmsSubscriberManager = (VmsSubscriberManager) getCar().getCarManager(
-                Car.VMS_SUBSCRIBER_SERVICE);
-        TestClientCallback clientCallback = new TestClientCallback();
-        vmsSubscriberManager.registerClientCallback(clientCallback);
-
-        // Inject a value and wait for its callback in TestClientCallback.onLayersAvailabilityChanged.
-        VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
-                .setAreaId(VehicleAreaType.VEHICLE_AREA_TYPE_NONE)
-                .setTimestamp(SystemClock.elapsedRealtimeNanos())
-                .build();
-        /*
-        Offering:
-        Layer  | Dependency
-        ====================
-        (2, 3, 444), [17] | {}
-        (4, 5, 444), [17] | {(2, 3)}
-        (6, 7, 444), [17] | {(2, 3), (4, 5)}
-        (6, 7, 444), [17] | {(100, 200)}
-
-        Expected availability:
-        {(2, 3, 444 [17]), (4, 5, 444 [17]), (6, 7, 444 [17])}
-         */
-
-        v.value.int32Values.addAll(
-                Arrays.asList(
-                        VmsMessageType.OFFERING, // MessageType
-                        PUBLISHER_ID,
-                        4, // Number of offered layers
-
-                        SUBSCRIPTION_LAYER_ID,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_LAYER_VERSION,
-                        0, // number of dependencies for layer
-
-                        SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1,
-                        1, // number of dependencies for layer
-                        SUBSCRIPTION_LAYER_ID,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_LAYER_VERSION,
-
-                        SUBSCRIPTION_DEPENDANT_LAYER_ID_2,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2,
-                        2, // number of dependencies for layer
-                        SUBSCRIPTION_LAYER_ID,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_LAYER_VERSION,
-                        SUBSCRIPTION_DEPENDANT_LAYER_ID_1,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_DEPENDANT_LAYER_VERSION_1,
-
-                        SUBSCRIPTION_DEPENDANT_LAYER_ID_2,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_DEPENDANT_LAYER_VERSION_2,
-                        1, // number of dependencies for layer
-                        SUBSCRIPTION_UNSUPPORTED_LAYER_ID,
-                        MOCK_PUBLISHER_LAYER_SUBTYPE,
-                        SUBSCRIPTION_UNSUPPORTED_LAYER_VERSION
-                )
-        );
-
-        assertEquals(0, mSubscriberSemaphore.availablePermits());
-
-        List<VmsAssociatedLayer> expectedAvailableLayers =
-                new ArrayList<>(Arrays.asList(
-                        SUBSCRIPTION_ASSOCIATED_LAYER,
-                        SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_1,
-                        SUBSCRIPTION_DEPENDANT_ASSOCIATED_LAYER_2
-                ));
-        getMockedVehicleHal().injectEvent(v);
-        assertTrue(mSubscriberSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
-        assertTrue(expectedAvailableLayers.containsAll(clientCallback.getAvailableLayers()));
-        assertEquals(expectedAvailableLayers.size(), clientCallback.getAvailableLayers().size());
-    }
-
-    private class HalHandler implements VehicleHalPropertyHandler {
-        private VehiclePropValue mValue;
-
-        @Override
-        public synchronized void onPropertySet(VehiclePropValue value) {
-            mValue = value;
-            mHalHandlerSemaphore.release();
-        }
-
-        @Override
-        public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
-            return mValue != null ? mValue : value;
-        }
-
-        @Override
-        public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
-            Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate);
-        }
-
-        @Override
-        public synchronized void onPropertyUnsubscribe(int property) {
-            Log.d(TAG, "onPropertyUnSubscribe property " + property);
-        }
-
-        public VehiclePropValue getValue() {
-            return mValue;
-        }
-    }
-
-    private class TestClientCallback implements VmsSubscriberClientCallback {
-        private VmsLayer mLayer;
-        private byte[] mPayload;
-        private List<VmsLayer> mAvailableLayers = new ArrayList<>();
-
-        @Override
-        public void onVmsMessageReceived(VmsLayer layer, byte[] payload) {
-            Log.d(TAG, "onVmsMessageReceived: layer: " + layer + " Payload: " + payload);
-            mLayer = layer;
-            mPayload = payload;
-            mSubscriberSemaphore.release();
-        }
-
-        @Override
-        public void onLayersAvailabilityChanged(List<VmsLayer> availableLayers) {
-            Log.d(TAG, "onLayersAvailabilityChanged: Layers: " + availableLayers);
-            mAvailableLayers.addAll(availableLayers);
-            mSubscriberSemaphore.release();
-        }
-
-        public VmsLayer getLayer() {
-            return mLayer;
-        }
-
-        public byte[] getPayload() {
-            return mPayload;
-        }
-
-        public List<VmsLayer> getAvailableLayers() {
-            return mAvailableLayers;
-        }
-    }
-}
diff --git a/tests/carservice_test/src/com/android/car/test/VmsTestUtils.java b/tests/carservice_test/src/com/android/car/test/VmsTestUtils.java
deleted file mode 100644
index 2f3af52..0000000
--- a/tests/carservice_test/src/com/android/car/test/VmsTestUtils.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.android.car.test;
-
-import android.car.annotation.FutureFeature;
-import android.util.Log;
-
-import com.android.car.internal.FeatureConfiguration;
-
-@FutureFeature
-public class VmsTestUtils {
-    public static boolean canRunTest(String tag) {
-        if (!FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE) {
-            Log.i(tag, "Skipping test because ENABLE_VEHICLE_MAP_SERVICE = false");
-        }
-        return FeatureConfiguration.ENABLE_VEHICLE_MAP_SERVICE;
-    }
-}
diff --git a/tests/carservice_unit_test/src/com/android/car/VmsLayersAvailabilityTest.java b/tests/carservice_unit_test/src/com/android/car/VmsLayersAvailabilityTest.java
deleted file mode 100644
index 4a09d4f..0000000
--- a/tests/carservice_unit_test/src/com/android/car/VmsLayersAvailabilityTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsLayerDependency;
-import android.car.vms.VmsLayersOffering;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-@SmallTest
-public class VmsLayersAvailabilityTest extends AndroidTestCase {
-
-    private static final VmsLayer LAYER_X = new VmsLayer(1, 1, 2);
-    private static final VmsLayer LAYER_Y = new VmsLayer(3, 2, 4);
-    private static final VmsLayer LAYER_Z = new VmsLayer(5, 3, 6);
-
-    private static final int PUBLISHER_ID_1 = 19;
-    private static final int PUBLISHER_ID_2 = 28;
-
-    private static final Set<Integer> PUBLISHERS_1 = new HashSet<>(Arrays.asList(PUBLISHER_ID_1));
-    private static final Set<Integer> PUBLISHERS_2 = new HashSet<>(Arrays.asList(PUBLISHER_ID_2));
-    private static final Set<Integer> PUBLISHERS_1_AND_2 =
-            new HashSet<>(Arrays.asList(PUBLISHER_ID_1, PUBLISHER_ID_2));
-
-    private static final VmsLayerDependency X_DEPENDS_ON_Y =
-            new VmsLayerDependency(LAYER_X, new HashSet<VmsLayer>(Arrays.asList(LAYER_Y)));
-
-    private static final VmsLayerDependency X_DEPENDS_ON_Z =
-            new VmsLayerDependency(LAYER_X, new HashSet<VmsLayer>(Arrays.asList(LAYER_Z)));
-
-    private static final VmsLayerDependency Y_DEPENDS_ON_Z =
-            new VmsLayerDependency(LAYER_Y, new HashSet<VmsLayer>(Arrays.asList(LAYER_Z)));
-
-    private static final VmsLayerDependency Y_DEPENDS_ON_X =
-            new VmsLayerDependency(LAYER_Y, new HashSet<VmsLayer>(Arrays.asList(LAYER_X)));
-
-    private static final VmsLayerDependency Z_DEPENDS_ON_X =
-            new VmsLayerDependency(LAYER_Z, new HashSet<VmsLayer>(Arrays.asList(LAYER_X)));
-
-    private static final VmsLayerDependency Z_DEPENDS_ON_NOTHING =
-            new VmsLayerDependency(LAYER_Z);
-
-    private static final VmsLayerDependency X_DEPENDS_ON_SELF =
-            new VmsLayerDependency(LAYER_X, new HashSet<VmsLayer>(Arrays.asList(LAYER_X)));
-
-    private Set<VmsLayersOffering> mOfferings;
-    private VmsLayersAvailability mLayersAvailability;
-
-    @Override
-    protected void setUp() throws Exception {
-        mLayersAvailability = new VmsLayersAvailability();
-        mOfferings = new HashSet<>();
-        super.setUp();
-    }
-
-    public void testNoOffering() {
-        assertTrue(mLayersAvailability.getAvailableLayers().isEmpty());
-    }
-
-    public void testEmptyOffering() {
-        mLayersAvailability.setPublishersOffering(Collections.EMPTY_LIST);
-        assertTrue(mLayersAvailability.getAvailableLayers().isEmpty());
-    }
-
-    public void testSingleLayerNoDeps() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_2));
-
-        VmsLayersOffering offering =
-                new VmsLayersOffering(new HashSet<>(Arrays.asList(new VmsLayerDependency(LAYER_X))),
-                        PUBLISHER_ID_2);
-
-        mOfferings.add(offering);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers, mLayersAvailability.getAvailableLayers());
-    }
-
-    public void testChainOfDependenciesSatisfied() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Y, PUBLISHERS_1));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Z, PUBLISHERS_1));
-
-        VmsLayersOffering offering =
-                new VmsLayersOffering(
-                        new HashSet<>(Arrays.asList(X_DEPENDS_ON_Y, Y_DEPENDS_ON_Z, Z_DEPENDS_ON_NOTHING)),
-                        PUBLISHER_ID_1);
-
-        mOfferings.add(offering);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-    }
-
-    public void testChainOfDependenciesSatisfiedTwoOfferings() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Y, PUBLISHERS_1));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Z, PUBLISHERS_1));
-
-        VmsLayersOffering offering1 =
-                new VmsLayersOffering(
-                        new HashSet<>(Arrays.asList(X_DEPENDS_ON_Y, Y_DEPENDS_ON_Z)),
-                        PUBLISHER_ID_1);
-
-        VmsLayersOffering offering2 =
-                new VmsLayersOffering(new HashSet<>(Arrays.asList(Z_DEPENDS_ON_NOTHING)),
-                        PUBLISHER_ID_1);
-
-        mOfferings.add(offering1);
-        mOfferings.add(offering2);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-    }
-
-    public void testChainOfDependencieNotSatisfied() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        VmsLayersOffering offering =
-                new VmsLayersOffering(new HashSet<>(Arrays.asList(X_DEPENDS_ON_Y, Y_DEPENDS_ON_Z)),
-                        PUBLISHER_ID_1);
-
-        mOfferings.add(offering);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-
-        Set<VmsAssociatedLayer> expectedUnavailableAssociatedLayers = new HashSet<>();
-        expectedUnavailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-        expectedUnavailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Y, PUBLISHERS_1));
-
-
-        assertEquals(expectedUnavailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getUnavailableLayers()));
-    }
-
-    public void testOneOfMultipleDependencySatisfied() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Z, PUBLISHERS_1));
-
-
-        VmsLayersOffering offering =
-                new VmsLayersOffering(
-                        new HashSet<>(Arrays.asList(
-                                X_DEPENDS_ON_Y, X_DEPENDS_ON_Z, Z_DEPENDS_ON_NOTHING)),
-                        PUBLISHER_ID_1);
-
-        mOfferings.add(offering);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-    }
-
-    public void testCyclicDependency() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-
-        VmsLayersOffering offering =
-                new VmsLayersOffering(
-                        new HashSet<>(
-                                Arrays.asList(X_DEPENDS_ON_Y, Y_DEPENDS_ON_Z, Z_DEPENDS_ON_X)),
-                        PUBLISHER_ID_1);
-
-        mOfferings.add(offering);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-    }
-
-    public void testAlmostCyclicDependency() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Z, PUBLISHERS_1_AND_2));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Y, PUBLISHERS_2));
-
-        VmsLayersOffering offering1 =
-                new VmsLayersOffering(
-                        new HashSet<>(Arrays.asList(X_DEPENDS_ON_Y, Z_DEPENDS_ON_NOTHING)),
-                        PUBLISHER_ID_1);
-
-        VmsLayersOffering offering2 =
-                new VmsLayersOffering(new HashSet<>(Arrays.asList(Y_DEPENDS_ON_Z, Z_DEPENDS_ON_X)),
-                        PUBLISHER_ID_2);
-
-        mOfferings.add(offering1);
-        mOfferings.add(offering2);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers, mLayersAvailability.getAvailableLayers());
-    }
-
-    public void testCyclicDependencyAndLayerWithoutDependency() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-        expectedAvailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Z, PUBLISHERS_1));
-
-        VmsLayersOffering offering1 =
-                new VmsLayersOffering(
-                        new HashSet<>(
-                                Arrays.asList(X_DEPENDS_ON_Y, Z_DEPENDS_ON_NOTHING)),
-                        PUBLISHER_ID_1);
-
-        VmsLayersOffering offering2 =
-                new VmsLayersOffering(new HashSet<>(Arrays.asList(Y_DEPENDS_ON_X)), PUBLISHER_ID_2);
-
-        mOfferings.add(offering1);
-        mOfferings.add(offering2);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-
-        Set<VmsAssociatedLayer> expectedUnavailableAssociatedLayers = new HashSet<>();
-        expectedUnavailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-        expectedUnavailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_Y, PUBLISHERS_2));
-
-        assertEquals(expectedUnavailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getUnavailableLayers()));
-    }
-
-    public void testSelfDependency() throws Exception {
-        Set<VmsAssociatedLayer> expectedAvailableAssociatedLayers = new HashSet<>();
-
-        VmsLayersOffering offering =
-                new VmsLayersOffering(new HashSet<>(Arrays.asList(X_DEPENDS_ON_SELF)),
-                        PUBLISHER_ID_1);
-
-        mOfferings.add(offering);
-        mLayersAvailability.setPublishersOffering(mOfferings);
-
-        assertEquals(expectedAvailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getAvailableLayers()));
-
-        Set<VmsAssociatedLayer> expectedUnavailableAssociatedLayers = new HashSet<>();
-        expectedUnavailableAssociatedLayers.add(new VmsAssociatedLayer(LAYER_X, PUBLISHERS_1));
-
-        assertEquals(expectedUnavailableAssociatedLayers,
-                new HashSet<VmsAssociatedLayer>(mLayersAvailability.getUnavailableLayers()));
-    }
-}
\ No newline at end of file
diff --git a/tests/carservice_unit_test/src/com/android/car/VmsPublishersInfoTest.java b/tests/carservice_unit_test/src/com/android/car/VmsPublishersInfoTest.java
deleted file mode 100644
index 2b75012..0000000
--- a/tests/carservice_unit_test/src/com/android/car/VmsPublishersInfoTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.annotation.FutureFeature;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import java.util.Arrays;
-import java.util.Map;
-
-@FutureFeature
-@SmallTest
-public class VmsPublishersInfoTest extends AndroidTestCase {
-    public static final byte[] MOCK_INFO_0 = new byte[]{2, 3, 5, 7, 11, 13, 17};
-    public static final byte[] SAME_MOCK_INFO_0 = new byte[]{2, 3, 5, 7, 11, 13, 17};
-    public static final byte[] MOCK_INFO_1 = new byte[]{2, 3, 5, 7, 11, 13, 17, 19};
-
-    private VmsPublishersInfo mVmsPublishersInfo;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mVmsPublishersInfo = new VmsPublishersInfo();
-    }
-
-    // Test one info sanity
-    public void testSingleInfo() throws Exception {
-        int id = mVmsPublishersInfo.getIdForInfo(MOCK_INFO_0);
-        assertEquals(0, id);
-
-        byte[] info = mVmsPublishersInfo.getPublisherInfo(id);
-        assertTrue(Arrays.equals(MOCK_INFO_0, info));
-    }
-
-    // Test one info sanity - wrong ID fails.
-    public void testSingleInfoWrongId() throws Exception {
-        int id = mVmsPublishersInfo.getIdForInfo(MOCK_INFO_0);
-        assertEquals(0, id);
-
-        try {
-            byte[] info = mVmsPublishersInfo.getPublisherInfo(id + 1);
-        }
-        catch (NullPointerException e) {
-            return;
-        }
-        fail();
-    }
-
-    // Test two infos.
-    public void testTwoInfos() throws Exception {
-        int id0 = mVmsPublishersInfo.getIdForInfo(MOCK_INFO_0);
-        int id1 = mVmsPublishersInfo.getIdForInfo(MOCK_INFO_1);
-        assertEquals(0, id0);
-        assertEquals(1, id1);
-
-        byte[] info0 = mVmsPublishersInfo.getPublisherInfo(id0);
-        byte[] info1 = mVmsPublishersInfo.getPublisherInfo(id1);
-        assertTrue(Arrays.equals(MOCK_INFO_0, info0));
-        assertTrue(Arrays.equals(MOCK_INFO_1, info1));
-    }
-
-    // Test same info twice get the same ID.
-    public void testSingleInfoInsertedTwice() throws Exception {
-        int id = mVmsPublishersInfo.getIdForInfo(MOCK_INFO_0);
-        assertEquals(0, id);
-
-        int sameId = mVmsPublishersInfo.getIdForInfo(SAME_MOCK_INFO_0);
-        assertEquals(sameId, id);
-    }
-}
diff --git a/tests/carservice_unit_test/src/com/android/car/VmsRoutingTest.java b/tests/carservice_unit_test/src/com/android/car/VmsRoutingTest.java
deleted file mode 100644
index 8fe849b..0000000
--- a/tests/carservice_unit_test/src/com/android/car/VmsRoutingTest.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source 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.car;
-
-import android.car.vms.IVmsSubscriberClient;
-import android.car.vms.VmsAssociatedLayer;
-import android.car.vms.VmsLayer;
-import android.car.vms.VmsSubscriptionState;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Map;
-
-@SmallTest
-public class VmsRoutingTest extends AndroidTestCase {
-    private static VmsLayer LAYER_WITH_SUBSCRIPTION_1 = new VmsLayer(1, 1, 2);
-    private static VmsLayer LAYER_WITH_SUBSCRIPTION_2 = new VmsLayer(1, 3, 3);
-    private static VmsLayer LAYER_WITHOUT_SUBSCRIPTION =
-            new VmsLayer(1, 7, 4);
-    private static int PUBLISHER_ID_1 = 123;
-    private static int PUBLISHER_ID_2 = 456;
-    private static int PUBLISHER_ID_UNLISTED = 789;
-    private VmsRouting mRouting;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mRouting = new VmsRouting();
-    }
-
-    public void testAddingSubscribersAndHalLayersNoOverlap() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a HAL subscription.
-        mRouting.addHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        // Verify expected subscriptions are in routing manager.
-        Set<VmsLayer> expectedSubscriptions = new HashSet<>();
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_1);
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_2);
-        VmsSubscriptionState subscriptionState = mRouting.getSubscriptionState();
-        assertEquals(2, subscriptionState.getSequenceNumber());
-        assertEquals(expectedSubscriptions,
-                new HashSet<>(subscriptionState.getLayers()));
-
-        // Verify there is only a single subscriber.
-        assertEquals(1,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1).size());
-    }
-
-    public void testAddingSubscribersAndHalLayersWithOverlap() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_2);
-
-        // Add a HAL subscription to a layer there is already another subscriber for.
-        mRouting.addHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        // Verify expected subscriptions are in routing manager.
-        Set<VmsLayer> expectedSubscriptions = new HashSet<>();
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_1);
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_2);
-        VmsSubscriptionState subscriptionState = mRouting.getSubscriptionState();
-        assertEquals(3, subscriptionState.getSequenceNumber());
-        assertEquals(expectedSubscriptions,
-                new HashSet<>(subscriptionState.getLayers()));
-    }
-
-    public void testAddingAndRemovingLayers() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a HAL subscription.
-        mRouting.addHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        // Remove a subscription to a layer.
-        mRouting.removeSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Update the HAL subscription
-        mRouting.removeHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        // Verify there are no subscribers in the routing manager.
-        VmsSubscriptionState subscriptionState = mRouting.getSubscriptionState();
-        assertEquals(4, subscriptionState.getSequenceNumber());
-        assertTrue(subscriptionState.getLayers().isEmpty());
-    }
-
-    public void testAddingBothTypesOfSubscribers() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriberForLayer = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriberForLayer, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a subscription without a layer.
-        MockVmsSubscriber subscriberWithoutLayer = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriberWithoutLayer);
-
-        // Verify 2 subscribers for the layer.
-        assertEquals(2,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1).size());
-
-        // Add the subscriber with layer as also a subscriber without layer
-        mRouting.addSubscription(subscriberForLayer);
-
-        // The number of subscribers for the layer should remain the same as before.
-        assertEquals(2,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1).size());
-    }
-
-    public void testOnlyRelevantSubscribers() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriberForLayer = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriberForLayer, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a subscription without a layer.
-        MockVmsSubscriber subscriberWithoutLayer = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriberWithoutLayer);
-
-        // Verify that only the subscriber without layer is returned.
-        Set<MockVmsSubscriber> expectedListeneres = new HashSet<MockVmsSubscriber>();
-        expectedListeneres.add(subscriberWithoutLayer);
-        assertEquals(expectedListeneres,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITHOUT_SUBSCRIPTION, PUBLISHER_ID_1));
-    }
-
-    public void testAddingSubscribersAndHalLayersAndSubscribersToPublishers() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a HAL subscription.
-        mRouting.addHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_2);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_2, PUBLISHER_ID_2);
-
-        // Verify expected subscriptions are in routing manager.
-        Set<VmsLayer> expectedSubscriptions = new HashSet<>();
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_1);
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_2);
-
-        Set<VmsAssociatedLayer> expectedSubscriptionsToPublishers = new HashSet<>();
-        expectedSubscriptionsToPublishers.add(new VmsAssociatedLayer(LAYER_WITH_SUBSCRIPTION_1,
-                new HashSet(Arrays.asList(PUBLISHER_ID_1, PUBLISHER_ID_2))));
-        expectedSubscriptionsToPublishers.add(new VmsAssociatedLayer(LAYER_WITH_SUBSCRIPTION_2,
-                new HashSet(Arrays.asList(PUBLISHER_ID_2))));
-
-        VmsSubscriptionState subscriptionState = mRouting.getSubscriptionState();
-        assertEquals(5, subscriptionState.getSequenceNumber());
-        assertEquals(expectedSubscriptions,
-                new HashSet<>(subscriptionState.getLayers()));
-
-        assertEquals(expectedSubscriptionsToPublishers,
-                subscriptionState.getAssociatedLayers());
-
-        // Verify there is only a single subscriber.
-        assertEquals(1,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1).size());
-    }
-
-    public void testAddingSubscriberToPublishersAndGetListeneresToDifferentPublisher()
-            throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_2);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1);
-
-        Set<IVmsSubscriberClient> subscribers;
-        // Need to route a layer 1 message from publisher 2 so there are no subscribers.
-        subscribers =
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1,
-                        PUBLISHER_ID_2);
-        assertEquals(0, subscribers.size());
-
-        // Need to route a layer 1 message from publisher 1 so there is one subscriber.
-        subscribers =
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1,
-                        PUBLISHER_ID_1);
-        assertEquals(1, subscribers.size());
-        assertTrue(subscribers.contains(subscriber));
-
-        // Verify all the messages for LAYER_WITH_SUBSCRIPTION_2 have subscribers since the
-        // subscription was done without specifying a specific publisher.
-        subscribers =
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_2,
-                        PUBLISHER_ID_UNLISTED);
-        assertEquals(1, subscribers.size());
-        assertTrue(subscribers.contains(subscriber));
-    }
-
-
-    public void testRemovalOfSubscribersToPublishers() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a HAL subscription.
-        mRouting.addHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_2);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_2, PUBLISHER_ID_2);
-        mRouting.removeSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_2, PUBLISHER_ID_2);
-
-        // Verify expected subscriptions are in routing manager.
-        Set<VmsLayer> expectedSubscriptions = new HashSet<>();
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_1);
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_2);
-
-
-        Set<VmsAssociatedLayer> expectedSubscriptionsToPublishers = new HashSet<>();
-        expectedSubscriptionsToPublishers.add(new VmsAssociatedLayer(LAYER_WITH_SUBSCRIPTION_1,
-                new HashSet(Arrays.asList(PUBLISHER_ID_1, PUBLISHER_ID_2))));
-
-        VmsSubscriptionState subscriptionState = mRouting.getSubscriptionState();
-        assertEquals(6, subscriptionState.getSequenceNumber());
-        assertEquals(expectedSubscriptions,
-                new HashSet<>(subscriptionState.getLayers()));
-
-        assertEquals(expectedSubscriptionsToPublishers,
-                subscriptionState.getAssociatedLayers());
-
-        // Verify there is only a single subscriber.
-        assertEquals(1,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1).size());
-    }
-
-    public void testRemovalOfSubscribersToPublishersClearListForPublisher() throws Exception {
-        // Add a subscription to a layer.
-        MockVmsSubscriber subscriber = new MockVmsSubscriber();
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1);
-
-        // Add a HAL subscription.
-        mRouting.addHalSubscription(LAYER_WITH_SUBSCRIPTION_2);
-
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_2);
-        mRouting.addSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_2, PUBLISHER_ID_2);
-        mRouting.removeSubscription(subscriber, LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1);
-
-        // Verify expected subscriptions are in routing manager.
-        Set<VmsLayer> expectedSubscriptions = new HashSet<>();
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_1);
-        expectedSubscriptions.add(LAYER_WITH_SUBSCRIPTION_2);
-
-        Set<VmsAssociatedLayer> expectedSubscriptionsToPublishers = new HashSet<>();
-        expectedSubscriptionsToPublishers.add(new VmsAssociatedLayer(LAYER_WITH_SUBSCRIPTION_1,
-                new HashSet(Arrays.asList(PUBLISHER_ID_2))));
-        expectedSubscriptionsToPublishers.add(new VmsAssociatedLayer(LAYER_WITH_SUBSCRIPTION_2,
-                new HashSet(Arrays.asList(PUBLISHER_ID_2))));
-
-        VmsSubscriptionState subscriptionState = mRouting.getSubscriptionState();
-        assertEquals(6, subscriptionState.getSequenceNumber());
-        assertEquals(expectedSubscriptions,
-                new HashSet<>(subscriptionState.getLayers()));
-
-        assertEquals(expectedSubscriptionsToPublishers,
-                subscriptionState.getAssociatedLayers());
-
-        // Verify there is only a single subscriber.
-        assertEquals(1,
-                mRouting.getSubscribersForLayerFromPublisher(
-                        LAYER_WITH_SUBSCRIPTION_1, PUBLISHER_ID_1).size());
-    }
-
-    class MockVmsSubscriber extends IVmsSubscriberClient.Stub {
-        @Override
-        public void onVmsMessageReceived(VmsLayer layer, byte[] payload) {
-        }
-
-        @Override
-        public void onLayersAvailabilityChanged(List<VmsAssociatedLayer> availableLayers) {
-        }
-    }
-}
\ No newline at end of file
diff --git a/tools/bootanalyze/bugreport_anayze.py b/tools/bootanalyze/bugreport_anayze.py
new file mode 100644
index 0000000..2575ebf
--- /dev/null
+++ b/tools/bootanalyze/bugreport_anayze.py
@@ -0,0 +1,386 @@
+#!/usr/bin/python
+
+# Copyright (C) 2017 The Android Open Source 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.
+#
+"""Tool to analyze boot-up time from bugreport."""
+
+import argparse
+import collections
+import datetime
+import math
+import operator
+import os
+import re
+import select
+import subprocess
+import sys
+import time
+import threading
+import yaml
+
+from datetime import datetime, date
+
+DBG = True
+
+LOG_START_PATTERN = r"""\-\-\-\-\-\-\s(.*)\s\-\-\-\-\-\-"""
+LOG_END_PATTERN = r"""\-\-\-\-\-\-\s\S.*\s\-\-\-\-\-\-"""
+
+KERNEL_LOG_TITLE = "KERNEL LOG"
+SYSYEM_LOG_TITLE = "SYSTEM LOG"
+LAST_KMSG_TITLE = "LAST KMSG"
+LAST_LOGCAT_TITLE = "LAST LOGCAT"
+
+SYSTEM_PROPS_TITLE = "SYSTEM PROPERTIES"
+
+TIME_DMESG = "\[\s*(\d+\.\d+)\]"
+TIME_LOGCAT = "(\d+)\-(\d+)\s(\d+):(\d+):(\d+\.\d+)"
+
+NATIVE_CRASH_START_PATTERN = "I\sDEBUG\s+:\s\*\*\*\s\*\*\*"
+NATIVE_CRASH_PATTERN = "I\sDEBUG\s+:"
+JAVA_CRASH_START_PATTERN = "E\sAndroidRuntime:\sFATAL\sEXCEPTION"
+JAVA_CRASH_PATTERN = "E\sAndroidRuntime:\s"
+
+EPOCH = datetime.utcfromtimestamp(0)
+
+def init_arguments():
+  parser = argparse.ArgumentParser(description='Measures boot time from bugreport.')
+  parser.add_argument('-c', '--config', dest='config',
+                      default='config.yaml', type=argparse.FileType('r'),
+                      help='config file for the tool')
+  parser.add_argument('bugreport_file', nargs=1, help='bugreport txt file',
+                       type=argparse.FileType('r'))
+  parser.add_argument('-n', '--iterate', dest='iterate', type=int, default=1,
+                      help='number of time to repeat the measurement', )
+  return parser.parse_args()
+
+# Event per each reboot, for distinghishing current boot from last boot
+class Events:
+  def __init__(self):
+    self.events = collections.OrderedDict() #K: keyword, V:time in ms
+    self.timings = collections.OrderedDict()
+    self.shutdown_events = collections.OrderedDict()
+    self.java_crash = collections.OrderedDict() #K:time, V:list of crash infos, each entry per line
+    self.native_crash = collections.OrderedDict()
+
+  def reset_events_time(self, delta):
+    new_events = collections.OrderedDict()
+    for entry in self.events.iteritems():
+      new_events[entry[0]] = entry[1] - delta
+    self.events = new_events
+    if len(self.native_crash) > 0:
+      new_crash = collections.OrderedDict()
+      for entry in self.native_crash.iteritems():
+        new_crash[entry[0] - delta] = entry[1]
+      self.native_crash = new_crash
+    if len(self.java_crash) > 0:
+      new_crash = collections.OrderedDict()
+      for entry in self.java_crash.iteritems():
+        new_crash[entry[0] - delta] = entry[1]
+      self.java_crash = new_crash
+
+  def reset_shutdown_events_time(self):
+    if len(self.shutdown_events) == 0:
+      return
+    time_offset = 0
+    new_events = collections.OrderedDict()
+    for entry in self.shutdown_events.iteritems():
+      if time_offset == 0:
+        time_offset = entry[1]
+      new_events[entry[0]] = entry[1] - time_offset
+    self.shutdown_events = new_events
+
+  def dump_dict(self, d):
+    for entry in d.iteritems():
+        print ' {0:30}: {1}'.format(entry[0], entry[1])
+
+  def dump_crash(self, time, stack):
+    print "    Crash time:", time, " stack:"
+    print ' '.join(stack)
+
+  def dump(self):
+    if len(self.events) > 0:
+      print "\n***Events:"
+      self.dump_dict(self.events)
+    if len(self.timings) > 0:
+      print "\n***Timings top 20"
+      timings_sorted = sorted(self.timings.items(), key = lambda item: item[1], reverse=True)
+      nums_to_dump = min(20, len(timings_sorted))
+      for i in range(nums_to_dump):
+          print ' {0:30}: {1}'.format(timings_sorted[i][0], timings_sorted[i][1])
+      print "\n***Timings:"
+      self.dump_dict(self.timings)
+    if len(self.shutdown_events) > 0:
+      print "\n***Shutdown Events (time relative to the begining of shutdown) :"
+      self.dump_dict(self.shutdown_events)
+    if len(self.native_crash) > 0:
+      print "\n***Native crash founds:", len(self.native_crash)
+      for entry in self.native_crash.iteritems():
+        self.dump_crash(entry[0], entry[1])
+    if len(self.java_crash) > 0:
+      print "\n***Java crash founds:", len(self.java_crash)
+      for entry in self.java_crash.iteritems():
+        self.dump_crash(entry[0], entry[1])
+
+class Parser:
+  def __init__(self, config_file, bugreport_file):
+    self.re_log_start = re.compile(LOG_START_PATTERN)
+    self.re_log_end = re.compile(LOG_END_PATTERN)
+    self.f = bugreport_file
+    cfg = yaml.load(config_file)
+    self.event_patterns = {key: re.compile(pattern)
+                         for key, pattern in cfg['events'].iteritems()}
+    self.timing_patterns = {key: re.compile(pattern)
+                         for key, pattern in cfg['timings'].iteritems()}
+    self.shutdown_event_patterns = {key: re.compile(pattern)
+                           for key, pattern in cfg['shutdown_events'].iteritems()}
+    self.current_boot_kernel = Events()
+    self.current_boot_logcat = Events()
+    self.last_boot_kernel = Events()
+    self.last_boot_logcat = Events()
+    self.boottime_props = collections.OrderedDict() # K:prop, V:boot time, added in boot time order
+    self.bootloader_time = 0
+    self.re_time_dmesg = re.compile(TIME_DMESG)
+    self.re_time_logcat = re.compile(TIME_LOGCAT)
+    self.re_native_crash_start = re.compile(NATIVE_CRASH_START_PATTERN)
+    self.re_native_crash = re.compile(NATIVE_CRASH_PATTERN)
+    self.re_java_crash_start = re.compile(JAVA_CRASH_START_PATTERN)
+    self.re_java_crash = re.compile(JAVA_CRASH_PATTERN)
+
+  def match_an_event(self, event_patterns, line):
+    for event_key, event_pattern in event_patterns.iteritems():
+      m = event_pattern.search(line)
+      if m:
+        return event_key, m
+    return None, None
+
+  def get_event_time(self, line, is_kernel):
+    if is_kernel:
+      m = self.re_time_dmesg.search(line)
+      if not m:
+        print "Cannot get time from log:", line
+        return -1
+      return int(float(m.group(1)) * 1000)
+    else:
+      m = self.re_time_logcat.search(line)
+      if not m:
+          print "Cannot get time from log:", line
+          return -1
+      mm = int(m.group(1))
+      dd = int(m.group(2))
+      hh = int(m.group(3))
+      min = int(m.group(4))
+      usecs = int(float(m.group(5)) * 1000000)
+      secs = usecs / 1000000
+      usecs = usecs - 1000000 * secs
+      dt = datetime(2017, mm, dd, hh, min, secs, usecs)
+      return int((dt - EPOCH).total_seconds() * 1000)
+
+  def queue_crash(self, event, crash_time, crash_stacks, is_native_crash):
+    stacks = list(crash_stacks)
+    if is_native_crash:
+      event.native_crash[crash_time] = stacks
+    else:
+      event.java_crash[crash_time] = stacks
+
+  def check_crash(self, event, orig_line):
+    line = orig_line
+    crash_time = 0
+    crash_stacks = []
+    is_native_crash = True
+    while len(line) > 0:
+      m = self.re_native_crash_start.search(line)
+      if m:
+        if len(crash_stacks) > 0:
+          self.queue_crash(event, crash_time, crash_stacks, is_native_crash)
+          crash_stacks = []
+        is_native_crash = True
+        crash_stacks.append(line)
+        crash_time = self.get_event_time(line, False)
+        line = self.f.readline()
+        continue
+      m = self.re_native_crash.search(line)
+      if m:
+        crash_stacks.append(line)
+        line = self.f.readline()
+        continue
+      m = self.re_java_crash_start.search(line)
+      if m:
+        if len(crash_stacks) > 0:
+          self.queue_crash(event, crash_time, crash_stacks, is_native_crash)
+          crash_stacks = []
+        is_native_crash = False
+        crash_stacks.append(line)
+        crash_time = self.get_event_time(line, False)
+        line = self.f.readline()
+        continue
+      m = self.re_java_crash.search(line)
+      if m:
+        crash_stacks.append(line)
+        line = self.f.readline()
+        continue
+      # reaching here means not crash, so return new line
+      if line != orig_line:
+        return line
+      else:
+        return self.f.readline()
+
+
+
+  def handle_events(self, event, is_kernel):
+    line = self.f.readline()
+    while len(line) > 0 and not self.re_log_end.match(line):
+      key, m = self.match_an_event(self.event_patterns, line)
+      if m:
+        event.events[key] = self.get_event_time(line, is_kernel)
+        line = self.f.readline()
+        continue
+      key, m = self.match_an_event(self.timing_patterns, line)
+      if m:
+        name = m.group('name')
+        time = float(m.group('time'))
+        if key.endswith('_secs'):
+          time = time * 1000
+        event.timings[name] = int(time)
+        line = self.f.readline()
+        continue
+      key, m = self.match_an_event(self.shutdown_event_patterns, line)
+      if m:
+          event.shutdown_events[key] = self.get_event_time(line, is_kernel)
+          line = self.f.readline()
+          continue
+      if not is_kernel: # collect crash
+        line = self.check_crash(event, line)
+        continue
+      line = self.f.readline()
+
+  def handle_kernel_log(self):
+    if DBG:
+      print "start " + KERNEL_LOG_TITLE
+    self.handle_events(self.current_boot_kernel, True)
+
+  def handle_system_log(self):
+    if DBG:
+      print "start " + SYSYEM_LOG_TITLE
+    self.handle_events(self.current_boot_logcat, False)
+
+  def handle_last_kernel_log(self):
+      if DBG:
+          print "start " + LAST_KMSG_TITLE
+      self.handle_events(self.last_boot_kernel, True)
+
+  def handle_last_system_log(self):
+    if DBG:
+        print "start " + LAST_LOGCAT_TITLE
+    self.handle_events(self.last_boot_logcat, False)
+
+  def handle_system_props(self):
+    if DBG:
+        print "start " + SYSTEM_PROPS_TITLE
+    re_prop = re.compile(r"""\[(.+)\].*\[(.*)\]""")
+    RO_BOOTTIME_PROP = "ro.boottime."
+    boottime_props = {} # K: prop name, V: boot time in ms
+    line = self.f.readline()
+    while len(line) > 0 and not self.re_log_end.match(line):
+      m = re_prop.match(line)
+      if not m:
+        print "Cannot parse prop:", line
+        line = self.f.readline()
+        continue
+      if m.group(1).startswith(RO_BOOTTIME_PROP):
+        name = m.group(1)[len(RO_BOOTTIME_PROP):]
+        time = int(m.group(2)) / 1000000 # ns to ms
+        boottime_props[name] = time
+      elif m.group(1) == "ro.boot.boottime":
+        print "Found bootloader boottime ", line
+        entries = m.group(2).split(",")
+        for entry in entries:
+          values = entry.split(":")
+          if values[0] != "SW":
+              self.bootloader_time += int(values[1])
+      line = self.f.readline()
+    self.boottime_props = collections.OrderedDict(sorted(
+        boottime_props.items(), key = lambda item: item[1]))
+
+  def parse(self):
+    while (True):
+      l = self.f.readline()
+      if len(l) == 0: # EOF
+        return
+      m = self.re_log_start.match(l)
+      if not m:
+        continue
+      #print m.group(1)
+      if m.group(1).startswith(KERNEL_LOG_TITLE):
+        self.handle_kernel_log()
+      elif m.group(1).startswith(SYSYEM_LOG_TITLE):
+        self.handle_system_log()
+      elif m.group(1).startswith(SYSTEM_PROPS_TITLE):
+        self.handle_system_props()
+      elif m.group(1).startswith(LAST_KMSG_TITLE):
+        self.handle_last_kernel_log()
+      elif m.group(1).startswith(LAST_LOGCAT_TITLE):
+        self.handle_last_system_log()
+
+  def dump_props(self):
+    if self.bootloader_time != 0:
+      print "*bootloader time:", self.bootloader_time
+    if self.boottime_props:
+      print "*ro.boottime.*:"
+      for name, t in self.boottime_props.iteritems():
+        print ' {0:30}: {1}'.format(name, t)
+
+  def reset_event_times(self, kernel_event, logcat_event):
+    has_boot_complete = True
+    kernel_bootcomplete_time = kernel_event.events.get("BootComplete_kernel")
+    if not kernel_bootcomplete_time:
+      has_boot_complete = False
+    logcat_bootcomplete_time = logcat_event.events.get("BootComplete")
+    if not logcat_bootcomplete_time:
+      has_boot_complete = False
+    time_delta = 0
+    if has_boot_complete:
+      time_delta = logcat_bootcomplete_time - kernel_bootcomplete_time
+    else:
+      time_delta = logcat_event.events.values()[0] if len(logcat_event.events) > 0 else 0
+    logcat_event.reset_events_time(time_delta)
+    logcat_event.reset_shutdown_events_time()
+    kernel_event.reset_shutdown_events_time()
+    return has_boot_complete
+
+  def dump(self):
+    self.dump_props()
+    boot_complete_found = self.reset_event_times(self.current_boot_kernel, self.current_boot_logcat)
+    print "* Kernel dmesg:"
+    self.current_boot_kernel.dump()
+    print "\n\n* Logcat " + ("(time matched with kernel dmesg):" if boot_complete_found\
+        else "(time set relative to the first event):")
+    self.current_boot_logcat.dump()
+    print "\n\n\n==== Data from last boot ==="
+    boot_complete_found = self.reset_event_times(self.last_boot_kernel, self.last_boot_logcat)
+    print "\n\n* Last Kernel dmesg:"
+    self.last_boot_kernel.dump()
+    print "\n\n* Last Logcat " + ("(time matched with kernel dmesg):" if boot_complete_found \
+        else "(time set relative to the first event):")
+    self.last_boot_logcat.dump()
+
+def main():
+  args = init_arguments()
+
+  parser = Parser(args.config, args.bugreport_file[0])
+  parser.parse()
+  parser.dump()
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/bootanalyze/config.yaml b/tools/bootanalyze/config.yaml
index 90f68b7..37f2891 100644
--- a/tools/bootanalyze/config.yaml
+++ b/tools/bootanalyze/config.yaml
@@ -1,13 +1,13 @@
 #YAML
 time_correction_key: correction
 timings:
-  system_server: SystemServerTiming(Async)?\s*:\s*(?P<name>[^\s]+) took to complete:\s(?P<time>[0-9]+)ms
+  system_server: SystemServerTiming(Async)?\s*:\s*(?P<name>\S+) took to complete:\s(?P<time>[0-9]+)ms
   fs_shutdown: (?P<name>boot_fs_shutdown),(?P<time>[0-9]+),([0-9]+)
-  ueventd_secs: ueventd:\s(?P<name>[^\s].+)\stook\s(?P<time>[.0-9]+)\sseconds
-  init_command_ms: init:\sCommand\s(?P<name>[^\s].+)\sreturned.*took\s(?P<time>[.0-9]+)ms
-  init_service_exec_secs: init:\sService\s.*exec\s[^\s]+\s\((?P<name>[^\s].+)\).*pid.*\swaiting\stook\s(?P<time>[.0-9]+)\sseconds
-  zygote64_timing: (?P<name>Zygote64Timing\:\s[^\s]+)\stook\sto\scomplete\:\s(?P<time>[0-9]+)ms
-  zygote32_timing: (?P<name>Zygote32Timing\:\s[^\s]+)\stook\sto\scomplete\:\s(?P<time>[0-9]+)ms
+  ueventd_secs: ueventd:\s(?P<name>\S.+)\stook\s(?P<time>[.0-9]+)\sseconds
+  init_command_ms: init:\sCommand\s(?P<name>\S.+)\sreturned.*took\s(?P<time>[.0-9]+)ms
+  init_service_exec_secs: init:\sService\s.*exec\s\S+\s\((?P<name>\S.+)\).*pid.*\swaiting\stook\s(?P<time>[.0-9]+)\sseconds
+  zygote64_timing: (?P<name>Zygote64Timing\:\s\S+)\stook\sto\scomplete\:\s(?P<time>[0-9]+)ms
+  zygote32_timing: (?P<name>Zygote32Timing\:\s\S+)\stook\sto\scomplete\:\s(?P<time>[0-9]+)ms
 events:
   kernel: Linux version
   android_init_1st_stage: init first stage started
@@ -40,7 +40,6 @@
   SystemServer_start: Entered the Android system server!
   system_server_ready: Enabled StrictMode for system server main
   PackageManagerInit_start: SystemServer\s*:\s*StartPackageManagerService
-  PackageManagerInit_ready: StartPackageManagerService took to complete
   BluetoothService_start: Starting com.android.server.BluetoothService
   SystemUi_start: for service com.android.systemui/.
   CarLauncherReady: Em.Overview:\s*onResume