diff --git src/preferences/keymap/KeymapWindow.cpp src/preferences/keymap/KeymapWindow.cpp
index 62924a2..872d9e6 100644
--- src/preferences/keymap/KeymapWindow.cpp
+++ src/preferences/keymap/KeymapWindow.cpp
@@ -28,7 +28,6 @@
 #include <MenuField.h>
 #include <MenuItem.h>
 #include <Path.h>
-#include <PopUpMenu.h>
 #include <Screen.h>
 #include <ScrollView.h>
 #include <StringView.h>
@@ -47,7 +46,9 @@ static const uint32 kMsgMenuFileSaveAs = 'mMFA';
 
 static const uint32 kChangeKeyboardLayout = 'cKyL';
 
-static const uint32 kMsgSwitchShortcuts = 'swSc';
+static const uint32 kMsgModifiersHaiku = 'mHku';
+static const uint32 kMsgModifiersWinLinux = 'mW/L';
+static const uint32 kMsgModifiersMac = 'mMac';
 
 static const uint32 kMsgMenuFontChanged = 'mMFC';
 
@@ -67,6 +68,19 @@ static const char* kDeadKeyTriggerNone = "<none>";
 
 static const char* kCurrentKeymapName = "(Current)";
 
+static const uint32 kLeftControlKey  = 0x5c;
+static const uint32 kLeftOptionKey   = 0x66;
+static const uint32 kLeftCommandKey  = 0x5d;
+static const uint32 kRightControlKey = 0x60;
+static const uint32 kRightOptionKey  = 0x67;
+static const uint32 kRightCommandKey = 0x5f;
+
+enum {
+	MODIFIERS_HAIKU,
+	MODIFIERS_WIN_LINUX,
+	MODIFIERS_MAC,
+	MODIFIERS_CUSTOM
+};
 
 KeymapWindow::KeymapWindow()
 	:
@@ -81,9 +95,6 @@ KeymapWindow::KeymapWindow()
 	fTextControl = new BTextControl(B_TRANSLATE("Sample and clipboard:"),
 		"", NULL);
 
-	fSwitchShortcutsButton = new BButton("switch", "",
-		new BMessage(kMsgSwitchShortcuts));
-
 	fRevertButton = new BButton("revertButton", B_TRANSLATE("Revert"),
 		new BMessage(kMsgRevertKeymap));
 
@@ -98,7 +109,7 @@ KeymapWindow::KeymapWindow()
 				.Add(BGroupLayoutBuilder(B_HORIZONTAL, 10)
 					.Add(_CreateDeadKeyMenuField(), 0.0)
 					.AddGlue()
-					.Add(fSwitchShortcutsButton))
+					.Add(_CreateModifiersMenuField(), 0.0))
 				.Add(fTextControl)
 				.AddGlue(0.0)
 				.Add(BGroupLayoutBuilder(B_HORIZONTAL, 10)
@@ -152,10 +163,7 @@ KeymapWindow::KeymapWindow()
 	fAppliedMap = fCurrentMap;
 	fCurrentMap.SetTarget(this, new BMessage(kMsgKeymapUpdated));
 
-	_UpdateButtons();
-
-	_UpdateDeadKeyMenu();
-	_UpdateSwitchShortcutButton();
+	_UpdateControls();
 
 	Unlock();
 }
@@ -234,8 +242,16 @@ KeymapWindow::MessageReceived(BMessage* message)
 			break;
 		}
 
-		case kMsgSwitchShortcuts:
-			_SwitchShortcutKeys();
+		case kMsgModifiersHaiku:
+			_SetModifiers(MODIFIERS_HAIKU);
+			break;
+
+		case kMsgModifiersWinLinux:
+			_SetModifiers(MODIFIERS_WIN_LINUX);
+			break;
+
+		case kMsgModifiersMac:
+			_SetModifiers(MODIFIERS_MAC);
 			break;
 
 		case kMsgMenuFontChanged:
@@ -283,18 +299,18 @@ KeymapWindow::MessageReceived(BMessage* message)
 				fAppliedMap = fCurrentMap;
 				fKeyboardLayoutView->SetKeymap(&fCurrentMap);
 				_UseKeymap();
-				_UpdateButtons();
+				_UpdateControls();
 			}
 			break;
 		}
 
 		case kMsgRevertKeymap:
 			_RevertKeymap();
-			_UpdateButtons();
+			_UpdateControls();
 			break;
 
 		case kMsgKeymapUpdated:
