 			if (destinationProjectionSRS == null || destinationProjectionSRS == '')
 				return geometryColumn;
 			
-			// check the cache
-			var srsCache:Object = _reprojectedColumnCache[geometryColumn] as Object;
-			if (srsCache == null)
-			{
-				srsCache = new Object(); // destinationSRS -> ProxyColumn
-				_reprojectedColumnCache[geometryColumn] = srsCache;
+			// check the cache
+			var worker:WorkerThread = _reprojectedColumnCache_d2d_col_srs.get(geometryColumn, destinationProjectionSRS);
+			
+			// if worker doesn't exist yet or was disposed, (re)create it
+			if (!worker || objectWasDisposed(worker))
+			{
+				worker = new WorkerThread(this, geometryColumn, destinationProjectionSRS);
+				_reprojectedColumnCache_d2d_col_srs.set(geometryColumn, destinationProjectionSRS, worker);
 			}
-			var reprojectedColumn:ProxyColumn = srsCache[destinationProjectionSRS] as ProxyColumn;
-
-			// if reprojected column is cached, return it
-			if (reprojectedColumn)
-				return reprojectedColumn;
-
-			// otherwise, create a proxy that will provide the reprojected shapes and save it in the cache
-			reprojectedColumn = newDisposableChild(this, ProxyColumn);
-			srsCache[destinationProjectionSRS] = reprojectedColumn;
-			
-			// create a WorkerThread that will reproject the geometries
-			new WorkerThread(this, geometryColumn, reprojectedColumn, destinationProjectionSRS);
-			
-			return reprojectedColumn;
+
+			return worker.reprojectedColumn;
 		}
 		
 		/**



		/**
		 * This is a multi-dimensional lookup:   unprojectedColumn -> Object, destinationSRS -> ProxyColumn
		 * Example: _reprojectedColumnCache[column][destinationSRS] is a ProxyColumn containing geometries reprojected to the given SRS.
		 */		
		private const _reprojectedColumnCache:Dictionary = new Dictionary(true); // weak links to be gc-friendly
		
		/**
		 * @inheritDoc

{
	import flash.geom.Point;
	import flash.utils.ByteArray;
	
	import org.openscales.proj4as.Proj4as;
	import org.openscales.proj4as.ProjConstants;
