diff --git a/car-apps-common/src/com/android/car/apps/common/CarUxRestrictionsUtil.java b/car-apps-common/src/com/android/car/apps/common/CarUxRestrictionsUtil.java
index 2fb5e17..ed219ae 100644
--- a/car-apps-common/src/com/android/car/apps/common/CarUxRestrictionsUtil.java
+++ b/car-apps-common/src/com/android/car/apps/common/CarUxRestrictionsUtil.java
@@ -17,7 +17,6 @@
 
 import static android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_LIMIT_STRING_LENGTH;
 
-import android.annotation.Nullable;
 import android.car.Car;
 import android.car.CarNotConnectedException;
 import android.car.drivingstate.CarUxRestrictions;
@@ -26,6 +25,9 @@
 import android.content.Context;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import java.util.Collections;
 import java.util.Set;
 import java.util.WeakHashMap;
@@ -40,32 +42,51 @@
 public class CarUxRestrictionsUtil {
     private static final String TAG = "CarUxRestrictionsUtil";
 
-    private Car mCarApi;
+    private final Car mCarApi;
     private CarUxRestrictionsManager mCarUxRestrictionsManager;
-    private CarUxRestrictions mCarUxRestrictions;
+    @NonNull
+    private CarUxRestrictions mCarUxRestrictions = getDefaultRestrictions();
 
     private Set<OnUxRestrictionsChangedListener> mObservers;
     private static CarUxRestrictionsUtil sInstance = null;
 
     private CarUxRestrictionsUtil(Context context) {
         CarUxRestrictionsManager.OnUxRestrictionsChangedListener listener = (carUxRestrictions) -> {
-            mCarUxRestrictions = carUxRestrictions;
-            notify(carUxRestrictions);
-        };
-        mCarApi = Car.createCar(context);
+            if (carUxRestrictions == null) {
+                mCarUxRestrictions = getDefaultRestrictions();
+            } else {
+                mCarUxRestrictions = carUxRestrictions;
+            }
 
+            for (OnUxRestrictionsChangedListener observer : mObservers) {
+                observer.onRestrictionsChanged(mCarUxRestrictions);
+            }
+        };
+
+        mCarApi = Car.createCar(context);
         mObservers = Collections.newSetFromMap(new WeakHashMap<>());
 
         try {
             mCarUxRestrictionsManager = (CarUxRestrictionsManager) mCarApi
                     .getCarManager(Car.CAR_UX_RESTRICTION_SERVICE);
             mCarUxRestrictionsManager.registerListener(listener);
-            mCarUxRestrictions = mCarUxRestrictionsManager.getCurrentCarUxRestrictions();
+            listener.onUxRestrictionsChanged(
+                    mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
         } catch (CarNotConnectedException e) {
             Log.e(TAG, "Car not connected", e);
+            // mCarUxRestrictions will be the default
+        } catch (NullPointerException e) {
+            Log.e(TAG, "Car not connected", e);
+            // mCarUxRestrictions will be the default
         }
     }
 
+    @NonNull
+    private CarUxRestrictions getDefaultRestrictions() {
+        return new CarUxRestrictions.Builder(true,
+                CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED, 0).build();
+    }
+
     /**
      * Listener interface used to update clients on UxRestrictions changes
      */
@@ -73,12 +94,13 @@
         /**
          * Called when CarUxRestrictions changes
          */
-        void onRestrictionsChanged(CarUxRestrictions carUxRestrictions);
+        void onRestrictionsChanged(@NonNull CarUxRestrictions carUxRestrictions);
     }
 
     /**
      * Returns the singleton instance of this class
      */
