Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 638)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 639)
@@ -2,6 +2,9 @@
 
 import java.awt.Desktop;
+import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -18,9 +21,9 @@
 import javax.swing.JPopupMenu;
 import javax.swing.JTable;
+import javax.swing.JViewport;
 import javax.swing.ListSelectionModel;
 import javax.swing.RowSorter;
 import javax.swing.SortOrder;
 import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
 import javax.swing.table.TableRowSorter;
 
@@ -49,89 +52,7 @@
 
 		setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-		getSelectionModel().addListSelectionListener(
-				new ListSelectionListener() {
-					@Override
-					public void valueChanged(ListSelectionEvent e) {
-						int viewRow = getSelectedRow();
-						if (viewRow < 0) {
-							notifyModSelectionListeners(null);
-						} else {
-							Mod mod = (Mod) getValueAt(viewRow, -1);
-							notifyModSelectionListeners(mod);
-						}
-					}
-				});
-		addMouseListener(new MouseAdapter() {
-			private void common(MouseEvent e) {
-				int r = rowAtPoint(e.getPoint());
-				if (r >= 0 && r < getRowCount())
-					setRowSelectionInterval(r, r);
-				else
-					clearSelection();
-
-				int rowindex = getSelectedRow();
-				if (rowindex >= 0) {
-					if (e.isPopupTrigger()
-							&& e.getComponent() instanceof JTable) {
-						final Mod mod = (Mod) getValueAt(rowindex, -1);
-
-						JPopupMenu popup = new JPopupMenu();
-
-						if (mod.isLocalAvailable()) {
-							// Open package folder item
-							JMenuItem openModFolder = new JMenuItem(
-									bundle.getString("openModFolder.text"));
-							openModFolder
-									.addActionListener(new ActionListener() {
-										@Override
-										public void actionPerformed(
-												ActionEvent arg0) {
-											try {
-												Desktop.getDesktop().open(
-														mod.getLocalPath());
-											} catch (IOException e) {
-												e.printStackTrace();
-											}
-										}
-									});
-							popup.add(openModFolder);
-						}
-
-						if (mod.getUrl() != null) {
-							// Open Depot page item
-							JMenuItem openDepotPage = new JMenuItem(
-									bundle.getString("openDepotPage.text"));
-							openDepotPage
-									.addActionListener(new ActionListener() {
-										@Override
-										public void actionPerformed(
-												ActionEvent arg0) {
-											try {
-												Desktop.getDesktop().browse(
-														mod.getUrl());
-											} catch (IOException e) {
-												e.printStackTrace();
-											}
-										}
-									});
-							popup.add(openDepotPage);
-						}
-
-						if (popup.getSubElements().length > 0)
-							popup.show(e.getComponent(), e.getX(), e.getY());
-					}
-				}
-			}
-
-			@Override
-			public void mousePressed(MouseEvent e) {
-				common(e);
-			}
-
-			@Override
-			public void mouseReleased(MouseEvent e) {
-				common(e);
-			}
-		});
+		getSelectionModel().addListSelectionListener(this);
+		addMouseListener(new MouseEventHandler());
+		addKeyListener(new KeyEventHandler());
 		// To get checkbox-cells with background of row
 		((JComponent) getDefaultRenderer(Boolean.class)).setOpaque(true);
@@ -260,3 +181,106 @@
 		sorter.setRowFilter(new ModTableFilter(type, downloadState));
 	}
+
+	@Override
+	public void valueChanged(ListSelectionEvent e) {
+		super.valueChanged(e);
+		int viewRow = getSelectedRow();
+		if (viewRow < 0) {
+			notifyModSelectionListeners(null);
+		} else {
+			Mod mod = (Mod) getValueAt(viewRow, -1);
+			notifyModSelectionListeners(mod);
+		}
+	}
+
+	private class MouseEventHandler extends MouseAdapter {
+		private void mouseEventProcessing(MouseEvent e) {
+			int r = rowAtPoint(e.getPoint());
+			if (r >= 0 && r < getRowCount())
+				setRowSelectionInterval(r, r);
+			else
+				clearSelection();
+
+			int rowindex = getSelectedRow();
+			if (rowindex >= 0) {
+				if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {
+					final Mod mod = (Mod) getValueAt(rowindex, -1);
+
+					JPopupMenu popup = new JPopupMenu();
+
+					if (mod.isLocalAvailable()) {
+						// Open package folder item
+						JMenuItem openModFolder = new JMenuItem(
+								bundle.getString("openModFolder.text"));
+						openModFolder.addActionListener(new ActionListener() {
+							@Override
+							public void actionPerformed(ActionEvent arg0) {
+								try {
+									Desktop.getDesktop().open(
+											mod.getLocalPath());
+								} catch (IOException e) {
+									e.printStackTrace();
+								}
+							}
+						});
+						popup.add(openModFolder);
+					}
+
+					if (mod.getUrl() != null) {
+						// Open Depot page item
+						JMenuItem openDepotPage = new JMenuItem(
+								bundle.getString("openDepotPage.text"));
+						openDepotPage.addActionListener(new ActionListener() {
+							@Override
+							public void actionPerformed(ActionEvent arg0) {
+								try {
+									Desktop.getDesktop().browse(mod.getUrl());
+								} catch (IOException e) {
+									e.printStackTrace();
+								}
+							}
+						});
+						popup.add(openDepotPage);
+					}
+
+					if (popup.getSubElements().length > 0)
+						popup.show(e.getComponent(), e.getX(), e.getY());
+				}
+			}
+		}
+
+		@Override
+		public void mousePressed(MouseEvent e) {
+			mouseEventProcessing(e);
+		}
+
+		@Override
+		public void mouseReleased(MouseEvent e) {
+			mouseEventProcessing(e);
+		}
+	}
+
+	private class KeyEventHandler extends KeyAdapter {
+		@Override
+		public void keyTyped(KeyEvent e) {
+			super.keyTyped(e);
+
+			if (e.getModifiers() == 0) {
+				String key = String.valueOf(e.getKeyChar()).toLowerCase();
+				for (int i = 0; i < getRowCount(); i++) {
+					Mod m = (Mod) getValueAt(i, -1);
+					if (m.getName().toLowerCase().startsWith(key)) {
+						setRowSelectionInterval(i, i);
+						JViewport viewport = (JViewport) getParent();
+						Rectangle rect = getCellRect(i, 0,
+								true);
+						Rectangle r2 = viewport.getVisibleRect();
+						scrollRectToVisible(new Rectangle(rect.x, rect.y,
+								(int) r2.getWidth(), (int) r2.getHeight()));
+						break;
+					}
+				}
+			}
+		}
+	}
 }
