diff -Naur kbdd.orig/kbd.c kbdd/kbd.c
--- kbdd.orig/kbd.c	2005-12-06 08:07:57.000000000 +0000
+++ kbdd/kbd.c	2005-12-18 08:21:52.000000000 +0000
@@ -924,6 +924,53 @@
 return 0;
 }
 
+int hp_bt_foldable(void){
+int fd;
+unsigned char buf[1];
+unsigned char cnew;
+char symb=0;
+
+	fd = open_serial(TTY_PORT, B9600);
+	if (fd < 0)
+		return -1;
+
+	for (;;) {
+		if (read (fd, buf, 1) < 0) {
+			perror(TTY_PORT);
+			return -1;
+		}
+		if (debug) fprintf(stderr, "got %d (0x%x)\n", buf[0], buf[0]);
+		if (buf[0] & 0x80) { /* release */
+			buf[0] &= 0x7f;
+			if (buf[0] == 2) {
+				symb = 0;
+				continue;
+			}
+			if (symb)
+				cnew = btfoldable_function[buf[0]];
+			else
+				cnew = btfoldable_normal[buf[0]];
+		
+			if (debug) fprintf(stderr, " release cnew=%d (0x%x)\n", cnew, cnew);
+			if (cnew != 0)
+				dev_uinput_key(uindev, (unsigned short)cnew, KEY_RELEASED);
+		} else { /* press */
+			if (buf[0] == 2) {
+				symb = 1;
+				continue;
+			}
+			if (symb)
+				cnew = btfoldable_function[buf[0]];
+			else
+				cnew = btfoldable_normal[buf[0]];
+			if (debug) fprintf(stderr, " press cnew=%d (0x%x)\n", cnew, cnew);
+			if (cnew != 0)
+				dev_uinput_key(uindev, (unsigned short)cnew, KEY_PRESSED);
+		}
+	}
+return 0;
+};
+
 int compaq_microkbd(void)
 {
 int fd;
@@ -1033,7 +1080,8 @@
 	fprintf (stderr, "\tmicrofold - Micro Innovations Foldaway keyboard\n");
 	fprintf (stderr, "\tmicropad  - Micro Innovations Datapad\n");
 	fprintf (stderr, "\tmicrokbd  - Compaq MicroKeyboard\n");
-	fprintf (stderr, "\ttargusir  - Targus Universal Wireless keyboard\n\n");
+	fprintf (stderr, "\ttargusir  - Targus Universal Wireless keyboard\n");
+	fprintf (stderr, "\tbtfoldable - HP iPAQ Bluetooth Foldable Keyboard\n\n");
 	fprintf (stderr, "Example:\n\t%s -t foldable\n", arg0);
 }
 
@@ -1054,6 +1102,8 @@
 #define KBD_TYPE_MICRO_DATAPAD	13
 #define KBD_TYPE_COMPAQ_MICROKBD	14
 #define KBD_TYPE_TARGUSIR		15
+#define KBD_TYPE_BTFOLDABLE		16
+
 
 
 int find_kbd_type(const char *ktype)
@@ -1088,6 +1138,8 @@
 		return KBD_TYPE_COMPAQ_MICROKBD;
 	else if (strncmp("targusir", ktype, 8) == 0)
 		return KBD_TYPE_TARGUSIR;
+	if (strncmp("btfoldable", ktype, 10) == 0)
+		return KBD_TYPE_BTFOLDABLE;
 
 	fprintf(stderr, "unrecognised keyboard type %s\n", ktype);
 
@@ -1184,6 +1236,8 @@
 
 	if (kbdtype == KBD_TYPE_FOLDABLE)
 		compaq_foldable();
+	else if (kbdtype == KBD_TYPE_BTFOLDABLE)
+		hp_bt_foldable();
 	else if (kbdtype == KBD_TYPE_SNAPNTYPE)
 		snapntype();
 	else if (kbdtype == KBD_TYPE_STOWAWAY)
