diff --git a/android-35/android/bluetooth/BluetoothHealth.java b/android-35/android/bluetooth/BluetoothHealth.java
new file mode 100644
index 0000000..8ce684e
--- /dev/null
+++ b/android-35/android/bluetooth/BluetoothHealth.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2011 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.bluetooth;
+
+import android.annotation.RequiresPermission;
+import android.annotation.SuppressLint;
+import android.bluetooth.annotations.RequiresBluetoothConnectPermission;
+import android.bluetooth.annotations.RequiresLegacyBluetoothPermission;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Public API for Bluetooth Health Profile.
+ *
+ * <p>BluetoothHealth is a proxy object for controlling the Bluetooth Service via IPC.
+ *
+ * <p>How to connect to a health device which is acting in the source role.
+ * <li>Use {@link BluetoothAdapter#getProfileProxy} to get the BluetoothHealth proxy object.
+ * <li>Create an {@link BluetoothHealth} callback and call {@link #registerSinkAppConfiguration} to
+ *     register an application configuration
+ * <li>Pair with the remote device. This currently needs to be done manually from Bluetooth Settings
+ * <li>Connect to a health device using {@link #connectChannelToSource}. Some devices will connect
+ *     the channel automatically. The {@link BluetoothHealth} callback will inform the application
+ *     of channel state change.
+ * <li>Use the file descriptor provided with a connected channel to read and write data to the
+ *     health channel.
+ * <li>The received data needs to be interpreted using a health manager which implements the IEEE
+ *     11073-xxxxx specifications.
+ * <li>When done, close the health channel by calling {@link #disconnectChannel} and unregister the
+ *     application configuration calling {@link #unregisterAppConfiguration}
+ *
+ * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should use
+ *     Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+ *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+ *     BluetoothDevice#createL2capChannel(int)}
+ */
+@Deprecated
+public final class BluetoothHealth implements BluetoothProfile {
+    private static final String TAG = "BluetoothHealth";
+
+    /**
+     * Health Profile Source Role - the health device.
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int SOURCE_ROLE = 1 << 0;
+
+    /**
+     * Health Profile Sink Role the device talking to the health device.
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int SINK_ROLE = 1 << 1;
+
+    /**
+     * Health Profile - Channel Type used - Reliable
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int CHANNEL_TYPE_RELIABLE = 10;
+
+    /**
+     * Health Profile - Channel Type used - Streaming
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int CHANNEL_TYPE_STREAMING = 11;
+
+    /**
+     * Hide auto-created default constructor
+     *
+     * @hide
+     */
+    BluetoothHealth() {}
+
+    /** @hide */
+    @Override
+    public void onServiceConnected(IBinder service) {}
+
+    /** @hide */
+    @Override
+    public void onServiceDisconnected() {}
+
+    /** @hide */
+    @Override
+    public BluetoothAdapter getAdapter() {
+        return null;
+    }
+
+    /**
+     * Register an application configuration that acts as a Health SINK. This is the configuration
+     * that will be used to communicate with health devices which will act as the {@link
+     * #SOURCE_ROLE}. This is an asynchronous call and so the callback is used to notify success or
+     * failure if the function returns true.
+     *
+     * @param name The friendly name associated with the application or configuration.
+     * @param dataType The dataType of the Source role of Health Profile to which the sink wants to
+     *     connect to.
+     * @param callback A callback to indicate success or failure of the registration and all
+     *     operations done on this application configuration.
+     * @return If true, callback will be called.
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public boolean registerSinkAppConfiguration(
+            String name, int dataType, BluetoothHealthCallback callback) {
+        Log.e(TAG, "registerSinkAppConfiguration(): BluetoothHealth is deprecated");
+        return false;
+    }
+
+    /**
+     * Unregister an application configuration that has been registered using {@link
+     * #registerSinkAppConfiguration}
+     *
+     * @param config The health app configuration
+     * @return Success or failure.
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public boolean unregisterAppConfiguration(BluetoothHealthAppConfiguration config) {
+        Log.e(TAG, "unregisterAppConfiguration(): BluetoothHealth is deprecated");
+        return false;
+    }
+
+    /**
+     * Connect to a health device which has the {@link #SOURCE_ROLE}. This is an asynchronous call.
+     * If this function returns true, the callback associated with the application configuration
+     * will be called.
+     *
+     * @param device The remote Bluetooth device.
+     * @param config The application configuration which has been registered using {@link
+     *     #registerSinkAppConfiguration(String, int, BluetoothHealthCallback) }
+     * @return If true, the callback associated with the application config will be called.
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public boolean connectChannelToSource(
+            BluetoothDevice device, BluetoothHealthAppConfiguration config) {
+        Log.e(TAG, "connectChannelToSource(): BluetoothHealth is deprecated");
+        return false;
+    }
+
+    /**
+     * Disconnect a connected health channel. This is an asynchronous call. If this function returns
+     * true, the callback associated with the application configuration will be called.
+     *
+     * @param device The remote Bluetooth device.
+     * @param config The application configuration which has been registered using {@link
+     *     #registerSinkAppConfiguration(String, int, BluetoothHealthCallback) }
+     * @param channelId The channel id associated with the channel
+     * @return If true, the callback associated with the application config will be called.
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public boolean disconnectChannel(
+            BluetoothDevice device, BluetoothHealthAppConfiguration config, int channelId) {
+        Log.e(TAG, "disconnectChannel(): BluetoothHealth is deprecated");
+        return false;
+    }
+
+    /**
+     * Get the file descriptor of the main channel associated with the remote device and application
+     * configuration.
+     *
+     * <p>It's the responsibility of the caller to close the ParcelFileDescriptor when done.
+     *
+     * @param device The remote Bluetooth health device
+     * @param config The application configuration
+     * @return null on failure, ParcelFileDescriptor on success.
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public ParcelFileDescriptor getMainChannelFd(
+            BluetoothDevice device, BluetoothHealthAppConfiguration config) {
+        Log.e(TAG, "getMainChannelFd(): BluetoothHealth is deprecated");
+        return null;
+    }
+
+    /**
+     * Get the current connection state of the profile.
+     *
+     * <p>This is not specific to any application configuration but represents the connection state
+     * of the local Bluetooth adapter with the remote device. This can be used by applications like
+     * status bar which would just like to know the state of the local adapter.
+     *
+     * @param device Remote bluetooth device.
+     * @return State of the profile connection. One of {@link #STATE_CONNECTED}, {@link
+     *     #STATE_CONNECTING}, {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING}
+     */
+    @Override
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public int getConnectionState(BluetoothDevice device) {
+        Log.e(TAG, "getConnectionState(): BluetoothHealth is deprecated");
+        return STATE_DISCONNECTED;
+    }
+
+    /**
+     * Get connected devices for the health profile.
+     *
+     * <p>Return the set of devices which are in state {@link #STATE_CONNECTED}
+     *
+     * <p>This is not specific to any application configuration but represents the connection state
+     * of the local Bluetooth adapter for this profile. This can be used by applications like status
+     * bar which would just like to know the state of the local adapter.
+     *
+     * @return List of devices. The list will be empty on error.
+     */
+    @Override
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public List<BluetoothDevice> getConnectedDevices() {
+        Log.e(TAG, "getConnectedDevices(): BluetoothHealth is deprecated");
+        return Collections.emptyList();
+    }
+
+    /**
+     * Get a list of devices that match any of the given connection states.
+     *
+     * <p>If none of the devices match any of the given states, an empty list will be returned.
+     *
+     * <p>This is not specific to any application configuration but represents the connection state
+     * of the local Bluetooth adapter for this profile. This can be used by applications like status
+     * bar which would just like to know the state of the local adapter.
+     *
+     * @param states Array of states. States can be one of {@link #STATE_CONNECTED}, {@link
+     *     #STATE_CONNECTING}, {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING},
+     * @return List of devices. The list will be empty on error.
+     */
+    @Override
+    @RequiresLegacyBluetoothPermission
+    @RequiresBluetoothConnectPermission
+    @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
+    @SuppressLint("AndroidFrameworkRequiresPermission")
+    public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
+        Log.e(TAG, "getDevicesMatchingConnectionStates(): BluetoothHealth is deprecated");
+        return Collections.emptyList();
+    }
+
+    /**
+     * Health Channel Connection State - Disconnected
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int STATE_CHANNEL_DISCONNECTED = 0;
+
+    /**
+     * Health Channel Connection State - Connecting
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int STATE_CHANNEL_CONNECTING = 1;
+
+    /**
+     * Health Channel Connection State - Connected
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int STATE_CHANNEL_CONNECTED = 2;
+
+    /**
+     * Health Channel Connection State - Disconnecting
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int STATE_CHANNEL_DISCONNECTING = 3;
+
+    /**
+     * Health App Configuration registration success
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int APP_CONFIG_REGISTRATION_SUCCESS = 0;
+
+    /**
+     * Health App Configuration registration failure
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int APP_CONFIG_REGISTRATION_FAILURE = 1;
+
+    /**
+     * Health App Configuration un-registration success
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int APP_CONFIG_UNREGISTRATION_SUCCESS = 2;
+
+    /**
+     * Health App Configuration un-registration failure
+     *
+     * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should
+     *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link
+     *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link
+     *     BluetoothDevice#createL2capChannel(int)}
+     */
+    @Deprecated public static final int APP_CONFIG_UNREGISTRATION_FAILURE = 3;
+}
