diff --git headers/os/add-ons/input_server/InputServerDevice.h headers/os/add-ons/input_server/InputServerDevice.h
index 3c33588..9add069 100644
--- headers/os/add-ons/input_server/InputServerDevice.h
+++ headers/os/add-ons/input_server/InputServerDevice.h
@@ -23,6 +23,7 @@ enum {
 	// B_KEYBOARD_DEVICE notifications
 	B_KEY_MAP_CHANGED		= 1,
 	B_KEY_LOCKS_CHANGED,
+	B_GET_KEYBOARD_ID,
 	B_KEY_REPEAT_DELAY_CHANGED,
 	B_KEY_REPEAT_RATE_CHANGED,
 
diff --git headers/private/input/kb_mouse_settings.h headers/private/input/kb_mouse_settings.h
index e76db24..bb782c3 100644
--- headers/private/input/kb_mouse_settings.h
+++ headers/private/input/kb_mouse_settings.h
@@ -12,6 +12,7 @@
 typedef struct {
 	bigtime_t	key_repeat_delay;
 	int32		key_repeat_rate;
+	uint16		keyboard_id;
 } kb_settings;
 
 #define kb_default_key_repeat_delay 500000
diff --git src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp
index ef963d2..d8fd6cd 100644
--- src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp
+++ src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp
@@ -512,6 +512,11 @@ KeyboardDevice::_UpdateSettings(uint32 opcode)
 {
 	KD_CALLED();
 
+	if (opcode == 0 || opcode == B_GET_KEYBOARD_ID) {
+		if (ioctl(fFD, KB_GET_KEYBOARD_ID, &fSettings.keyboard_id) != B_OK)
+			LOG_ERR("error when KB_GET_KEYBOARD_ID, fd:%d\n", fFD);
+	}
+
 	if (opcode == 0 || opcode == B_KEY_REPEAT_RATE_CHANGED) {
 		if (get_key_repeat_rate(&fSettings.key_repeat_rate) != B_OK) {
 			LOG_ERR("error when get_key_repeat_rate\n");
diff --git src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.cpp src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.cpp
index bfd492b..953794e 100644
--- src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.cpp
+++ src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.cpp
@@ -61,6 +61,7 @@ static bool sIsExtended = false;
 
 static int32 sKeyboardRepeatRate;
 static bigtime_t sKeyboardRepeatDelay;
+static uint16 sKeyboardId;
 
 
 static status_t
@@ -492,6 +493,17 @@ keyboard_ioctl(void *_cookie, uint32 op, void *buffer, size_t length)
 		}
 
 		case KB_GET_KEYBOARD_ID:
+		{
+			TRACE("ps2: ioctl KB_GET_KEYBOARD_ID\n");
+			uint8 keyboard_id[2];
+			// 0xf2 (Read keyboard ID) - Keyboard responds with "ack" (0xFA).
+			if (ps2_dev_command(&ps2_device[PS2_DEVICE_KEYB],
+					PS2_CMD_GET_DEVICE_ID, NULL, 0, keyboard_id, 2) != B_OK);
+				return B_ERROR;
+			sKeyboardId = (uint16)((keyboard_id[1] << 8) & keyboard_id[0]);
+			return user_memcpy(buffer, &sKeyboardId, sizeof(sKeyboardId));
+		}
+
 		case KB_SET_CONTROL_ALT_DEL_TIMEOUT:
 		case KB_CANCEL_CONTROL_ALT_DEL:
 		case KB_DELAY_CONTROL_ALT_DEL:
diff --git src/kits/interface/InterfaceDefs.cpp src/kits/interface/InterfaceDefs.cpp
index ed61c2f..730ac73 100644
--- src/kits/interface/InterfaceDefs.cpp
+++ src/kits/interface/InterfaceDefs.cpp
@@ -691,7 +691,7 @@ get_keyboard_id(uint16 *id)
 
 	_control_input_server_(&command, &reply);
 
-	status_t err = reply.FindInt16("id", (int16 *)&kid);
+	status_t err = reply.FindUInt16("id", &kid);
 	if (err != B_OK)
 		return err;
 	*id = kid;
diff --git src/servers/input/InputServer.cpp src/servers/input/InputServer.cpp
index 8b44ef8..ec65b64 100644
--- src/servers/input/InputServer.cpp
+++ src/servers/input/InputServer.cpp
@@ -872,7 +872,13 @@ InputServer::HandleGetSetMouseMap(BMessage* message, BMessage* reply)
 status_t
 InputServer::HandleGetKeyboardID(BMessage* message, BMessage* reply)
 {
-	return reply->AddInt16("id", fKeyboardID);
+	BMessage msg(IS_CONTROL_DEVICES);
+	msg.AddInt32("type", B_KEYBOARD_DEVICE);
+	msg.AddInt32("code", B_GET_KEYBOARD_ID);
+	if (fAddOnManager->PostMessage(&msg) == B_OK)
+		return reply->AddUInt16("id", fKeyboardSettings.KeyboardId());
+	else
+		return B_ERROR;
 }
 
 
diff --git src/servers/input/KeyboardSettings.cpp src/servers/input/KeyboardSettings.cpp
index 96aff49..f65216d 100644
--- src/servers/input/KeyboardSettings.cpp
+++ src/servers/input/KeyboardSettings.cpp
@@ -26,7 +26,7 @@ KeyboardSettings::KeyboardSettings()
 		goto err;
 	if (file.Read(&fSettings, sizeof(kb_settings)) != sizeof(kb_settings))
 		goto err;
-		
+	
 	return;
 err:
 	fSettings.key_repeat_delay = kb_default_key_repeat_delay;
@@ -56,6 +56,13 @@ KeyboardSettings::SetKeyboardRepeatDelay(bigtime_t delay)
 
 
 void
+KeyboardSettings::SetKeyboardId(uint16 id)
+{
+	fSettings.keyboard_id = id;
+}
+
+
+void
 KeyboardSettings::Save()
 {
 	BPath path;
diff --git src/servers/input/KeyboardSettings.h src/servers/input/KeyboardSettings.h
index e67548c..84b5d34 100644
--- src/servers/input/KeyboardSettings.h
+++ src/servers/input/KeyboardSettings.h
@@ -22,9 +22,11 @@ public :
 
 	void		SetKeyboardRepeatRate(int32 rate);
 	void		SetKeyboardRepeatDelay(bigtime_t delay);
-	
+	void		SetKeyboardId(uint16 id);
+
 	int32		KeyboardRepeatRate() const		{ return fSettings.key_repeat_rate; }
 	bigtime_t	KeyboardRepeatDelay() const 	{ return fSettings.key_repeat_delay; }
+	uint16		KeyboardId() const 				{ return fSettings.keyboard_id; }
 
 	void 		Save();
 	
