# Updated but not checked in:
#   (will commit)
#
#	modified:   configure.in
#	new file:   fdi/policy/10osvendor/10-bluetooth-switch.fdi
#	modified:   fdi/policy/10osvendor/Makefile.am
#	modified:   tools/.gitignore
#	modified:   tools/Makefile.am
#	new file:   tools/hal-system-bluetooth-get-power
#	new file:   tools/hal-system-bluetooth-set-power
#	new file:   tools/hal-system-sonypic.c
#	modified:   tools/linux/Makefile.am
#	new file:   tools/linux/hal-system-bluetooth-get-power-linux
#	new file:   tools/linux/hal-system-bluetooth-set-power-linux
#	modified:   tools/linux/hal-system-lcd-get-brightness-linux
#	modified:   tools/linux/hal-system-lcd-set-brightness-linux
#
diff --git a/configure.in b/configure.in
index 8c4cccf..3db3442 100644
--- a/configure.in
+++ b/configure.in
@@ -438,11 +438,11 @@ if test "x$enable_pmu" != "xno"; then
 fi
 AM_CONDITIONAL(HAVE_PMU, test x$msg_pmu = xyes, [Compiling PMU])
 
-AC_ARG_ENABLE(have_pci, [  --disable-pci          Build without PCI support])
+AC_ARG_ENABLE(have_pci, [  --disable-pci           Build without PCI support])
 msg_pci=no
 if test "x$enable_pci" != "xno"; then
 	msg_pci=yes
- 	AC_DEFINE(HAVE_PCI, [], [Set if we have ACPI support])
+ 	AC_DEFINE(HAVE_PCI, [], [Set if we have PCI support])
 fi
 
 # D-Bus libs
@@ -734,6 +734,39 @@ elif test "x$with_dell_backlight" = "x" ; then
 fi
 AM_CONDITIONAL(BUILD_DELL, test x$BUILD_DELL = xyes)
 
+dnl Sony PIC support
+AC_ARG_ENABLE(sonypic,
+		AC_HELP_STRING([--enable-sonypic],[Build with Sony PIC support]),
+		[case "${enableval}" in
+		yes) ENABLE_SONYPIC=yes ;;
+		no) ENABLE_SONYPIC=no ;;
+	        *) AC_MSG_ERROR(bad value ${enableval} for --enable-sonypic) ;;
+		esac],
+		[ENABLE_SONYPIC=auto]) dnl Default value
+
+have_sonypic=no
+if test x$ENABLE_SONYPIC != "xno" ; then
+	AC_COMPILE_IFELSE([
+		#include <linux/sonypi.h>
+		int main(int argc,char **argv) {
+			return 0;
+		}
+	],
+	have_sonypic=yes
+	)
+	AC_MSG_CHECKING(for Sony PIC headers)
+	AC_MSG_RESULT([$have_sonypic])
+
+	if test "x$ENABLE_SONYPIC" = "xyes" && test "x$have_sonypic" != "xyes" ; then
+		AC_MSG_ERROR([Sony PIC support explicitly requested but no support found])
+	fi
+fi
+if test x"$have_sonypic" = "xyes" ; then
+        AC_DEFINE(HAVE_SONYPIC, 1, [Set if we have Sony PIC support])
+fi
+msg_sonypic=$have_sonypic
+AM_CONDITIONAL(HAVE_SONYPIC, test x$msg_sonypic = xyes, [Compiling Sony PIC])
+
 dnl
 dnl SUBSETTING END
 dnl
@@ -827,6 +860,7 @@ echo "
         use ACPI:                   ${msg_acpi}
         use PMU:                    ${msg_pmu}
         use APM:                    ${msg_apm}
+        use Sony PIC:               ${msg_sonypic}
 
         Macbook Pro utils:          ${BUILD_MACBOOKPRO} (Linux only, x86 only, requires libpci)
         OMAP utils:                 ${BUILD_OMAP} (Linux only, arm only)
