Index: /java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 857)
@@ -1,2 +1,2 @@
 appname=AE Installer 2
-appversion=.08
+appversion=.10
Index: /java/installer2/src/net/oni2/aeinstaller/AEInstaller2.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 857)
@@ -146,5 +146,5 @@
 			ProxySettings.deserializeFromFile(Paths.getProxySettingsFilename());
 		}
-
+		
 		initBundles();
 
Index: /java/installer2/src/net/oni2/aeinstaller/backend/Paths.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 857)
@@ -15,4 +15,11 @@
 	public static File getDepotCacheFilename() {
 		return new File(getPrefsPath(), "ModDepotCache.xml");
+	}
+
+	/**
+	 * @return Package manager cache filename
+	 */
+	public static File getPacManCacheFilename() {
+		return new File(getPrefsPath(), "PacManCache.xml");
 	}
 
Index: /java/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java	(revision 857)
@@ -37,21 +37,25 @@
 	private String submitter = "";
 	private String creator = "";
-	private EBSLInstallType bslInstallType = EBSLInstallType.NORMAL;
+	private transient EBSLInstallType bslInstallType = EBSLInstallType.NORMAL;
 	private String description = "";
-	private double aeVersion = 0;
+	private transient double aeVersion = 0;
 	private int zipSize = 0;
-	private NodeMod node = null;
-	private net.oni2.moddepot.model.File file = null;
-
-	private File exeFile = null;
-	private EExeType exeType = EExeType.OSBINARY;
-	private File iconFile = null;
-	private String workingDir = "Base";
-
-	private HashSet<Integer> incompatibilities = new HashSet<Integer>();
-	private HashSet<Integer> dependencies = new HashSet<Integer>();
-	private HashSet<Integer> unlockLevel = new HashSet<Integer>();
-
-	private long localTimestamp = 0;
+
+	private URI nodeUrl = null;
+	private String fileUrl = null;
+
+	private long createdMillis = -1;
+	private long updatedMillis = -1;
+
+	private transient File exeFile = null;
+	private transient EExeType exeType = EExeType.OSBINARY;
+	private transient File iconFile = null;
+	private transient String workingDir = "Base";
+
+	private transient HashSet<Integer> incompatibilities = new HashSet<Integer>();
+	private transient HashSet<Integer> dependencies = new HashSet<Integer>();
+	private transient HashSet<Integer> unlockLevel = new HashSet<Integer>();
+
+	private transient long localTimestamp = 0;
 
 	/**
@@ -62,5 +66,4 @@
 	 */
 	public Package(NodeMod nm) {
-		node = nm;
 		name = nm.getTitle();
 		packageNumber = nm.getPackageNumber();
@@ -73,4 +76,17 @@
 				t.addEntry(this);
 		}
+
+		createdMillis = nm.getCreated();
+		updatedMillis = nm.getUploads().firstElement().getTimestamp();
+
+		try {
+			nodeUrl = new URI(nm.getPath());
+		} catch (URISyntaxException e) {
+			e.printStackTrace();
+		}
+
+		fileUrl = nm.getUploads().firstElement().getUri_full();
+		zipSize = nm.getUploads().firstElement().getFilesize();
+
 		version = nm.getVersion();
 		submitter = nm.getName();
@@ -81,6 +97,4 @@
 				description = "<p>" + description + "</p>";
 		}
-		file = nm.getUploads().firstElement();
-		zipSize = file.getFilesize();
 
 		if (isLocalAvailable())
@@ -115,5 +129,5 @@
 			aeVersion = mi.getAeVersion();
 			bslInstallType = mi.getBslInstallType();
-			if (node == null) {
+			if (isLocalOnly()) {
 				name = mi.getName();
 				creator = mi.getCreator();
@@ -132,6 +146,6 @@
 		} else {
 			clearLocalOnlyInfo();
-			System.err.println("No config found for mod folder: "
-					+ getLocalPath().getPath());
+//			System.err.println("No config found for mod folder: "
+//					+ getLocalPath().getPath());
 		}
 		if (aeicfg.exists()) {
@@ -159,5 +173,5 @@
 			}
 		}
-		if (node == null)
+		if (isLocalOnly())
 			tool = plain.exists();
 	}