+    @NonNull
     public static CarUxRestrictionsUtil getInstance(Context context) {
         if (sInstance == null) {
             sInstance = new CarUxRestrictionsUtil(context);
@@ -87,12 +109,6 @@
         return sInstance;
     }
 
-    private void notify(CarUxRestrictions carUxRestrictions) {
-        for (OnUxRestrictionsChangedListener listener : mObservers) {
-            listener.onRestrictionsChanged(carUxRestrictions);
-        }
-    }
-
     /**
      * Registers a listener on this class for updates to CarUxRestrictions.
      * Multiple listeners may be registered.
diff --git a/car-apps-common/src/com/android/car/apps/common/widget/PagedRecyclerView.java b/car-apps-common/src/com/android/car/apps/common/widget/PagedRecyclerView.java
index 8ad23aa..08ba31b 100644
--- a/car-apps-common/src/com/android/car/apps/common/widget/PagedRecyclerView.java
+++ b/car-apps-common/src/com/android/car/apps/common/widget/PagedRecyclerView.java
@@ -51,7 +51,7 @@
 
     private Context mContext;
 
-    private CarUxRestrictionsUtil mCarUxRestrictionsUtil;
+    private final CarUxRestrictionsUtil mCarUxRestrictionsUtil;
     private final CarUxRestrictionsUtil.OnUxRestrictionsChangedListener mListener;
 
     private boolean mScrollBarEnabled;
@@ -206,11 +206,7 @@
     public PagedRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
-        try {
-            mCarUxRestrictionsUtil = CarUxRestrictionsUtil.getInstance(context);
-        } catch (NullPointerException e) {
-            // Do nothing, mCarUxRestrictionsUtil will be null
-        }
+        mCarUxRestrictionsUtil = CarUxRestrictionsUtil.getInstance(context);
         mListener = this::updateCarUxRestrictions;
 
         init(context, attrs, defStyle);
@@ -302,17 +298,13 @@
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        if (mCarUxRestrictionsUtil != null) {
-            mCarUxRestrictionsUtil.register(mListener);
-        }
+        mCarUxRestrictionsUtil.register(mListener);
     }
 
     @Override
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        if (mCarUxRestrictionsUtil != null) {
-            mCarUxRestrictionsUtil.unregister(mListener);
-        }
+        mCarUxRestrictionsUtil.unregister(mListener);
     }
 
     private void updateCarUxRestrictions(CarUxRestrictions carUxRestrictions) {
diff --git a/car-messsaging-lib/Android.mk b/car-messsaging-lib/Android.mk
deleted file mode 100644
index 32e920c..0000000
--- a/car-messsaging-lib/Android.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# Copyright (C) 2019 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) $(call all-Iaidl-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_AIDL_INCLUDES := \
-    $(LOCAL_PATH)/src \
-
-LOCAL_STATIC_ANDROID_LIBRARIES += \
-    androidx.annotation_annotation \
-
-LOCAL_MODULE := car-messaging-lib
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/car-messsaging-lib/AndroidManifest.xml b/car-messsaging-lib/AndroidManifest.xml
deleted file mode 100644
index 0577c35..0000000
--- a/car-messsaging-lib/AndroidManifest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2019 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.android.car.messaging">
-</manifest>
diff --git a/car-messsaging-lib/OWNERS b/car-messsaging-lib/OWNERS
deleted file mode 100644
index c74339b..0000000
--- a/car-messsaging-lib/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# People who can approve changes for submission.
-ritwikam@google.com
-jiayuzhou@google.com
diff --git a/car-messsaging-lib/res/values/strings.xml b/car-messsaging-lib/res/values/strings.xml
deleted file mode 100644
index f98ab23..0000000
--- a/car-messsaging-lib/res/values/strings.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 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>
-</resources>
diff --git a/car-messsaging-lib/src/com/android/car/messaging/entity/Action.java b/car-messsaging-lib/src/com/android/car/messaging/entity/Action.java
deleted file mode 100644
index cfd6209..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/entity/Action.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.entity;
-
-import android.app.PendingIntent;
-import android.app.RemoteInput;
-import android.os.Bundle;
-import android.os.Parcel;
-
-import androidx.annotation.Nullable;
-
-/**
- * Semantic actions that 3p can perform.
- */
-public class Action extends BaseEntity {
-    private String mSemanticAction;
-    private PendingIntent mCallback;
-    private Bundle mExtra;
-    private RemoteInput mRemoteInput;
-
-    public static final Creator<Action> CREATOR = new Creator<Action>() {
-        @Override
-        public Action createFromParcel(Parcel in) {
-            return new Action(in);
-        }
-
-        @Override
-        public Action[] newArray(int size) {
-            return new Action[size];
-        }
-    };
-
-    protected Action() {
-        super();
-    }
-
-    protected Action(Parcel in) {
-        super(in);
-        mSemanticAction = in.readString();
-        mCallback = in.readParcelable(PendingIntent.class.getClassLoader());
-        mRemoteInput = in.readParcelable(RemoteInput.class.getClassLoader());
-        mExtra = in.readBundle(getClass().getClassLoader());
-    }
-
-    /**
-     * Returns the semantic action.
-     */
-    @Nullable
-    public String getSemanticAction() {
-        return mSemanticAction;
-    }
-
-    /**
-     * Returns the callback which will be fired when the action is triggered.
-     */
-    public PendingIntent getCallback() {
-        return mCallback;
-    }
-
-    /**
-     * Returns the extra which helps to fulfill the action.
-     */
-    public Bundle getExtra() {
-        return mExtra;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mSemanticAction);
-        dest.writeValue(mCallback);
-        dest.writeValue(mRemoteInput);
-        dest.writeBundle(mExtra);
-    }
-
-    /**
-     * Builder for {@link Action}.
-     */
-    public static class Builder {
-        private String mSemanticAction;
-        private PendingIntent mCallback;
-        private Bundle mExtra;
-
-        public void setSemanticAction(String semanticAction) {
-            mSemanticAction = semanticAction;
-        }
-
-        public void setCallback(PendingIntent callback) {
-            mCallback = callback;
-        }
-
-        public void setExtra(Bundle extra) {
-            mExtra = extra;
-        }
-
-        /**
-         * Build {@link Action}.
-         */
-        public Action build() {
-            Action action = new Action();
-            action.mCallback = mCallback;
-            action.mExtra = mExtra;
-            action.mSemanticAction = mSemanticAction;
-            return action;
-        }
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/entity/BaseEntity.java b/car-messsaging-lib/src/com/android/car/messaging/entity/BaseEntity.java
deleted file mode 100644
index 2083ab8..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/entity/BaseEntity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.entity;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * The base class for all messaging entities.
- */
-public abstract class BaseEntity implements Parcelable {
-    protected BaseEntity() {}
-
-    protected BaseEntity(Parcel in) {}
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/entity/Conversation.java b/car-messsaging-lib/src/com/android/car/messaging/entity/Conversation.java
deleted file mode 100644
index aac1b2c..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/entity/Conversation.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.entity;
-
-import android.os.Parcel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents a conversation.
- */
-public class Conversation extends BaseEntity {
-    private ConversationMetaData mConversationMetaData;
-    private List<Action> mActions = new ArrayList<>();
-
-    public static final Creator<Conversation> CREATOR = new Creator<Conversation>() {
-        @Override
-        public Conversation createFromParcel(Parcel in) {
-            return new Conversation(in);
-        }
-
-        @Override
-        public Conversation[] newArray(int size) {
-            return new Conversation[size];
-        }
-    };
-
-    protected Conversation(Parcel in) {
-        super(in);
-        mConversationMetaData = in.readParcelable(ConversationMetaData.class.getClassLoader());
-        in.readList(mActions, /* classloader = */ Action.class.getClassLoader());
-    }
-
-    protected Conversation() {
-        super();
-    }
-
-    public ConversationMetaData getConversationMetaData() {
-        return mConversationMetaData;
-    }
-
-    public List<Action> getActions() {
-        return mActions;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeValue(mConversationMetaData);
-        dest.writeList(mActions);
-    }
-
-    /**
-     * Builder for {@link Conversation}.
-     */
-    public static class Builder {
-        private ConversationMetaData mConversationMetaData;
-        private List<Action> mActions = new ArrayList<>();
-
-        /**
-         * Add an Action to the Conversation.
-         */
-        public void addActions(Action action) {
-            mActions.add(action);
-        }
-
-        /**
-         * Builds {@link Conversation}.
-         */
-        public Conversation build() {
-            Conversation conversation = new Conversation();
-            conversation.mConversationMetaData = mConversationMetaData;
-            conversation.mActions.addAll(mActions);
-            return conversation;
-        }
-
-        public void setConversationMetaData(ConversationMetaData conversationMetaData) {
-            mConversationMetaData = conversationMetaData;
-        }
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/entity/ConversationContainer.java b/car-messsaging-lib/src/com/android/car/messaging/entity/ConversationContainer.java
deleted file mode 100644
index 8871b27..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/entity/ConversationContainer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.entity;
-
-import android.os.Parcel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Contains a list of conversations.
- */
-public class ConversationContainer extends BaseEntity {
-
-    private String mTitle;
-    private List<Conversation> mConversations = new ArrayList<>();
-
-    public static final Creator<ConversationContainer> CREATOR =
-            new Creator<ConversationContainer>() {
-                @Override
-                public ConversationContainer createFromParcel(Parcel in) {
-                    return new ConversationContainer(in);
-                }
-
-                @Override
-                public ConversationContainer[] newArray(int size) {
-                    return new ConversationContainer[size];
-                }
-            };
-
-    protected ConversationContainer(Parcel in) {
-        super(in);
-        mTitle = in.readString();
-        in.readList(mConversations, Conversation.class.getClassLoader());
-    }
-
-    protected ConversationContainer() {}
-
-    public String getTitle() {
-        return mTitle;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mTitle);
-        dest.writeList(mConversations);
-    }
-
-    /**
-     * Builder for {@link ConversationContainer}.
-     */
-    public static class Builder {
-        private String mTitle;
-        private List<Conversation> mConversations = new ArrayList<>();
-
-
-        public void setTitle(String title) {
-            mTitle = title;
-        }
-
-        /**
-         * Adds a conversation to a conversation container.
-         */
-        public void addConversation(Conversation conversation) {
-            mConversations.add(conversation);
-        }
-
-        /**
-         * Builds {@link ConversationContainer}.
-         */
-        public ConversationContainer build() {
-            ConversationContainer conversationContainer = new ConversationContainer();
-            conversationContainer.mTitle = mTitle;
-            conversationContainer.mConversations.addAll(mConversations);
-            return conversationContainer;
-        }
-    }
-
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/entity/ConversationMetaData.java b/car-messsaging-lib/src/com/android/car/messaging/entity/ConversationMetaData.java
deleted file mode 100644
index 1980dc9..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/entity/ConversationMetaData.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.entity;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Contains meta data of a conversation such as conversation title.
- */
-public class ConversationMetaData implements Parcelable {
-    private String mTitle;
-
-    public static final Creator<ConversationMetaData> CREATOR =
-            new Creator<ConversationMetaData>() {
-                @Override
-                public ConversationMetaData createFromParcel(Parcel in) {
-                    return new ConversationMetaData(in);
-                }
-
-                @Override
-                public ConversationMetaData[] newArray(int size) {
-                    return new ConversationMetaData[size];
-                }
-            };
-
-    protected ConversationMetaData(Parcel in) {
-        mTitle = in.readString();
-    }
-
-    protected ConversationMetaData() {}
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mTitle);
-    }
-
-    public String getTitle() {
-        return mTitle;
-    }
-
-    /**
-     * Builder for {@link ConversationMetaData}.
-     */
-    public static class Builder {
-        private String mTitle;
-
-        public void setTitle(String title) {
-            mTitle = title;
-        }
-
-        /**
-         * Builds {@link ConversationContainer}.
-         */
-        public ConversationMetaData build() {
-            ConversationMetaData conversationMetaData = new ConversationMetaData();
-            conversationMetaData.mTitle = mTitle;
-            return conversationMetaData;
-        }
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/entity/Message.java b/car-messsaging-lib/src/com/android/car/messaging/entity/Message.java
deleted file mode 100644
index f764dca..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/entity/Message.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.entity;
-
-import android.os.Parcel;
-
-/**
- * Represents an individual message.
- */
-public class Message extends BaseEntity {
-
-    private String mMessageBody;
-
-    public static final Creator<Message> CREATOR = new Creator<Message>() {
-        @Override
-        public Message createFromParcel(Parcel in) {
-            return new Message(in);
-        }
-
-        @Override
-        public Message[] newArray(int size) {
-            return new Message[size];
-        }
-    };
-
-    protected Message(Parcel in) {
-        super(in);
-        mMessageBody = in.readString();
-    }
-
-    protected Message() {}
-
-    /**
-     * Returns the message body.
-     */
-    public String getMessageBody() {
-        return mMessageBody;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mMessageBody);
-    }
-
-    /**
-     * Builder for {@link Message}.
-     */
-    public static class Builder {
-        private String mMessage;
-
-        public void setMessage(String message) {
-            mMessage = message;
-        }
-
-        /**
-         * Builds a {@link Message}.
-         */
-        public Message build() {
-            Message message = new Message();
-            message.mMessageBody = mMessage;
-            return message;
-        }
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/ConnectionConfig.aidl b/car-messsaging-lib/src/com/android/car/messaging/service/ConnectionConfig.aidl
deleted file mode 100644
index 7e3edb5..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/ConnectionConfig.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (C) 2019 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.messaging.service;
-
-parcelable ConnectionConfig;
\ No newline at end of file
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/ConnectionConfig.java b/car-messsaging-lib/src/com/android/car/messaging/service/ConnectionConfig.java
deleted file mode 100644
index 0f9a7c1..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/ConnectionConfig.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.service;
-
-import android.content.pm.PackageManager;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Contains configuration of {@link MessagingService} connection.
- */
-public class ConnectionConfig implements Parcelable {
-    private int mApiVersion;
-    private String mPackageName;
-
-    private ConnectionConfig() {}
-
-    protected ConnectionConfig(Parcel in) {
-        mApiVersion = in.readInt();
-        mPackageName = in.readString();
-    }
-
-    public static final Creator<ConnectionConfig> CREATOR = new Creator<ConnectionConfig>() {
-        @Override
-        public ConnectionConfig createFromParcel(Parcel in) {
-            return new ConnectionConfig(in);
-        }
-
-        @Override
-        public ConnectionConfig[] newArray(int size) {
-            return new ConnectionConfig[size];
-        }
-    };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mApiVersion);
-        dest.writeString(mPackageName);
-    }
-
-    /**
-     * Returns the Api version for the current connection.
-     */
-    public int getApiVersion() {
-        return mApiVersion;
-    }
-
-    /**
-     * Returns the package name of the caller.
-     */
-    public String getPackageName() {
-        return mPackageName;
-    }
-
-    /**
-     * Builds a {@link ConnectionConfig}.
-     */
-    public static class Builder {
-        private int mApiVersion;
-        private String mPackageName;
-
-        /**
-         * Sets the requested api version for the connection.
-         */
-        public void setApiVersion(int apiVersion) {
-            mApiVersion = apiVersion;
-        }
-
-        /**
-         * Sets the package name of the caller. Must be one of the return value of
-         * {@link PackageManager#getPackagesForUid} for the caller's uid.
-         */
-        public void setPackageName(String packageName) {
-            mPackageName = packageName;
-        }
-
-        /**
-         * Builds a {#link ConnectionConfig}.
-         */
-        public ConnectionConfig build() {
-            ConnectionConfig connectionConfig = new ConnectionConfig();
-            connectionConfig.mApiVersion = mApiVersion;
-            connectionConfig.mPackageName = mPackageName;
-            return connectionConfig;
-        }
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/IConnectionCallback.aidl b/car-messsaging-lib/src/com/android/car/messaging/service/IConnectionCallback.aidl
deleted file mode 100644
index d7e8852..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/IConnectionCallback.aidl
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (C) 2019 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.messaging.service;
-
-import com.android.car.messaging.service.IMessagingService;
-
-/**
- * A callback which will be called after client tries to connect to a MessagingService.
- */
-oneway interface IConnectionCallback {
-
-    /**
-     * Called when the connection has been established.
-     */
-    void onConnect(IMessagingService service);
-
-    /**
-     * Called when the connection is failed to estabilished, such as client is not authorized or
-     * requested version is incompatible.
-     */
-    void onConnectFailed();
-}
\ No newline at end of file
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/ILoadEntityContentCallback.aidl b/car-messsaging-lib/src/com/android/car/messaging/service/ILoadEntityContentCallback.aidl
deleted file mode 100644
index dea4737..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/ILoadEntityContentCallback.aidl
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Copyright (C) 2019 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.messaging.service;
-
-oneway interface ILoadEntityContentCallback {
-    void onEntitiesLoaded(in List entities);
-}
\ No newline at end of file
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/IMessagingService.aidl b/car-messsaging-lib/src/com/android/car/messaging/service/IMessagingService.aidl
deleted file mode 100644
index afd08b4..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/IMessagingService.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Copyright (C) 2019 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.messaging.service;
-
-import android.os.Bundle;
-
-import  com.android.car.messaging.service.ILoadEntityContentCallback;
-
-/**
- * An interface through which clients access to a messaging service.
- */
-interface IMessagingService {
-    /**
-     * Loads the sub content of an entity and subscribes to any changes of the sub content.
-     * Specify the class name of the entity with
-     * {@link MessagingService#EXTRA_SUBSCRIBED_CLASS_NAME} key in the option Bundle.
-     */
-    void subscribeContent(String id, ILoadEntityContentCallback callback, in Bundle options) = 1;
-
-    /**
-     * Unregisters a callback which subscribed to sub content of an entity through
-     * {@link #subscribeContent}.
-     */
-    void unsubscribeContent(String id, ILoadEntityContentCallback callback) = 2;
-}
\ No newline at end of file
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/IMessagingServiceProvider.aidl b/car-messsaging-lib/src/com/android/car/messaging/service/IMessagingServiceProvider.aidl
deleted file mode 100644
index e4515ff..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/IMessagingServiceProvider.aidl
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (C) 2019 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.messaging.service;
-
-import com.android.car.messaging.service.ConnectionConfig;
-import com.android.car.messaging.service.IConnectionCallback;
-import com.android.car.messaging.service.IMessagingService;
-import com.android.car.messaging.service.SupportedVersionInfo;
-
-/**
- * An interface through which clients are authenticated, api version handshaked and connected
- * to a MessagingService.
- */
-interface IMessagingServiceProvider {
-
-    /* @return The versions supported by the API. */
-    SupportedVersionInfo getSupportedApiVersionInfo() = 1;
-
-    /**
-     * Requests to connect to a MessagingService.
-     *
-     * Returns a non-null MessagingService if the client is authenticated and connection is
-     * successful.
-     */
-    oneway void connect(in ConnectionConfig config, IConnectionCallback callback) = 2;
-}
\ No newline at end of file
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/MessagingService.java b/car-messsaging-lib/src/com/android/car/messaging/service/MessagingService.java
deleted file mode 100644
index 6a0eec0..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/MessagingService.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.service;
-
-import android.app.Service;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import androidx.annotation.MainThread;
-
-import com.android.car.messaging.entity.BaseEntity;
-import com.android.car.messaging.entity.Conversation;
-import com.android.car.messaging.entity.ConversationContainer;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Base class for messaging apps which enables messaging apps to provide their data to authorized
- * clients.
- */
-public abstract class MessagingService extends Service {
-    private static final String TAG = "MessagingService";
-
-    /**
-     * The key for a client to specify the class name of an entity which the client is
-     * subscribed to.
-     */
-    public static final String EXTRA_SUBSCRIBED_CLASS_NAME = "subscribed_class_name";
-
-    /**
-     * The root id for {@link ConversationContainer}.
-     */
-    public static final String CONVERSATION_CONTAINER_ROOT_ID = "conversation_container_id";
-
-    private MessagingServiceProviderImpl mMessagingServiceProviderImpl;
-    private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
-
-    // TODO: Merging these two Maps into one when there are more attributes to store for an ID.
-    private Map<String, List<IBinder>> mIdToSubscriptionMap = new ArrayMap<>();
-    private Map<String, String> mIdToClassNameMap = new ArrayMap<>();
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        mMessagingServiceProviderImpl = new MessagingServiceProviderImpl();
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mMessagingServiceProviderImpl;
-    }
-
-    private class MessagingServiceProviderImpl extends IMessagingServiceProvider.Stub {
-        private MessagingServiceImpl mMessagingService = new MessagingServiceImpl();
-
-        @Override
-        public SupportedVersionInfo getSupportedApiVersionInfo() {
-            return new SupportedVersionInfo(/* minVersion = */ 1, /* maxVersion = */ 1);
-        }
-
-        @Override
-        public void connect(ConnectionConfig connectionConfig,
-                IConnectionCallback callback) throws RemoteException {
-            int uid = Binder.getCallingUid();
-            if (isValidPackage(connectionConfig.getPackageName(), uid)) {
-                mMainThreadHandler.post(() -> {
-                    try {
-                        if (onAuthenticate(connectionConfig.getPackageName())) {
-                            callback.onConnect(mMessagingService);
-                        } else {
-                            callback.onConnectFailed();
-                        }
-                    } catch (RemoteException e) {
-                        Log.w(TAG, "Calling IConnectionCallback failed. Ignoring. "
-                                + "pkg=" + connectionConfig.getPackageName());
-                    }
-                });
-            } else {
-                callback.onConnectFailed();
-            }
-        }
-
-        /**
-         * Returns true if the provided package name belongs to the given uid.
-         */
-        private boolean isValidPackage(String pkg, int uid) {
-            if (pkg == null) {
-                return false;
-            }
-
-            final PackageManager pm = getPackageManager();
-            final String[] packages = pm.getPackagesForUid(uid);
-            if (packages == null) {
-                return false;
-            }
-
-            for (String aPackage : packages) {
-                if (aPackage.equals(pkg)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    private class MessagingServiceImpl extends IMessagingService.Stub {
-
-        @Override
-        public void subscribeContent(
-                String id, ILoadEntityContentCallback callback, Bundle options) {
-            mMainThreadHandler.post(() -> {
-                try {
-                    MessagingService.this.subscribeContent(id, callback, options);
-                } catch (RemoteException e) {
-                    Log.w(TAG, "Unable to subscribe to content. callback = " + callback);
-                    MessagingService.this.unsubscribeContent(id, callback);
-                }
-            });
-        }
-
-        @Override
-        public void unsubscribeContent(String id, ILoadEntityContentCallback callback) {
-            mMainThreadHandler.post(() -> MessagingService.this.unsubscribeContent(id, callback));
-        }
-    }
-
-    @MainThread
-    private void subscribeContent(String id, ILoadEntityContentCallback callback, Bundle options)
-            throws RemoteException {
-        List<IBinder> allSubscriptions = mIdToSubscriptionMap.computeIfAbsent(
-                id, (key) -> new ArrayList<>());
-
-        if (allSubscriptions.contains(callback.asBinder())) {
-            return;
-        }
-
-        allSubscriptions.add(callback.asBinder());
-        String entityClassName = options.getString(EXTRA_SUBSCRIBED_CLASS_NAME);
-        mIdToClassNameMap.put(id, entityClassName);
-        List<? extends BaseEntity> entities = loadEntityContentList(id, entityClassName);
-        callback.onEntitiesLoaded(entities);
-    }
-
-    @MainThread
-    private void unsubscribeContent(String id, ILoadEntityContentCallback callback) {
-        List<IBinder> allSubscriptions = mIdToSubscriptionMap.computeIfAbsent(
-                id, (key) -> new ArrayList<>());
-        allSubscriptions.remove(callback.asBinder());
-        if (allSubscriptions.isEmpty()) {
-            mIdToClassNameMap.remove(id);
-        }
-    }
-
-    private List<? extends BaseEntity> loadEntityContentList(String id, String className) {
-        if (CONVERSATION_CONTAINER_ROOT_ID.equals(id)) {
-            return onLoadAllConversationContainers();
-        } else if (className.equals(ConversationContainer.class.getName())) {
-            return onLoadConversations(id);
-        }
-
-        return new ArrayList<>();
-    }
-
-    /**
-     * Called when a client tries to connect to this {@link MessagingService}. Returns true if
-     * the client is authorized to access
-     *
-     * @param packageName The calling client's package name.
-     */
-    protected abstract boolean onAuthenticate(String packageName);
-
-    /**
-     * Called to load all {@link ConversationContainer}s.
-     */
-    protected abstract List<ConversationContainer> onLoadAllConversationContainers();
-
-    /**
-     * Called to load all conversations in a {@link ConversationContainer}.
-     */
-    protected abstract List<Conversation> onLoadConversations(String containerId);
-
-    /**
-     * Notifies the client that content {@link BaseEntity entities} of a {@link BaseEntity} has
-     * changed.
-     */
-    @MainThread
-    public void notifyContentListChanged(String id) {
-        List<IBinder> allSubscriptions = mIdToSubscriptionMap.get(id);
-        if (allSubscriptions == null) {
-            return;
-        }
-        try {
-            for (IBinder callback : allSubscriptions) {
-                List<? extends BaseEntity> entities =
-                        loadEntityContentList(id, mIdToClassNameMap.get(id));
-                ILoadEntityContentCallback.Stub.asInterface(callback).onEntitiesLoaded(entities);
-            }
-        } catch (RemoteException e) {
-            Log.w(TAG, "Unable to call ILoadEntityContentCallback.");
-        }
-    }
-}
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/SupportedVersionInfo.aidl b/car-messsaging-lib/src/com/android/car/messaging/service/SupportedVersionInfo.aidl
deleted file mode 100644
index 783325a..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/SupportedVersionInfo.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (C) 2019 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.messaging.service;
-
-parcelable SupportedVersionInfo;
\ No newline at end of file
diff --git a/car-messsaging-lib/src/com/android/car/messaging/service/SupportedVersionInfo.java b/car-messsaging-lib/src/com/android/car/messaging/service/SupportedVersionInfo.java
deleted file mode 100644
index cd74c57..0000000
--- a/car-messsaging-lib/src/com/android/car/messaging/service/SupportedVersionInfo.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2019 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.messaging.service;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Contains the max and min supported api version.
- */
-public final class SupportedVersionInfo implements Parcelable {
-    private int mMinVersion;
-    private int mMaxVersion;
-
-    public SupportedVersionInfo(int minVersion, int maxVersion) {
-        mMinVersion = minVersion;
-        mMaxVersion = maxVersion;
-    }
-
-    protected SupportedVersionInfo(Parcel in) {
-        mMinVersion = in.readInt();
-        mMaxVersion = in.readInt();
-    }
-
-    public static final Creator<SupportedVersionInfo> CREATOR =
-            new Creator<SupportedVersionInfo>() {
-                @Override
-                public SupportedVersionInfo createFromParcel(Parcel in) {
-                    return new SupportedVersionInfo(in);
-                }
-
-                @Override
-                public SupportedVersionInfo[] newArray(int size) {
-                    return new SupportedVersionInfo[size];
-                }
-            };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mMinVersion);
-        dest.writeInt(mMaxVersion);
-    }
-
-    public int getMinVersion() {
-        return mMinVersion;
-    }
-
-    public int getMaxVersion() {
-        return mMaxVersion;
-    }
-}
diff --git a/car-telephony-common/src/com/android/car/telephony/common/Contact.java b/car-telephony-common/src/com/android/car/telephony/common/Contact.java
index 17337ed..e95cb3e 100644
--- a/car-telephony-common/src/com/android/car/telephony/common/Contact.java
+++ b/car-telephony-common/src/com/android/car/telephony/common/Contact.java
@@ -144,31 +144,13 @@
                 ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI);
         int lookupKeyColumn = cursor.getColumnIndex(
                 ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY);
-        int typeColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
-        int labelColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL);
-        int numberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
-        int rawDataIdColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID);
-        int dataVersionColumn = cursor.getColumnIndex(
-                ContactsContract.CommonDataKinds.Phone.DATA_VERSION);
-        // IS_PRIMARY means primary entry of the raw contact and IS_SUPER_PRIMARY means primary
-        // entry of the aggregated contact. It is guaranteed that only one data entry is super
-        // primary.
-        int isPrimaryColumn = cursor.getColumnIndex(
-                ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY);
 
         Contact contact = new Contact();
         contact.mId = cursor.getLong(contactIdColumn);
         contact.mDisplayName = cursor.getString(displayNameColumn);
         contact.mAltDisplayName = cursor.getString(altDisplayNameColumn);
 
-        PhoneNumber number = PhoneNumber.newInstance(
-                context,
-                cursor.getString(numberColumn),
-                cursor.getInt(typeColumn),
-                cursor.getString(labelColumn),
-                cursor.getInt(isPrimaryColumn) > 0,
-                cursor.getLong(rawDataIdColumn),
-                cursor.getInt(dataVersionColumn));
+        PhoneNumber number = PhoneNumber.fromCursor(context, cursor);
         contact.mPhoneNumbers.add(number);
         if (number.isPrimary()) {
             contact.mPrimaryPhoneNumber = number;
diff --git a/car-telephony-common/src/com/android/car/telephony/common/PhoneNumber.java b/car-telephony-common/src/com/android/car/telephony/common/PhoneNumber.java
index 26884ec..85893e0 100644
--- a/car-telephony-common/src/com/android/car/telephony/common/PhoneNumber.java
+++ b/car-telephony-common/src/com/android/car/telephony/common/PhoneNumber.java
@@ -18,8 +18,10 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.database.Cursor;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 
 import androidx.annotation.Nullable;
@@ -39,6 +41,34 @@
     private boolean mIsPrimary;
     private long mId;
     private int mDataVersion;
+    private String mAccountName;
+    private String mAccountType;
+
+    static PhoneNumber fromCursor(Context context, Cursor cursor) {
+        int typeColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
+        int labelColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL);
+        int numberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
+        int rawDataIdColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID);
+        int dataVersionColumn = cursor.getColumnIndex(
+                ContactsContract.CommonDataKinds.Phone.DATA_VERSION);
+        // IS_PRIMARY means primary entry of the raw contact and IS_SUPER_PRIMARY means primary
+        // entry of the aggregated contact. It is guaranteed that only one data entry is super
+        // primary.
+        int isPrimaryColumn = cursor.getColumnIndex(
+                ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY);
+        int accountNameColumn = cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME);
+        int accountTypeColumn = cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE);
+        return PhoneNumber.newInstance(
+                context,
+                cursor.getString(numberColumn),
+                cursor.getInt(typeColumn),
+                cursor.getString(labelColumn),
+                cursor.getInt(isPrimaryColumn) > 0,
+                cursor.getLong(rawDataIdColumn),
+                cursor.getString(accountNameColumn),
+                cursor.getString(accountTypeColumn),
+                cursor.getInt(dataVersionColumn));
+    }
 
     /**
      * Creates a new {@link PhoneNumber}.
@@ -54,19 +84,23 @@
      *                    Phone#DATA_VERSION}
      */
     public static PhoneNumber newInstance(Context context, String rawNumber, int type,
-            @Nullable String label, boolean isPrimary, long id, int dataVersion) {
+            @Nullable String label, boolean isPrimary, long id, String accountName,
+            String accountType, int dataVersion) {
         I18nPhoneNumberWrapper i18nPhoneNumber = I18nPhoneNumberWrapper.Factory.INSTANCE.get(
                 context, rawNumber);
-        return new PhoneNumber(i18nPhoneNumber, type, label, isPrimary, id, dataVersion);
+        return new PhoneNumber(i18nPhoneNumber, type, label, isPrimary, id, accountName,
+                accountType, dataVersion);
     }
 
     private PhoneNumber(I18nPhoneNumberWrapper i18nNumber, int type, @Nullable String label,
-            boolean isPrimary, long id, int dataVersion) {
+            boolean isPrimary, long id, String accountName, String accountType, int dataVersion) {
         mI18nPhoneNumber = i18nNumber;
         mType = type;
         mLabel = label;
         mIsPrimary = isPrimary;
         mId = id;
+        mAccountName = accountName;
+        mAccountType = accountType;
         mDataVersion = dataVersion;
     }
 
@@ -131,6 +165,16 @@
         return mId;
     }
 
