diff --git a/.bluez.metadata b/.bluez.metadata
index 71ea444..a6e8e36 100644
--- a/.bluez.metadata
+++ b/.bluez.metadata
@@ -1 +1 @@
-2ba46754eb2d79c4d491eb24c9883355324cd08a SOURCES/bluez-4.101.tar.gz
+0e378976175b08a19b1232f2af2e83cebee572bd SOURCES/bluez-5.23.tar.xz
diff --git a/.gitignore b/.gitignore
index a5d6495..08624cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/bluez-4.101.tar.gz
+SOURCES/bluez-5.23.tar.xz
diff --git a/SOURCES/0001-Activate-the-Socket-Mobile-CF-kit.patch b/SOURCES/0001-Activate-the-Socket-Mobile-CF-kit.patch
deleted file mode 100644
index d2f9aef..0000000
--- a/SOURCES/0001-Activate-the-Socket-Mobile-CF-kit.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 9c6f914530c3873e88b55e3f7c18ce2b8b533e20 Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Thu, 10 Jan 2013 09:14:33 +0100
-Subject: [PATCH] Activate the Socket Mobile CF kit
-
-https://bugzilla.redhat.com/show_bug.cgi?id=498756
----
- scripts/bluetooth-serial.rules | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/scripts/bluetooth-serial.rules b/scripts/bluetooth-serial.rules
-index 072335f..f6284ff 100644
---- a/scripts/bluetooth-serial.rules
-+++ b/scripts/bluetooth-serial.rules
-@@ -33,3 +33,7 @@ SUBSYSTEM=="tty", SUBSYSTEMS=="pcmcia", ATTRS{prod_id1}=="PCMCIA", ATTRS{prod_id
- 
- # CC&C BT0100M
- SUBSYSTEM=="tty", SUBSYSTEMS=="pcmcia", ATTRS{prod_id1}=="Bluetooth BT0100M", ENV{HCIOPTS}="bcsp 115200", RUN+="bluetooth_serial"
-+
-+# SocketMobile CF Connection Kit
-+SUBSYSTEM=="tty", SUBSYSTEMS=="pcmcia", ATTRS{prod_id1}=="Socket", ATTRS{prod_id2}=="CF+ Personal Network Card Rev 2.5", ENV{HCIOPTS}="socket", RUN+="bluetooth_serial"
-+
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-Add-sixaxis-cable-pairing-plugin.patch b/SOURCES/0001-Add-sixaxis-cable-pairing-plugin.patch
deleted file mode 100644
index b20c9c8..0000000
--- a/SOURCES/0001-Add-sixaxis-cable-pairing-plugin.patch
+++ /dev/null
@@ -1,554 +0,0 @@
-From 64f9449656dbbb718d53a54ed8e7904e289280ec Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Fri, 30 Dec 2011 12:34:29 +0100
-Subject: [PATCH] Add sixaxis cable-pairing plugin
-
-Implement the old "sixpair" using libudev and libusb-1.0.
-
-When a Sixaxis device is plugged in, events are filtered, and
-the device is selected, poked around to set the default Bluetooth
-address, and added to the database of the current default adapter.
----
- Makefile.am     |    9 +-
- acinclude.m4    |   16 +++
- configure.ac    |    1 +
- plugins/cable.c |  382 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/adapter.c   |   19 +++
- src/adapter.h   |    3 +
- 6 files changed, 428 insertions(+), 2 deletions(-)
- create mode 100644 plugins/cable.c
-
-diff --git a/Makefile.am b/Makefile.am
-index 53fcbe9..f831a72 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -238,6 +238,11 @@ builtin_sources += thermometer/main.c \
- endif
- 
- 
-+if CABLE
-+builtin_modules += cable
-+builtin_sources += plugins/cable.c
-+endif
-+
- builtin_modules += hciops mgmtops
- builtin_sources += plugins/hciops.c plugins/mgmtops.c
- 
-@@ -306,7 +311,7 @@ src_bluetoothd_SOURCES = $(gdbus_sources) $(builtin_sources) \
- 			src/event.h src/event.c \
- 			src/oob.h src/oob.c src/eir.h src/eir.c
- src_bluetoothd_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@ @DBUS_LIBS@ \
--								-ldl -lrt
-+								@CABLE_LIBS@ -ldl -lrt
- src_bluetoothd_LDFLAGS = $(AM_LDFLAGS) -Wl,--export-dynamic \
- 				-Wl,--version-script=$(srcdir)/src/bluetooth.ver
- 
-@@ -428,7 +433,7 @@ EXTRA_DIST += doc/manager-api.txt \
- 
- AM_YFLAGS = -d
- 
--AM_CFLAGS += @DBUS_CFLAGS@ @GLIB_CFLAGS@
-+AM_CFLAGS += @DBUS_CFLAGS@ @GLIB_CFLAGS@ @CABLE_CFLAGS@
- 
- INCLUDES = -I$(builddir)/lib -I$(builddir)/src -I$(srcdir)/src \
- 			-I$(srcdir)/audio -I$(srcdir)/sbc -I$(srcdir)/gdbus \
-diff --git a/acinclude.m4 b/acinclude.m4
-index 6505ad3..3f59989 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -139,6 +139,12 @@ AC_DEFUN([AC_PATH_UDEV], [
- 	AC_SUBST(UDEV_LIBS)
- ])
- 
-+AC_DEFUN([AC_PATH_CABLE], [
-+	PKG_CHECK_MODULES(CABLE, libudev libusb-1.0, cable_found=yes, cable_found=no)
-+	AC_SUBST(CABLE_CFLAGS)
-+	AC_SUBST(CABLE_LIBS)
-+])
-+
- AC_DEFUN([AC_PATH_SNDFILE], [
- 	PKG_CHECK_MODULES(SNDFILE, sndfile, sndfile_found=yes, sndfile_found=no)
- 	AC_SUBST(SNDFILE_CFLAGS)
-@@ -176,6 +182,7 @@ AC_DEFUN([AC_ARG_BLUEZ], [
- 	sndfile_enable=${sndfile_found}
- 	hal_enable=no
- 	usb_enable=${usb_found}
-+	cable_enable=${cable_found}
- 	alsa_enable=${alsa_found}
- 	gstreamer_enable=${gstreamer_found}
- 	audio_enable=yes
-@@ -265,6 +272,10 @@ AC_DEFUN([AC_ARG_BLUEZ], [
- 		usb_enable=${enableval}
- 	])
- 
-+	AC_ARG_ENABLE(cable, AC_HELP_STRING([--enable-cable], [enable DeviceKit support]), [
-+		cable_enable=${enableval}
-+	])
-+
- 	AC_ARG_ENABLE(tools, AC_HELP_STRING([--enable-tools], [install Bluetooth utilities]), [
- 		tools_enable=${enableval}
- 	])
-@@ -366,6 +377,10 @@ AC_DEFUN([AC_ARG_BLUEZ], [
- 		AC_DEFINE(HAVE_LIBUSB, 1, [Define to 1 if you have USB library.])
- 	fi
- 
-+	if (test "${cable_enable}" = "yes" && test "${cable_found}" = "yes"); then
-+		AC_DEFINE(HAVE_CABLE, 1, [Define to 1 if you have libcable.])
-+	fi
-+
- 	AM_CONDITIONAL(SNDFILE, test "${sndfile_enable}" = "yes" && test "${sndfile_found}" = "yes")
- 	AM_CONDITIONAL(USB, test "${usb_enable}" = "yes" && test "${usb_found}" = "yes")
- 	AM_CONDITIONAL(SBC, test "${alsa_enable}" = "yes" || test "${gstreamer_enable}" = "yes" ||
-@@ -398,4 +413,5 @@ AC_DEFUN([AC_ARG_BLUEZ], [
- 	AM_CONDITIONAL(DBUSOOBPLUGIN, test "${dbusoob_enable}" = "yes")
- 	AM_CONDITIONAL(WIIMOTEPLUGIN, test "${wiimote_enable}" = "yes")
- 	AM_CONDITIONAL(GATTMODULES, test "${gatt_enable}" = "yes")
-+	AM_CONDITIONAL(CABLE, test "${cable_enable}" = "yes" && test "${cable_found}" = "yes")
- ])
-diff --git a/configure.ac b/configure.ac
-index 48b181e..45a4b15 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -46,6 +46,7 @@ AC_PATH_GSTREAMER
- AC_PATH_USB
- AC_PATH_UDEV
- AC_PATH_SNDFILE
-+AC_PATH_CABLE
- AC_PATH_OUI
- AC_PATH_READLINE
- AC_PATH_CHECK
-diff --git a/plugins/cable.c b/plugins/cable.c
-new file mode 100644
-index 0000000..fe758db
---- /dev/null
-+++ b/plugins/cable.c
-@@ -0,0 +1,382 @@
-+/*
-+ *
-+ *  BlueZ - Bluetooth protocol stack for Linux
-+ *
-+ *  Copyright (C) 2009  Bastien Nocera <hadess@hadess.net>
-+ *
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License as published by
-+ *  the Free Software Foundation; either version 2 of the License, or
-+ *  (at your option) any later version.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this program; if not, write to the Free Software
-+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ *
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#include <glib.h>
-+#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1
-+#include <libudev.h>
-+#include <dbus/dbus.h>
-+#include <bluetooth/bluetooth.h>
-+#include <bluetooth/sdp.h>
-+#include <libusb.h>
-+
-+#include "plugin.h"
-+#include "log.h"
-+
-+#include "adapter.h"
-+#include "manager.h"
-+#include "device.h"
-+
-+#include "storage.h"
-+#include "sdp_lib.h"
-+
-+/* Vendor and product ID for the Sixaxis PS3 controller */
-+#define VENDOR 0x054c
-+#define PRODUCT 0x0268
-+#define SIXAXIS_PNP_RECORD "3601920900000A000100000900013503191124090004350D35061901000900113503190011090006350909656E09006A0901000900093508350619112409010009000D350F350D350619010009001335031900110901002513576972656C65737320436F6E74726F6C6C65720901012513576972656C65737320436F6E74726F6C6C6572090102251B536F6E7920436F6D707574657220456E7465727461696E6D656E740902000901000902010901000902020800090203082109020428010902052801090206359A35980822259405010904A101A102850175089501150026FF00810375019513150025013500450105091901291381027501950D0600FF8103150026FF0005010901A10075089504350046FF0009300931093209358102C0050175089527090181027508953009019102750895300901B102C0A1028502750895300901B102C0A10285EE750895300901B102C0A10285EF750895300901B102C0C0090207350835060904090901000902082800090209280109020A280109020B09010009020C093E8009020D280009020E2800"
-+#define HID_UUID "00001124-0000-1000-8000-00805f9b34fb"
-+
-+static struct btd_device *create_cable_association(DBusConnection *conn,
-+						    struct btd_adapter *adapter,
-+						    const char *name,
-+						    const char *address,
-+						    guint32 vendor_id,
-+						    guint32 product_id,
-+						    const char *pnp_record)
-+{
-+	sdp_record_t *rec;
-+	struct btd_device *device;
-+	bdaddr_t src, dst;
-+	char srcaddr[18];
-+
-+	device = adapter_find_device(adapter, address);
-+	if (device == NULL) {
-+		device = device_create(conn, adapter, address, BDADDR_BREDR);
-+		if (device != NULL)
-+			adapter_create_device_for_device(conn, adapter, device);
-+	}
-+	if (device != NULL) {
-+		device_set_temporary(device, FALSE);
-+		device_set_name(device, name);
-+	}
-+
-+	str2ba(address, &dst);
-+	adapter_get_address(adapter, &src);
-+	ba2str(&src, srcaddr);
-+
-+	write_device_name(&dst, &src, (char *) name);
-+
-+	/* Store the device's SDP record */
-+	rec = record_from_string(pnp_record);
-+	store_record(srcaddr, address, rec);
-+	sdp_record_free(rec);
-+	/* Set the device id */
-+	store_device_id(srcaddr, address, 0xffff, vendor_id, product_id, 0);
-+	/* Don't write a profile, it will be updated when the device connects */
-+
-+	write_trust(srcaddr, address, "[all]", TRUE);
-+
-+	return device;
-+}
-+
-+static char *get_bdaddr(libusb_device_handle *devh, int itfnum)
-+{
-+	unsigned char msg[17];
-+	char *address;
-+	int res;
-+
-+	res = libusb_control_transfer(devh,
-+				      LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
-+				      0x01, 0x03f2, itfnum,
-+				      (void*) msg, sizeof(msg),
-+				      5000);
-+
-+	if (res < 0) {
-+		DBG("Getting the device Bluetooth address failed");
-+		return NULL;
-+	}
-+
-+	address = g_strdup_printf("%02X:%02X:%02X:%02X:%02X:%02X",
-+				  msg[4], msg[5], msg[6], msg[7], msg[8], msg[9]);
-+
-+	DBG("Device Bluetooth address: %s\n", address);
-+
-+	return address;
-+}
-+
-+static gboolean set_master_bdaddr(libusb_device_handle *devh, int itfnum, char *host)
-+{
-+	unsigned char msg[8];
-+	int mac[6];
-+	int res;
-+
-+	if (sscanf(host, "%X:%X:%X:%X:%X:%X",
-+		   &mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6) {
-+		return FALSE;
-+	}
-+
-+	msg[0] = 0x01;
-+	msg[1] = 0x00;
-+	msg[2] = mac[0];
-+	msg[3] = mac[1];
-+	msg[4] = mac[2];
-+	msg[5] = mac[3];
-+	msg[6] = mac[4];
-+	msg[7] = mac[5];
-+
-+	res = libusb_control_transfer(devh,
-+				      LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
-+				      0x09, 0x03f5, itfnum,
-+				      (void*) msg, sizeof(msg),
-+				      5000);
-+
-+	if (res < 0) {
-+		DBG("Setting the master Bluetooth address failed");
-+		return FALSE;
-+	}
-+
-+	return TRUE;
-+}
-+static void handle_usb_device(struct btd_adapter *adapter,
-+			      libusb_device *dev,
-+			      struct libusb_config_descriptor *cfg,
-+			      int itfnum,
-+			      const struct libusb_interface_descriptor *alt)
-+{
-+	DBusConnection *conn;
-+	libusb_device_handle *devh;
-+	char *device_bdaddr;
-+	char adapter_bdaddr[18];
-+	struct btd_device *device;
-+	bdaddr_t dst;
-+
-+	device_bdaddr = NULL;
-+	conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-+	if (conn == NULL) {
-+		DBG("Failed to get on the bus");
-+		return;
-+	}
-+
-+	if (libusb_open(dev, &devh) < 0) {
-+		DBG("Can't open device");
-+		goto bail;
-+	}
-+	libusb_detach_kernel_driver(devh, itfnum);
-+
-+	if (libusb_claim_interface(devh, itfnum) < 0) {
-+		DBG("Can't claim interface %d", itfnum);
-+		goto bail;
-+	}
-+
-+	device_bdaddr = get_bdaddr(devh, itfnum);
-+	if (device_bdaddr == NULL) {
-+		DBG("Failed to get the Bluetooth address from the device");
-+		goto bail;
-+	}
-+
-+	device = create_cable_association(conn,
-+					  adapter,
-+					  "PLAYSTATION(R)3 Controller",
-+					  device_bdaddr,
-+					  VENDOR, PRODUCT, SIXAXIS_PNP_RECORD);
-+	btd_device_add_uuid(device, HID_UUID);
-+
-+	adapter_get_address(adapter, &dst);
-+	ba2str(&dst, adapter_bdaddr);
-+	DBG("Adapter bdaddr %s", adapter_bdaddr);
-+
-+	if (set_master_bdaddr(devh, itfnum, adapter_bdaddr) == FALSE) {
-+		DBG("Failed to set the master Bluetooth address");
-+		goto bail;
-+	}
-+
-+bail:
-+	dbus_connection_unref(conn);
-+	g_free(device_bdaddr);
-+	libusb_release_interface(devh, itfnum);
-+	/* We ignore errors from the reattach, as there's nothing we
-+	 * can do about it */
-+	libusb_attach_kernel_driver(devh, itfnum);
-+	if (devh != NULL)
-+		libusb_close(devh);
-+}
-+
-+static void handle_device_plug(struct udev_device *udevice)
-+{
-+	struct btd_adapter *adapter;
-+	guint i;
-+
-+	libusb_device **list, *usbdev;
-+	ssize_t num_devices;
-+	struct libusb_device_descriptor desc;
-+	guint8 j;
-+
-+	if (g_strcmp0(udev_device_get_property_value(udevice, "ID_SERIAL"),
-+		      "Sony_PLAYSTATION_R_3_Controller") != 0)
-+		return;
-+	/* Don't look at events with an associated driver */
-+	if (udev_device_get_property_value(udevice, "ID_USB_DRIVER") != NULL)
-+		return;
-+
-+	DBG("Found Sixaxis device");
-+
-+	/* Look for the default adapter */
-+	adapter = manager_get_default_adapter();
-+	if (adapter == NULL)
-+		return;
-+
-+	/* Look for the USB device */
-+	libusb_init(NULL);
-+
-+	num_devices = libusb_get_device_list(NULL, &list);
-+	if (num_devices < 0) {
-+		DBG("libusb_get_device_list failed");
-+		return;
-+	}
-+
-+	usbdev = NULL;
-+	for (i = 0; i < num_devices; i++) {
-+		char *path;
-+
-+		path = g_strdup_printf("%s/%03d/%03d", "/dev/bus/usb",
-+				       libusb_get_bus_number(list[i]),
-+				       libusb_get_device_address(list[i]));
-+		if (g_strcmp0(path, udev_device_get_devnode(udevice)) == 0) {
-+			g_free(path);
-+			usbdev = libusb_ref_device(list[i]);
-+			break;
-+		}
-+		g_free(path);
-+	}
-+
-+	libusb_free_device_list(list, TRUE);
-+	if (usbdev == NULL) {
-+		DBG("Found a Sixaxis, but couldn't find it via libusb");
-+		goto out;
-+	}
-+
-+	if (libusb_get_device_descriptor(usbdev, &desc) < 0) {
-+		DBG("libusb_get_device_descriptor() failed");
-+		goto out;
-+	}
-+
-+	/* Look for the interface number that interests us */
-+	for (j = 0; j < desc.bNumConfigurations; j++) {
-+		struct libusb_config_descriptor *config;
-+		guint8 k;
-+
-+		if (libusb_get_config_descriptor(usbdev, j, &config) < 0) {
-+			DBG("Failed to get config descriptor %d", j);
-+			continue;
-+		}
-+
-+		for (k = 0; k < config->bNumInterfaces; k++) {
-+			const struct libusb_interface *itf = &config->interface[k];
-+			int l;
-+
-+			for (l = 0; l < itf->num_altsetting ; l++) {
-+				struct libusb_interface_descriptor alt;
-+
-+				alt = itf->altsetting[l];
-+				if (alt.bInterfaceClass == 3) {
-+					handle_usb_device(adapter, usbdev, config, l, &alt);
-+				}
-+			}
-+		}
-+	}
-+
-+out:
-+	if (usbdev != NULL)
-+		libusb_unref_device(usbdev);
-+	libusb_exit(NULL);
-+}
-+
-+static gboolean device_event_idle(struct udev_device *udevice)
-+{
-+	handle_device_plug(udevice);
-+	udev_device_unref(udevice);
-+	return FALSE;
-+}
-+
-+static struct udev *ctx = NULL;
-+static struct udev_monitor *monitor = NULL;
-+static guint watch_id = 0;
-+
-+static gboolean
-+monitor_event(GIOChannel *source,
-+	      GIOCondition condition,
-+	      gpointer data)
-+{
-+	struct udev_device *udevice;
-+
-+	udevice = udev_monitor_receive_device(monitor);
-+	if (udevice == NULL)
-+		goto out;
-+	if (g_strcmp0(udev_device_get_action(udevice), "add") != 0)
-+		goto out;
-+
-+	g_timeout_add_seconds(1, (GSourceFunc) device_event_idle, udevice);
-+
-+out:
-+	return TRUE;
-+}
-+
-+
-+static int cable_init(void)
-+{
-+	GIOChannel *channel;
-+
-+	DBG("Setup cable plugin");
-+
-+	ctx = udev_new();
-+	monitor = udev_monitor_new_from_netlink(ctx, "udev");
-+	if (monitor == NULL) {
-+		error ("Could not get udev monitor");
-+		return -1;
-+	}
-+
-+	/* Listen for newly connected usb device */
-+	udev_monitor_filter_add_match_subsystem_devtype(monitor,
-+							"usb", NULL);
-+	udev_monitor_enable_receiving(monitor);
-+
-+	channel = g_io_channel_unix_new(udev_monitor_get_fd(monitor));
-+	watch_id = g_io_add_watch(channel, G_IO_IN, monitor_event, NULL);
-+	g_io_channel_unref(channel);
-+
-+	return 0;
-+}
-+
-+static void cable_exit(void)
-+{
-+	DBG("Cleanup cable plugin");
-+
-+	if (watch_id != 0) {
-+		g_source_remove(watch_id);
-+		watch_id = 0;
-+	}
-+	if (monitor != NULL) {
-+		udev_monitor_unref(monitor);
-+		monitor = NULL;
-+	}
-+	if (ctx != NULL) {
-+		udev_unref(ctx);
-+		ctx = NULL;
-+	}
-+}
-+
-+BLUETOOTH_PLUGIN_DEFINE(cable, VERSION,
-+			BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, cable_init, cable_exit)
-diff --git a/src/adapter.c b/src/adapter.c
-index 6e04faf..0488891 100644
---- a/src/adapter.c
-+++ b/src/adapter.c
-@@ -952,6 +952,25 @@ static struct btd_device *adapter_create_device(DBusConnection *conn,
- 	return device;
- }
- 
-+void adapter_create_device_for_device(DBusConnection *conn,
-+				      struct btd_adapter *adapter,
-+				      struct btd_device *device)
-+{
-+	const char *path;
-+
-+	device_set_temporary(device, TRUE);
-+
-+	adapter->devices = g_slist_append(adapter->devices, device);
-+
-+	path = device_get_path(device);
-+	g_dbus_emit_signal(conn, adapter->path,
-+			ADAPTER_INTERFACE, "DeviceCreated",
-+			DBUS_TYPE_OBJECT_PATH, &path,
-+			DBUS_TYPE_INVALID);
-+
-+	adapter_update_devices(adapter);
-+}
-+
- void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
- 						struct btd_device *device,
- 						gboolean remove_storage)
-diff --git a/src/adapter.h b/src/adapter.h
-index b7ea62b..ac0aa2e 100644
---- a/src/adapter.h
-+++ b/src/adapter.h
-@@ -114,6 +114,9 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
- 					uint8_t *data, uint8_t data_len);
- void adapter_emit_device_found(struct btd_adapter *adapter,
- 						struct remote_dev_info *dev);
-+void adapter_create_device_for_device(DBusConnection *conn,
-+				      struct btd_adapter *adapter,
-+				      struct btd_device *device);
- void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
- int adapter_set_name(struct btd_adapter *adapter, const char *name);
- void adapter_name_changed(struct btd_adapter *adapter, const char *name);
--- 
-1.7.10.2
-
diff --git a/SOURCES/0001-Allow-PulseAudio-to-connect-by-default.patch b/SOURCES/0001-Allow-PulseAudio-to-connect-by-default.patch
deleted file mode 100644
index bec6b77..0000000
--- a/SOURCES/0001-Allow-PulseAudio-to-connect-by-default.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 93c876a85b650c3e05d6042cd1bf4e5008fdebc5 Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Thu, 10 Jan 2013 09:13:19 +0100
-Subject: [PATCH] Allow PulseAudio to connect by default
-
-Disable the socket by default, it is enabled by default.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=969385#c4
----
- audio/audio.conf | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/audio/audio.conf b/audio/audio.conf
-index fd6092a..a78f609 100644
---- a/audio/audio.conf
-+++ b/audio/audio.conf
-@@ -4,6 +4,10 @@
- # particular interface
- [General]
- 
-+# Allow PulseAudio to connect by default
-+# https://bugzilla.redhat.com/show_bug.cgi?id=969385#c4
-+Disable=Socket
-+
- # Switch to master role for incoming connections (defaults to true)
- #Master=true
- 
--- 
-1.8.4.2
-
diff --git a/SOURCES/0001-Allow-using-obexd-without-systemd-in-the-user-sessio.patch b/SOURCES/0001-Allow-using-obexd-without-systemd-in-the-user-sessio.patch
new file mode 100644
index 0000000..1ea3e6f
--- /dev/null
+++ b/SOURCES/0001-Allow-using-obexd-without-systemd-in-the-user-sessio.patch
@@ -0,0 +1,58 @@
+From 3027cb7141fb65cf3eeda69c688db8c4045e2d3f Mon Sep 17 00:00:00 2001
+From: Giovanni Campagna <gcampagna-cNUdlRotFMnNLxjTenLetw@public.gmane.org>
+Date: Sat, 12 Oct 2013 17:45:25 +0200
+Subject: [PATCH] Allow using obexd without systemd in the user session
+
+Not all sessions run systemd --user (actually, the majority
+doesn't), so the dbus daemon must be able to spawn obexd
+directly, and to do so it needs the full path of the daemon.
+---
+ Makefile.obexd                      | 4 ++--
+ obexd/src/org.bluez.obex.service    | 4 ----
+ obexd/src/org.bluez.obex.service.in | 4 ++++
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+ delete mode 100644 obexd/src/org.bluez.obex.service
+ create mode 100644 obexd/src/org.bluez.obex.service.in
+
+diff --git a/Makefile.obexd b/Makefile.obexd
+index 3760867..142e7c3 100644
+--- a/Makefile.obexd
++++ b/Makefile.obexd
+@@ -2,12 +2,12 @@
+ if SYSTEMD
+ systemduserunitdir = @SYSTEMD_USERUNITDIR@
+ systemduserunit_DATA = obexd/src/obex.service
++endif
+ 
+ dbussessionbusdir = @DBUS_SESSIONBUSDIR@
+ dbussessionbus_DATA = obexd/src/org.bluez.obex.service
+-endif
+ 
+-EXTRA_DIST += obexd/src/obex.service.in obexd/src/org.bluez.obex.service
++EXTRA_DIST += obexd/src/obex.service.in obexd/src/org.bluez.obex.service.in
+ 
+ obex_plugindir = $(libdir)/obex/plugins
+ 
+diff --git a/obexd/src/org.bluez.obex.service b/obexd/src/org.bluez.obex.service
+deleted file mode 100644
+index a538088..0000000
+--- a/obexd/src/org.bluez.obex.service
++++ /dev/null
+@@ -1,4 +0,0 @@
+-[D-BUS Service]
+-Name=org.bluez.obex
+-Exec=/bin/false
+-SystemdService=dbus-org.bluez.obex.service
+diff --git a/obexd/src/org.bluez.obex.service.in b/obexd/src/org.bluez.obex.service.in
+new file mode 100644
+index 0000000..9c815f2
+--- /dev/null
++++ b/obexd/src/org.bluez.obex.service.in
+@@ -0,0 +1,4 @@
++[D-BUS Service]
++Name=org.bluez.obex
++Exec=@libexecdir@/obexd
++SystemdService=dbus-org.bluez.obex.service
+-- 
+1.8.3.1
+
diff --git a/SOURCES/0001-Enable-the-Gateway-and-Source-audio-profiles-by-defa.patch b/SOURCES/0001-Enable-the-Gateway-and-Source-audio-profiles-by-defa.patch
deleted file mode 100644
index 817f5ac..0000000
--- a/SOURCES/0001-Enable-the-Gateway-and-Source-audio-profiles-by-defa.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 0b5f5d0be6a1c9aa2d63e72e6a979f46cfbcc866 Mon Sep 17 00:00:00 2001
-From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
-Date: Thu, 10 Jan 2013 09:20:22 +0100
-Subject: [PATCH] Enable the Gateway and Source audio profiles by default.
-
-Those can be disabled by the user in /etc/bluetooth/audio.conf if
-necessary.
-
-https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/948613
----
- audio/a2dp.c    | 2 +-
- audio/manager.c | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/audio/a2dp.c b/audio/a2dp.c
-index 404be53..6c0ab26 100644
---- a/audio/a2dp.c
-+++ b/audio/a2dp.c
-@@ -1444,7 +1444,7 @@ int a2dp_register(DBusConnection *conn, const bdaddr_t *src, GKeyFile *config)
- {
- 	int sbc_srcs = 0, sbc_sinks = 0;
- 	int mpeg12_srcs = 0, mpeg12_sinks = 0;
--	gboolean source = TRUE, sink = FALSE, socket = FALSE;
-+	gboolean source = TRUE, sink = TRUE, socket = TRUE;
- 	gboolean delay_reporting = FALSE;
- 	char *str;
- 	GError *err = NULL;
-diff --git a/audio/manager.c b/audio/manager.c
-index d442d1d..99e03bb 100644
---- a/audio/manager.c
-+++ b/audio/manager.c
-@@ -110,9 +110,9 @@ static GSList *devices = NULL;
- static struct enabled_interfaces enabled = {
- 	.hfp		= TRUE,
- 	.headset	= TRUE,
--	.gateway	= FALSE,
-+	.gateway	= TRUE,
- 	.sink		= TRUE,
--	.source		= FALSE,
-+	.source		= TRUE,
- 	.control	= TRUE,
- 	.socket		= FALSE,
- 	.media		= TRUE,
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-Fix-GDBus-flags-after-conversion-to-macros.patch b/SOURCES/0001-Fix-GDBus-flags-after-conversion-to-macros.patch
deleted file mode 100644
index 44bcd45..0000000
--- a/SOURCES/0001-Fix-GDBus-flags-after-conversion-to-macros.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From a66a557038c0e3d21bc4f14090efb497558a12be Mon Sep 17 00:00:00 2001
-From: Lucas De Marchi <lucas.demarchi@profusion.mobi>
-Date: Tue, 26 Jun 2012 18:11:25 -0300
-Subject: [PATCH] Fix GDBus flags after conversion to macros
-
-Commit "aa3b9016bf444b60e1b7e1804dfc323a23a93c5a Convert GDBus methods
-to use macro helpers" converted the previous tables to use the new
-macros but some flags were lost.
----
- attrib/client.c   | 2 +-
- audio/control.c   | 2 +-
- audio/headset.c   | 2 +-
- audio/transport.c | 2 +-
- src/manager.c     | 2 +-
- 5 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/attrib/client.c b/attrib/client.c
-index 8d119df..b3e3abe 100644
---- a/attrib/client.c
-+++ b/attrib/client.c
-@@ -519,7 +519,7 @@ static const GDBusMethodTable char_methods[] = {
- 	{ GDBUS_METHOD("GetProperties",
- 			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
- 			get_properties) },
--	{ GDBUS_METHOD("SetProperty",
-+	{ GDBUS_ASYNC_METHOD("SetProperty",
- 			GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
- 			set_property) },
- 	{ }
-diff --git a/audio/control.c b/audio/control.c
-index c5a6a58..187f838 100644
---- a/audio/control.c
-+++ b/audio/control.c
-@@ -198,7 +198,7 @@ static DBusMessage *control_get_properties(DBusConnection *conn,
- }
- 
- static const GDBusMethodTable control_methods[] = {
--	{ GDBUS_ASYNC_METHOD("IsConnected",
-+	{ GDBUS_DEPRECATED_METHOD("IsConnected",
- 				NULL, GDBUS_ARGS({ "connected", "b" }),
- 				control_is_connected) },
- 	{ GDBUS_METHOD("GetProperties",
-diff --git a/audio/headset.c b/audio/headset.c
-index 729e4dc..b9c6265 100644
---- a/audio/headset.c
-+++ b/audio/headset.c
-@@ -2094,7 +2094,7 @@ static const GDBusMethodTable headset_methods[] = {
- static const GDBusSignalTable headset_signals[] = {
- 	{ GDBUS_DEPRECATED_SIGNAL("Connected", NULL) },
- 	{ GDBUS_DEPRECATED_SIGNAL("Disconnected", NULL) },
--	{ GDBUS_DEPRECATED_SIGNAL("AnswerRequested", NULL) },
-+	{ GDBUS_SIGNAL("AnswerRequested", NULL) },
- 	{ GDBUS_DEPRECATED_SIGNAL("Stopped", NULL) },
- 	{ GDBUS_DEPRECATED_SIGNAL("Playing", NULL) },
- 	{ GDBUS_DEPRECATED_SIGNAL("SpeakerGainChanged",
-diff --git a/audio/transport.c b/audio/transport.c
-index b015625..832ad2a 100644
---- a/audio/transport.c
-+++ b/audio/transport.c
-@@ -959,7 +959,7 @@ static const GDBusMethodTable transport_methods[] = {
- 	{ GDBUS_ASYNC_METHOD("Release",
- 			GDBUS_ARGS({ "access_type", "s" }), NULL,
- 			release ) },
--	{ GDBUS_ASYNC_METHOD("SetProperty",
-+	{ GDBUS_METHOD("SetProperty",
- 			GDBUS_ARGS({ "name", "s" }, { "value", "v" }),
- 			NULL, set_property) },
- 	{ },
-diff --git a/src/manager.c b/src/manager.c
-index 385354d..7061f64 100644
---- a/src/manager.c
-+++ b/src/manager.c
-@@ -207,7 +207,7 @@ static const GDBusMethodTable manager_methods[] = {
- 			GDBUS_ARGS({ "pattern", "s" }),
- 			GDBUS_ARGS({ "adapter", "o" }),
- 			find_adapter) },
--	{ GDBUS_ASYNC_METHOD("ListAdapters",
-+	{ GDBUS_DEPRECATED_METHOD("ListAdapters",
- 			NULL, GDBUS_ARGS({ "adapters", "ao" }),
- 			list_adapters) },
- 	{ }
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-audio-Permit-concurrent-use-of-AG-and-HF-roles.patch b/SOURCES/0001-audio-Permit-concurrent-use-of-AG-and-HF-roles.patch
deleted file mode 100644
index c1a5828..0000000
--- a/SOURCES/0001-audio-Permit-concurrent-use-of-AG-and-HF-roles.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 2f92669697152848f2fae584d45fde5d80ea6eb8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Dalleau?=
- <frederic.dalleau@linux.intel.com>
-Date: Fri, 22 Jun 2012 16:11:25 +0200
-Subject: [PATCH] audio: Permit concurrent use of AG and HF roles
-
-If a device supports both HF and AG roles, then if a SCO connection
-related to AG profile happens, the connection is rejected because HF is
-not connected. One consequence is pulseaudio failing to load bluetooth
-module.
----
- audio/main.c | 9 +++++++--
- 1 file changed, 7 insertions(+), 2 deletions(-)
-
-diff --git a/audio/main.c b/audio/main.c
-index 5c751af..a48c8b8 100644
---- a/audio/main.c
-+++ b/audio/main.c
-@@ -102,7 +102,7 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
- 	if (device->headset) {
- 		if (headset_get_state(device) < HEADSET_STATE_CONNECTED) {
- 			DBG("Refusing SCO from non-connected headset");
--			goto drop;
-+			goto gateway;
- 		}
- 
- 		if (!headset_get_hfp_active(device)) {
-@@ -115,7 +115,11 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
- 			goto drop;
- 
- 		headset_set_state(device, HEADSET_STATE_PLAYING);
--	} else if (device->gateway) {
-+		goto connect;
-+	}
-+
-+gateway:
-+	if (device->gateway) {
- 		if (!gateway_is_connected(device)) {
- 			DBG("Refusing SCO from non-connected AG");
- 			goto drop;
-@@ -126,6 +130,7 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
- 	} else
- 		goto drop;
- 
-+connect:
- 	sk = g_io_channel_unix_get_fd(chan);
- 	fcntl(sk, F_SETFL, 0);
- 
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-build-Enable-BIND_NOW.patch b/SOURCES/0001-build-Enable-BIND_NOW.patch
deleted file mode 100644
index 280dbd1..0000000
--- a/SOURCES/0001-build-Enable-BIND_NOW.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 6c01076f556922a63c73f0fcc4d62b97f9e1aca8 Mon Sep 17 00:00:00 2001
-From: Fedora Bluez maintainers <bluez-owner@fedoraproject.org>
-Date: Thu, 7 Nov 2013 09:23:35 +0100
-Subject: [PATCH] build: Enable BIND_NOW
-
-Partial RELRO means that the object is GNU_RELRO but not BIND_NOW.  This
-reduces the effectiveness of RELRO.  bluez triggers this because it
-enables PIE during the build, and rpmdiff takes this as an indicator
-that the best possible hardening is desired.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=983161
----
- acinclude.m4 | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/acinclude.m4 b/acinclude.m4
-index ae58bbd..f0f8902 100644
---- a/acinclude.m4
-+++ b/acinclude.m4
-@@ -359,7 +359,7 @@ AC_DEFUN([AC_ARG_BLUEZ], [
- 
- 	if (test "${pie_enable}" = "yes" && test "${ac_cv_prog_cc_pie}" = "yes"); then
- 		misc_cflags="$misc_cflags -fPIC"
--		misc_ldflags="$misc_ldflags -pie"
-+		misc_ldflags="$misc_ldflags -pie -Wl,-z,now"
- 	fi
- 
- 	if (test "${debug_enable}" = "yes" && test "${ac_cv_prog_cc_g}" = "yes"); then
--- 
-1.8.3.1
-
diff --git a/SOURCES/0001-hid2hci-change-subsystem-in-udev-rule-from-usb-to-us.patch b/SOURCES/0001-hid2hci-change-subsystem-in-udev-rule-from-usb-to-us.patch
deleted file mode 100644
index f8fcada..0000000
--- a/SOURCES/0001-hid2hci-change-subsystem-in-udev-rule-from-usb-to-us.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From d557e0d956d69318664ed5d1c3e4a765da24bc2a Mon Sep 17 00:00:00 2001
-From: Alexander Holler <holler@ahsoftware.de>
-Date: Tue, 20 Nov 2012 12:47:08 +0100
-Subject: [PATCH] hid2hci: change subsystem in udev rule from usb to usb*
-
-With kernel 3.6 (commit 7e97243c2080ecae7129e83635227fdebd4feef6) the
-class for some devices (e.g. dongles from Logitech) were changed from
-usb to usbmisc. As consequence the udev rule for hid2hci didn't work
-anymore with kernels >= 3.6.
-
-Changing the subsystem from "usb" to "usb*" matches both "usb" and
-"usbmisc" and works with all kernels.
----
- scripts/bluetooth-hid2hci.rules | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/scripts/bluetooth-hid2hci.rules b/scripts/bluetooth-hid2hci.rules
-index 0687c8a..db6bb03 100644
---- a/scripts/bluetooth-hid2hci.rules
-+++ b/scripts/bluetooth-hid2hci.rules
-@@ -1,7 +1,7 @@
- # do not edit this file, it will be overwritten on update
- 
- ACTION=="remove", GOTO="hid2hci_end"
--SUBSYSTEM!="usb", GOTO="hid2hci_end"
-+SUBSYSTEM!="usb*", GOTO="hid2hci_end"
- 
- # Variety of Dell Bluetooth devices - match on a mouse device that is
- # self powered and where a HID report needs to be sent to switch modes
--- 
-1.8.0
-
diff --git a/SOURCES/0001-input-Add-helper-function-to-request-disconnect.patch b/SOURCES/0001-input-Add-helper-function-to-request-disconnect.patch
deleted file mode 100644
index 481b72c..0000000
--- a/SOURCES/0001-input-Add-helper-function-to-request-disconnect.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From c70bf65af6e301f18063491b22112300c0fb9b89 Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Sun, 17 Jun 2012 01:25:46 +0200
-Subject: [PATCH 1/3] input: Add helper function to request disconnect
-
----
- input/device.c |    7 +++++++
- input/device.h |    1 +
- 2 files changed, 8 insertions(+)
-
-diff --git a/input/device.c b/input/device.c
-index 0e3f4a9..8fdd4e0 100644
---- a/input/device.c
-+++ b/input/device.c
-@@ -1306,3 +1306,10 @@ int input_device_close_channels(const bdaddr_t *src, const bdaddr_t *dst)
- 
- 	return 0;
- }
-+
-+void input_device_request_disconnect(struct fake_input *fake)
-+{
-+	if (fake == NULL || fake->idev == NULL)
-+		return;
-+	device_request_disconnect(fake->idev->device, NULL);
-+}
-diff --git a/input/device.h b/input/device.h
-index 509a353..ff52967 100644
---- a/input/device.h
-+++ b/input/device.h
-@@ -49,3 +49,4 @@ int input_device_unregister(const char *path, const char *uuid);
- int input_device_set_channel(const bdaddr_t *src, const bdaddr_t *dst, int psm,
- 							GIOChannel *io);
- int input_device_close_channels(const bdaddr_t *src, const bdaddr_t *dst);
-+void input_device_request_disconnect(struct fake_input *fake);
--- 
-1.7.10
-
diff --git a/SOURCES/0001-input-Fix-not-adding-watches-when-io-channel-is-conn.patch b/SOURCES/0001-input-Fix-not-adding-watches-when-io-channel-is-conn.patch
deleted file mode 100644
index 0b984d5..0000000
--- a/SOURCES/0001-input-Fix-not-adding-watches-when-io-channel-is-conn.patch
+++ /dev/null
@@ -1,101 +0,0 @@
-From ea793cb9f744cd2942b66385118161b880de958a Mon Sep 17 00:00:00 2001
-From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-Date: Tue, 19 Jun 2012 12:44:43 +0300
-Subject: [PATCH] input: Fix not adding watches when io channel is connected
-
-This can leave dangling pointers in case one of the channel is never
-connected which cause -EALREADY to be returned by
-input_device_set_channel next time the device attempts to connect.
-
-For the same reason the code path when acting as client now add the
-watch as soon as the connection completes instead when both channels
-are connected.
----
- input/device.c | 31 ++++++++++++++++++++++++-------
- 1 file changed, 24 insertions(+), 7 deletions(-)
-
-diff --git a/input/device.c b/input/device.c
-index 0e3f4a9..09a9a39 100644
---- a/input/device.c
-+++ b/input/device.c
-@@ -387,6 +387,11 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
- 	struct input_conn *iconn = data;
- 	struct input_device *idev = iconn->idev;
- 	gboolean connected = FALSE;
-+	char address[18];
-+
-+	ba2str(&iconn->idev->dst, address);
-+
-+	DBG("Device %s disconnected", address);
- 
- 	/* Checking for ctrl_watch avoids a double g_io_channel_shutdown since
- 	 * it's likely that ctrl_watch_cb has been queued for dispatching in
-@@ -415,6 +420,11 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
- static gboolean ctrl_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
- {
- 	struct input_conn *iconn = data;
-+	char address[18];
-+
-+	ba2str(&iconn->idev->dst, address);
-+
-+	DBG("Device %s disconnected", address);
- 
- 	/* Checking for intr_watch avoids a double g_io_channel_shutdown since
- 	 * it's likely that intr_watch_cb has been queued for dispatching in
-@@ -811,13 +821,6 @@ static int input_device_connected(struct input_device *idev,
- 	if (err < 0)
- 		return err;
- 
--	iconn->intr_watch = g_io_add_watch(iconn->intr_io,
--					G_IO_HUP | G_IO_ERR | G_IO_NVAL,
--					intr_watch_cb, iconn);
--	iconn->ctrl_watch = g_io_add_watch(iconn->ctrl_io,
--					G_IO_HUP | G_IO_ERR | G_IO_NVAL,
--					ctrl_watch_cb, iconn);
--
- 	connected = TRUE;
- 	emit_property_changed(idev->conn, idev->path, INPUT_DEVICE_INTERFACE,
- 				"Connected", DBUS_TYPE_BOOLEAN, &connected);
-@@ -854,6 +857,10 @@ static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err,
- 	dbus_message_unref(iconn->pending_connect);
- 	iconn->pending_connect = NULL;
- 
-+	iconn->intr_watch = g_io_add_watch(iconn->intr_io,
-+					G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-+					intr_watch_cb, iconn);
-+
- 	return;
- 
- failed:
-@@ -913,6 +920,10 @@ static void control_connect_cb(GIOChannel *chan, GError *conn_err,
- 
- 	iconn->intr_io = io;
- 
-+	iconn->ctrl_watch = g_io_add_watch(iconn->ctrl_io,
-+					G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-+					ctrl_watch_cb, iconn);
-+
- 	return;
- 
- failed:
-@@ -1272,11 +1283,17 @@ int input_device_set_channel(const bdaddr_t *src, const bdaddr_t *dst, int psm,
- 		if (iconn->ctrl_io)
- 			return -EALREADY;
- 		iconn->ctrl_io = g_io_channel_ref(io);
-+		iconn->ctrl_watch = g_io_add_watch(iconn->ctrl_io,
-+					G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-+					ctrl_watch_cb, iconn);
- 		break;
- 	case L2CAP_PSM_HIDP_INTR:
- 		if (iconn->intr_io)
- 			return -EALREADY;
- 		iconn->intr_io = g_io_channel_ref(io);
-+		iconn->intr_watch = g_io_add_watch(iconn->intr_io,
-+					G_IO_HUP | G_IO_ERR | G_IO_NVAL,
-+					intr_watch_cb, iconn);
- 		break;
- 	}
- 
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-network-NULL-dereference-fix.patch b/SOURCES/0001-network-NULL-dereference-fix.patch
deleted file mode 100644
index 5b6e750..0000000
--- a/SOURCES/0001-network-NULL-dereference-fix.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From b57c64f1aa5c51dd785f2572636b8c41ada06d72 Mon Sep 17 00:00:00 2001
-From: Pavel Raiskup <praiskup@redhat.com>
-Date: Tue, 30 Aug 2011 15:10:46 +0200
-Subject: [PATCH] network: NULL dereference fix
-
-Variable ifindex dereferenced on line 242 before null check on line 249.
----
- network/common.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/network/common.c b/network/common.c
-index 4704072..a223685 100644
---- a/network/common.c
-+++ b/network/common.c
-@@ -240,13 +240,15 @@ int bnep_if_down(const char *devname)
- 
- int bnep_add_to_bridge(const char *devname, const char *bridge)
- {
--	int ifindex = if_nametoindex(devname);
-+	int ifindex;
- 	struct ifreq ifr;
- 	int sk, err;
- 
- 	if (!devname || !bridge)
- 		return -EINVAL;
- 
-+	ifindex = if_nametoindex(devname);
-+
- 	sk = socket(AF_INET, SOCK_STREAM, 0);
- 	if (sk < 0)
- 		return -1;
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-network-fix-network-Connect-method-parameters.patch b/SOURCES/0001-network-fix-network-Connect-method-parameters.patch
deleted file mode 100644
index 05edb01..0000000
--- a/SOURCES/0001-network-fix-network-Connect-method-parameters.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 57170b311f1468330f4a9961dc0b3ac45f97bc13 Mon Sep 17 00:00:00 2001
-From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
-Date: Sat, 30 Jun 2012 00:39:05 -0300
-Subject: [PATCH] network: fix network Connect() method parameters
-
----
- network/connection.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/network/connection.c b/network/connection.c
-index 544ec3a..59423a9 100644
---- a/network/connection.c
-+++ b/network/connection.c
-@@ -554,7 +554,9 @@ static void path_unregister(void *data)
- 
- static const GDBusMethodTable connection_methods[] = {
- 	{ GDBUS_ASYNC_METHOD("Connect",
--			NULL, NULL, connection_connect) },
-+				GDBUS_ARGS({"uuid", "s"}),
-+				GDBUS_ARGS({"interface", "s"}),
-+				connection_connect) },
- 	{ GDBUS_METHOD("Disconnect",
- 			NULL, NULL, connection_disconnect) },
- 	{ GDBUS_METHOD("GetProperties",
--- 
-1.8.0.1
-
diff --git a/SOURCES/0001-obex-Use-GLib-helper-function-to-manipulate-paths.patch b/SOURCES/0001-obex-Use-GLib-helper-function-to-manipulate-paths.patch
new file mode 100644
index 0000000..004a389
--- /dev/null
+++ b/SOURCES/0001-obex-Use-GLib-helper-function-to-manipulate-paths.patch
@@ -0,0 +1,38 @@
+From f7861d27fbcbc519f57d8496aa9486f487908821 Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Sat, 9 Nov 2013 18:13:43 +0100
+Subject: [PATCH 1/5] obex: Use GLib helper function to manipulate paths
+
+Instead of trying to do it by hand. This also makes sure that
+relative paths aren't used by the agent.
+---
+ obexd/src/manager.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/obexd/src/manager.c b/obexd/src/manager.c
+index cec8a39..f18896e 100644
+--- a/obexd/src/manager.c
++++ b/obexd/src/manager.c
+@@ -651,14 +651,14 @@ static void agent_reply(DBusPendingCall *call, void *user_data)
+ 				DBUS_TYPE_STRING, &name,
+ 				DBUS_TYPE_INVALID)) {
+ 		/* Splits folder and name */
+-		const char *slash = strrchr(name, '/');
++		gboolean is_relative = !g_path_is_absolute(name);
+ 		DBG("Agent replied with %s", name);
+-		if (!slash) {
+-			agent->new_name = g_strdup(name);
++		if (is_relative) {
++			agent->new_name = g_path_get_basename(name);
+ 			agent->new_folder = NULL;
+ 		} else {
+-			agent->new_name = g_strdup(slash + 1);
+-			agent->new_folder = g_strndup(name, slash - name);
++			agent->new_name = g_path_get_basename(name);
++			agent->new_folder = g_path_get_dirname(name);
+ 		}
+ 	}
+ 
+-- 
+1.8.4.2
+
diff --git a/SOURCES/0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch b/SOURCES/0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
index 447e951..e583320 100644
--- a/SOURCES/0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
+++ b/SOURCES/0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
@@ -1,17 +1,17 @@
-From 3aca31788655582f3029b3c88ad6f468c4de07a2 Mon Sep 17 00:00:00 2001
+From aa73bf5039dfd2cf0a52dd6fd22501d955cc1a00 Mon Sep 17 00:00:00 2001
 From: Tommy <mesilliac@gmail.com>
 Date: Thu, 10 Jan 2013 09:18:43 +0100
 Subject: [PATCH] work around Logitech diNovo Edge keyboard firmware issue
 
 https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/269851
 ---
- scripts/bluetooth-hid2hci.rules | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ tools/hid2hci.rules |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
 
-diff --git a/scripts/bluetooth-hid2hci.rules b/scripts/bluetooth-hid2hci.rules
-index 0687c8a..2a571e5 100644
---- a/scripts/bluetooth-hid2hci.rules
-+++ b/scripts/bluetooth-hid2hci.rules
+diff --git a/tools/hid2hci.rules b/tools/hid2hci.rules
+index db6bb03..7db4572 100644
+--- a/tools/hid2hci.rules
++++ b/tools/hid2hci.rules
 @@ -11,7 +11,10 @@ ATTR{bInterfaceClass}=="03", ATTR{bInterfaceSubClass}=="01", ATTR{bInterfaceProt
    RUN+="hid2hci --method=dell --devpath=%p", ENV{HID2HCI_SWITCH}="1"
  
diff --git a/SOURCES/0002-autopair-Don-t-handle-the-iCade.patch b/SOURCES/0002-autopair-Don-t-handle-the-iCade.patch
new file mode 100644
index 0000000..68751ae
--- /dev/null
+++ b/SOURCES/0002-autopair-Don-t-handle-the-iCade.patch
@@ -0,0 +1,47 @@
+From c16ae7041c7511d8d1ed8441f696716fa6a9117e Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Tue, 19 Nov 2013 14:11:39 +0100
+Subject: [PATCH 2/5] autopair: Don't handle the iCade
+
+We can't easily enter digits other than 1 through 4 (inclusive)
+so leave it up to the agent to figure out a good passcode
+for the iCade.
+
+Note that we can not use the VID/PID of the device, as it is not
+yet known at that point.
+---
+ plugins/autopair.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/plugins/autopair.c b/plugins/autopair.c
+index 8c98c12..5d2f6f7 100644
+--- a/plugins/autopair.c
++++ b/plugins/autopair.c
+@@ -57,13 +57,23 @@ static ssize_t autopair_pincb(struct btd_adapter *adapter,
+ {
+ 	char addr[18];
+ 	char pinstr[7];
++	char name[25];
+ 	uint32_t class;
+ 
+ 	ba2str(device_get_address(device), addr);
+ 
+ 	class = btd_device_get_class(device);
+ 
+-	DBG("device %s 0x%x", addr, class);
++	device_get_name(device, name, sizeof(name));
++	name[sizeof(name) - 1] = 0;
++
++	DBG("device %s (%s) 0x%x", addr, name, class);
++
++	g_message ("vendor 0x%X product: 0x%X", btd_device_get_vendor (device), btd_device_get_product (device));
++
++	/* The iCade shouldn't use random PINs like normal keyboards */
++	if (name != NULL && strstr(name, "iCade") != NULL)
++		return 0;
+ 
+ 	/* This is a class-based pincode guesser. Ignore devices with an
+ 	 * unknown class.
+-- 
+1.8.4.2
+
diff --git a/SOURCES/0002-fakehid-Disconnect-from-PS3-remote-after-10-mins.patch b/SOURCES/0002-fakehid-Disconnect-from-PS3-remote-after-10-mins.patch
deleted file mode 100644
index 8941126..0000000
--- a/SOURCES/0002-fakehid-Disconnect-from-PS3-remote-after-10-mins.patch
+++ /dev/null
@@ -1,118 +0,0 @@
-From cca11542bcd4d1748c850806c1599ed1b76ea19a Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Sun, 17 Jun 2012 01:26:18 +0200
-Subject: [PATCH 2/3] fakehid: Disconnect from PS3 remote after 10 mins
-
-After 10 minutes, disconnect the PS3 BD Remote to avoid draining its
-battery. This is consistent with its behaviour on the PS3.
-
-Original patch by Ruslan N. Marchenko <rufferson@gmail.com>
----
- input/device.h  |    1 +
- input/fakehid.c |   36 ++++++++++++++++++++++++++++++++++++
- 2 files changed, 37 insertions(+)
-
-diff --git a/input/device.h b/input/device.h
-index ff52967..d8baa2c 100644
---- a/input/device.h
-+++ b/input/device.h
-@@ -33,6 +33,7 @@ struct fake_input {
- 	int		uinput;		/* uinput socket */
- 	int		rfcomm;		/* RFCOMM socket */
- 	uint8_t		ch;		/* RFCOMM channel number */
-+	guint           timeout_id;	/* Disconnect timeout ID */
- 	gboolean	(*connect) (struct input_conn *iconn, GError **err);
- 	int		(*disconnect) (struct input_conn *iconn);
- 	void		*priv;
-diff --git a/input/fakehid.c b/input/fakehid.c
-index 3181538..a125356 100644
---- a/input/fakehid.c
-+++ b/input/fakehid.c
-@@ -44,6 +44,9 @@
- #include "fakehid.h"
- #include "uinput.h"
- 
-+/* Timeout to get the PS3 remote disconnected, in seconds */
-+#define PS3_REMOTE_TIMEOUT 10 * 60
-+
- enum ps3remote_special_keys {
- 	PS3R_BIT_PS = 0,
- 	PS3R_BIT_ENTER = 3,
-@@ -141,6 +144,20 @@ static unsigned int ps3remote_keymap[] = {
- 	[0xff] = KEY_MAX,
- };
- 
-+static gboolean ps3_remote_timeout_cb(gpointer user_data);
-+
-+static void ps3remote_set_timeout(struct fake_input *fake, gboolean enable)
-+{
-+	if (enable) {
-+		fake->timeout_id = g_timeout_add_seconds(PS3_REMOTE_TIMEOUT, ps3_remote_timeout_cb, fake);
-+	} else {
-+		if (fake->timeout_id > 0) {
-+			g_source_remove(fake->timeout_id);
-+			fake->timeout_id = 0;
-+		}
-+	}
-+}
-+
- static int ps3remote_decode(char *buff, int size, unsigned int *value)
- {
- 	static unsigned int lastkey = 0;
-@@ -203,6 +220,16 @@ error:
- 	return -1;
- }
- 
-+static gboolean
-+ps3_remote_timeout_cb(gpointer user_data)
-+{
-+	struct fake_input *fake = (struct fake_input *) user_data;
-+	input_device_request_disconnect(fake);
-+	DBG("Disconnected PS3 BD Remote after timeout");
-+	fake->timeout_id = 0;
-+	return FALSE;
-+}
-+
- static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
- 				gpointer data)
- {
-@@ -221,6 +248,9 @@ static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
- 		goto failed;
- 	}
- 
-+	/* Remove the old timeout */
-+	ps3remote_set_timeout(fake, FALSE);
-+
- 	fd = g_io_channel_unix_get_fd(chan);
- 
- 	memset(buff, 0, sizeof(buff));
-@@ -256,6 +286,8 @@ static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
- 		goto failed;
- 	}
- 
-+	ps3remote_set_timeout(fake, TRUE);
-+
- 	return TRUE;
- 
- failed:
-@@ -318,6 +350,8 @@ static int ps3remote_setup_uinput(struct fake_input *fake,
- 		goto err;
- 	}
- 
-+	ps3remote_set_timeout(fake, TRUE);
-+
- 	return 0;
- 
- err:
-@@ -378,6 +412,8 @@ struct fake_input *fake_hid_connadd(struct fake_input *fake,
- 	for (l = fake_hid->devices; l != NULL; l = l->next) {
- 		old = l->data;
- 		if (old->idev == fake->idev) {
-+			if (fake->timeout_id > 0)
-+				g_source_remove(fake->timeout_id);
- 			g_free(fake);
- 			fake = old;
- 			fake_hid->connect(fake, NULL);
--- 
-1.7.10
-
diff --git a/SOURCES/0003-fakehid-Use-the-same-constant-as-declared.patch b/SOURCES/0003-fakehid-Use-the-same-constant-as-declared.patch
deleted file mode 100644
index b6adf77..0000000
--- a/SOURCES/0003-fakehid-Use-the-same-constant-as-declared.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From a354165e58f937ee12c16ab48ce334b664c8f163 Mon Sep 17 00:00:00 2001
-From: Bastien Nocera <hadess@hadess.net>
-Date: Sun, 17 Jun 2012 01:29:01 +0200
-Subject: [PATCH 3/3] fakehid: Use the same constant as declared
-
-ps3remote_keymap[] uses 0xff as the max value, so should we.
----
- input/fakehid.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/input/fakehid.c b/input/fakehid.c
-index a125356..a758413 100644
---- a/input/fakehid.c
-+++ b/input/fakehid.c
-@@ -335,7 +335,7 @@ static int ps3remote_setup_uinput(struct fake_input *fake,
- 	}
- 
- 	/* enabling keys */
--	for (i = 0; i < 256; i++)
-+	for (i = 0; i < 0xff; i++)
- 		if (ps3remote_keymap[i] != KEY_RESERVED)
- 			if (ioctl(fake->uinput, UI_SET_KEYBIT,
- 						ps3remote_keymap[i]) < 0) {
--- 
-1.7.10
-
diff --git a/SOURCES/0004-agent-Assert-possible-infinite-loop.patch b/SOURCES/0004-agent-Assert-possible-infinite-loop.patch
new file mode 100644
index 0000000..2746e0c
--- /dev/null
+++ b/SOURCES/0004-agent-Assert-possible-infinite-loop.patch
@@ -0,0 +1,25 @@
+From 67e5477687a2753d3f7b300bcfdc74464d8ad41f Mon Sep 17 00:00:00 2001
+From: Bastien Nocera <hadess@hadess.net>
+Date: Mon, 9 Dec 2013 18:04:56 +0100
+Subject: [PATCH 4/5] agent: Assert possible infinite loop
+
+---
+ src/agent.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/agent.c b/src/agent.c
+index bcba969..b292881 100644
+--- a/src/agent.c
++++ b/src/agent.c
+@@ -203,6 +203,8 @@ void agent_unref(struct agent *agent)
+ 	if (agent->ref > 0)
+ 		return;
+ 
++	g_assert (agent->ref == 0);
++
+ 	if (agent->request) {
+ 		DBusError err;
+ 		agent_pincode_cb pincode_cb;
+-- 
+1.8.4.2
+
diff --git a/SOURCES/bluez-uinput.modules b/SOURCES/bluez-uinput.modules
deleted file mode 100644
index 9f721d9..0000000
--- a/SOURCES/bluez-uinput.modules
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-if [ ! -c /dev/input/uinput ] ; then
-	exec /sbin/modprobe uinput >/dev/null 2>&1
-fi
-
diff --git a/SOURCES/dund.conf b/SOURCES/dund.conf
deleted file mode 100644
index dec4a84..0000000
--- a/SOURCES/dund.conf
+++ /dev/null
@@ -1 +0,0 @@
-#DUNDARGS='--search --persist'
diff --git a/SOURCES/dund.init b/SOURCES/dund.init
deleted file mode 100755
index 6b2e563..0000000
--- a/SOURCES/dund.init
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/sh
-
-# chkconfig:	- 26 89
-
-### BEGIN INIT INFO
-# Required-Start: bluetooth
-# Default-Start: 
-# Short-Description: Bluetooth Dial-Up-Networking Daemon.
-# Description: Bluetooth Dial-Up-Networking Daemon. Provides PPP over RFCOMM
-# services.
-### END INIT INFO
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
-
-[ "${NETWORKING}" = "yes" ] || exit 0
-
-[ -r /etc/sysconfig/dund ] && . /etc/sysconfig/dund
-
-start() 
-{
-	[ -z "$DUNDARGS" ] && exit 6
-
-        echo -n $"Starting dund: "
-        daemon /usr/bin/dund $DUNDARGS
-	RETVAL=$?
-	echo
-	[ $RETVAL = 0 ] && touch /var/lock/subsys/dund
-        return $RETVAL
-}
-
-stop() 
-{
-        echo -n $"Shutting down dund: "
-	/usr/bin/dund -K
-	killproc dund
-	RETVAL=$?
-
-	rm -f  /var/lock/subsys/dund
-        echo
-	return $RETVAL
-}
-
-# See how we were called.
-case "$1" in
-  start)
-	start
-        ;;
-  stop)
-	stop
-        ;;
-  force-reload|restart|reload)
-	stop
-	start
-	;;
-  try-restart|condrestart)
-	[ -e /var/lock/subsys/dund ] && (stop; start)
-	;;
-  status)
-  	status dund
-	RETVAL=$?
-	;;
-  *)
-        echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
-        exit 3
-esac
-
-exit $RETVAL
diff --git a/SOURCES/pand.conf b/SOURCES/pand.conf
deleted file mode 100644
index ee1003a..0000000
--- a/SOURCES/pand.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-#PANDARGS='--listen --role NAP'
-#PANDARGS='--search --cache --persist'
diff --git a/SOURCES/pand.init b/SOURCES/pand.init
deleted file mode 100755
index 5877e72..0000000
--- a/SOURCES/pand.init
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/sh
-
-# chkconfig:	- 26 89
-
-### BEGIN INIT INFO
-# Required-Start: bluetooth
-# Default-Start:
-# Short-Description: Bluetooth Personal Area Networking Daemon.
-# Description: Bluetooth Personal Area Networking Daemon. Provides network
-# services over Bluetooth.
-### END INIT INFO
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
-
-[ "${NETWORKING}" = "yes" ] || exit 0
-
-[ -r /etc/sysconfig/pand ] && . /etc/sysconfig/pand
-
-start() 
-{
-	[ -z "$PANDARGS" ] && exit 6
-        [ -x /etc/bluetooth/pan/system-up ] && /etc/bluetooth/pan/system-up
-
-        echo -n $"Starting pand: "
-        daemon /usr/bin/pand $PANDARGS
-	RETVAL=$?
-        echo
-	[ $RETVAL = 0 ] && touch /var/lock/subsys/pand
-	return $RETVAL
-}
-
-stop() 
-{
-        echo -n $"Shutting down pand: "
-	/usr/bin/pand -K
-	killproc pand
-	RETVAL=$?
-        [ -x /etc/bluetooth/pan/system-down ] && /etc/bluetooth/pan/system-down
-	rm -f  /var/lock/subsys/pand
-        echo
-	return $RETVAL
-}
-
-[ -f /usr/bin/pand ] || exit 0
-
-# See how we were called.
-case "$1" in
-  start)
-	start
-        ;;
-  stop)
-	stop
-        ;;
-  force-reload|restart|reload)
-	stop
-	start
-	;;
-  try-restart|condrestart)
-	[ -e /var/lock/subsys/pand ] && (stop; start)
-	;;
-  status)
-  	status pand
-	RETVAL=$?
-	;;
-  *)
-        echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
-        exit 3
-esac
-
-exit $RETVAL
diff --git a/SOURCES/rfcomm.init b/SOURCES/rfcomm.init
deleted file mode 100755
index b1e53da..0000000
--- a/SOURCES/rfcomm.init
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/sh
-
-# chkconfig:	- 27 88
-
-### BEGIN INIT INFO
-# Required-Start: bluetooth
-# Default-Start: 
-# Short-Description: Bluetooth RFCOMM setup.
-# Description: Bluetooth RFCOMM setup. Sets up serial devices
-# over Bluetooth.
-### END INIT INFO
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
-
-[ "${NETWORKING}" = "yes" ] || exit 0
-
-start() 
-{
-        echo -n $"Starting rfcomm: "
-        rfcomm bind all
-	RETVAL=$?
-	echo
-	[ $RETVAL = 0 ] && touch /var/lock/subsys/rfcomm
-        return $RETVAL
-}
-
-stop() 
-{
-        echo -n $"Shutting down rfcomm: "
-	rfcomm release all
-	RETVAL=$?
-
-	rm -f  /var/lock/subsys/rfcomm
-        echo
-	return $RETVAL
-}
-
-# See how we were called.
-case "$1" in
-  start)
-	start
-        ;;
-  stop)
-	stop
-        ;;
-  force-reload|restart|reload)
-	stop
-	start
-	;;
-  try-restart|condrestart)
-	[ -e /var/lock/subsys/rfcomm ] && (stop; start)
-	;;
-  status)
-        RETVAL=1
-  	[ -e /var/lock/subsys/rfcomm ] && RETVAL=0
-	;;
-  *)
-        echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
-        exit 3
-esac
-
-exit $RETVAL
diff --git a/SPECS/bluez.spec b/SPECS/bluez.spec
index b9106ff..cb2a1f7 100644
--- a/SPECS/bluez.spec
+++ b/SPECS/bluez.spec
@@ -1,71 +1,52 @@
 Summary: Bluetooth utilities
 Name: bluez
-Version: 4.101
-Release: 13%{?dist}
+Version: 5.23
+Release: 4%{?dist}
 License: GPLv2+
 Group: Applications/System
 URL: http://www.bluez.org/
 
-Source: http://www.kernel.org/pub/linux/bluetooth/%{name}-%{version}.tar.gz
+Source0: http://www.kernel.org/pub/linux/bluetooth/bluez-%{version}.tar.xz
 Source1: bluez.gitignore
-Source3: dund.init
-Source4: dund.conf
-Source5: pand.init
-Source6: pand.conf
-Source7: rfcomm.init
-Source8: bluez-uinput.modules
-
-# https://bugzilla.redhat.com/show_bug.cgi?id=877998
-Patch1: 0001-hid2hci-change-subsystem-in-udev-rule-from-usb-to-us.patch
-# https://bugzilla.redhat.com/show_bug.cgi?id=983161
-Patch2: 0001-build-Enable-BIND_NOW.patch
-# https://bugzilla.redhat.com/show_bug.cgi?id=969385
-Patch3: 0001-Allow-PulseAudio-to-connect-by-default.patch
-# https://bugzilla.redhat.com/show_bug.cgi?id=498756
-Patch4: 0001-Activate-the-Socket-Mobile-CF-kit.patch
-# http://thread.gmane.org/gmane.linux.bluez.kernel/2396
-Patch5: 0001-Add-sixaxis-cable-pairing-plugin.patch
-# PS3 BD Remote patches
-Patch6: 0001-input-Add-helper-function-to-request-disconnect.patch
-Patch7: 0002-fakehid-Disconnect-from-PS3-remote-after-10-mins.patch
-Patch8: 0003-fakehid-Use-the-same-constant-as-declared.patch
-# Upstream patches
-Patch9: 0001-audio-Permit-concurrent-use-of-AG-and-HF-roles.patch
-Patch10: 0001-Fix-GDBus-flags-after-conversion-to-macros.patch
-Patch11: 0001-input-Fix-not-adding-watches-when-io-channel-is-conn.patch
-Patch12: 0001-network-fix-network-Connect-method-parameters.patch
-Patch13: 0001-network-NULL-dereference-fix.patch
-# Ubuntu patches
-Patch14: 0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
-Patch15: 0001-Enable-the-Gateway-and-Source-audio-profiles-by-defa.patch
+
+## Ubuntu patches
+Patch2: 0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
+# Non-upstream
+Patch3: 0001-Allow-using-obexd-without-systemd-in-the-user-sessio.patch
+Patch4: 0001-obex-Use-GLib-helper-function-to-manipulate-paths.patch
+Patch5: 0002-autopair-Don-t-handle-the-iCade.patch
+Patch7: 0004-agent-Assert-possible-infinite-loop.patch
+
+%global _hardened_build 1
 
 BuildRequires: git
-BuildRequires: flex
 BuildRequires: dbus-devel >= 0.90
-BuildRequires: libusb-devel, glib2-devel, alsa-lib-devel
-BuildRequires: libsndfile-devel
-BuildRequires: libcap-ng-devel
+BuildRequires: glib2-devel
+BuildRequires: libical-devel >= 1.0.1
 BuildRequires: readline-devel
 # For cable pairing
 BuildRequires: systemd-devel
 # For cups
 BuildRequires: cups-devel
-%ifnarch s390 s390x
-BuildRequires: libusbx-devel
-%endif
 
 # For rebuild
 BuildRequires: libtool autoconf automake
 
-Requires: bluez-libs = %{version}-%{release}
-Requires: systemd
 Requires: dbus >= 0.60
-Requires: hwdata >= 0.215
-%ifnarch s390 s390x
-Requires: dbus-bluez-pin-helper
-%endif
-Requires(preun): /bin/systemctl
-Requires(post): /bin/systemctl
+
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+
+# Dropped in Fedora 20:
+Obsoletes: bluez-alsa < 5.0
+Obsoletes: bluez-compat < 5.0
+Obsoletes: bluez-gstreamer < 5.0
+
+# Other bluetooth-releated packages that haven't gotten ported to BlueZ 5
+Obsoletes: blueman < 1.23-9
+Obsoletes: blueman-nautilus < 1.23-9
+Obsoletes: obex-data-server < 1:0.4.6-8
 
 %description
 Utilities for use in Bluetooth applications:
@@ -74,6 +55,14 @@ Utilities for use in Bluetooth applications:
 	- hciconfig
 	- bluetoothd
 	- l2ping
+	- rfcomm
+	- sdptool
+	- bccmd
+	- bluetoothctl
+	- btmon
+	- hcidump
+	- l2test
+	- rctest
 	- start scripts (Red Hat)
 	- pcmcia configuration files
 
@@ -86,40 +75,22 @@ Group: System Environment/Libraries
 %package libs-devel
 Summary: Development libraries for Bluetooth applications
 Group: Development/Libraries
-Requires: bluez-libs = %{version}-%{release}
-Requires: pkgconfig
+Requires: bluez-libs%{?_isa} = %{version}-%{release}
 
 %package cups
 Summary: CUPS printer backend for Bluetooth printers
 Group: System Environment/Daemons
-Requires: bluez-libs = %{version}-%{release}
+Requires: bluez%{?_isa} = %{version}-%{release}
 Requires: cups
 
-%package alsa
-Summary: ALSA support for Bluetooth audio devices
-Group: System Environment/Daemons
-Requires: bluez-libs = %{version}-%{release}
-
-%package compat
-Summary: Compatibility utilities for Bluetooth devices
-Group: System Environment/Daemons
-Requires: bluez-libs = %{version}-%{release}
-Requires: bluez = %{version}-%{release}
-Requires(preun): /sbin/chkconfig, /sbin/service
-Requires(post): /sbin/chkconfig, /sbin/service
-
 %package hid2hci
 Summary: Put HID proxying bluetooth HCI's into HCI mode
 Group: System Environment/Daemons
-Requires: bluez-libs = %{version}-%{release}
-Requires: bluez = %{version}-%{release}
+Requires: bluez%{?_isa} = %{version}-%{release}
 
 %description cups
 This package contains the CUPS backend
 
-%description alsa
-This package contains ALSA support for Bluetooth audio devices
-
 %description libs
 Libraries for use in Bluetooth applications.
 
@@ -127,10 +98,6 @@ Libraries for use in Bluetooth applications.
 bluez-libs-devel contains development libraries and headers for
 use in Bluetooth applications.
 
-%description compat
-This package contains compatibility utilities for Bluetooth devices.
-This includes hidd, dund and pand.
-
 %description hid2hci
 Most allinone PC's and bluetooth keyboard / mouse sets which include a
 bluetooth dongle, ship with a so called HID proxying bluetooth HCI.
@@ -151,7 +118,6 @@ they are paired, this will require the use of a regular (wired) USB keyboard
 and mouse.
 
 %prep
-
 %setup -q
 git init
 if [ -z "$GIT_COMMITTER_NAME" ]; then
@@ -166,24 +132,18 @@ git am -p1 %{patches} < /dev/null
 
 %build
 libtoolize -f -c
-autoreconf -vif
-%configure --enable-cups --enable-dfutool --enable-tools --enable-bccmd --enable-hidd --enable-pand --enable-dund --enable-hid2hci --with-ouifile=/usr/share/hwdata/oui.txt --with-systemdsystemunitdir=/lib/systemd/system --enable-wiimote --disable-gstreamer
-make V=1
+autoreconf -f -i
+%configure --enable-cups --enable-tools --enable-library \
+           --enable-sixaxis --enable-pie \
+           --with-systemdsystemunitdir=%{_unitdir} \
+           --with-systemduserunitdir=%{_userunitdir}
+make %{?_smp_mflags} V=1
 
 %install
 make install DESTDIR=$RPM_BUILD_ROOT
-/sbin/ldconfig -n $RPM_BUILD_ROOT/%{_libdir}
-# Remove autocrap and libtool droppings
-rm -f $RPM_BUILD_ROOT/%{_libdir}/*.la				\
-	$RPM_BUILD_ROOT/%{_libdir}/alsa-lib/*.la		\
-	$RPM_BUILD_ROOT/%{_libdir}/bluetooth/plugins/*.la
 
-for a in dund pand rfcomm ; do
-	install -D -m0755 $RPM_SOURCE_DIR/$a.init $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/$a
-	if [ -e $RPM_SOURCE_DIR/$a.conf ] ; then
-		install -D -m0644 $RPM_SOURCE_DIR/$a.conf $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/$a
-	fi
-done
+# Remove autocrap and libtool droppings
+find $RPM_BUILD_ROOT -name '*.la' -delete
 
 # Remove the cups backend from libdir, and install it in /usr/lib whatever the install
 if test -d ${RPM_BUILD_ROOT}/usr/lib64/cups ; then
@@ -191,140 +151,103 @@ if test -d ${RPM_BUILD_ROOT}/usr/lib64/cups ; then
 	rm -rf ${RPM_BUILD_ROOT}%{_libdir}/cups
 fi
 
-rm -f ${RPM_BUILD_ROOT}/%{_sysconfdir}/udev/*.rules ${RPM_BUILD_ROOT}/lib/udev/rules.d/*.rules
-install -D -p -m0644 scripts/bluetooth-serial.rules ${RPM_BUILD_ROOT}/lib/udev/rules.d/97-bluetooth-serial.rules
-install -D -p -m0644 scripts/bluetooth-hid2hci.rules ${RPM_BUILD_ROOT}/lib/udev/rules.d/97-bluetooth-hid2hci.rules
-install -D -m0755 scripts/bluetooth_serial ${RPM_BUILD_ROOT}/lib/udev/bluetooth_serial
-
-install -D -m0755 %{SOURCE8} $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/modules/bluez-uinput.modules
+rm -f ${RPM_BUILD_ROOT}/%{_sysconfdir}/udev/*.rules ${RPM_BUILD_ROOT}/usr/lib/udev/rules.d/*.rules
+install -D -p -m0644 tools/hid2hci.rules ${RPM_BUILD_ROOT}/lib/udev/rules.d/97-hid2hci.rules
 
 install -d -m0755 $RPM_BUILD_ROOT/%{_localstatedir}/lib/bluetooth
 
 mkdir -p $RPM_BUILD_ROOT/%{_libdir}/bluetooth/
 
-install -D -p -m0644 audio/audio.conf ${RPM_BUILD_ROOT}/etc/bluetooth/
-
 %post libs -p /sbin/ldconfig
 
-%post
-if [ $1 -eq 1 ]; then
-	/bin/systemctl enable bluetooth.service >/dev/null 2>&1 || :
-fi
-
 %postun libs -p /sbin/ldconfig
 
+%post
+%systemd_post bluetooth.service
+
 %preun
-if [ $1 -eq 0 ]; then
-        /bin/systemctl --no-reload disable bluetooth.service >/dev/null 2>&1 || :
-        /bin/systemctl stop bluetooth.service >/dev/null 2>&1 || :
-fi
+%systemd_preun bluetooth.service
 
 %postun
-/bin/systemctl daemon-reload >/dev/null 2>&1 || :
-if [ $1 -ge 1 ] ; then
-        /bin/systemctl try-restart bluetooth.service >/dev/null 2>&1 || :
-fi
-
-%triggerun -- bluez < 4.94-4
-/bin/systemctl --no-reload enable bluetooth.service >/dev/null 2>&1 || :
-
-%post compat
-/sbin/chkconfig --add dund
-/sbin/chkconfig --add pand
-/sbin/chkconfig --add rfcomm
-if [ "$1" -ge "1" ]; then
-	/sbin/service dund condrestart >/dev/null 2>&1 || :
-	/sbin/service pand condrestart >/dev/null 2>&1 || :
-	/sbin/service rfcomm condrestart >/dev/null 2>&1 || :
-fi
-exit 0
-
-%preun compat
-if [ "$1" = "0" ]; then
-	/sbin/service dund stop >/dev/null 2>&1 || :
-	/sbin/service pand stop >/dev/null 2>&1 || :
-	/sbin/service rfcomm stop >/dev/null 2>&1 || :
-	/sbin/chkconfig --del dund
-	/sbin/chkconfig --del pand
-	/sbin/chkconfig --del rfcomm
-fi
+%systemd_postun_with_restart bluetooth.service
 
 %post hid2hci
 /sbin/udevadm trigger --subsystem-match=usb
 
 %files
-%defattr(-,root,root,-)
+%doc AUTHORS COPYING ChangeLog README
 %{_bindir}/ciptool
-%{_bindir}/dfutool
 %{_bindir}/hcitool
 %{_bindir}/l2ping
 %{_bindir}/rfcomm
 %{_bindir}/sdptool
-%{_bindir}/gatttool
-%{_sbindir}/*
+%{_bindir}/bccmd
+%{_bindir}/bluetoothctl
+%{_bindir}/bluemoon
+%{_bindir}/btmon
+%{_bindir}/hciattach
+%{_bindir}/hciconfig
+%{_bindir}/hcidump
+%{_bindir}/l2test
+%{_bindir}/mpris-proxy
+%{_bindir}/rctest
 %{_mandir}/man1/ciptool.1.gz
-%{_mandir}/man1/dfutool.1.gz
 %{_mandir}/man1/hcitool.1.gz
 %{_mandir}/man1/rfcomm.1.gz
 %{_mandir}/man1/sdptool.1.gz
+%{_mandir}/man1/bccmd.1.*
+%{_mandir}/man1/hciattach.1.*
+%{_mandir}/man1/hciconfig.1.*
+%{_mandir}/man1/hcidump.1.*
+%{_mandir}/man1/l2ping.1.*
+%{_mandir}/man1/rctest.1.*
 %{_mandir}/man8/*
-%exclude %{_mandir}/man8/hid2hci.8*
-%dir %{_sysconfdir}/bluetooth/
-%config(noreplace) %{_sysconfdir}/bluetooth/main.conf
-%config(noreplace) %{_sysconfdir}/bluetooth/audio.conf
-%config(noreplace) %{_sysconfdir}/sysconfig/modules/bluez-uinput.modules
+%{_libexecdir}/bluetooth/bluetoothd
+%{_libexecdir}/bluetooth/obexd
+%exclude %{_mandir}/man1/hid2hci.1*
 %config %{_sysconfdir}/dbus-1/system.d/bluetooth.conf
 %{_libdir}/bluetooth/
-/lib/udev/bluetooth_serial
-/lib/udev/rules.d/97-bluetooth-serial.rules
 %{_localstatedir}/lib/bluetooth
 %{_datadir}/dbus-1/system-services/org.bluez.service
-/usr/lib/systemd/system/bluetooth.service
+%{_datadir}/dbus-1/services/org.bluez.obex.service
+%{_unitdir}/bluetooth.service
+%{_userunitdir}/obex.service
 
 %files libs
-%defattr(-,root,root,-)
+%doc COPYING
 %{_libdir}/libbluetooth.so.*
-%doc AUTHORS COPYING INSTALL ChangeLog README
 
 %files libs-devel
-%defattr(-,root,root,-)
 %{_libdir}/libbluetooth.so
 %dir %{_includedir}/bluetooth
 %{_includedir}/bluetooth/*
 %{_libdir}/pkgconfig/bluez.pc
 
 %files cups
-%defattr(-,root,root,-)
 %_cups_serverbin/backend/bluetooth
 
-%files alsa
-%defattr(-,root,root,-)
-%{_libdir}/alsa-lib/*.so
-%{_datadir}/alsa/bluetooth.conf
-
-%files compat
-%defattr(-,root,root,-)
-%{_bindir}/dund
-%{_bindir}/pand
-%{_bindir}/hidd
-%config(noreplace) %{_sysconfdir}/bluetooth/rfcomm.conf
-%{_sysconfdir}/rc.d/init.d/dund
-%{_sysconfdir}/rc.d/init.d/rfcomm
-%{_sysconfdir}/rc.d/init.d/pand
-%config(noreplace) %{_sysconfdir}/sysconfig/dund
-%config(noreplace) %{_sysconfdir}/sysconfig/pand
-%{_mandir}/man1/dund.1.gz
-%{_mandir}/man1/hidd.1.gz
-%{_mandir}/man1/pand.1.gz
-
 %files hid2hci
-%defattr(-,root,root,-)
 /usr/lib/udev/hid2hci
-%{_mandir}/man8/hid2hci.8*
-/lib/udev/rules.d/97-bluetooth-hid2hci.rules
-%exclude /usr/lib/udev/rules.d/97-bluetooth-hid2hci.rules
+%{_mandir}/man1/hid2hci.1*
+/lib/udev/rules.d/97-hid2hci.rules
 
 %changelog
+* Fri Jul 10 2015 Bastien Nocera <bnocera@redhat.com> 5.23-4
+- Build with --enable-fpie as well
+Resolves: #1174545
+
+* Wed Jul 08 2015 Bastien Nocera <bnocera@redhat.com> 5.23-3
+- Enable hardened build
+Resolves: #1174545
+
+* Wed Jul 08 2015 Milan Crha <mcrha@redhat.com> 5.23-2
+- Rebuild against updated libical
+- Related: #1209787
+
+* Thu Mar 19 2015 Richard Hughes <rhughes@redhat.com> 5.23-1
+- Update to 5.23
+- Resolves: #1174545
+
 * Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 4.101-13
 - Mass rebuild 2014-01-24