diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..30fabbc
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,59 @@
+#############################################################################
+#
+# Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd
+#
+#############################################################################
+LOCAL_PATH := $(call my-dir)
+
+ifneq ($(BOARD_HAVE_BLUETOOTH_SLSI),)
+
+include $(CLEAR_VARS)
+
+# Setup bdroid local make variables for handling configuration
+ifneq ($(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR),)
+    bdroid_C_INCLUDES := $(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR)
+    bdroid_CFLAGS := -DHAS_BDROID_BUILDCFG
+else
+  $(warning NO BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR, using only generic configuration)
+  bdroid_C_INCLUDES :=
+  bdroid_CFLAGS := -DHAS_NO_BDROID_BUILDCFG
+endif
+
+BDROID_DIR := $(TOP_DIR)system/bt
+
+LOCAL_SRC_FILES := \
+    src/bt_vendor_slsi.c
+
+LOCAL_C_INCLUDES += \
+    $(BDROID_DIR)/hci/include \
+    $(BDROID_DIR)/stack/include \
+    $(BDROID_DIR)/include \
+    $(LOCAL_DIR)/include \
+    $(BDROID_DIR) \
+    $(LOCAL_DIR)/include \
+    $(BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR)
+
+LOCAL_CFLAGS += $(bdroid_CFLAGS)
+
+ifneq ($(TARGET_BUILD_VARIANT),user)
+LOCAL_CFLAGS += -DBTVENDOR_DBG=TRUE
+endif
+
+ifeq ($(CONFIG_SAMSUNG_SCSC_WIFIBT),true)
+# Enable BT/WIFI related code changes in Android source files
+LOCAL_CFLAGS += -DCONFIG_SAMSUNG_SCSC_WIFIBT
+endif
+
+LOCAL_SHARED_LIBRARIES := \
+    libcutils
+
+LOCAL_MODULE := libbt-vendor
+LOCAL_MODULE_OWNER := samsung
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)
+
+include $(BUILD_SHARED_LIBRARY)
+
+endif # BOARD_HAVE_BLUETOOTH_SLSI
diff --git a/conf/bt_did.conf b/conf/bt_did.conf
new file mode 100644
index 0000000..7f6dc08
--- /dev/null
+++ b/conf/bt_did.conf
@@ -0,0 +1,18 @@
+# Device ID (DID) configuration
+[DID1]
+
+# Primary Record - true or false (default)
+# There can be only one primary record
+primaryRecord = true
+
+# Vendor ID '0xFFFF' indicates no Device ID Service Record is present in the device
+# 0x0075 = Samsung Electronics Co. Ltd.
+vendorId = 0x0075
+
+# Product ID & Product Version
+# Per spec DID v1.3 0xJJMN for version is interpreted as JJ.M.N
+# JJ: major version number, M: minor version number, N: sub-minor version number
+# For example: 1200, v14.3.6
+productId = 0x1200
+version = 0x1436
+
diff --git a/conf/bt_vendor.conf b/conf/bt_vendor.conf
new file mode 100644
index 0000000..ca5cc73
--- /dev/null
+++ b/conf/bt_vendor.conf
@@ -0,0 +1,13 @@
+#############################################################################
+#
+# Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd
+#
+#############################################################################
+# Configuration of which bus to use for handling digital audio data. Valid values are PCM or I2S
+audioBusConfig=I2S
+
+# Configuration of H4 device path
+h4_file=/dev/scsc_h4_0
+
+# Platform codec configuration: 1 route audio between ear-jack and BT for eSCO
+audio_sco_jack=1
\ No newline at end of file
diff --git a/conf/bt_vendor_hammerhead_scsc.conf b/conf/bt_vendor_hammerhead_scsc.conf
new file mode 100644
index 0000000..d7cdafc
--- /dev/null
+++ b/conf/bt_vendor_hammerhead_scsc.conf
@@ -0,0 +1,13 @@
+#############################################################################
+#
+# Copyright (c) 2012 - 2014 Samsung Electronics Co., Ltd
+#
+#############################################################################
+# Configuration of which bus to use for handling digital audio data. Valid values are PCM or I2S
+# audioBusConfig=I2S
+
+# Configuration of H4 device path
+h4_file=/dev/scsc_h4_0
+
+# Platform codec configuration: 1 route audio between ear-jack and BT for eSCO
+# audio_sco_jack=1
diff --git a/include/bdroid_buildcfg.h b/include/bdroid_buildcfg.h
new file mode 100644
index 0000000..90b4cbb
--- /dev/null
+++ b/include/bdroid_buildcfg.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+#ifndef _BDROID_BUILDCFG_H
+#define _BDROID_BUILDCFG_H
+
+#define BTM_DEF_LOCAL_NAME   "SLSI S5E7570"
+/**
+ * SD-3510 Increase page timeout value when A2dp is streaming
+ * During A2DP streaming, BT sometimes fails to connect
+ * because of PAGE_TIMEOUT.
+ * BTA_DM_PAGE_TIMEOUT is originally defined in bta_dm_cfg.c
+ */
+#define BTA_DM_PAGE_TIMEOUT 8192
+
+/**
+ * SD-996 Increase MAX_L2CAP_CHANNELS
+ * L2CAP: MAX_L2CAP_CHANNELS is now defined to 20 in order to be able
+ * to connect to 7 HID devices or 5 HID devices and a Stereo Headset
+ * which support AV, AVRCP and HFG
+ * Originally defined in bt_target.h
+ */
+#define MAX_L2CAP_CHANNELS          (20)
+
+/**
+ * SD-1101 Optimize RX SPP throughput
+ * Optimize RX SPP throughput by making sure that
+ * the Peer device do not run out of rfcomm credits
+ * Originally defined in bt_target.h
+ * SSB-5680: Re-optimize for OPP throughput
+ */
+#define PORT_RX_BUF_LOW_WM          (20)
+#define PORT_RX_BUF_HIGH_WM         (40)
+#define PORT_RX_BUF_CRITICAL_WM     (45)
+
+/**
+ * SD-2893 Optimize MTU used by the RFCOMM socket
+ * Optimize the MTU used by the RFCOMM socket by
+ * defining a MTU that can be sent in one l2cap packet
+ * Originally defined in bta_jv_api.h
+ */
+#define BTA_JV_DEF_RFC_MTU      (1011)
+
+/*
+ * SSB-213 New extension channel needed for Android-defined vendor specific commands.
+ * Toggles support for vendor specific extensions such as RPA offloading,
+ * feature discovery, multi-adv etc.
+ */
+#define BLE_VND_INCLUDED        TRUE
+
+/**
+ * SSB-4621 Change number of credits allocated for Bluetooth LE data in the Android host
+ * Based in investigations initiated by MTK-86 it is recommended to change the number of
+ * credits allocated for BLE data from 1 (default) to 2.
+ */
+#define L2C_DEF_NUM_BLE_BUF_SHARED      2
+
+/**
+ * SSB-582 Improve data scheduling to HCI when A2DP is involved
+ * Ensure that A2DP data is scheduled in a way that suits the scheduling in Coex and BT-only scenarios
+ */
+#define L2CAP_HIGH_PRI_MIN_XMIT_QUOTA       13
+#define MIN_NUMBER_A2DP_SDUS                3
+
+#endif
diff --git a/include/bt_vendor_slsi.h b/include/bt_vendor_slsi.h
new file mode 100644
index 0000000..a8107eb
--- /dev/null
+++ b/include/bt_vendor_slsi.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+ *
+ * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd
+ *
+ ****************************************************************************/
+#ifndef BT_VENDOR_SLSI_H__
+#define BT_VENDOR_SLSI_H__
+
+#ifndef CONFIG_SAMSUNG_SCSC_WIFIBT
+#error "CONFIG_SAMSUNG_SCSC_WIFIBT not defined"
+#endif
+
+#include <cutils/log.h>
+
+#include "bt_types.h"
+#include "btm_api.h"
+
+#ifndef BTVENDOR_DBG
+#define BTVENDOR_DBG FALSE
+#endif
+
+#define BTVENDORE(param, ...) { ALOGE(param, ## __VA_ARGS__); }
+
+#if (BTVENDOR_DBG == TRUE)
+#define BTVENDORD(param, ...) { ALOGD(param, ## __VA_ARGS__); }
+#define BTVENDORI(param, ...) { ALOGI(param, ## __VA_ARGS__); }
+#define BTVENDORV(param, ...) { ALOGV(param, ## __VA_ARGS__); }
+#define BTVENDORW(param, ...) { ALOGW(param, ## __VA_ARGS__); }
+#else
+#define BTVENDORD(param, ...) {}
+#define BTVENDORI(param, ...) {}
+#define BTVENDORV(param, ...) {}
+#define BTVENDORW(param, ...) {}
+#endif
+#define SCSC_UNUSED(x) (void)(x)
+
+#endif
diff --git a/src/bt_vendor_slsi.c b/src/bt_vendor_slsi.c
new file mode 100644
index 0000000..4e93300
--- /dev/null
+++ b/src/bt_vendor_slsi.c
@@ -0,0 +1,292 @@
+/****************************************************************************
+ *
+ * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd
+ *
+ ****************************************************************************/
+#ifndef _BSD_SOURCE
+#define _BSD_SOURCE
+#endif
+
+#define LOG_TAG "BT_VENDOR"
+
+#include <endian.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/param.h>
+
+#include "bt_vendor_lib.h"
+
+#include "bt_vendor_slsi.h"
+
+/**
+ * SSB-5242 Route HCI I/F over ABD to driver on PC.
+ */
+#ifndef ENABLE_HCI_TUNNELLING
+#define ENABLE_HCI_TUNNELLING FALSE
+#endif /* !ENABLE_HCI_TUNNELLING */
+#if defined(ENABLE_HCI_TUNNELLING) && (ENABLE_HCI_TUNNELLING == TRUE)
+#include <netinet/in.h>
+#include <netdb.h>
+#endif
+
+#define BLUETOOTH_ADDRESS_FILE "/sys/module/scsc_bt/parameters/bluetooth_address"
+
+/**
+ * SSB-5242 Route HCI I/F over ABD to driver on PC.
+ */
+#if defined(ENABLE_HCI_TUNNELLING) && (ENABLE_HCI_TUNNELLING == TRUE)
+static int hci_tunnelling_port_num = 10157;
+#endif
+
+static const bt_vendor_callbacks_t *vcb;
+static unsigned long long bt_addr;
+
+static char h4_file[MAXPATHLEN] = "/dev/scsc_h4_0";
+static int hci_fd = -1;
+
+/*
+ * Internal helpers
+ */
+
+static void set_bluetooth_address(unsigned long long value)
+{
+    BTVENDORI("Setting Bluetooth address");
+    if (!access(BLUETOOTH_ADDRESS_FILE, W_OK))
+    {
+        int bt_fd = open(BLUETOOTH_ADDRESS_FILE, O_RDWR);
+        if (bt_fd != -1)
+        {
+            char buf[15];
+            ssize_t res;
+
+            res = sprintf(buf, "0x%llx", value);
+            if (res != write(bt_fd, buf, res))
+            {
+                BTVENDORW("Unable setiting Bluetooth address (%s)", strerror(errno));
+            }
+            close(bt_fd);
+        }
+        else
+        {
+            BTVENDORW("Opening file: " BLUETOOTH_ADDRESS_FILE " - failed with: %s", strerror(errno));
+        }
+    }
+    else
+    {
+        BTVENDORW("Unable to access: " BLUETOOTH_ADDRESS_FILE " - error: %s", strerror(errno));
+    }
+}
+
+/*
+ * Internal interface
+ */
+
+/**
+ * SSB-5242 Route HCI I/F over ABD to driver on PC.
+ */
+#if defined(ENABLE_HCI_TUNNELLING) && (ENABLE_HCI_TUNNELLING == TRUE)
+static int socket_open_client(int port_num)
+{
+    struct sockaddr_in serv_addr;
+    struct hostent *server;
+    int fd = -1;
+
+    BTVENDORI("HCI Tunnelling: socket_open_client(): port: 0x%08x.", port_num);
+
+    fd = socket(AF_INET, SOCK_STREAM, 0);
+
+    if (fd < 0)
+    {
+        BTVENDORE("HCI Tunnelling: socket_open_client(): error from socket(), errno:0x%08x:%s.", errno, strerror(errno));
+        fd = -1;
+        return fd;
+    }
+
+    BTVENDORI("HCI Tunnelling: socket_open_client(): port: 0x%08x, fd: 0x%08x.", port_num, fd);
+
+    server = gethostbyname("localhost");
+
+    if (server == NULL)
+    {
+        BTVENDORE("HCI Tunnelling: socket_open_client(): error from gethostbyname(), errno:0x%08x:%s, fd: 0x%08x.", errno, strerror(errno), fd);
+        fd = -1;
+        return fd;
+    }
+
+    bzero((char *) &serv_addr, sizeof(serv_addr));
+    serv_addr.sin_family = AF_INET;
+    bcopy((char *) server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
+    serv_addr.sin_port = htons(port_num);
+
+    if (connect(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
+    {
+        BTVENDORE("HCI Tunnelling: socket_open_client(): error from connect(), errno:0x%08x:%s, fd: 0x%08x.", errno, strerror(errno), fd);
+        fd = -1;
+        return fd;
+    }
+
+    BTVENDORI("HCI Tunnelling: socket_open_client(): OK, fd:0x%08x.", fd);
+
+    return fd;
+}
+#endif
+
+static int hci_open(int *fds)
+{
+    int h4_fd;
+
+    BTVENDORI("HCI open");
+
+/**
+ * SSB-5242 Route HCI I/F over ADB to driver on PC.
+ */
+#if defined(ENABLE_HCI_TUNNELLING) && (ENABLE_HCI_TUNNELLING == TRUE)
+    h4_fd = socket_open_client(hci_tunnelling_port_num);
+#else
+    if (bt_addr != 0)
+    {
+        set_bluetooth_address(bt_addr);
+    }
+
+    BTVENDORI("Opening h4 device %s", h4_file);
+    h4_fd = open(h4_file, O_RDWR);
+#endif
+    if (h4_fd == -1)
+    {
+        BTVENDORE("Open h4 device failed: %s (%d)", strerror(errno), errno);
+        return -1;
+    }
+
+    BTVENDORI("Open h4 device %s succeded", h4_file);
+
+    hci_fd = h4_fd;
+    *fds = h4_fd;
+
+    return 1;
+}
+
+static int hci_close(void)
+{
+    int fd = hci_fd;
+
+    if (bt_addr != 0)
+    {
+        set_bluetooth_address(0);
+    }
+
+    hci_fd = -1;
+    return close(fd);
+}
+
+static int init(const bt_vendor_callbacks_t *p_cb, unsigned char *local_bdaddr)
+{
+    /* Sanity check */
+    if (p_cb == NULL)
+    {
+        ALOGE("init failed with no user callbacks!");
+        return -1;
+    }
+
+    /* Store a reference to user callbacks */
+    vcb = (bt_vendor_callbacks_t *) p_cb;
+
+    /* Store the Bluetooth address */
+    bt_addr = (((unsigned long long) local_bdaddr[0]) << 40) |
+              (((unsigned long long) local_bdaddr[1]) << 32) |
+              (((unsigned long long) local_bdaddr[2]) << 24) |
+              (((unsigned long long) local_bdaddr[3]) << 16) |
+              (((unsigned long long) local_bdaddr[4]) << 8) |
+              ((unsigned long long) local_bdaddr[5]);
+
+    return 0;
+}
+
+static int op(bt_vendor_opcode_t opcode, void *param)
+{
+    int retval = 0;
+
+    switch (opcode)
+    {
+        case BT_VND_OP_POWER_CTRL:
+        {
+            break;
+        }
+        case BT_VND_OP_FW_CFG:
+        {
+            vcb->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
+            break;
+        }
+        case BT_VND_OP_SCO_CFG:
+        {
+            vcb->scocfg_cb(BT_VND_OP_RESULT_SUCCESS);
+            break;
+        }
+        case BT_VND_OP_USERIAL_OPEN:
+        {
+            retval = hci_open((int *) param);
+            BTVENDORD("hci_open returns: %d", retval);
+            break;
+        }
+        case BT_VND_OP_USERIAL_CLOSE:
+        {
+            retval = hci_close();
+            BTVENDORD("hci_close returns: %d", retval);
+            break;
+        }
+        case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
+        {
+            uint32_t *timeout_ms = (uint32_t *) param;
+            *timeout_ms = 3000; /* 3 Seconds delay until the idle alarm is fired */
+            break;
+        }
+        case BT_VND_OP_LPM_SET_MODE:
+        {
+            /* LPM not required on SoC solutions - return fail to disable it */
+            vcb->lpm_cb(BT_VND_OP_RESULT_FAIL);
+            break;
+        }
+        case BT_VND_OP_LPM_WAKE_SET_STATE:
+        {
+            break;
+        }
+        case BT_VND_OP_EPILOG:
+        {
+            vcb->epilog_cb(BT_VND_OP_RESULT_SUCCESS);
+            break;
+        }
+        case BT_VND_OP_SET_AUDIO_STATE:
+        {
+            /* Unhandled - just ignore */
+            BTVENDORE("BT_VND_OP_SET_AUDIO_STATE - ignoring");
+            break;
+        }
+        default:
+        {
+            BTVENDORW("Hit default with opcode:0x%02X", opcode);
+            retval = -1;
+            break;
+        }
+    }
+
+    return retval;
+}
+
+static void cleanup(void)
+{
+    if (hci_fd != -1)
+    {
+        int fd = hci_fd;
+        hci_fd = -1;
+        (void) close(fd);
+    }
+
+    return;
+}
+
+const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
+    sizeof(bt_vendor_interface_t),
+    init,
+    op,
+    cleanup,
+};