diff --git a/fdi/policy/10osvendor/10-bluetooth-switch.fdi b/fdi/policy/10osvendor/10-bluetooth-switch.fdi
new file mode 100644
index 0000000..bd3918e
--- /dev/null
+++ b/fdi/policy/10osvendor/10-bluetooth-switch.fdi
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deviceinfo version="0.2">
+
+  <device>
+    <match key="killswitch.type" string="bluetooth">
+      <append key="info.interfaces" type="strlist">org.freedesktop.Hal.Device.KillSwitch</append>
+
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_names" type="strlist">SetPower</append>
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_signatures" type="strlist">b</append>
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_argnames" type="strlist">power</append>
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_execpaths" type="strlist">hal-system-bluetooth-set-power</append>
+
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_names" type="strlist">GetPower</append>
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_signatures" type="strlist"></append>
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_argnames" type="strlist"></append>
+      <append key="org.freedesktop.Hal.Device.KillSwitch.method_execpaths" type="strlist">hal-system-bluetooth-get-power</append>
+    </match>
+  </device>
+
+</deviceinfo>
diff --git a/fdi/policy/10osvendor/Makefile.am b/fdi/policy/10osvendor/Makefile.am
index e2e1d8a..55666ef 100644
--- a/fdi/policy/10osvendor/Makefile.am
+++ b/fdi/policy/10osvendor/Makefile.am
@@ -5,6 +5,7 @@ dist_fdi_DATA = 			\
 	10-keyboard-policy.fdi		\
 	10-power-mgmt-policy.fdi	\
 	10-toshiba-buttons.fdi		\
+	10-bluetooth-switch.fdi		\
 	10-laptop-panel-mgmt-policy.fdi	\
 	15-storage-luks.fdi		\
 	20-storage-methods.fdi
diff --git a/tools/.gitignore b/tools/.gitignore
index 94316c8..664b6f3 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -13,6 +13,7 @@ hal-device
 hal-luks-remove
 hal-luks-setup
 hal-system-power-pmu
+hal-system-sonypic
 hal-policy-is-privileged
 hal-storage-mount
 hal-storage-cleanup-all-mountpoints
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 64b76f3..4909974 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -62,6 +62,11 @@ libexec_PROGRAMS +=			    \
 	hal-system-power-pmu
 endif
 
+if HAVE_SONYPIC
+libexec_PROGRAMS +=		            \
+	hal-system-sonypic
+endif
+
 if HAVE_ACLMGMT
 libexec_PROGRAMS += hal-acl-tool
 
@@ -94,6 +99,11 @@ hal_system_power_pmu_SOURCES = hal-system-power-pmu.c
 hal_system_power_pmu_LDADD = @DBUS_LIBS@ $(top_builddir)/libhal/libhal.la
 endif
 
+if HAVE_SONYPIC
+hal_system_sonypic_SOURCES = hal-system-sonypic.c
+hal_system_sonypic_LDADD = @GLIB_LIBS@ @DBUS_LIBS@ $(top_builddir)/libhal/libhal.la
+endif
+
 scriptdir = $(libdir)/hal/scripts
 
 script_SCRIPTS =				\
@@ -106,7 +116,9 @@ script_SCRIPTS =				\
 	hal-system-power-reboot			\
 	hal-system-lcd-get-brightness		\
 	hal-system-lcd-set-brightness		\
-	hal-system-power-set-power-save
+	hal-system-power-set-power-save		\
+	hal-system-bluetooth-get-power		\
+	hal-system-bluetooth-set-power
 
 EXTRA_DIST=$(man_MANS) $(MAN_IN_FILES) gen-libgphoto-hal-fdi $(script_SCRIPTS)
 
