diff -ur pbbuttons-0.4/pbbserver/backlight.c pbbuttons-0.4-colin/pbbserver/backlight.c
--- pbbuttons-0.4/pbbserver/backlight.c	Thu Feb 21 22:57:27 2002
+++ pbbuttons-0.4-colin/pbbserver/backlight.c	Wed Jul 10 17:34:40 2002
@@ -27,18 +27,18 @@
 	ioctl(fd, PMU_IOC_GRAB_BACKLIGHT, 0);
 }
 
-int set_backlight_level(int fd, int op)
+int set_backlight_level(int fd_pmu, int fd_fb, int op)
 {
 	int level = 0;
-
-	if (ioctl(fd, PMU_IOC_GET_BACKLIGHT, &level) >= 0) {
+	
+	if (ioctl(fd_pmu, PMU_IOC_GET_BACKLIGHT, &level) >= 0) {
 		switch (op) {
 		case OP_BRIGHTNESS_UP:
 			if (level < BACKLIGHT_MAX)
 				level++;
 			break;
 		case OP_BRIGHTNESS_DOWN:
-			if (level > BACKLIGHT_OFF)
+			if (level >= BACKLIGHT_OFF)
 				level--;
 			break;
 		case OP_BRIGHTNESS_MIN:
@@ -47,8 +47,14 @@
 		case OP_BRIGHTNESS_MAX:
 			level = BACKLIGHT_MAX;
 		}
-		if (ioctl(fd, PMU_IOC_SET_BACKLIGHT, &level) >= 0)
-			return level;
+		if(level == -1) {
+			ioctl(fd_fb, FBIOBLANK, 1);
+		}
+		else {
+			ioctl(fd_fb, FBIOBLANK, 0);
+			if (ioctl(fd_pmu, PMU_IOC_SET_BACKLIGHT, &level) >= 0)
+				return level;
+		}
 	}
 	return -1;
 }
diff -ur pbbuttons-0.4/pbbserver/backlight.h pbbuttons-0.4-colin/pbbserver/backlight.h
--- pbbuttons-0.4/pbbserver/backlight.h	Thu Feb 21 22:53:47 2002
+++ pbbuttons-0.4-colin/pbbserver/backlight.h	Wed Jul 10 17:27:13 2002
@@ -27,8 +27,13 @@
 #define PMU_IOC_GRAB_BACKLIGHT	_IOR('B', 6, 0)
 #endif
 
+#ifndef FBIOBLANK
+#define FBIOBLANK      0x4611          /* 0 or vesa-level+1 */
+#endif
+
 /* prototypes */
 void init_backlight(int fd);                    /* switch backlight control to user space */
-int set_backlight_level(int fd, int op);   /* set backlight level according OP */
+int set_backlight_level(int fd_pmu, int fd_fb, int op);   /* set backlight level according OP */
+
 
 #endif    /* INCLUDE_BACKLIGHT_H */
diff -ur pbbuttons-0.4/pbbserver/errorcodes.h pbbuttons-0.4-colin/pbbserver/errorcodes.h
--- pbbuttons-0.4/pbbserver/errorcodes.h	Mon Feb 25 16:26:02 2002
+++ pbbuttons-0.4-colin/pbbserver/errorcodes.h	Wed Jul 10 17:18:22 2002
@@ -15,6 +15,7 @@
 /* errorcodes */
 #define ERR_OK				0
 #define ERR_NOPMU			-1
+#define ERR_NOFB			-18
 #define ERR_NOMIXER			-2
 #define ERR_NOKEYBEVENT		-3
 #define ERR_NOBUTTONEVENT	-4
diff -ur pbbuttons-0.4/pbbserver/event.c pbbuttons-0.4-colin/pbbserver/event.c
--- pbbuttons-0.4/pbbserver/event.c	Mon Feb 25 21:08:18 2002
+++ pbbuttons-0.4-colin/pbbserver/event.c	Wed Jul 10 17:28:48 2002
@@ -90,15 +90,15 @@
 	if (value) {
 		if (code == md->keybrightup) {
 			if (mod)
-				level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_MAX);
+				level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_MAX);
 			else
-				level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_UP);
+				level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_UP);
 			distribute_to_clients(&md->mp_data, DISPLAYBRIGHTNESS, level);
 		} else if (code == md->keybrightdn) {
 			if (mod)
-				level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_MIN);
+				level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_MIN);
 			else