@@ -212,6 +226,6 @@
 	 */
 	public boolean isNewerAvailable() {
-		if (file != null)
-			return file.getTimestamp() > localTimestamp;
+		if (!isLocalOnly())
+			return updatedMillis > localTimestamp;
 		else
 			return false;
@@ -226,9 +240,17 @@
 
 	/**
+	 * @return If this mod is only locally available (not on Depot)
+	 */
+	public boolean isLocalOnly() {
+		return nodeUrl == null;
+	}
+
+	/**
 	 * @return Is mod installed?
 	 */
 	public boolean isInstalled() {
 		if (tool)
-			return ToolInstallationList.getInstance().isInstalled(packageNumber);
+			return ToolInstallationList.getInstance()
+					.isInstalled(packageNumber);
 		else
 			return PackageManager.getInstance().isModInstalled(this);
@@ -320,4 +342,25 @@
 
 	/**
+	 * @return the createdMillis
+	 */
+	public long getCreatedMillis() {
+		return createdMillis;
+	}
+
+	/**
+	 * @return the updatedMillis
+	 */
+	public long getUpdatedMillis() {
+		return updatedMillis;
+	}
+
+	/**
+	 * @return the fileUrl
+	 */
+	public String getFileUrl() {
+		return fileUrl;
+	}
+
+	/**
 	 * @return Is a package that is always installed?
 	 */
@@ -327,32 +370,8 @@
 
 	/**
-	 * @return Get the depot file entry
-	 */
-	public net.oni2.moddepot.model.File getFile() {
-		return file;
-	}
-
-	/**
-	 * @return Get the depot Node
-	 */
-	public NodeMod getNode() {
-		return node;
-	}
-
-	/**
 	 * @return Depot page URI
 	 */
 	public URI getUrl() {
-		if (node == null)
-			return null;
-		if (node.getPath() == null)
-			return null;
-		URI res = null;
-		try {
-			res = new URI(node.getPath());
-		} catch (URISyntaxException e) {
-			e.printStackTrace();
-		}
-		return res;
+		return nodeUrl;
 	}
 
Index: /java/installer2/src/net/oni2/aeinstaller/backend/packages/PackageManager.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/packages/PackageManager.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/packages/PackageManager.java	(revision 857)
@@ -21,4 +21,5 @@
 
 import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.XStreamException;
 import com.thoughtworks.xstream.io.xml.StaxDriver;
 
@@ -32,4 +33,5 @@
 	private HashMap<Integer, Package> mods = new HashMap<Integer, Package>();
 	private HashMap<Integer, Package> tools = new HashMap<Integer, Package>();
+	private Type localType = null;
 
 	/**
@@ -88,22 +90,9 @@
 		mods = new HashMap<Integer, Package>();
 
-		Type localType = new Type("-Local-");
+		localType = new Type("-Local-");
 		types.put("-Local-", localType);
 
 		for (TaxonomyTerm tt : DepotManager.getInstance().getTypes()) {
 			types.put(tt.getName(), new Type(tt.getName()));
-		}
-
-		HashMap<Integer, Package> modFolders = new HashMap<Integer, Package>();
-		if (Paths.getModsPath().exists()) {
-			for (File f : Paths.getModsPath().listFiles(new FileFilter() {
-				@Override
-				public boolean accept(File pathname) {
-					return pathname.isDirectory();
-				}
-			})) {
-				Package m = new Package(f);
-				modFolders.put(m.getPackageNumber(), m);
-			}
 		}
 
@@ -115,18 +104,8 @@
 				else
 					mods.put(m.getPackageNumber(), m);
-				modFolders.remove(m.getPackageNumber());
-			}
-		}
-
-		for (Package m : modFolders.values()) {
-			if (!m.isCorePackage()) {
-				localType.addEntry(m);
-				m.getTypes().add(localType);
-			}
-			if (m.isTool())
-				tools.put(m.getPackageNumber(), m);
-			else
-				mods.put(m.getPackageNumber(), m);
-		}
+			}
+		}
+
+		updateLocalData();
 	}
 
@@ -345,5 +324,88 @@
 	 */
 	boolean isModInstalled(Package m) {
-		return ModInstallationList.getInstance().isInstalled(m.getPackageNumber());
+		return ModInstallationList.getInstance().isInstalled(
+				m.getPackageNumber());
+	}
+
+	private void updateLocalData() {
+		if (Paths.getModsPath().exists()) {
+			for (File f : Paths.getModsPath().listFiles(new FileFilter() {
+				@Override
+				public boolean accept(File pathname) {
+					return pathname.isDirectory();
+				}
+			})) {
+				Package m = new Package(f);
+				HashMap<Integer, Package> map = null;
+				if (m.isTool())
+					map = tools;
+				else
+					map = mods;
+
+				if (!map.containsKey(m.getPackageNumber())) {
+					map.put(m.getPackageNumber(), m);
+					if (!m.isCorePackage()) {
+						localType.addEntry(m);
+						m.getTypes().add(localType);
+					}
+				}
+			}
+		}
+
+		for (Package p : mods.values()) {
+			p.updateLocalData();
+		}
+		for (Package p : tools.values()) {
+			p.updateLocalData();
+		}
+	}
+
+	private static XStream getXStream() {
+		XStream xs = new XStream(new StaxDriver());
+		xs.alias("Packages", PackageManager.class);
+		xs.alias("Type", Type.class);
+		xs.alias("Package", Package.class);
+		return xs;
+	}
+
+	/**
+	 * Save Depot cache instance to file
+	 * 
+	 * @param cacheFile
+	 *            File to save to
+	 */
+	public void saveToCacheFile(java.io.File cacheFile) {
+		try {
+			FileOutputStream fos = new FileOutputStream(cacheFile);
+			XStream xs = getXStream();
+			xs.toXML(this, fos);
+			fos.close();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Load cache from file
+	 * 
+	 * @param cacheFile
+	 *            File to load
+	 */
+	public static void loadFromCacheFile(java.io.File cacheFile) {
+		try {
+			FileInputStream fis = new FileInputStream(cacheFile);
+			XStream xs = getXStream();
+			Object obj = xs.fromXML(fis);
+			fis.close();
+			if (obj instanceof PackageManager) {
+				instance = (PackageManager) obj;
+				instance.updateLocalData();
+			}
+		} catch (XStreamException e) {
+		} catch (FileNotFoundException e) {
+		} catch (IOException e) {
+		}
 	}
 }
Index: /java/installer2/src/net/oni2/aeinstaller/backend/packages/download/ModDownload.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/packages/download/ModDownload.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/packages/download/ModDownload.java	(revision 857)
@@ -74,6 +74,5 @@
 		targetFolder = mod.getLocalPath();
 		try {
-			downloader = new FileDownloader(mod.getFile().getUri_full(),
-					zipFile);
+			downloader = new FileDownloader(mod.getFileUrl(), zipFile);
 			downloader.addListener(this);
 			unpacker = new Unpacker(zipFile, targetFolder, this);
@@ -130,5 +129,5 @@
 		try {
 			log = new PrintWriter(logFile);
-			log.println("Timestamp -> " + mod.getFile().getTimestamp());
+			log.println("Timestamp -> " + mod.getUpdatedMillis());
 		} catch (FileNotFoundException e) {
 			e.printStackTrace();
Index: /java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 857)
@@ -216,13 +216,13 @@
 	@DoInBackground(progressMessage = "updateDepot.title", cancelable = false, indeterminateProgress = false)
 	private void execDepotUpdate(final BackgroundEvent evt) {
-		DepotManager.loadFromCacheFile(Paths.getDepotCacheFilename());
-
+		boolean hasUpdated = false;
 		if (!RuntimeOptions.isOfflineMode()
 				&& !RuntimeOptions.isNoCacheUpdateMode()) {
 			long start = new Date().getTime();
 
-			if (DepotManager.getInstance().updateInformation())
+			if ((hasUpdated = DepotManager.getInstance().updateInformation())) {
 				DepotManager.getInstance().saveToCacheFile(
 						Paths.getDepotCacheFilename());
+			}
 
 			System.out.println("Took: " + (new Date().getTime() - start)
@@ -230,5 +230,10 @@
 		}
 
-		PackageManager.getInstance().init();
+		if (hasUpdated || !Paths.getPacManCacheFilename().exists()) {
+			PackageManager.getInstance().init();
+			PackageManager.getInstance().saveToCacheFile(
+					Paths.getPacManCacheFilename());
+		} else
+			PackageManager.loadFromCacheFile(Paths.getPacManCacheFilename());
 		tblMods.reloadData();
 		initModTypeBox();
Index: /java/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 857)
@@ -338,5 +338,5 @@
 					}
 
-					if (mod.getFile() != null) {
+					if (!mod.isLocalOnly()) {
 						// Download package
 						JMenuItem downloadPackage = new JMenuItem(
@@ -370,5 +370,5 @@
 							@Override
 							public void actionPerformed(ActionEvent arg0) {
-								if (mod.getNode() == null) {
+								if (mod.isLocalOnly()) {
 									JOptionPane.showMessageDialog(
 											null,
Index: /java/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java	(revision 856)
+++ /java/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableModel.java	(revision 857)
@@ -68,13 +68,11 @@
 				return res;
 			case 5:
-				if (mod.getNode() != null)
-					return sdf.format(new Date(
-							mod.getNode().getCreated() * 1000));
+				if (mod.getCreatedMillis() > 0)
+					return sdf.format(new Date(mod.getCreatedMillis() * 1000));
 				else
 					return null;
 			case 6:
-				if (mod.getFile() != null)
-					return sdf.format(new Date(
-							mod.getFile().getTimestamp() * 1000));
+				if (mod.getUpdatedMillis() > 0)
+					return sdf.format(new Date(mod.getUpdatedMillis() * 1000));
 				else
 					return null;