-			_UpdateButtons();
+			_UpdateControls();
 			fSystemListView->DeselectAll();
 			fUserListView->Select(0L);
 			break;
@@ -429,8 +445,7 @@ KeymapWindow::_CreateMenu()
 BMenuField*
 KeymapWindow::_CreateDeadKeyMenuField()
 {
-	BPopUpMenu* deadKeyMenu = new BPopUpMenu(B_TRANSLATE("Select dead keys"),
-		false, false);
+	BMenu* deadKeyMenu = new BMenu(B_TRANSLATE("Select dead keys"));
 
 	fAcuteMenu = new BMenu(B_TRANSLATE("Acute trigger"));
 	fAcuteMenu->SetRadioMode(true);
@@ -480,6 +495,28 @@ KeymapWindow::_CreateDeadKeyMenuField()
 }
 
 
+BMenuField*
+KeymapWindow::_CreateModifiersMenuField()
+{
+	fModifiersMenu =
+		new BMenu(B_TRANSLATE("Set modifier keys"));
+	fModifiersMenu->SetRadioMode(true);
+	fModifiersMenu->SetLabelFromMarked(false);
+
+	fModifiersMenu->AddItem(
+		new BMenuItem(B_TRANSLATE("Haiku modifier keys"),
+			new BMessage(kMsgModifiersHaiku)), MODIFIERS_HAIKU);
+	fModifiersMenu->AddItem(
+		new BMenuItem(B_TRANSLATE("Windows/Linux modifier keys"),
+			new BMessage(kMsgModifiersWinLinux)), MODIFIERS_WIN_LINUX);
+	fModifiersMenu->AddItem(
+		new BMenuItem(B_TRANSLATE("Mac modifier keys"),
+			new BMessage(kMsgModifiersMac)), MODIFIERS_MAC);
+
+	return new BMenuField(NULL, fModifiersMenu);
+}
+
+
 BView*
 KeymapWindow::_CreateMapLists()
 {
@@ -584,22 +621,27 @@ KeymapWindow::_SetKeyboardLayout(const char* path)
 }
 
 
-/*!	Sets the label of the "Switch Shorcuts" button to make it more
-	descriptive what will happen when you press that button.
-*/
+/*!	Marks the item in the modifiers menu to the current mode */
 void