diff -Naur kbdd.orig/keyboards.h kbdd/keyboards.h
--- kbdd.orig/keyboards.h	2005-12-06 08:07:57.000000000 +0000
+++ kbdd/keyboards.h	2005-12-03 16:01:41.000000000 +0000
@@ -156,6 +156,48 @@
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  };
 
 /***********************************************************************************
+ *   HP iPAQ  Bluetooth Foldable
+ *
+ * Key down sends one byte:  (KEY)
+ * Key up sends  one byte:    (KEY | 0x80)
+ ***********************************************************************************/
+
+ /* normal keys */
+
+ unsigned char btfoldable_normal[128] = { 
+ /*0x00*/ 0, 0, 0, 0, 0, 0, 0, KEY_LEFTMETA, KEY_ESC, 0, 0, 0, 0, KEY_TAB, KEY_GRAVE, 0, 
+ /*0x10*/ KEY_LEFTALT, 0, KEY_LEFTSHIFT,KEY_RIGHTALT, KEY_LEFTCTRL, KEY_Q, KEY_1, 0, 0, 0, KEY_Z, KEY_S, KEY_A, KEY_W, KEY_2, 0, 
+ /*0x20*/ 0, KEY_C, KEY_X, KEY_D, KEY_E, KEY_4, KEY_3, 0, KEY_UP, 0, KEY_V, KEY_F, KEY_T, KEY_R, KEY_5, KEY_RIGHT, 
+ /*0x30*/ 0, KEY_N, KEY_B, KEY_H, KEY_G, KEY_Y, KEY_6, 0, 0, 0, KEY_M, KEY_J, KEY_U, KEY_7, KEY_8, 0, 
+ /*0x40*/ 0, KEY_COMMA, KEY_K, KEY_I, KEY_O, KEY_0, KEY_9, 0, 0, KEY_DOT, KEY_SLASH, KEY_L, KEY_SEMICOLON, KEY_P, KEY_MINUS, 0, 
+ /*0x50*/ 0, 0, KEY_APOSTROPHE, 0, KEY_LEFTBRACE, KEY_EQUAL, 0, 0, KEY_CAPSLOCK, KEY_RIGHTSHIFT, KEY_ENTER, KEY_RIGHTBRACE, KEY_SPACE, KEY_BACKSLASH, KEY_LEFT, 0, 
+ /*0x60*/ KEY_DOWN, 0, 0, 0, 0, 0, KEY_DELETE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+ /*0x70*/ 0, KEY_BACKSPACE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  };
+
+/*
+ keys with blue Fn key, contains also modifiers (shift,alt,ctrl,..) to let them work also with Fn pressed 
+ some blue symbols are also mapped to its equivalent but some are not
+
+ Fn keyboard labels:
+ q=mail,r=calendar,t=todo,y=document viewer?,backspace=off,baskslash=OK,a=file manager?,s=today?,d=web browser,f=itask,
+ ;=pgup, '=pgdown, /=battery symbol, left=home,right=end
+
+ real Fn mappings:
+ q=mail, d=www, f=menu, ;=pageup, '=pagedown,left=home,right=end,backspace=sleep
+ 1-0,-,= =F1-F12
+ up=pageup,down=pagedown
+*/
+
+unsigned char btfoldable_function[128] = { 
+/*0x00*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+/*0x10*/ KEY_LEFTALT, 0, KEY_LEFTSHIFT, KEY_RIGHTALT, KEY_LEFTCTRL, KEY_MAIL, KEY_F1, 0, 0, 0, 0, 0, 0, 0, KEY_F2, 0, 
+/*0x20*/ 0, 0, 0, KEY_WWW, 0, KEY_F4, KEY_F3, 0, KEY_PAGEUP, 0, 0, KEY_MENU, 0, 0, KEY_F5, KEY_END, 
+/*0x30*/ 0, 0, 0, 0, 0, 0, KEY_F6, 0, 0, 0, 0, 0, 0, KEY_F7, KEY_F8, 0,
+/*0x40*/ 0, 0, 0, 0, 0, KEY_F10, KEY_F9, 0, 0, 0, 0, 0, KEY_PAGEUP, 0, KEY_F11, 0, 
+/*0x50*/ 0, 0, KEY_PAGEDOWN, 0, 0, KEY_F12, 0, 0, 0, 0, 0, 0, 0, 0, KEY_HOME, 0, 
+/*0x60*/ KEY_PAGEDOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+/*0x70*/ KEY_SLEEP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  };
+/***********************************************************************************
  *   Targus Stowaway keyboard                                                     
  *
  * 9600 baud, 8N1
@@ -782,6 +824,8 @@
 	  h3600_hpslim_process_char, 4800, UTCR0_8BitData | UTCR0_1StpBit, &g_uart_3 },
 	{ "Belkin Wireless PDA Keyboard", "belkin-irda",
 	h3600_belkin_irda_process_char, 9600, UTCR0_8BitData | UTCR0_1StpBit, &g_uart_2 },
+	{ "HP iPAQ Bluetooth Foldable Keyboard", "btfoldable",
+	  h3600_btfoldable_process_char,  4800, UTCR0_8BitData | UTCR0_1StpBit, &g_uart_3 },
 };
 
 #define NUM_KEYBOARDS ARRAY_SIZE(keyboards)
