__u16           sniff_min_interval;
        __u16           sniff_max_interval;
 
+       unsigned int    auto_accept_delay;
+
        unsigned long   quirks;
 
        atomic_t        cmd_cnt;
 
        struct timer_list disc_timer;
        struct timer_list idle_timer;
+       struct timer_list auto_accept_timer;
 
        struct work_struct work_add;
        struct work_struct work_del;
 
        hci_conn_enter_sniff_mode(conn);
 }
 
+static void hci_conn_auto_accept(unsigned long arg)
+{
+       struct hci_conn *conn = (void *) arg;
+       struct hci_dev *hdev = conn->hdev;
+
+       hci_dev_lock(hdev);
+
+       hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst),
+                                                               &conn->dst);
+
+       hci_dev_unlock(hdev);
+}
+
 struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
 {
        struct hci_conn *conn;
 
        setup_timer(&conn->disc_timer, hci_conn_timeout, (unsigned long)conn);
        setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
+       setup_timer(&conn->auto_accept_timer, hci_conn_auto_accept,
+                                                       (unsigned long) conn);
 
        atomic_set(&conn->refcnt, 0);
 
 
        del_timer(&conn->disc_timer);
 
+       del_timer(&conn->auto_accept_timer);
+
        if (conn->type == ACL_LINK) {
                struct hci_conn *sco = conn->link;
                if (sco)
 
        /* If no side requires MITM protection; auto-accept */
        if ((!loc_mitm || conn->remote_cap == 0x03) &&
                                (!rem_mitm || conn->io_capability == 0x03)) {
-               BT_DBG("Auto-accept of user confirmation");
+               BT_DBG("Auto-accept of user confirmation with %ums delay",
+                                               hdev->auto_accept_delay);
+
+               if (hdev->auto_accept_delay > 0) {
+                       int delay = msecs_to_jiffies(hdev->auto_accept_delay);
+                       mod_timer(&conn->auto_accept_timer, jiffies + delay);
+                       goto unlock;
+               }
+
                hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
                                                sizeof(ev->bdaddr), &ev->bdaddr);
                goto unlock;
 
        .release        = single_release,
 };
 
+static int auto_accept_delay_set(void *data, u64 val)
+{
+       struct hci_dev *hdev = data;
+
+       hci_dev_lock_bh(hdev);
+
+       hdev->auto_accept_delay = val;
+
+       hci_dev_unlock_bh(hdev);
+
+       return 0;
+}
+
+static int auto_accept_delay_get(void *data, u64 *val)
+{
+       struct hci_dev *hdev = data;
+
+       hci_dev_lock_bh(hdev);
+
+       *val = hdev->auto_accept_delay;
+
+       hci_dev_unlock_bh(hdev);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
+                                       auto_accept_delay_set, "%llu\n");
+
 int hci_register_sysfs(struct hci_dev *hdev)
 {
        struct device *dev = &hdev->dev;
 
        debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
 
+       debugfs_create_file("auto_accept_delay", 0444, hdev->debugfs, hdev,
+                                               &auto_accept_delay_fops);
        return 0;
 }