+    @Nullable
+    public String getAccountName() {
+        return mAccountName;
+    }
+
+    @Nullable
+    public String getAccountType() {
+        return mAccountType;
+    }
+
     /**
      * Each contact may have a few sources with the same phone number. Merge same phone numbers as
      * one.
@@ -144,6 +188,8 @@
                 mDataVersion = phoneNumber.mDataVersion;
                 mId = phoneNumber.mId;
                 mIsPrimary |= phoneNumber.mIsPrimary;
+                mAccountName = phoneNumber.mAccountName;
+                mAccountType = phoneNumber.mAccountType;
             }
         }
         return this;
@@ -174,6 +220,8 @@
         dest.writeParcelable(mI18nPhoneNumber, flags);
         dest.writeBoolean(mIsPrimary);
         dest.writeLong(mId);
+        dest.writeString(mAccountName);
+        dest.writeString(mAccountType);
         dest.writeInt(mDataVersion);
     }
 
@@ -186,9 +234,11 @@
                     I18nPhoneNumberWrapper.class.getClassLoader());
             boolean isPrimary = source.readBoolean();
             long id = source.readLong();
+            String accountName = source.readString();
+            String accountType = source.readString();
             int dataVersion = source.readInt();
             PhoneNumber phoneNumber = new PhoneNumber(i18nPhoneNumberWrapper, type, label,
-                    isPrimary, id, dataVersion);
+                    isPrimary, id, accountName, accountType, dataVersion);
             return phoneNumber;
         }
 