diff --git a/tools/hal-system-bluetooth-get-power b/tools/hal-system-bluetooth-get-power
new file mode 100644
index 0000000..4de48bd
--- /dev/null
+++ b/tools/hal-system-bluetooth-get-power
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# Copyright (C) 2007 Bastien Nocera <bnocera@redhat.com>
+#
+# 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.
+
+# Check for environment variables
+if [ -z "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" ]; then
+        echo "org.freedesktop.Hal.Device.UnknownError" >&2
+	echo "Missing or empty environment variable(s)." >&2
+	echo "This script should be started by hald." >&2
+	exit 1
+fi
+
+# TODO: check privilege
+
+if [ -n "$HALD_UNAME_S" -a -x ./$HALD_UNAME_S/hal-system-bluetooth-get-power-$HALD_UNAME_S ]; then
+    exec ./$HALD_UNAME_S/hal-system-bluetooth-get-power-$HALD_UNAME_S $@
+else
+    echo "org.freedesktop.Hal.Device.UnknownError" >&2
+    echo "No back-end for your operating system" >&2
+    exit 1
+fi
diff --git a/tools/hal-system-bluetooth-set-power b/tools/hal-system-bluetooth-set-power
new file mode 100644
index 0000000..7c80a26
--- /dev/null
+++ b/tools/hal-system-bluetooth-set-power
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (C) 2007 Bastien Nocera <bnocera@redhat.com>
+#
+# 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.
+
+# Check for environment variables
+if [ -z "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" ] ; then
+        echo "org.freedesktop.Hal.Device.UnknownError" >&2
+        echo "Missing or empty environment variable(s)." >&2
+        echo "This script should be started by hald." >&2
+        exit 1
+fi
+
+# TODO: check privilege
+
+# read value for set bluetooth power
+read value
+export value
+
+if [ -n "$HALD_UNAME_S" -a -x ./$HALD_UNAME_S/hal-system-bluetooth-set-power-$HALD_UNAME_S ]; then
+    exec ./$HALD_UNAME_S/hal-system-bluetooth-set-power-$HALD_UNAME_S $@
+else
+    echo "org.freedesktop.Hal.Device.UnknownError" >&2
+    echo "No back-end for your operating system" >&2
+    exit 1
+fi
diff --git a/tools/hal-system-sonypic.c b/tools/hal-system-sonypic.c
new file mode 100644
index 0000000..e6f4b4f
--- /dev/null
+++ b/tools/hal-system-sonypic.c
@@ -0,0 +1,308 @@
+/*! @file	hal-system-sonypic.c
+ *  @brief	Issue ioctl's from methods invoked by HAL.
+ *  @author	Bastien Nocera <bnocera@redhat.com>
+ *  @author	Richard Hughes <richard@hughsie.com>
+ *  @date	Thursday 08 February 2007
+ */
+/*
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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 Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <glib.h>
+
+#include <sys/ioctl.h>
+
+#ifdef __linux__
+#include <linux/sonypi.h>
+#define SONYPI_DEV	"/dev/sonypi"
+#define __u8		u_int8_t
+#endif /* __linux__ */
+
+#include <libhal/libhal.h>
+
+/**
+ * @defgroup HalSystemSonypi  Use sonypi specific ioctls
+ * @ingroup HalMisc
+ *
+ * @brief A commandline tool for running sonypi specific ioctl's. Uses libhal
+ *
+ * @{
+ */
+
+/** Gets the LCD brightness
+ *
+ *  @param	val		The returned brightness value, 0..255
+ *  @return			Success, TRUE or FALSE
+ */
+static int
+sonypi_get_lcd_brightness (__u8 *val)
+{
+#ifdef __FreeBSD__
+	return FALSE;			/* FIXME implement */
+#elif sun
+	return FALSE;			/* FIXME implement */
+#else
+	int fd;
+	int ret;
+
+	fd = open (SONYPI_DEV, O_RDONLY);
+	if (fd < 0) {
+		fprintf (stderr, "sonyi : Failed to open " SONYPI_DEV "\n");
+		return FALSE;
+	}
+	ret = ioctl (fd, SONYPI_IOCGBRT, val);
+	close (fd);
+
+	if (ret < 0) {
+		fprintf (stderr, "sonypi : SONYPI_IOCGBRT failed\n");
+		return FALSE;
+	}
+	return TRUE;
+#endif /* ! __FreeBSD__ */
+}
+
+/** Gets whether the builtin Bluetooth adapter is turned on
+ *
+ * @param      val              The returned power status
+ * @return			Success, TRUE or FALSE
+ */
+static int
+sonypi_get_bluetooth_power (int *found, int usb_vendor_id, int usb_product_id)
+{
+	LibHalContext *ctx;
+	DBusError err;
+	char **devices;
+	int num_devices, i;
+
+	*found = FALSE;
+
+	dbus_error_init (&err);
+	ctx = libhal_ctx_init_direct (&err);
+	if (ctx == NULL) {
+		fprintf (stderr, "Cannot contact HAL: %s\n", dbus_error_is_set (&err) ?
+				err.message : "No reason");
+		if (dbus_error_is_set (&err))
+			LIBHAL_FREE_DBUS_ERROR (&err);
+		return FALSE;
+	}
+	devices = libhal_get_all_devices (ctx, &num_devices, &err);
+	if (dbus_error_is_set (&err))
+		goto error_set;
+
+	for(i = 0; i < num_devices; i++) {
+		int device_vid, device_pid;
+		if (libhal_device_property_exists (ctx, devices[i], "usb.vendor_id", &err) == FALSE) {
+			if (dbus_error_is_set (&err))
+				goto error_set;
+			continue;
+		}
+		device_vid = libhal_device_get_property_int (ctx, devices[i], "usb.vendor_id", &err);
+		if (dbus_error_is_set (&err))
+			goto error_set;
+		if (device_vid != usb_vendor_id)
+			continue;
+
+		if (libhal_device_property_exists (ctx, devices[i], "usb.product_id", &err) == FALSE) {
+			if (dbus_error_is_set (&err))
+				goto error_set;
+			continue;
+		}
+		device_pid = libhal_device_get_property_int (ctx, devices[i], "usb.product_id", &err);
+		if (dbus_error_is_set (&err))
+			goto error_set;
+		if (device_pid != usb_product_id)
+			continue;
+
+		/* Yay! Found the device */
+		*found = TRUE;
+		break;
+	}
+
+	libhal_ctx_shutdown (ctx, NULL);
+	return TRUE;
+
+error_set:
+	fprintf (stderr, "Error looking for the Bluetooth device: %s\n", err.message);
+	LIBHAL_FREE_DBUS_ERROR (&err);
+	libhal_ctx_shutdown (ctx, &err);
+
+	return FALSE;
+}
+
+/** Sets the LCD brightness
+ *
+ *  @param	val		The brightness value we want to set, 0..255
+ *  @return			Success, TRUE or FALSE
+ */
+static int
+sonypi_set_lcd_brightness (__u8 val)
+{
+#ifdef __FreeBSD__
+	return FALSE;			/* FIXME implement */
+#elif sun
+	return FALSE;			/* FIXME implement */
+#else
+	int ret;
+	int fd;
+
+	fd = open (SONYPI_DEV, O_RDWR);
+	if (fd < 0) {
+		fprintf (stderr, "sonypi : Failed to open " SONYPI_DEV "\n");
+		return FALSE;
+	}
+	ret = ioctl (fd, SONYPI_IOCSBRT, &val);
+	close (fd);
+
+	if (ret < 0) {
+		fprintf (stderr, "sonypi : SONYPI_IOCSBRT failed\n");
+		return FALSE;
+	}
+	return TRUE;
+#endif /* ! __FreeBSD__ */
+}
+
+/** Sets the builtin Bluetooth adapter's power
+ *
+ * @param	val		The power value we want to set
+ * @return			Success, TRUE or FALSE
+ */
+static int
+sonypi_set_bluetooth_power (int val)
+{
+#ifdef __FreeBSD__
+	return FALSE;			/* FIXME implement */
+#elif sun
+	return FALSE;			/* FIXME implement */
+#else
+	int ret;
+	int fd;
+
+	fd = open (SONYPI_DEV, O_RDWR);
+	if (fd < 0) {
+		fprintf (stderr, "sonypi : Failed to open " SONYPI_DEV "\n");
+		return FALSE;
+	}
+	ret = ioctl (fd, SONYPI_IOCSBLUE, &val);
+	close (fd);
+
+	if (ret < 0) {
+		fprintf (stderr, "sonypi : SONYPI_IOCSBLUE failed\n");
+		return FALSE;
+	}
+	return TRUE;
+#endif /* ! __FreeBSD__ */
+}
+
+/** Print out program usage.
+ *
+ *  @param  argc                Number of arguments given to program
+ *  @param  argv                Arguments given to program
+ */
+static void
+usage (int argc, char *argv[])
+{
+	fprintf (stderr, "\nusage : hal-system-sonypi "
+			 "[setlcd x] [getlcd] [setbluetooth x] [getbluetooth]\n");
+	fprintf (stderr,
+ "\n"
+ "        setlcd x       Sets the LCD to a range 0..14 (0 is off)\n"
+ "        getlcd         Gets the current LCD brightness value\n"
+ "        setbluetooth x Sets the Bluetooth power\n"
+ "        getbluetooth   Gets the Bluetooth power\n"
+ "        help           Show this information and exit\n"
+ "\n"
+ "This program calls sonypi specific ioctls from within scripts run by HAL.\n");
+}
+
+/** Entry point
+ *
+ *  @param  argc                Number of arguments given to program
+ *  @param  argv                Arguments given to program
+ *  @return                     Return code
+ */
+int
+main (int argc, char *argv[])
+{
+	__u8 brightness;
+	int power;
+	int ret;
+
+	if (argc == 2) {
+		if (strcmp (argv[1], "getlcd") == 0) {
+			ret = sonypi_get_lcd_brightness (&brightness);
+			if (ret == FALSE)
+				return EXIT_FAILURE;
+			printf ("%i", brightness);
+			return EXIT_SUCCESS;
+		}
+		if (strcmp (argv[1], "getbluetooth") == 0) {
+			const char *usb_vendor_id, *usb_product_id;
+			int vid, pid;
+
+			power = 0;
+			if ((usb_vendor_id = g_getenv ("HAL_PROP_KILLSWITCH_EXPECTED_USB_VENDOR_ID")) == NULL
+			    || (usb_product_id = g_getenv ("HAL_PROP_KILLSWITCH_EXPECTED_USB_PRODUCT_ID")) == NULL) {
+				fprintf (stderr, "sonypi : no expected USB IDs supplied\n");
+				return EXIT_FAILURE;
+			}
+
+			vid = (int) g_ascii_strtoll (usb_vendor_id, NULL, 0);
+			pid = (int) g_ascii_strtoll (usb_product_id, NULL, 0);
+			ret = sonypi_get_bluetooth_power (&power, vid, pid);
+
+			if (ret == FALSE)
+				return EXIT_FAILURE;
+			printf ("%i", power);
+			return EXIT_SUCCESS;
+		}
+	} else if (argc == 3) {
+		if (strcmp (argv[1], "setlcd") == 0) {
+			/* This will clip the brightness to a number
+			 * between 0 and 255 */
+			brightness = atoi (argv[2]);
+			ret = sonypi_set_lcd_brightness (brightness);
+			if (ret == FALSE)
+				return EXIT_FAILURE;
+			return EXIT_SUCCESS;
+		}
+		if (strcmp (argv[1], "setbluetooth") == 0) {
+			power = atoi (argv[2]);
+			ret = sonypi_set_bluetooth_power (power);
+			if (ret == FALSE)
+				return EXIT_FAILURE;
+			return EXIT_SUCCESS;
+		}
+	}
+	usage (argc, argv);
+	return EXIT_SUCCESS;
+}
+
+/**
+ * @}
+ */
diff --git a/tools/linux/Makefile.am b/tools/linux/Makefile.am
index 2e8b4cb..d3bd975 100644
--- a/tools/linux/Makefile.am
+++ b/tools/linux/Makefile.am
@@ -15,7 +15,9 @@ script_SCRIPTS =					\
 	hal-system-power-reboot-linux			\
 	hal-system-lcd-get-brightness-linux		\
 	hal-system-lcd-set-brightness-linux		\
