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 b8a70ca..47acd86 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
@@ -127,7 +127,7 @@
 		setupTerminal(wndParent);
 	}
 
-	public void setEncoding(String encoding) throws UnsupportedEncodingException {
+	@Override public void setEncoding(String encoding) throws UnsupportedEncodingException {
 		if (encoding == null) {
 			// TODO better use a standard remote-to-local encoding?
 			encoding = "ISO-8859-1"; //$NON-NLS-1$
@@ -140,18 +140,18 @@
 		fTerminalText.setInputStreamReader(fInputStreamReader);
 	}
 
-	public String getEncoding() {
+	@Override public String getEncoding() {
 		return fEncoding;
 	}
 
-	public ITerminalConnector[] getConnectors() {
+	@Override public ITerminalConnector[] getConnectors() {
 		return fConnectors;
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#copy()
 	 */
-	public void copy() {
+	@Override public void copy() {
 		copy(DND.CLIPBOARD);
 	}
 
@@ -164,7 +164,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#paste()
 	 */
-	public void paste() {
+	@Override public void paste() {
 		paste(DND.CLIPBOARD);
 // TODO paste in another thread.... to avoid blocking
 //		new Thread() {
@@ -186,7 +186,7 @@
 	/**
 	 * @param strText the text to paste
 	 */
-	public boolean pasteString(String strText) {
+	@Override public boolean pasteString(String strText) {
 		if(!isConnected()) {
       return false;
     }
@@ -207,14 +207,14 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#selectAll()
 	 */
-	public void selectAll() {
+	@Override public void selectAll() {
 		getCtlText().selectAll();
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#sendKey(char)
 	 */
-	public void sendKey(char character) {
+	@Override public void sendKey(char character) {
 		Event event;
 		KeyEvent keyEvent;
 
@@ -232,7 +232,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#clearTerminal()
 	 */
-	public void clearTerminal() {
+	@Override public void clearTerminal() {
 		// The TerminalText object does all text manipulation.
 
 		getTerminalText().clearTerminal();
@@ -241,14 +241,14 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#getClipboard()
 	 */
-	public Clipboard getClipboard() {
+	@Override public Clipboard getClipboard() {
 		return fClipboard;
 	}
 
 	/**
 	 * @return non null selection
 	 */
-	public String getSelection() {
+	@Override public String getSelection() {
 		String txt= fCtlText.getSelectionText();
 		if(txt==null)
      {
@@ -260,42 +260,42 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setFocus()
 	 */
-	public boolean setFocus() {
+	@Override public boolean setFocus() {
 		return getCtlText().setFocus();
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isEmpty()
 	 */
-	public boolean isEmpty() {
+	@Override public boolean isEmpty() {
 		return getCtlText().isEmpty();
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isDisposed()
 	 */
-	public boolean isDisposed() {
+	@Override public boolean isDisposed() {
 		return getCtlText().isDisposed();
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isConnected()
 	 */
-	public boolean isConnected() {
+	@Override public boolean isConnected() {
 		return fState==TerminalState.CONNECTED;
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#disposeTerminal()
 	 */
-	public void disposeTerminal() {
+	@Override public void disposeTerminal() {
 		Logger.log("entered."); //$NON-NLS-1$
 		disconnectTerminal();
 		fClipboard.dispose();
 		getTerminalText().dispose();
 	}
 
-	public void connectTerminal() {
+	@Override public void connectTerminal() {
 		Logger.log("entered."); //$NON-NLS-1$
 		if(getTerminalConnector()==null) {
       return;
@@ -315,13 +315,13 @@
 		waitForConnect();
 	}
 
-	public ITerminalConnector getTerminalConnector() {
+	@Override public ITerminalConnector getTerminalConnector() {
 		return fConnector;
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#disconnectTerminal()
 	 */
-	public void disconnectTerminal() {
+	@Override public void disconnectTerminal() {
 		Logger.log("entered."); //$NON-NLS-1$
 
 		//Disconnect the remote side first
@@ -382,7 +382,7 @@
 	private synchronized void startReaderJob() {
 		if(fJob==null) {
 			fJob=new Job("Terminal data reader") { //$NON-NLS-1$
-				protected IStatus run(IProgressMonitor monitor) {
+				@Override protected IStatus run(IProgressMonitor monitor) {
 					IStatus status=Status.OK_STATUS;
 					try {
 						while(true) {
@@ -464,7 +464,7 @@
 		}
 	}
 
-	public Shell getShell() {
+	@Override public Shell getShell() {
 		return getCtlText().getShell();
 	}
 
@@ -525,7 +525,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setupTerminal(org.eclipse.swt.widgets.Composite)
 	 */
-	public void setupTerminal(Composite parent) {
+	@Override public void setupTerminal(Composite parent) {
 		Assert.isNotNull(parent);
 		fState=TerminalState.CLOSED;
 		setupControls(parent);
@@ -536,7 +536,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#onFontChanged()
 	 */
-	public void setFont(Font font) {
+	@Override public void setFont(Font font) {
 		getCtlText().setFont(font);
 		if(fCommandInputField!=null) {
 			fCommandInputField.setFont(font);
@@ -546,13 +546,13 @@
 		fCtlText.onFontChange();
 		getTerminalText().fontChanged();
 	}
-	public Font getFont() {
+	@Override public Font getFont() {
 		return getCtlText().getFont();
 	}
-	public Control getControl() {
+	@Override public Control getControl() {
 		return fCtlText;
 	}
-	public Control getRootControl() {
+	@Override public Control getRootControl() {
 		return fWndParent;
 	}
 	protected void setupControls(Composite parent) {
@@ -578,18 +578,19 @@
 		fCtlText.addMouseListener(new MouseAdapter() {
       @Override
       public void mouseUp(MouseEvent e) {
-        Point p = fCtlText.screenPointToCell(e.x, e.y);
-        if (p == null) {
-          return;
+        IHyperlink hyperlink = hyperlinkAt(e);
+        if (hyperlink != null) {
+          hyperlink.open();
         }
-        List<IHyperlink> hyperlinks = fTerminalText.hyperlinksAt(p.y);
-        for (IHyperlink hyperlink : hyperlinks) {
-          IRegion region = hyperlink.getHyperlinkRegion();
-          int start = region.getOffset();
-          int end = start + region.getLength() - 1;
-          if (p.x >= start && p.x <= end) {
-            hyperlink.open();
-          }
+      }
+    });
+    fCtlText.addMouseMoveListener(new MouseMoveListener() {
+      @Override public void mouseMove(MouseEvent e) {
+        IHyperlink hyperlink = hyperlinkAt(e);
+        int cursorId = (hyperlink == null) ? SWT.CURSOR_IBEAM : SWT.CURSOR_HAND;
+        Cursor newCursor = fCtlText.getDisplay().getSystemCursor(cursorId);
+        if (!newCursor.equals(fCtlText.getCursor())) {
+          fCtlText.setCursor(newCursor);
         }
       }
     });
@@ -597,12 +598,12 @@
 		fCtlText.setLayoutData(new GridData(GridData.FILL_BOTH));
 		fCtlText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 		fCtlText.addResizeHandler(new TextCanvas.ResizeListener() {
-			public void sizeChanged(int lines, int columns) {
+			@Override public void sizeChanged(int lines, int columns) {
 				fTerminalText.setDimensions(lines, columns);
 			}
 		});
 		fCtlText.addMouseListener(new MouseAdapter() {
-			public void mouseUp(MouseEvent e) {
+			@Override public void mouseUp(MouseEvent e) {
 				// update selection used by middle mouse button paste
 				if (e.button == 1 && getSelection().length() > 0) {
 					copy(DND.SELECTION_CLIPBOARD);
@@ -616,6 +617,22 @@
 		setFont(JFaceResources.getTextFont());
 	}
 
+  private IHyperlink hyperlinkAt(MouseEvent e) {
+    Point p = fCtlText.screenPointToCell(e.x, e.y);
+    if (p != null) {
+      List<IHyperlink> hyperlinks = fTerminalText.hyperlinksAt(p.y);
+      for (IHyperlink hyperlink : hyperlinks) {
+        IRegion region = hyperlink.getHyperlinkRegion();
+        int start = region.getOffset();
+        int end = start + region.getLength() - 1;
+        if (p.x >= start && p.x <= end) {
+          return hyperlink;
+        }
+      }
+    }
+    return null;
+	}
+
 	protected void setupListeners() {
 		fKeyHandler = new TerminalKeyHandler();
 		fFocusListener = new TerminalFocusListener();
@@ -643,7 +660,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#displayTextInTerminal(java.lang.String)
 	 */
-	public void displayTextInTerminal(String text) {
+	@Override public void displayTextInTerminal(String text) {
 		writeToTerminal("\r\n"+text+"\r\n"); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	private void writeToTerminal(String text) {
@@ -659,7 +676,7 @@
 
 	}
 
-	public OutputStream getRemoteToTerminalOutputStream() {
+	@Override public OutputStream getRemoteToTerminalOutputStream() {
 		if(Logger.isLogEnabled()) {
 			return new LoggingOutputStream(fInputStream.getOutputStream());
 		} else {
@@ -675,7 +692,7 @@
 	}
 
 
-	public OutputStream getOutputStream() {
+	@Override public OutputStream getOutputStream() {
 		if(getTerminalConnector()!=null) {
       return getTerminalConnector().getTerminalToRemoteStream();
     }
@@ -685,7 +702,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setMsg(java.lang.String)
 	 */
-	public void setMsg(String msg) {
+	@Override public void setMsg(String msg) {
 		fMsg = msg;
 	}
 
@@ -713,7 +730,7 @@
 			super();
 		}
 
-		public void focusGained(FocusEvent event) {
+		@Override public void focusGained(FocusEvent event) {
 			// Disable all keyboard accelerators (e.g., Control-B) so the Terminal view
 			// can see every keystroke.  Without this, Emacs, vi, and Bash are unusable
 			// in the Terminal view.
@@ -735,7 +752,7 @@
 					.activateContext("org.eclipse.tm.terminal.TerminalContext"); //$NON-NLS-1$
 		}
 
-		public void focusLost(FocusEvent event) {
+		@Override public void focusLost(FocusEvent event) {
 			// Enable all keybindings.
 
 			IBindingService bindingService = (IBindingService) PlatformUI
@@ -751,7 +768,7 @@
 	}
 
 	protected class TerminalKeyHandler extends KeyAdapter {
-		public void keyPressed(KeyEvent event) {
+		@Override public void keyPressed(KeyEvent event) {
 			if (getState()==TerminalState.CONNECTING) {
         return;
       }
@@ -977,22 +994,22 @@
 
 	}
 
-	public void setTerminalTitle(String title) {
+	@Override public void setTerminalTitle(String title) {
 		fTerminalListener.setTerminalTitle(title);
 	}
 
 
-	public TerminalState getState() {
+	@Override public TerminalState getState() {
 		return fState;
 	}
 
 
-	public void setState(TerminalState state) {
+	@Override public void setState(TerminalState state) {
 		fState=state;
 		fTerminalListener.setState(state);
 		// enable the (blinking) cursor if the terminal is connected
 		runAsyncInDisplayThread(new Runnable() {
-			public void run() {
+			@Override public void run() {
 				if(fCtlText!=null && !fCtlText.isDisposed()) {
           fCtlText.setCursorEnabled(isConnected());
         }
@@ -1011,22 +1028,22 @@
     }
 	}
 
-	public String getSettingsSummary() {
+	@Override public String getSettingsSummary() {
 		if(getTerminalConnector()!=null) {
       return getTerminalConnector().getSettingsSummary();
     }
 		return ""; //$NON-NLS-1$
 	}
 
-	public void setConnector(ITerminalConnector connector) {
+	@Override public void setConnector(ITerminalConnector connector) {
 		fConnector=connector;
 
 	}
-	public ICommandInputField getCommandInputField() {
+	@Override public ICommandInputField getCommandInputField() {
 		return fCommandInputField;
 	}
 
-	public void setCommandInputField(ICommandInputField inputField) {
+	@Override public void setCommandInputField(ICommandInputField inputField) {
 		if(fCommandInputField!=null) {
       fCommandInputField.dispose();
     }
@@ -1039,11 +1056,11 @@
     }
 	}
 
-	public int getBufferLineLimit() {
+	@Override public int getBufferLineLimit() {
 		return fTerminalModel.getMaxHeight();
 	}
 
-	public void setBufferLineLimit(int bufferLineLimit) {
+	@Override public void setBufferLineLimit(int bufferLineLimit) {
 		if(bufferLineLimit<=0) {
       return;
     }
@@ -1055,15 +1072,15 @@
 		}
 	}
 
-	public boolean isScrollLock() {
+	@Override public boolean isScrollLock() {
 		return fCtlText.isScrollLock();
 	}
 
-	public void setScrollLock(boolean on) {
+	@Override public void setScrollLock(boolean on) {
 		fCtlText.setScrollLock(on);
 	}
 
-	public void setInvertedColors(boolean invert) {
+	@Override public void setInvertedColors(boolean invert) {
 		fCtlText.setInvertedColors(invert);
 	}
 
