public PackageContent ExtractPackageInfo(Core.Package package) {
			string tempPath = Path.Combine(this.TempFolder, Guid.NewGuid().ToString("N").ToUpper());
			package.Extract(tempPath);
			AppDomain tempDomain = ReflectionHelper.LoadAppDomain(tempPath, new Uri(this.GetType().Assembly.CodeBase).LocalPath);
			try {
				object handle;
				try {
					handle = tempDomain.CreateInstanceAndUnwrap(typeof (PackageScanner).Assembly.GetName().Name, typeof (PackageScanner).FullName);
				} catch (FileNotFoundException) {
					throw new AppServerException("Package does not contain required assembly " + typeof (PackageScanner).Assembly.Name());
				}
				PackageScanner scanner = handle as PackageScanner;
				if (scanner == null) throw new Exception("Could not load package scanner");
				PackageContent info = scanner.Run();
				Logger.Info(this, "Scanner found " + info.Bootstrappers.Count + " bootstrapper(s) and " + info.Updaters.Count + " updater(s)");
				string manifestFile = Path.Combine(tempPath, "manifest.xml");
				if (File.Exists(manifestFile)) {
					Logger.Debug(this, "Loading package manifest " + manifestFile + "...");
					try {
						using (FileStream stream = File.Open(manifestFile, FileMode.Open, FileAccess.Read)) {
							info.Manifest = XmlSerializer.Deserialize<Manifest>(stream);
							Logger.Debug(this, "Manifest loaded");
						}
					} catch (Exception ex) {
						Logger.Error("Failed to load manifest: " + ex.Message);
					}
				} else Logger.Debug(this, "Package contains no manifest");
				return (info);
			} finally {
				AppDomain.Unload(tempDomain);
				try {
					Directory.Delete(tempPath, true);
				} catch (Exception ex) {
					Logger.Warn(this, "Failed to remove temp folder " + tempPath + ": " + ex.Message);
				}
			}
		}