 			{
 				// ignore error
 			}
+		}
+		/**
+		 * @return true if data was loaded from cache
+		 */
+		private static function loadCache(source:WeaveAnalystDataSource):Boolean
+		{
+			var currentState:Object = getSessionState(source);
+			var sourceName:String = WeaveAPI.globalHashMap.getName(source);
+			if (cache && cache[sourceName])
+			{
+				if (WeaveAPI.SessionManager.computeDiff(currentState, cache[sourceName][CACHE_STATE]) === undefined)
+				{
+					setSessionState(source.outputCSV, cache[sourceName][CACHE_OUTPUT_STATE]);
+					return true;
+				}
+			}
+			return false;
 		}
 		private static function saveCache(source:WeaveAnalystDataSource):void
 		{

				_service.invokeAsyncMethod('runScriptWithInputs', [scriptName.value, simpleInputs, columnData]),
				handleScriptResult,
				handleScriptError,
				currentState
			);
		}
		

			promise.depend(url, scriptName, inputs, hierarchyRefresh);
			if (!cacheFile)
			{
				// register static LinkableFile as a child of the globalHashMap so it will not be disposed when an instance of this data source is disposed.
				cacheFile = registerLinkableChild(WeaveAPI.globalHashMap, new LinkableFile(URLRequestUtils.LOCAL_FILE_URL_SCHEME + CACHE_FILE_NAME), parseCacheFile);
			}
			registerLinkableChild(this, cacheFile, runScript);
		}
		
		private static const CACHE_STATE:String = 'sessionState';
		private static const CACHE_OUTPUT_STATE:String = 'outputCSV';
		private static const CACHE_FILE_NAME:String = 'WeaveAnalystDataSource.cache';
		private static var cacheFile:LinkableFile = null;
		private static var cache:Object;
		private static function parseCacheFile():void
