Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/EApplyFilterTo.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/EApplyFilterTo.java	(revision 660)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/EApplyFilterTo.java	(revision 660)
@@ -0,0 +1,36 @@
+package net.oni2.aeinstaller.gui.modtable;
+
+import java.util.ResourceBundle;
+
+/**
+ * @author Christian Illy
+ */
+public enum EApplyFilterTo {
+	/**
+	 * Filter on all fields
+	 */
+	ALL,
+	/**
+	 * Filter only on name field
+	 */
+	NAME,
+	/**
+	 * Filter only on creator field
+	 */
+	CREATOR,
+	/**
+	 * Filter only on description field
+	 */
+	DESCRIPTION;
+
+	private ResourceBundle bundle = ResourceBundle
+			.getBundle("net.oni2.aeinstaller.localization.ModTable");
+
+	/**
+	 * @return Name of Filter
+	 */
+	public String toString() {
+		return bundle.getString("filterTo." + super.toString());
+	}
+
+}
Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 659)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 660)
@@ -98,5 +98,5 @@
 		setRowSorter(sorter);
 
-		setFilter(null, 0);
+		setFilter(null, 0, null, EApplyFilterTo.ALL);
 
 		List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
@@ -221,8 +221,14 @@
 	 * @param downloadState
 	 *            Show only: 0 = all, 1 = online, 2 = downloaded
-	 */
-	public void setFilter(Type type, int downloadState) {
+	 * @param filterString
+	 *            String to filter on
+	 * @param filterTo
+	 *            Fields to use string filter on
+	 */
+	public void setFilter(Type type, int downloadState, String filterString,
+			EApplyFilterTo filterTo) {
 		sorter.setRowFilter(new ModTableFilter(type, downloadState,
-				contentType == ETableContentType.CORE, false));
+				filterString, filterTo, contentType == ETableContentType.CORE,
+				false));
 	}
 
@@ -378,4 +384,13 @@
 
 	private class KeyEventHandler extends KeyAdapter {
+		private void goToRow(int row) {
+			setRowSelectionInterval(row, row);
+			JViewport viewport = (JViewport) getParent();
+			Rectangle rect = getCellRect(row, 0, true);
+			Rectangle r2 = viewport.getVisibleRect();
+			scrollRectToVisible(new Rectangle(rect.x, rect.y,
+					(int) r2.getWidth(), (int) r2.getHeight()));
+		}
+
 		@Override
 		public void keyTyped(KeyEvent e) {
@@ -384,14 +399,21 @@
 			if (e.getModifiers() == 0) {
 				String key = String.valueOf(e.getKeyChar()).toLowerCase();
-				for (int i = 0; i < getRowCount(); i++) {
+				int row = getSelectedRow();
+				if (row == (getRowCount() - 1))
+					row = -1;
+				for (int i = row + 1; i < getRowCount(); i++) {
 					Package m = (Package) 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;
+						goToRow(i);
+						return;
+					}
+				}
+				if (row > 0) {
+					for (int i = 0; i < row; i++) {
+						Package m = (Package) getValueAt(i, -1);
+						if (m.getName().toLowerCase().startsWith(key)) {
+							goToRow(i);
+							return;
+						}
 					}
 				}
Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java	(revision 659)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java	(revision 660)
@@ -12,4 +12,6 @@
 	private Type type = null;
 	private int downloadState = 0;
+	private EApplyFilterTo filterTo = EApplyFilterTo.ALL;
+	private String filterString = null;
 
 	private boolean showCorePackages = false;
@@ -21,4 +23,8 @@
 	 * @param downloadState
 	 *            Show only: 0 = all, 1 = online, 2 = downloaded
+	 * @param filterString
+	 *            Filter for the given string
+	 * @param filterTo
+	 *            Use the string filter only on the named field
 	 * @param showCorePackages
 	 *            Show core packages in table
@@ -26,9 +32,13 @@
 	 *            Show packages not valid on this platform
 	 */
-	public ModTableFilter(Type type, int downloadState,
-			boolean showCorePackages, boolean showInvalidPlatform) {
+	public ModTableFilter(Type type, int downloadState, String filterString,
+			EApplyFilterTo filterTo, boolean showCorePackages,
+			boolean showInvalidPlatform) {
 		super();
 		this.type = type;
 		this.downloadState = downloadState;
+		if (filterString != null)
+			this.filterString = filterString.toLowerCase();
+		this.filterTo = filterTo;
 		this.showCorePackages = showCorePackages;
 		this.showInvalidPlatform = showInvalidPlatform;
@@ -58,4 +68,28 @@
 				break;
 		}
+		if (filterString != null && filterString.length() > 1) {
+			switch (filterTo) {
+				case ALL:
+					result &= mod.getName().toLowerCase()
+							.contains(filterString)
+							|| mod.getCreator().toLowerCase()
+									.contains(filterString)
+							|| mod.getDescription().toLowerCase()
+									.contains(filterString);
+					break;
+				case CREATOR:
+					result &= mod.getCreator().toLowerCase()
+							.contains(filterString);
+					break;
+				case DESCRIPTION:
+					result &= mod.getDescription().toLowerCase()
+							.contains(filterString);
+					break;
+				case NAME:
+					result &= mod.getName().toLowerCase()
+							.contains(filterString);
+					break;
+			}
+		}
 
 		return result;
