Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/DownloadSizeListener.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/DownloadSizeListener.java	(revision 600)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/DownloadSizeListener.java	(revision 600)
@@ -0,0 +1,12 @@
+package net.oni2.aeinstaller.gui.modtable;
+
+/**
+ * @author Christian Illy
+ */
+public interface DownloadSizeListener {
+	/**
+	 * @param newSize
+	 *            New size of files to download
+	 */
+	public void downloadSizeChanged(int newSize);
+}
Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java	(revision 593)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java	(revision 600)
@@ -1,11 +1,8 @@
 package net.oni2.aeinstaller.gui.modtable;
-
-import java.util.HashSet;
 
 import javax.swing.RowFilter;
 
-import net.oni2.aeinstaller.backend.Settings;
-import net.oni2.aeinstaller.backend.depot.DepotManager;
-import net.oni2.aeinstaller.backend.depot.model.NodeMod;
+import net.oni2.aeinstaller.backend.mods.Mod;
+import net.oni2.aeinstaller.backend.mods.Type;
 
 /**
@@ -13,11 +10,11 @@
  */
 public class ModTableFilter extends RowFilter<ModTableModel, Integer> {
-	int type = -1;
+	Type type = null;
 
 	/**
 	 * @param type
-	 *            Type of mods to show (-1 for all)
+	 *            Type of mods to show (null for all)
 	 */
-	public ModTableFilter(int type) {
+	public ModTableFilter(Type type) {
 		super();
 		this.type = type;
@@ -26,18 +23,17 @@
 	@Override
 	public boolean include(
-			javax.swing.RowFilter.Entry<? extends ModTableModel, ? extends Integer> entry) {
-		NodeMod mod = (NodeMod) entry.getModel().getValueAt(
-				entry.getIdentifier(), -1);
+			RowFilter.Entry<? extends ModTableModel, ? extends Integer> entry) {
+		Mod mod = (Mod) entry.getModel().getValueAt(entry.getIdentifier(), -1);
 
-		if (!DepotManager.getInstance().isModValidOnPlatform(mod,
-				Settings.getPlatform()))
+		if (mod.isDefaultMod())
 			return false;
 
-		if (type < 0)
+		if (!mod.validOnPlatform())
+			return false;
+
+		if (type == null)
 			return true;
 
-		HashSet<Integer> types = new HashSet<Integer>();
-		types.add(type);
-		return DepotManager.getInstance().isModOfType(mod, types, false);
+		return mod.getTypes().contains(type);
 	}
 }
Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java	(revision 593)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java	(revision 600)
@@ -1,5 +1,7 @@
 package net.oni2.aeinstaller.gui.modtable;
 
+import java.util.HashSet;
 import java.util.ResourceBundle;
+import java.util.TreeSet;
 import java.util.Vector;
 
@@ -7,7 +9,7 @@
 import javax.swing.table.TableColumn;
 
-import net.oni2.aeinstaller.backend.depot.DepotConfig;
-import net.oni2.aeinstaller.backend.depot.DepotManager;
-import net.oni2.aeinstaller.backend.depot.model.NodeMod;
+import net.oni2.aeinstaller.backend.mods.Mod;
+import net.oni2.aeinstaller.backend.mods.ModManager;
+import net.oni2.aeinstaller.backend.mods.Type;
 
 /**
@@ -21,8 +23,8 @@
 			.getName());
 
-	private Vector<NodeMod> items;
-	private Vector<Boolean> install;
-	private int vocabModTypeID = -1;
-	private int vocabPlatformID = -1;
+	private Vector<Mod> items = new Vector<Mod>();
+	private Vector<Boolean> install = new Vector<Boolean>();
+
+	private HashSet<DownloadSizeListener> listeners = new HashSet<DownloadSizeListener>();
 
 	/**
@@ -35,40 +37,22 @@
 	@Override
 	public Object getValueAt(int row, int col) {
-		NodeMod node = items.get(row);
+		Mod mod = items.get(row);
 		switch (col) {
 			case -1:
-				return node;
-			case 0:
-				return node.getTitle();
-			case 1:
-				return node.getFields().get("package_number");
+				return mod;
+			case 0:
+				return mod.getName();
+			case 1:
+				return mod.getPackageNumber();
 			case 2:
 				String type = "";
-				if (vocabModTypeID < 0) {
-					vocabModTypeID = DepotManager
-							.getInstance()
-							.getVocabulary(
-									DepotConfig.getVocabularyName_ModType())
-							.getVid();
-				}
-				for (int tid : node.getTaxonomyTerms().get(vocabModTypeID)) {
+				for (Type t : mod.getTypes()) {
 					if (type.length() > 0)
 						type += ", ";
-					type += DepotManager.getInstance().getTaxonomyTerm(tid)
-							.getName();
+					type += t.getName();
 				}
 				return type;
 			case 3:
-				if (vocabPlatformID < 0) {
-					vocabPlatformID = DepotManager
-							.getInstance()
-							.getVocabulary(
-									DepotConfig.getVocabularyName_Platform())
-							.getVid();
-				}
-				int tid = node.getTaxonomyTerms().get(vocabPlatformID)
-						.iterator().next();
-				return DepotManager.getInstance().getTaxonomyTerm(tid)
-						.getName();
+				return mod.getPlatform().toString();
 			case 4:
 				return install.get(row);
@@ -163,6 +147,7 @@
 	 */
 	public void reloadData() {
-		items = DepotManager.getInstance().getModPackageNodes();
-		install = new Vector<Boolean>();
+		items.clear();
+		items.addAll(ModManager.getInstance().getMods());
+		install.clear();
 		// TODO check installed
 		for (int i = 0; i < items.size(); i++) {
@@ -176,6 +161,18 @@
 	 * @return Items
 	 */
-	public Vector<NodeMod> getItems() {
+	public Vector<Mod> getItems() {
 		return items;
+	}
+
+	/**
+	 * @return Mods selected for installation
+	 */
+	public TreeSet<Mod> getSelectedMods() {
+		TreeSet<Mod> res = new TreeSet<Mod>();
+		for (int i = 0; i < items.size(); i++) {
+			if (install.get(i))
+				res.add(items.get(i));
+		}
+		return res;
 	}
 
@@ -190,5 +187,32 @@
 		if (columnIndex == 4) {
 			install.set(rowIndex, (Boolean) aValue);
-		}
+
+			int size = 0;
+			for (int i = 0; i < items.size(); i++) {
+				if (install.get(i)) {
+					Mod m = items.get(i);
+					if (!m.isLocalAvailable() || m.isNewerAvailable())
+						size += m.getZipSize();
+				}
+			}
+			for (DownloadSizeListener dsl : listeners)
+				dsl.downloadSizeChanged(size);
+		}
+	}
+
+	/**
+	 * @param lis
+	 *            Listener to receive download size changed events
+	 */
+	public void addDownloadSizeListener(DownloadSizeListener lis) {
+		listeners.add(lis);
+	}
+
+	/**
+	 * @param lis
+	 *            Listener to no longer receive download size changed events
+	 */
+	public void removeDownloadSizeListener(DownloadSizeListener lis) {
+		listeners.remove(lis);
 	}
 
