diff --git a/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java b/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java
index a9152ab..ac4b847 100644
--- a/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java
+++ b/tcl/plugins/org.eclipse.dltk.tcl.core/packages/org/eclipse/dltk/tcl/core/TclPackagesManager.java
@@ -21,6 +21,8 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.RuntimePerformanceMonitor;
+import org.eclipse.dltk.core.RuntimePerformanceMonitor.PerformanceNode;
 import org.eclipse.dltk.core.environment.IDeployment;
 import org.eclipse.dltk.core.environment.IExecutionEnvironment;
 import org.eclipse.dltk.core.environment.IFileHandle;
@@ -57,40 +59,57 @@
 	private static Resource infos = null;
 	private static final Map<String, Resource> projectInfos = new HashMap<String, Resource>();
 
-	public static synchronized List<TclPackageInfo> getPackageInfos(
+	public static List<TclPackageInfo> getPackageInfos(
 			IInterpreterInstall install, Set<String> packageNames,
 			boolean fetchIfRequired) {
 		initialize();
 		TclInterpreterInfo interpreterInfo = getTclInterpreter(install);
-		return Collections.unmodifiableList(getPackagesForInterpreter(
-				packageNames, fetchIfRequired, interpreterInfo, install));
+		List<TclPackageInfo> collection = null;
+		synchronized (TclPackagesManager.class) {
+			collection = Collections
+					.unmodifiableList(new ArrayList<TclPackageInfo>(
+							getPackagesForInterpreter(packageNames,
+									fetchIfRequired, interpreterInfo, install)));
+		}
+		return collection;
 	}
 
-	public static synchronized List<TclPackageInfo> getPackageInfos(
+	public static List<TclPackageInfo> getPackageInfos(
 			IInterpreterInstall install) {
 		initialize();
 		TclInterpreterInfo interpreterInfo = getTclInterpreter(install);
-		return Collections.unmodifiableList(interpreterInfo.getPackages());
+		List<TclPackageInfo> collection = null;
+		synchronized (TclPackagesManager.class) {
+			collection = Collections
+					.unmodifiableList(new ArrayList<TclPackageInfo>(
+							interpreterInfo.getPackages()));
+		}
+		return collection;
 	}
 
-	public static synchronized TclPackageInfo getPackageInfo(
-			IInterpreterInstall install, String name, boolean fetchIfRequired) {
+	public static TclPackageInfo getPackageInfo(IInterpreterInstall install,
+			String name, boolean fetchIfRequired) {
 		initialize();
 		TclInterpreterInfo interpreterInfo = getTclInterpreter(install);
 		EList<TclPackageInfo> packages = interpreterInfo.getPackages();
-		for (TclPackageInfo tclPackageInfo : packages) {
-			if (name.equals(tclPackageInfo.getName())) {
-				if (tclPackageInfo.isFetched() || !fetchIfRequired) {
-					return tclPackageInfo;
-				} else {
-					Set<TclPackageInfo> toFetch = new HashSet<TclPackageInfo>();
-					toFetch.add(tclPackageInfo);
-					fetchSources(toFetch, install, interpreterInfo);
-					return tclPackageInfo;
+		Set<TclPackageInfo> toFetch = new HashSet<TclPackageInfo>();
+		TclPackageInfo result = null;
+
+		synchronized (TclPackagesManager.class) {
+			for (TclPackageInfo tclPackageInfo : packages) {
+				if (name.equals(tclPackageInfo.getName())) {
+					if (tclPackageInfo.isFetched() || !fetchIfRequired) {
+						return tclPackageInfo;
+					} else {
+						toFetch.add(tclPackageInfo);
+						fetchSources(toFetch, install, interpreterInfo);
+						result = tclPackageInfo;
+						break;
+					}
 				}
 			}
 		}
-		return null;
+		return result;
 	}
 
 	public static Set<TclPackageInfo> getDependencies(
@@ -112,33 +131,42 @@
 		return null;
 	}
 
-	private static synchronized TclInterpreterInfo getTclInterpreter(
+	private static TclInterpreterInfo getTclInterpreter(
 			IInterpreterInstall install) {
-		EList<EObject> contents = infos.getContents();
+		return getTclInterpreter(install, true);
+	}
+
+	private static TclInterpreterInfo getTclInterpreter(
+			IInterpreterInstall install, boolean allowCreate) {
 		TclInterpreterInfo interpreterInfo = null;
 		String interpreterLocation = install.getInstallLocation().toOSString();
 		String environmentId = install.getInstallLocation().getEnvironmentId();
-		for (EObject eObject : contents) {
-			if (eObject instanceof TclInterpreterInfo) {
-				TclInterpreterInfo info = (TclInterpreterInfo) eObject;
-				String location = info.getInstallLocation();
-				String name = info.getName();
-				String env = info.getEnvironment();
-				if (interpreterLocation.equals(location)
-						&& install.getName().equals(name) && env != null
-						&& env.equals(environmentId)) {
-					interpreterInfo = info;
-					break;
+		synchronized (TclPackagesManager.class) {
+			for (EObject eObject : infos.getContents()) {
+				if (eObject instanceof TclInterpreterInfo) {
+					TclInterpreterInfo info = (TclInterpreterInfo) eObject;
+					String location = info.getInstallLocation();
+					String name = info.getName();
+					String env = info.getEnvironment();
+					if (interpreterLocation.equals(location)
+							&& install.getName().equals(name) && env != null
+							&& env.equals(environmentId)) {
+						interpreterInfo = info;
+						break;
+					}
 				}
 			}
-		}
-		if (interpreterInfo == null) {
-			interpreterInfo = TclPackagesFactory.eINSTANCE
-					.createTclInterpreterInfo();
-			interpreterInfo.setInstallLocation(interpreterLocation);
-			interpreterInfo.setName(install.getName());
-			interpreterInfo.setEnvironment(environmentId);
-			infos.getContents().add(interpreterInfo);
+			if (interpreterInfo == null) {
+				if (!allowCreate) {
+					return null;
+				}
+				interpreterInfo = TclPackagesFactory.eINSTANCE
+						.createTclInterpreterInfo();
+				interpreterInfo.setInstallLocation(interpreterLocation);
+				interpreterInfo.setName(install.getName());
+				interpreterInfo.setEnvironment(environmentId);
+				infos.getContents().add(interpreterInfo);
+			}
 		}
 		if (!interpreterInfo.isFetched()
 				|| interpreterInfo.getFetchedAt() == null
@@ -183,17 +211,23 @@
 
 	private static void fetchPackagesForInterpreter(
 			IInterpreterInstall install, TclInterpreterInfo interpreterInfo) {
+		PerformanceNode p = RuntimePerformanceMonitor.begin();
 		IExecutionEnvironment exeEnv = install.getExecEnvironment();
-		List<String> content = deployExecute(exeEnv, install
-				.getInstallLocation().toOSString(),
+		if (exeEnv == null) {
+			return;
+		}
+		List<String> content = deployExecute(exeEnv, install,
 				new String[] { "get-pkgs" }, install //$NON-NLS-1$
 						.getEnvironmentVariables());
-		if (content != null) {
-			processContent(content, false, true, interpreterInfo);
-			interpreterInfo.setFetched(true);
-			interpreterInfo.setFetchedAt(new Date());
-			save();
+		synchronized (TclPackagesManager.class) {
+			if (content != null) {
+				processContent(content, false, true, interpreterInfo);
+				interpreterInfo.setFetched(true);
+				interpreterInfo.setFetchedAt(new Date());
+				save();
+			}
 		}
+		p.done("Tcl", "Fetch interpreter packages info", 0);
 	}
 
 	public static void save() {
@@ -201,7 +235,9 @@
 			try {
 				infos.save(null);
 			} catch (IOException e) {
-				TclPlugin.error(e);
+				if (DLTKCore.DEBUG) {
+					// TclPlugin.error(e);
+				}
 			}
 		}
 		synchronized (projectInfos) {
@@ -255,7 +291,7 @@
 		return null;
 	}
 
-	private static void processContent(List<String> content,
+	private static synchronized void processContent(List<String> content,
 			boolean markAsFetched, boolean purgePackages,
 			TclInterpreterInfo info) {
 		String text = getXMLContent(content);
@@ -298,8 +334,8 @@
 		}
 	}
 
-	private static TclPackageInfo getCreatePackage(TclInterpreterInfo info,
-			String name) {
+	private static synchronized TclPackageInfo getCreatePackage(
+			TclInterpreterInfo info, String name) {
 		TclPackageInfo packageInfo = null;
 		for (TclPackageInfo pkgInfo : info.getPackages()) {
 			if (pkgInfo.getName().equals(name)) {
@@ -342,15 +378,21 @@
 			TclInterpreterInfo interpreterInfo, IInterpreterInstall install) {
 		Set<TclPackageInfo> result = new HashSet<TclPackageInfo>();
 		Set<TclPackageInfo> toFetch = new HashSet<TclPackageInfo>();
-		for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) {
-			if (packageName.contains(tclPackageInfo.getName())) {
-				processPackage(tclPackageInfo, result, toFetch, fetchIfRequired);
+		synchronized (TclPackagesManager.class) {
+			for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) {
+				if (packageName.contains(tclPackageInfo.getName())) {
+					processPackage(tclPackageInfo, result, toFetch,
+							fetchIfRequired);
+				}
 			}
 		}
 		fetchSources(toFetch, install, interpreterInfo);
-		for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) {
-			if (packageName.contains(tclPackageInfo.getName())) {
-				processPackage(tclPackageInfo, result, toFetch, fetchIfRequired);
+		synchronized (TclPackagesManager.class) {
+			for (TclPackageInfo tclPackageInfo : interpreterInfo.getPackages()) {
+				if (packageName.contains(tclPackageInfo.getName())) {
+					processPackage(tclPackageInfo, result, toFetch,
+							fetchIfRequired);
+				}
 			}
 		}
 		List<TclPackageInfo> resultList = new ArrayList<TclPackageInfo>();
@@ -381,10 +423,16 @@
 		if (toFetch.size() == 0) {
 			return;
 		}
+		PerformanceNode p = RuntimePerformanceMonitor.begin();
 		IExecutionEnvironment exeEnv = install.getExecEnvironment();
 		IDeployment deployment = exeEnv.createDeployment();
+		if (deployment == null) {
+			return;
+		}
 		IFileHandle script = deploy(deployment);
+
 		if (script == null) {
+			deployment.dispose();
 			return;
 		}
 
@@ -404,6 +452,7 @@
 			if (DLTKCore.DEBUG) {
 				e1.printStackTrace();
 			}
+			deployment.dispose();
 			return;
 		}
 		IFileHandle file = deployment.getFile(packagesPath);
@@ -422,19 +471,23 @@
 			if (DLTKCore.DEBUG) {
 				e.printStackTrace();
 			}
+			deployment.dispose();
 		}
 		if (process == null) {
+			deployment.dispose();
 			return;
 		}
 		List<String> output = ProcessOutputCollector.execute(process);
-		deployment.dispose();
+		// deployment.dispose();
 		processContent(output, true, false, interpreterInfo);
 
 		// Mark all toFetch as fetched.
 		for (TclPackageInfo info : toFetch) {
 			info.setFetched(true);
 		}
+		deployment.dispose();
 		save();
+		p.done("Tcl", "Fetch interpreter package sources", 0);
 	}
 
 	private static URI getInfoLocation() {
@@ -457,7 +510,7 @@
 		}
 	}
 
-	private static void initialize() {
+	private synchronized static void initialize() {
 		if (infos == null) {
 			final URI location = getInfoLocation();
 			infos = new XMIResourceImpl(location);
@@ -503,7 +556,7 @@
 	}
 
 	private static List<String> deployExecute(IExecutionEnvironment exeEnv,
-			String installLocation, String[] arguments,
+			IInterpreterInstall install, String[] arguments,
 			EnvironmentVariable[] env) {
 		IDeployment deployment = exeEnv.createDeployment();
 		if (deployment == null) {
@@ -511,6 +564,7 @@
 		}
 		IFileHandle script = deploy(deployment);
 		if (script == null) {
+			deployment.dispose();
 			return null;
 		}
 
@@ -526,14 +580,15 @@
 
 		Process process = null;
 		try {
-			process = ScriptLaunchUtil.runScriptWithInterpreter(exeEnv,
-					installLocation, config);
+			process = ScriptLaunchUtil.runScriptWithInterpreter(exeEnv, install
+					.getInstallLocation().toOSString(), config);
 		} catch (CoreException e) {
 			if (DLTKCore.DEBUG) {
 				e.printStackTrace();
 			}
 		}
 		if (process == null) {
+			deployment.dispose();
 			return null;
 		}
 		List<String> output = ProcessOutputCollector.execute(process);
@@ -603,13 +658,16 @@
 	public static synchronized void removeInterpreterInfo(
 			IInterpreterInstall install) {
 		initialize();
-		TclInterpreterInfo info = getTclInterpreter(install);
-		info.getPackages().clear();
-		infos.getContents().remove(info);
-		save();
+		final TclInterpreterInfo info = getTclInterpreter(install, false);
+		if (info != null) {
+			info.getPackages().clear();
+			info.setFetched(false);
+			info.setFetchedAt(null);
+			save();
+		}
 	}
 
-	public static synchronized Set<String> getPackageInfosAsString(
+	public static Set<String> getPackageInfosAsString(
 			IInterpreterInstall install) {
 		initialize();
 		Set<String> result = new HashSet<String>();
@@ -619,4 +677,5 @@
 		}
 		return result;
 	}
+
 }