-	hal-system-power-set-power-save-linux
+	hal-system-power-set-power-save-linux		\
+	hal-system-bluetooth-get-power-linux		\
+	hal-system-bluetooth-set-power-linux
 
 EXTRA_DIST = 90-hal.rules $(script_SCRIPTS)
 
diff --git a/tools/linux/hal-system-bluetooth-get-power-linux b/tools/linux/hal-system-bluetooth-get-power-linux
new file mode 100644
index 0000000..6dd8c77
--- /dev/null
+++ b/tools/linux/hal-system-bluetooth-get-power-linux
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (C) 2007 Bastien Nocera <bnocera@redhat.com>
+#
+# 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.
+
+if [ "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" = "sonypic" ]; then
+	value="`hal-system-sonypic getbluetooth`"
+	if [ $? -ne 0 ]; then
+		echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2
+		exit 1
+	fi
+	exit ${value}
+else
+	echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2
+	echo "Access type not supported" >&2
+	exit 1
+fi
+
diff --git a/tools/linux/hal-system-bluetooth-set-power-linux b/tools/linux/hal-system-bluetooth-set-power-linux
new file mode 100644
index 0000000..f3c80ad
--- /dev/null
+++ b/tools/linux/hal-system-bluetooth-set-power-linux
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (C) 2007 Bastien Nocera <bnocera@redhat.com>
+#
+# 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.
+
+if [ "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" = "sonypic" ]; then
+	hal-system-sonypic setbluetooth $value
+	if [ $? -ne 0 ]; then
+		echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2
+		exit 1
+	fi
+	exit 0
+else
+	echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2
+	echo "Access type not supported" >&2
+	exit 1
+fi
+
diff --git a/tools/linux/hal-system-lcd-get-brightness-linux b/tools/linux/hal-system-lcd-get-brightness-linux
index c5d5615..5128c4b 100755
--- a/tools/linux/hal-system-lcd-get-brightness-linux
+++ b/tools/linux/hal-system-lcd-get-brightness-linux
@@ -20,6 +20,13 @@ if [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "pmu" ]; then
 		exit 1
 	fi
 	exit ${value}
+elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then
+	value="`hal-system-sonypic getlcd`"
+	if [ $? -ne 0 ]; then
+		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
+		exit 1
+	fi
+	exit ${value}
 fi
 
 # Check for file existance and that it's readable
@@ -57,27 +64,6 @@ elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "omnibook" ]; then
 	# cat /proc/omnibook/lcd
 	#  LCD brightness:  7
 	value="`cat $HAL_PROP_LINUX_ACPI_PATH | awk '{print $3;}'`"
-elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then
-	# spicctrl -B
-	# 70
-	# 0..255
-	if [ -x /usr/sbin/spicctrl ]; then
-		SPICCRTL="/usr/sbin/spicctrl"
-        elif [ -x /usr/bin/spicctrl ]; then
-		SPICCRTL="/usr/bin/spicctrl"
-	else
-                echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
-                echo "spicctrl not found or not executable" >&2
-                exit 1;
-        fi
-
-	value="`$SPICCRTL -B`"
-	RETVAL=$?
-	if [ $RETVAL != 0 ]; then
-		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
-		exit 1;
-	fi
-	exit ${value}
 else
 	echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
 	echo "No ACPI method found" >&2
diff --git a/tools/linux/hal-system-lcd-set-brightness-linux b/tools/linux/hal-system-lcd-set-brightness-linux
index 2eadcc5..a456744 100755
--- a/tools/linux/hal-system-lcd-set-brightness-linux
+++ b/tools/linux/hal-system-lcd-set-brightness-linux
@@ -20,6 +20,13 @@ if [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "pmu" ]; then
 		exit 1
 	fi
 	exit 0
+elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then
+	hal-system-sonypic setlcd $value
+	if [ $? -ne 0 ]; then
+		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
+		exit 1
+	fi
+	exit 0
 fi
 
 # Check for file existance and that it's writable
@@ -52,26 +59,6 @@ elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "omnibook" ]; then
 	# echo "{0..7} || {0...11}" > /proc/omnibook/lcd
 	# http://bugzilla.gnome.org/show_bug.cgi?id=331458
 	echo "$value" > $HAL_PROP_LINUX_ACPI_PATH
-elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then
-	# spicctrl -B
-	# 70
-	# 0..255
-        if [ -x /usr/sbin/spicctrl ]; then
-                SPICCRTL="/usr/sbin/spicctrl"
-        elif [ -x /usr/bin/spicctrl ]; then
-                SPICCRTL="/usr/bin/spicctrl"
-	else 
-		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
-		echo "spicctrl not found or not executable" >&2
-		exit 1;
-	fi
-
-	$SPICCRTL -b "$value"
-	RETVAL=$?
-	if [ $RETVAL != 0 ]; then
-		echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
-		exit 1;
-	fi
 else
 	echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2
 	echo "No ACPI method found" >&2
