diff --git a/Makefile.am b/Makefile.am
index 450e931..5717c3d 100644
--- a/Makefile.am
+++ b/Makefile.am
EXTRA_DIST =
-pkglibexecdir = $(libexecdir)/bluetooth
+pkglibexecdir = @PKGLIBEXECDIR@
pkglibexec_PROGRAMS =
diff --git a/configure.ac b/configure.ac
index 70e9d4b..bb6380f 100644
--- a/configure.ac
+++ b/configure.ac
prefix="${ac_default_prefix}"
fi
+if (test "${exec_prefix}" = "NONE"); then
+ # exec_prefix defaults to prefix, although our manual handling of the
+ # latter (above) confuses autoconf. Manually set the exec_prefix.
+ exec_prefix="${prefix}"
+fi
+
+# Expand any variables containing relative references like ${prefix} and co.
+#
+# Otherwise we'll end up with literal references in the final binaries or
+# manuals, which is not something we really want.
+
+if (test "$libexecdir" = '${exec_prefix}/libexec'); then
+ pkglibexecdir="${exec_prefix}/libexec/bluetooth"
+else
+ pkglibexecdir="${libexecdir}/bluetooth"
+fi
+AC_SUBST(PKGLIBEXECDIR, "${pkglibexecdir}")
+
if (test "$localstatedir" = '${prefix}/var'); then
storagedir="${prefix}/var/lib/bluetooth"
else
diff --git a/mesh/bluetooth-mesh.service.in b/mesh/bluetooth-mesh.service.in
index 9c3ff01..899ef10 100644
--- a/mesh/bluetooth-mesh.service.in
+++ b/mesh/bluetooth-mesh.service.in
[Service]
Type=dbus
BusName=org.bluez.mesh
-ExecStart=@exec_prefix@/bluetooth/bluetooth-meshd
+ExecStart=@PKGLIBEXECDIR@/bluetooth-meshd
NotifyAccess=main
LimitNPROC=1
ProtectHome=true
diff --git a/obexd/src/obex.service.in b/obexd/src/obex.service.in
index 03d09a6..cf4d8c9 100644
--- a/obexd/src/obex.service.in
+++ b/obexd/src/obex.service.in
[Service]
Type=dbus
BusName=org.bluez.obex
-ExecStart=@exec_prefix@/bluetooth/obexd
+ExecStart=@PKGLIBEXECDIR@/obexd
[Install]
Alias=dbus-org.bluez.obex.service
diff --git a/obexd/src/org.bluez.obex.service.in b/obexd/src/org.bluez.obex.service.in
index 14c16d3..873b9d1 100644
--- a/obexd/src/org.bluez.obex.service.in
+++ b/obexd/src/org.bluez.obex.service.in
[D-BUS Service]
Name=org.bluez.obex
-Exec=@exec_prefix@/bluetooth/obexd
+Exec=@PKGLIBEXECDIR@/obexd
SystemdService=dbus-org.bluez.obex.service
diff --git a/src/bluetooth.service.in b/src/bluetooth.service.in
index 63e1575..8ebe89b 100644
--- a/src/bluetooth.service.in
+++ b/src/bluetooth.service.in
[Service]
Type=dbus
BusName=org.bluez
-ExecStart=@exec_prefix@/bluetooth/bluetoothd
+ExecStart=@PKGLIBEXECDIR@/bluetoothd
NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
diff --git a/tools/bluetooth-logger.service.in b/tools/bluetooth-logger.service.in
index 5657c8d..d6df676 100644
--- a/tools/bluetooth-logger.service.in
+++ b/tools/bluetooth-logger.service.in
[Service]
Type=simple
-ExecStart=@exec_prefix@/bluetooth/btmon-logger -p -b /var/log/bluetooth/hci.log
+ExecStart=@PKGLIBEXECDIR@/btmon-logger -p -b /var/log/bluetooth/hci.log
NotifyAccess=main
CapabilityBoundingSet=CAP_NET_RAW
LimitNPROC=1