Index: AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 658)
+++ AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 659)
@@ -1,2 +1,2 @@
 appname=AE Installer 2
-appversion=0.99i
+appversion=0.99j
Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 658)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 659)
@@ -16,5 +16,7 @@
 import java.util.ResourceBundle;
 import java.util.TreeSet;
-
+import java.util.Vector;
+
+import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
 import javax.swing.JMenuItem;
@@ -28,4 +30,7 @@
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.RowSorterEvent;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableRowSorter;
 
@@ -107,4 +112,6 @@
 			model.setColumnConstraints(i, getColumnModel().getColumn(i));
 		}
+
+		getTableHeader().addMouseListener(new HeaderMouseEventHandler());
 
 		if (contentType != ETableContentType.MODS) {
@@ -392,3 +399,95 @@
 		}
 	}
+
+	private class HeaderMouseEventHandler extends MouseAdapter {
+		private Vector<TableColumn> columns = new Vector<TableColumn>();
+		private TableColumnModel tcm = getColumnModel();
+
+		public HeaderMouseEventHandler() {
+			super();
+
+			for (int i = 1; i < tcm.getColumnCount(); i++) {
+				columns.add(tcm.getColumn(i));
+			}
+
+			for (int i = 1; i < columns.size(); i++) {
+				TableColumn tc = columns.get(i);
+				if (!Settings.getInstance().get(
+						String.format("modShowColumn%02d", tc.getModelIndex()),
+						true))
+					tcm.removeColumn(tc);
+			}
+		}
+
+		private TableColumn getColumn(String name) {
+			for (TableColumn tc : columns) {
+				if (tc.getHeaderValue().equals(name)) {
+					return tc;
+				}
+			}
+			return null;
+		}
+
+		private int headerContains(TableColumn tc) {
+			for (int col = 0; col < tcm.getColumnCount(); col++) {
+				if (tcm.getColumn(col).equals(tc))
+					return col;
+			}
+			return -1;
+		}
+
+		private void mouseEventProcessing(MouseEvent e) {
+			if (e.isPopupTrigger() && e.getComponent() instanceof JTableHeader) {
+				JPopupMenu popup = new JPopupMenu();
+
+				ActionListener al = new ActionListener() {
+					@Override
+					public void actionPerformed(ActionEvent e) {
+						JCheckBoxMenuItem itm = (JCheckBoxMenuItem) e
+								.getSource();
+						TableColumn col = getColumn(itm.getText());
+						if (itm.isSelected()) {
+							tcm.addColumn(col);
+							for (int i = columns.indexOf(col) - 1; i >= 0; i--) {
+								int pos = headerContains(columns.get(i));
+								if (pos >= 0) {
+									tcm.moveColumn(tcm.getColumnCount() - 1,
+											pos + 1);
+									break;
+								}
+							}
+						} else {
+							tcm.removeColumn(col);
+						}
+						Settings.getInstance().put(
+								String.format("modShowColumn%02d",
+										col.getModelIndex()), itm.isSelected());
+					}
+				};
+
+				for (int i = 1; i < columns.size(); i++) {
+					JCheckBoxMenuItem itm = new JCheckBoxMenuItem(
+							(String) columns.get(i).getHeaderValue());
+					itm.setSelected(headerContains(columns.get(i)) >= 0);
+
+					itm.addActionListener(al);
+					popup.add(itm);
+				}
+
+				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);
+		}
+	}
+
 }
