diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/LastCommandTracker.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/LastCommandTracker.java
new file mode 100644
index 0000000..f640fe0
--- /dev/null
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/LastCommandTracker.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2012 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.terminal.local.ui.view;
+
+import java.util.*;
+import java.util.regex.Pattern;
+
+import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IStreamMonitor;
+import org.eclipse.swt.events.*;
+import org.eclipse.tm.internal.terminal.emulator.VT100TerminalControl;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class LastCommandTracker extends KeyAdapter implements IStreamListener {
+  private static final String CRLF = "\r\n";
+  private static final Pattern WHITE_SPACE_PATTERN = Pattern.compile("[\\s]+");
+
+  private final List<String> words = new ArrayList<String>();
+
+  private final VT100TerminalControl terminalControl;
+  private CommandListener commandListener;
+
+  LastCommandTracker(VT100TerminalControl terminalControl) {
+    this.terminalControl = terminalControl;
+  }
+
+  void setCommandListener(CommandListener listener) {
+    commandListener = listener;
+  }
+
+  @Override public void streamAppended(String text, IStreamMonitor monitor) {
+    int charCount = text.length();
+    if (charCount == 0) {
+      return;
+    }
+    String word = text;
+    int index = text.lastIndexOf(CRLF);
+    if (index != -1) {
+      words.clear();
+      word = text.substring(index + CRLF.length(), charCount);
+    }
+    if (!word.isEmpty()) {
+      words.add(word);
+    }
+  }
+
+  @Override public void keyPressed(KeyEvent e) {
+    if (e.character == '\r') {
+      trackLastCommand();
+    }
+  }
+
+  private void trackLastCommand() {
+    int line = terminalControl.getCursorLine();
+    String text = textAtLine(line);
+    if (text.isEmpty() || words.isEmpty()) {
+      return;
+    }
+    String prompt = words.get(0);
+    if (text.startsWith(prompt)) {
+      String command = lastCommand(prompt, text);
+      notifyCommandIssued(command);
+      return;
+    }
+    // most likely line wrapped;
+    while (!text.startsWith(prompt)) {
+      String previousLineText = textAtLine(--line);
+      if (previousLineText.isEmpty()) {
+        return;
+      }
+      text = previousLineText.concat(text);
+    }
+    String command = lastCommand(prompt, text);
+    notifyCommandIssued(command);
+  }
+
+  private String textAtLine(int line) {
+    if (line < 0) {
+      return "";
+    }
+    char[] chars = terminalControl.getChars(line);
+    if (chars == null || chars.length == 0) {
+      return "";
+    }
+    return new String(chars).trim();
+  }
+
+  private String lastCommand(String prompt, String text) {
+    String command = null;
+    String withoutPrompt = text.substring(prompt.length());
+    String[] actualInput = WHITE_SPACE_PATTERN.split(withoutPrompt);
+    if (actualInput.length != 0) {
+      command = actualInput[0];
+    }
+    return (command == null) ? "" : command;
+  }
+
+  private void notifyCommandIssued(String command) {
+    if (!command.isEmpty() && commandListener != null) {
+      commandListener.commandIssued(command);
+    }
+  }
+}
\ No newline at end of file
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
index 13edd97..ed8977f 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
@@ -11,13 +11,7 @@
 import static com.google.eclipse.terminal.local.core.connector.LocalTerminalConnector.createLocalTerminalConnector;
 import static org.eclipse.tm.internal.terminal.provisional.api.TerminalState.CONNECTING;
 
-import java.util.*;
-import java.util.List;
-import java.util.regex.Pattern;
-
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IStreamMonitor;
 import org.eclipse.jface.action.*;
 import org.eclipse.jface.layout.*;
 import org.eclipse.swt.events.*;
@@ -34,16 +28,12 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 class TerminalWidget extends Composite {
-  private static final String CRLF = "\r\n";
-  private static final Pattern WHITE_SPACE_PATTERN = Pattern.compile("[\\s]+");
-
   private final TerminalListener terminalListener = new TerminalListener();
 
   private final VT100TerminalControl terminalControl;
   private final EditActions editActions;
   private final LastCommandTracker lastCommandTracker;
 
-  private CommandListener commandListener;
   private LifeCycleListener lifeCycleListener;
 
   TerminalWidget(Composite parent, int style) {
@@ -79,7 +69,7 @@
         editActions.update();
       }
     });
-    lastCommandTracker = new LastCommandTracker();
+    lastCommandTracker = new LastCommandTracker(terminalControl);
     terminalTextControl.addKeyListener(lastCommandTracker);
   }
 
@@ -169,46 +159,7 @@
   }
 
   void setCommandListener(CommandListener listener) {
-    commandListener = listener;
-  }
-
-  private class LastCommandTracker extends KeyAdapter implements IStreamListener {
-    private final List<String> words = new ArrayList<String>();
-
-    @Override public void streamAppended(String text, IStreamMonitor monitor) {
-      int charCount = text.length();
-      if (charCount == 0) {
-        return;
-      }
-      String word = text;
-      int index = text.lastIndexOf(CRLF);
-      if (index != -1) {
-        words.clear();
-        word = text.substring(index + CRLF.length(), charCount);
-      }
-      if (!word.isEmpty()) {
-        words.add(word);
-      }
-    }
-
-    @Override public void keyPressed(KeyEvent e) {
-      if (e.character == '\r') {
-        int line = terminalControl.getCursorLine();
-        String text = new String(terminalControl.getChars(line));
-        if (words.size() <= 1) {
-          return;
-        }
-        String prompt = words.get(0);
-        text = text.substring(prompt.length());
-        String[] actualInput = WHITE_SPACE_PATTERN.split(text);
-        if (actualInput.length != 0) {
-          String command = actualInput[0];
-          if (!command.isEmpty() && commandListener != null) {
-            commandListener.commandIssued(command);
-          }
-        }
-      }
-    }
+    lastCommandTracker.setCommandListener(listener);
   }
 
   private static class TerminalListener implements ITerminalListener {