-KeymapWindow::_UpdateSwitchShortcutButton()
+KeymapWindow::_UpdateModifiersMenu()
 {
-	const char* label = B_TRANSLATE("Switch shortcut keys");
-	if (fCurrentMap.KeyForModifier(B_LEFT_COMMAND_KEY) == 0x5d
-		&& fCurrentMap.KeyForModifier(B_LEFT_CONTROL_KEY) == 0x5c) {
-		label = B_TRANSLATE("Switch shortcut keys to Windows/Linux mode");
-	} else if (fCurrentMap.KeyForModifier(B_LEFT_COMMAND_KEY) == 0x5c
-		&& fCurrentMap.KeyForModifier(B_LEFT_CONTROL_KEY) == 0x5d) {
-		label = B_TRANSLATE("Switch shortcut keys to Haiku mode");
+	// Remove the custom item (may be added back)
+	fModifiersMenu->RemoveItem(MODIFIERS_CUSTOM);
+
+	// To be in a mode the modifier keys must either be unmapped (== 0),
+	// or mapped to the keys for the mode.
+	if (_HaikuMode())
+		fModifiersMenu->ItemAt(MODIFIERS_HAIKU)->SetMarked(true);
+	else if (_WinLinuxMode())
+		fModifiersMenu->ItemAt(MODIFIERS_WIN_LINUX)->SetMarked(true);
+	else if (_MacMode())
+		fModifiersMenu->ItemAt(MODIFIERS_MAC)->SetMarked(true);
+	else {
+		// Custom modifiers setting
+		fModifiersMenu->AddItem(new BMenuItem(B_TRANSLATE("Custom"), NULL),
+			MODIFIERS_CUSTOM);
+		fModifiersMenu->ItemAt(MODIFIERS_CUSTOM)->SetMarked(true);
 	}
-
-	fSwitchShortcutsButton->SetLabel(label);
 }
 
 
@@ -648,7 +690,7 @@ KeymapWindow::_UpdateDeadKeyMenu()
 
 
 void
-KeymapWindow::_UpdateButtons()
+KeymapWindow::_UpdateControls()
 {
 	if (fCurrentMap != fAppliedMap) {
 		fCurrentMap.SetName(kCurrentKeymapName);
@@ -658,28 +700,193 @@ KeymapWindow::_UpdateButtons()
 	fRevertButton->SetEnabled(fCurrentMap != fPreviousMap);
 
 	_UpdateDeadKeyMenu();
-	_UpdateSwitchShortcutButton();
+	_UpdateModifiersMenu();
 }
 
 
+/*!	Set the modifiers keys */
 void
-KeymapWindow::_SwitchShortcutKeys()
+KeymapWindow::_SetModifiers(uint8 mode)
 {
-	uint32 leftCommand = fCurrentMap.Map().left_command_key;
-	uint32 leftControl = fCurrentMap.Map().left_control_key;
-	uint32 rightCommand = fCurrentMap.Map().right_command_key;
-	uint32 rightControl = fCurrentMap.Map().right_control_key;
+	key_map& keyMap = fCurrentMap.Map();
+
+	uint32 leftControl = fCurrentMap.KeyForModifier(B_LEFT_CONTROL_KEY);
+	uint32 leftCommand = fCurrentMap.KeyForModifier(B_LEFT_COMMAND_KEY);
+	uint32 leftOption = fCurrentMap.KeyForModifier(B_LEFT_OPTION_KEY);
+	uint32 rightControl = fCurrentMap.KeyForModifier(B_RIGHT_CONTROL_KEY);
+	uint32 rightCommand = fCurrentMap.KeyForModifier(B_RIGHT_COMMAND_KEY);
+	uint32 rightOption = fCurrentMap.KeyForModifier(B_RIGHT_OPTION_KEY);
+
+	if (_HaikuMode()) {
+		switch (mode) {
+			case MODIFIERS_HAIKU:
+				// switching from Haiku mode to Haiku mode
+				return;
+
+			case MODIFIERS_WIN_LINUX:
+				// switching from Haiku mode to Windows/Linux mode
+				// swap command and control keys
+
+				// swap left side
+				keyMap.left_control_key = leftCommand;
+				keyMap.left_command_key = leftControl;
+
+				// swap right side
+				keyMap.right_control_key = rightCommand;
+				keyMap.right_command_key = rightControl;
+				break;
 
-	// switch left side
-	fCurrentMap.Map().left_command_key = leftControl;
-	fCurrentMap.Map().left_control_key = leftCommand;
+			case MODIFIERS_MAC:
+				// switching from Haiku mode to Mac mode
+				// swap command and option keys
 
-	// switch right side
-	fCurrentMap.Map().right_command_key = rightControl;
-	fCurrentMap.Map().right_control_key = rightCommand;
+				// swap left side
+				keyMap.left_command_key = leftOption;
+				keyMap.left_option_key = leftCommand;
+
+				// swap right side
+				keyMap.right_command_key = rightOption;
+				keyMap.right_option_key = rightCommand;
+				break;
+		}
+	} else if (_WinLinuxMode()) {
+		switch (mode) {
+			case MODIFIERS_HAIKU:
+				// switching from Windows/Linux mode to Haiku mode
+				// swap command and control keys
+
+				// swap left side
+				keyMap.left_control_key = leftCommand;
+				keyMap.left_command_key = leftControl;
+
+				// swap right side
+				keyMap.right_control_key = rightCommand;
+				keyMap.right_command_key = rightControl;
+				break;
+
+			case MODIFIERS_WIN_LINUX:
+				// switching from Windows/Linux mode to Windows/Linux mode
+				return;
+
+			case MODIFIERS_MAC:
+				// switching from Windows/Linux mode to Mac mode
+				// swap control and option keys
+				// then swap command and option keys
+
+				// swap left side
+				keyMap.left_control_key = leftCommand;
+				keyMap.left_command_key = leftOption;
+				keyMap.left_option_key = leftControl;
+
+				// swap right side
+				keyMap.right_control_key = rightCommand;
+				keyMap.right_command_key = rightOption;
+				keyMap.right_option_key = rightControl;
+				break;
+		}
+	} else if (_MacMode()) {
+		switch (mode) {
+			case MODIFIERS_HAIKU:
+				// switching from Mac mode to Haiku mode
+				// swap command and option keys
+
+				// swap left side
+				keyMap.left_command_key = leftOption;
+				keyMap.left_option_key = leftCommand;
+
+				// swap right side
+				keyMap.right_command_key = rightOption;
+				keyMap.right_option_key = rightCommand;
+				break;
+
+			case MODIFIERS_WIN_LINUX:
+				// switching from Mac mode to Windows/Linux mode
+				// swap control and command
+				// then swap command and option
+
+				// switch left side
+				keyMap.left_control_key = leftOption;
+				keyMap.left_command_key = leftControl;
+				keyMap.left_option_key = leftCommand;
+
+				// switch right side
+				keyMap.right_control_key = rightOption;
+				keyMap.right_command_key = rightControl;
+				keyMap.right_option_key = rightCommand;
+				break;
+
+			case MODIFIERS_MAC:
+				return;
+		}
+	} else { // Custom
+		switch (mode) {
+			// Set modifiers to Haiku mode, the default
+			case MODIFIERS_HAIKU:
+				// switch left side
+				keyMap.left_control_key = kLeftControlKey;
+				keyMap.left_command_key = kLeftCommandKey;
+				keyMap.left_option_key  = kLeftOptionKey;
+
+				// switch right side
+				keyMap.right_control_key = kRightControlKey;
+				if (keyMap.right_control_key == 0
+					|| keyMap.right_command_key == 0
+					|| keyMap.right_option_key == 0) {
+					keyMap.right_command_key = 0;
+					keyMap.right_option_key  = kRightCommandKey;
+				} else {
+					keyMap.right_command_key = kRightCommandKey;
+					keyMap.right_option_key  = kRightOptionKey;
+				}
+
+				break;
+
+			// Set modifiers to Win/Linux mode, swap control and command
+			case MODIFIERS_WIN_LINUX:
+				// switch left side
+				keyMap.left_control_key = kLeftCommandKey;
+				keyMap.left_command_key = kLeftControlKey;
+				keyMap.left_option_key  = kLeftOptionKey;
+
+				// switch right side
+				keyMap.right_command_key = kRightControlKey;
+				if (keyMap.right_control_key == 0
+					|| keyMap.right_command_key == 0
+					|| keyMap.right_option_key == 0) {
+					keyMap.right_control_key = 0;
+					keyMap.right_option_key  = kRightCommandKey;
+				} else {
+					keyMap.right_control_key = kRightCommandKey;
+					keyMap.right_option_key  = kRightOptionKey;
+				}
+
+				break;
+
+			// Set modifiers to Mac mode swap option and command
+			case MODIFIERS_MAC:
+				// switch left side
+				keyMap.left_control_key  = kLeftControlKey;
+				keyMap.left_command_key  = kLeftOptionKey;
+				keyMap.left_option_key   = kLeftCommandKey;
+
+				// switch right side
+				keyMap.right_control_key = kRightControlKey;
+				if (keyMap.right_control_key == 0
+					|| keyMap.right_command_key == 0
+					|| keyMap.right_option_key == 0) {
+					keyMap.right_command_key = kRightCommandKey;
+					keyMap.right_option_key  = 0;
+				} else {
+					keyMap.right_command_key = kRightOptionKey;
+					keyMap.right_option_key  = kRightCommandKey;
+				}
+
+				break;
+		}
+	}
 
 	fKeyboardLayoutView->SetKeymap(&fCurrentMap);
-	_UpdateButtons();
+	_UpdateControls();
 }
 
 
@@ -943,3 +1150,63 @@ KeymapWindow::_SaveSettings() const
 
 	return settings.Flatten(&file);
 }
+
+
+bool
+KeymapWindow::_HaikuMode()
+{
+	uint32 leftControl = fCurrentMap.KeyForModifier(B_LEFT_CONTROL_KEY);
+	uint32 leftCommand = fCurrentMap.KeyForModifier(B_LEFT_COMMAND_KEY);
+	uint32 leftOption = fCurrentMap.KeyForModifier(B_LEFT_OPTION_KEY);
+	uint32 rightControl = fCurrentMap.KeyForModifier(B_RIGHT_CONTROL_KEY);
+	uint32 rightCommand = fCurrentMap.KeyForModifier(B_RIGHT_COMMAND_KEY);
+	uint32 rightOption = fCurrentMap.KeyForModifier(B_RIGHT_OPTION_KEY);
+
+	return leftControl == kLeftControlKey && leftCommand == kLeftCommandKey
+		&& leftOption == kLeftOptionKey
+		&& (rightControl == kRightControlKey || rightControl == 0)
+		&& (rightCommand == kRightCommandKey || rightCommand == kRightOptionKey
+			|| rightCommand == 0)
+		&& (rightOption == kRightOptionKey || rightOption == kRightCommandKey
+			|| rightOption == 0);
+}
+
+
+bool
+KeymapWindow::_WinLinuxMode()
+{
+	uint32 leftControl = fCurrentMap.KeyForModifier(B_LEFT_CONTROL_KEY);
+	uint32 leftCommand = fCurrentMap.KeyForModifier(B_LEFT_COMMAND_KEY);
+	uint32 leftOption = fCurrentMap.KeyForModifier(B_LEFT_OPTION_KEY);
+	uint32 rightControl = fCurrentMap.KeyForModifier(B_RIGHT_CONTROL_KEY);
+	uint32 rightCommand = fCurrentMap.KeyForModifier(B_RIGHT_COMMAND_KEY);
+	uint32 rightOption = fCurrentMap.KeyForModifier(B_RIGHT_OPTION_KEY);
+
+	return leftControl == kLeftCommandKey && leftCommand == kLeftControlKey
+		&& leftOption == kLeftOptionKey
+		&& (rightControl == kRightCommandKey || rightControl == kRightOptionKey ||
+			rightControl == 0)
+		&& (rightCommand == kRightControlKey || rightCommand == 0)
+		&& (rightOption == kRightOptionKey || rightOption == kRightCommandKey
+			|| rightOption == 0);
+}
+
+
+bool
+KeymapWindow::_MacMode()
+{
+	uint32 leftControl = fCurrentMap.KeyForModifier(B_LEFT_CONTROL_KEY);
+	uint32 leftCommand = fCurrentMap.KeyForModifier(B_LEFT_COMMAND_KEY);
+	uint32 leftOption = fCurrentMap.KeyForModifier(B_LEFT_OPTION_KEY);
+	uint32 rightControl = fCurrentMap.KeyForModifier(B_RIGHT_CONTROL_KEY);
+	uint32 rightCommand = fCurrentMap.KeyForModifier(B_RIGHT_COMMAND_KEY);
+	uint32 rightOption = fCurrentMap.KeyForModifier(B_RIGHT_OPTION_KEY);
+
+	return leftControl == kLeftControlKey && leftCommand == kLeftOptionKey
+		&& leftOption == kLeftCommandKey
+		&& (rightControl == kRightControlKey || rightControl == 0)
+		&& (rightCommand == kRightOptionKey || rightCommand == kRightCommandKey
+			|| rightCommand == 0)
+		&& (rightOption == kRightCommandKey || rightCommand == kRightOptionKey
+			|| rightOption == 0);
+}
diff --git src/preferences/keymap/KeymapWindow.h src/preferences/keymap/KeymapWindow.h
index cc6cb4b..1091d0b 100644
--- src/preferences/keymap/KeymapWindow.h
+++ src/preferences/keymap/KeymapWindow.h
@@ -42,14 +42,16 @@ protected:
 			void				_AddKeyboardLayouts(BMenu* menu);
 			status_t			_SetKeyboardLayout(const char* path);
 
-			void				_UpdateSwitchShortcutButton();
-			void				_UpdateButtons();
-			void				_SwitchShortcutKeys();
+			void				_UpdateModifiersMenu();
+			void				_UpdateControls();
+
+			void				_SetModifiers(uint8);
 
 			void				_UseKeymap();
 			void				_RevertKeymap();
 
 			BMenuField*			_CreateDeadKeyMenuField();
+			BMenuField*			_CreateModifiersMenuField();
 			void				_UpdateDeadKeyMenu();
 
 			void 				_FillSystemMaps();
@@ -67,6 +69,10 @@ protected:
 			status_t			_SaveSettings() const;
 
 private:
+			bool				_HaikuMode();
+			bool				_WinLinuxMode();
+			bool				_MacMode();
+
 			BListView*			fSystemListView;
 			BListView*			fUserListView;
 			BButton*			fRevertButton;
@@ -74,7 +80,7 @@ private:
 			BMenu*				fFontMenu;
 			KeyboardLayoutView*	fKeyboardLayoutView;
 			BTextControl*		fTextControl;
-			BButton*			fSwitchShortcutsButton;
+			BMenu*				fModifiersMenu;
 			BMenu*				fAcuteMenu;
 			BMenu*				fCircumflexMenu;
 			BMenu*				fDiaeresisMenu;