-				level = set_backlight_level(md->fd_pmu, OP_BRIGHTNESS_DOWN);
+				level = set_backlight_level(md->fd_pmu, md->fd_fb, OP_BRIGHTNESS_DOWN);
 			distribute_to_clients(&md->mp_data, DISPLAYBRIGHTNESS, level);
 		} else if (code == md->keyvolup) {
 			volume = increment_master_volume(&md->sd_data, mod ? +10 : +1);
diff -ur pbbuttons-0.4/pbbserver/init.c pbbuttons-0.4-colin/pbbserver/init.c
--- pbbuttons-0.4/pbbserver/init.c	Tue Feb 26 09:36:46 2002
+++ pbbuttons-0.4-colin/pbbserver/init.c	Wed Jul 10 17:23:16 2002
@@ -59,6 +59,12 @@
 	} else
 		init_backlight(md->fd_pmu);
 
+	if ((md->fd_fb = open(md->fbdev, O_RDWR)) <= 0) {     /* open FB device */
+		md->lasterrno = errno;
+		return ERR_NOFB;
+	} else
+		init_backlight(md->fd_pmu);
+
 	if ((md->fd_keybev = open_eventdev(0x0200, 0x0f00)) == -1)
 		return ERR_NOKEYBEVENT;
 
@@ -108,6 +114,9 @@
 		case ERR_NOPMU:
 			fprintf(stderr, _("ERROR: Can't open pmu [%s]: %s\n"), md->pmudev, strerror(md->lasterrno));
 			break;
+		case ERR_NOFB:
+			fprintf(stderr, _("ERROR: Can't open fb [%s]: %s\n"), md->fbdev, strerror(md->lasterrno));
+			break;
 		case ERR_NOMIXER:
 			fprintf(stderr, _("ERROR: Can't open mixer [%s]: %s\n"), md->mixerdev, strerror(md->lasterrno));
 			break;
@@ -137,6 +146,7 @@
 				"   -%c, --version       display version information and exit\n"
 				"   -%c, --detach        start %s as background process\n"
 				"   -%c, --pmu=PMU       use alternative pmu device   [%s]\n"
+				"   -%c, --fb=FB         use alternative fb  device   [%s]\n"
 				"   -%c, --mixer=MIXER   use alternative mixer device [%s]\n"
 				"   -%c, --cdrom=CDROM   use alternative cdrom device [%s]\n"
 				"   -%c, --keybup=KEY    use alternative keycode to increase brightness [%i]\n"
@@ -145,8 +155,8 @@
 				"   -%c, --keyvdn=KEY    use alternative keycode to decrease volume     [%i]\n"
 				"   -%c, --keymute=KEY   use alternative keycode to mute/unmute         [%i]\n"
 				"   -%c, --keyeject=KEY  use alternative keycode to eject a CDROM       [%i]\n"),
-				ARG_HELP, ARG_VERSION, ARG_DETACH, md->prgname, ARG_PMU,
-				DEFAULT_PMU, ARG_MIXER, DEFAULT_MIXER, ARG_CDROM, DEFAULT_CDROM,
+				ARG_HELP, ARG_VERSION, ARG_DETACH, md->prgname, ARG_PMU, 
+				DEFAULT_PMU, ARG_FB, DEFAULT_FB, ARG_MIXER, DEFAULT_MIXER, ARG_CDROM, DEFAULT_CDROM,
 				ARG_KEYBUP, KEY_BRIGHTNESSUP, ARG_KEYBDN, KEY_BRIGHTNESSDOWN,
 				ARG_KEYVUP, KEY_VOLUMEUP, ARG_KEYVDN, KEY_VOLUMEDOWN,
 				ARG_KEYMUTE, KEY_MUTE, ARG_KEYEJECT, KEY_EJECTCD);
@@ -161,6 +171,8 @@
 		case ERR_NOTACHARDEVICE:
 			if (md->errsource == md->pmudev)
 				src = _("PMU");
+			else if (md->errsource == md->fbdev)
+				src = _("FB");
 			else
 				src = _("Mixer");
 			fprintf(stderr, _("ERROR: The given %s [%s] is not a character device.\n"), src, md->errsource);
