diff --git a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java
index 9d67214..6da42b1 100644
--- a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java
+++ b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java
@@ -12,32 +12,63 @@
 
 import java.util.*;
 
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.swt.SWT;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.jface.bindings.keys.*;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.keys.IBindingService;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class EditActionAccelerators {
-  private static final Map<Integer, KeyStroke> ACCELERATORS = new HashMap<Integer, KeyStroke>();
+  private static final String COPY_COMMAND_ID = "com.google.eclipse.terminal.local.copy"; //$NON-NLS-1$
+  private static final String PASTE_COMMAND_ID = "com.google.eclipse.terminal.local.paste"; //$NON-NLS-1$
 
-  static {
-    addActionAccelerator('C');
-    addActionAccelerator('V');
+  private final Map<Integer, String> commandIdsByAccelerator = new HashMap<Integer, String>();
+
+  private void load() {
+    addAccelerator(COPY_COMMAND_ID);
+    addAccelerator(PASTE_COMMAND_ID);
   }
 
-  private static void addActionAccelerator(int naturalKey) {
-    int modifierKeys = (SWT.COMMAND == SWT.MOD1) ? SWT.COMMAND : SWT.CONTROL | SWT.SHIFT;
-    KeyStroke keyStroke = KeyStroke.getInstance(modifierKeys, naturalKey);
-    int accelerator = convertKeyStrokeToAccelerator(keyStroke);
-    ACCELERATORS.put(accelerator, keyStroke);
+  private void addAccelerator(String commandId) {
+    KeySequence keySequence = bindingFor(commandId);
+    if (keySequence == null) {
+      return;
+    }
+    KeyStroke[] keyStrokes = keySequence.getKeyStrokes();
+    if (keyStrokes.length != 0) {
+      int accelerator = convertKeyStrokeToAccelerator(keyStrokes[0]);
+      commandIdsByAccelerator.put(new Integer(accelerator), commandId);
+    }
   }
 
-  static Integer naturalKey(int accelerator) {
-    KeyStroke keyStroke = ACCELERATORS.get(accelerator);
-    if (keyStroke != null) {
-      return keyStroke.getNaturalKey();
+  private static KeySequence bindingFor(String commandId) {
+    IBindingService bindingService = bindingService();
+    TriggerSequence binding = bindingService.getBestActiveBindingFor(commandId);
+    if (binding instanceof KeySequence) {
+      KeySequence keySequence = (KeySequence) binding;
+      return keySequence;
     }
     return null;
   }
+
+  private static IBindingService bindingService() {
+    return (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class);
+  }
+
+  boolean isCopyAction(int accelerator) {
+    return isMatchingAction(accelerator, COPY_COMMAND_ID);
+  }
+
+  boolean isPasteAction(int accelerator) {
+    return isMatchingAction(accelerator, PASTE_COMMAND_ID);
+  }
+
+  private boolean isMatchingAction(int accelerator, String commandId) {
+    if (commandIdsByAccelerator.isEmpty()) {
+      load();
+    }
+    return commandId.equals(commandIdsByAccelerator.get(new Integer(accelerator)));
+  }
 }
diff --git a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
index 0db064f..ed1039b 100644
--- a/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
+++ b/com.google.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
@@ -111,6 +111,8 @@
 	 */
 	volatile private Job fJob;
 
+	private final EditActionAccelerators editActionAccelerators = new EditActionAccelerators();
+
 	public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) {
 		fConnectors=connectors;
 		fTerminalListener=target;
@@ -162,7 +164,11 @@
 	}
 
 	private void copy(int clipboardType) {
-		Object[] data = new Object[] { getSelection() };
+		String selection = getSelection();
+		if (selection == null || selection.isEmpty()) {
+		  return;
+		}
+    Object[] data = new Object[] { selection };
 		Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
 		fClipboard.setContents(data, types, clipboardType);
 	}
@@ -780,16 +786,13 @@
       }
 
 			int accelerator = convertEventToUnmodifiedAccelerator(event);
-			Integer naturalKey = EditActionAccelerators.naturalKey(accelerator);
-			if (naturalKey != null) {
-			  switch (naturalKey.intValue()) {
-  			  case 'C':
-  			    copy();
-  			    return;
-  			  case 'V':
-  			    paste();
-  			    return;
-			  }
+			if (editActionAccelerators.isCopyAction(accelerator)) {
+			  copy();
+			  return;
+			}
+			if (editActionAccelerators.isPasteAction(accelerator)) {
+			  paste();
+			  return;
 			}
 
 			// We set the event.doit to false to prevent any further processing of this
