 			private var _liveStallStartTime:Date;
 			
 			private var hasStarted:Boolean = false;// true after we have played once, checked before automatically switching to a default stream
+			
+			private var streamIsGood:Boolean = false;// true if we have gotten some data from the stream
+			private var isWaitingForData:Boolean = false;// true if we can't find our data but have already started a valid stream
+			private var retryAttemptStartCount:Number;// this is timer's count at the moment we start the timer
+			private var retryAttemptWaitTime:Number = 2.0;// this is how long we will wait after a URL error in seconds before trying to get the segment again
+			private var retryAttemptMaxTime:Number = 10;// this is how long in seconds we will try to reset after a URL error before we start moving forward in the stream
+			private var recognizeBadStreamTime:Number = 20;// this is how long in seconds we will attempt to recover after a URL error before we give up completely
+			private var timeSinceWait:Number = 0;// this is how long we have currently been waiting for a retry attempt. Used to determine when we should retry again
+			private var retryAttemptCount:Number = 0;// this is how many times we have tried to recover from a URL error in a row. Used to assist in retry timing
 
 			private static const HIGH_PRIORITY:int = int.MAX_VALUE;
 			

					}
				}
				
			private var _desiredBufferTime_Min:Number = 0;
			private var _desiredBufferTime_Max:Number = 0;
			

				private function onDownloadError(event:HTTPStreamingEvent):void
				{
					// We map all URL errors to Play.StreamNotFound.
					// if this was a good stream we want to wait to see if the URL error was a fluke
					if (streamIsGood)
					{
						setState(HTTPStreamingState.WAIT);
						isWaitingForData = true;
						retryAttemptStartCount = _mainTimer.currentCount;
						return;
					}
					
					dispatchEvent
					( new NetStatusEvent
						( NetStatusEvent.NET_STATUS