@@ -171,6 +183,7 @@
 		case ERR_PRINTSTATUS:
 			printf(_("Status: %s\n"
 				"   PMU device:                  %s\n"
+				"   FB device:                   %s\n"
 				"   Mixer device:                %s\n"
 				"   CDROM device:                %s\n"
 				"   Keycode for brightness up:   %i\n"
@@ -179,7 +192,7 @@
 				"   Keycode for volume down:     %i\n"
 				"   Keycode for mute:            %i\n"
 				"   Keycode for eject CD:        %i\n"),
-				md->prgname, md->pmudev, md->mixerdev, md->cdromdev, md->keybrightup,
+				md->prgname, md->pmudev, md->fbdev, md->mixerdev, md->cdromdev, md->keybrightup,
 				md->keybrightdn, md->keyvolup, md->keyvoldn, md->keymute, md->keyejectcd);
 			break;
 		case ERR_FORKED:
@@ -201,6 +214,7 @@
 		  {"detach", no_argument, 0, ARG_DETACH},
 		  {"status", no_argument, 0, ARG_STATUS},		/* only for debug purposes */
 		  {"pmu", required_argument, 0, ARG_PMU},
+		  {"fb", required_argument, 0, ARG_FB},
 		  {"mixer", required_argument, 0, ARG_MIXER},
 		  {"cdrom", required_argument, 0, ARG_CDROM},
 		  {"keybup", required_argument, 0, ARG_KEYBUP},
@@ -220,6 +234,7 @@
 
 	md->child			= 0;
 	md->pmudev		= DEFAULT_PMU;
+	md->fbdev		= DEFAULT_FB;
 	md->mixerdev		= DEFAULT_MIXER;
 	md->cdromdev		= DEFAULT_CDROM;
 	md->keybrightup	= KEY_BRIGHTNESSUP;
@@ -240,6 +255,13 @@
 			case ARG_PMU:
 				if((err = check_devorfile(md->pmudev = optarg, TYPE_CHARDEV))) {
 					md->errsource = md->pmudev;
+					md->lasterrno = errno;
+					return err;
+				}
+				break;
+			case ARG_FB:
+				if((err = check_devorfile(md->fbdev = optarg, TYPE_CHARDEV))) {
+					md->errsource = md->fbdev;
 					md->lasterrno = errno;
 					return err;
 				}
diff -ur pbbuttons-0.4/pbbserver/init.h pbbuttons-0.4-colin/pbbserver/init.h
--- pbbuttons-0.4/pbbserver/init.h	Mon Feb 25 21:07:58 2002
+++ pbbuttons-0.4-colin/pbbserver/init.h	Wed Jul 10 17:26:17 2002
@@ -39,6 +39,7 @@
 #endif
 
 #define DEFAULT_PMU		"/dev/pmu"
+#define DEFAULT_FB		"/dev/fb"
 #define DEFAULT_MIXER	"/dev/mixer"
 #define DEFAULT_CDROM	"/dev/cdrom"
 
@@ -49,11 +50,12 @@
 
 /* short options for optarg */
 
-#define ARG_ALL			"hvsp:m:c:dB:C:V:W:M:E:"
+#define ARG_ALL			"hvspf:m:c:dB:C:V:W:M:E:"
 #define ARG_HELP			'h'
 #define ARG_VERSION		'v'
 #define ARG_STATUS		's'
 #define ARG_PMU			'p'
+#define ARG_FB			'f'
 #define ARG_MIXER		'm'
 #define ARG_CDROM		'c'
 #define ARG_DETACH		'd'
@@ -67,11 +69,13 @@
 struct init {
 	char *prgname;		/* programname without any leading path */
 	char *pmudev;			/* pathname of the PMU device */
+	char *fbdev;			/* pathname of the FB device */
 	char *mixerdev;		/* pathname of the mixer device */
 	char *cdromdev;		/* pathname of the cdrom device */
 	int fd_keybev;				/* filehandle of the keyboard event device */
 	int fd_buttonev;			/* filehandle of the button event device */
 	int fd_pmu;				/* filehandle of the PMU device */
+	int fd_fb;				/* filehandle of the FB device */
 	struct msgport_data mp_data;	/* definitions for IPC message handling */
 	struct sound_data sd_data;		/* definitions for sound management */
 	unsigned short modifier;			/* currently pressed modifier keys */
