 			}
 		}
 		
-		/**
-		 * @private
-		 * 
-		 * Attempts to use the appendsBytes method. Do noting if this is not compiled
+		private function keepBufferFed():void
+		{
+			// Check the actual amount of content present.
+			if(super.bufferLength >= bufferFeedMin)
+				return;
+
+			var curTagOffset:int = 0;
+
+			while(super.bufferLength < (bufferFeedMin + bufferFeedAmount)
+			      && (pendingTags.length - curTagOffset) > 0)
+			{
+				// Append some tags.
+				var buffer:ByteArray = new ByteArray();
+				var tag:FLVTag = pendingTags[curTagOffset];
+				buffer.length = FLVTag.TAG_HEADER_BYTE_COUNT + tag.dataSize;
+				tag.write(buffer);
+				curTagOffset++;
+
+				// Do writing.
+				trace("Writing " + buffer.length + " bytes");
+				if(writeToMasterBuffer)
+					_masterBuffer.writeBytes(buffer);				
+				appendBytes(buffer);
+			}
+
+			// Erase the consumed tags.
+			if(curTagOffset)
+			{
+				trace("Submitted " + curTagOffset + " tags, " + (pendingTags.length - curTagOffset) + " left");
+				pendingTags.splice(0, curTagOffset);				
+			}
+		}
+
+		public override function get bufferLength():Number
+		{
+			if(pendingTags.length == 0)
+				return super.bufferLength;
+
+			// Get active range of pending tags.
+			var minTime:Number = Number.MAX_VALUE, maxTime:Number = 0.0;
+			for(var i:int=0; i<pendingTags.length; i++)
+			{
+				var curTag:FLVTag = pendingTags[i];
+				var curTime:Number = curTag.timestamp;
+				if(curTime < minTime)
+					minTime = curTime;
+				if(curTime > maxTime)
+					maxTime = curTime;
+			}
+
+			var len:Number = (maxTime - minTime) / 1000 + super.bufferLength;
+			trace("CALCULATED LENGTH TO BE " + len + " (" + (maxTime/1000) + " , " + (minTime/1000) + ", " + super.bufferLength + ")");
+			return len;
+		}
+
+
+		private function onBufferTag(tag:FLVTag):Boolean
+		{
+			trace("Got tag " + tag);
+			// Do filter logic here.
+
+			// Add to the queue.
+			pendingTags.push(tag);
+
+			return true;
+		}
+
+		/**
+		 * @private
+		 * 
+		 * Attempts to use the appendsBytes method. Do nothing if this is not compiled
 		 * for an Argo player or newer.
 		 */
 		private function attemptAppendBytes(bytes:ByteArray):void
 		{
-			if(writeToMasterBuffer)
-				_masterBuffer.writeBytes(bytes);
-
-			CONFIG::FLASH_10_1
-			{
-				appendBytes(bytes);
-			}
+			trace("Parsing " + bytes.length);
+
+			// Parse to FLV tags and insert into queue.
+			bufferParser.parse(bytes, true, onBufferTag);
+
+			// Sort tags.
+			pendingTags.sort(function(a:FLVTag, b:FLVTag):int
+			{
+				return a.timestamp - b.timestamp;
+			});
+
+			// Feed Flash buffer if needed.
+			keepBufferFed();
 		}
 		
 		/**

						// If the timer doesn't yet exist, create it, setting the delay to twice the maximum desired buffer time
						streamTooSlowTimer = new Timer(_desiredBufferTime_Max * 2000);

						streamTooSlowTimer.addEventListener(TimerEvent.TIMER, function(timerEvent:TimerEvent = null):void {

							try
							{
								// Check we have a valid stream to switch to.

			var header:FLVHeader = new FLVHeader();
			var headerBytes:ByteArray = new ByteArray();
			header.write(headerBytes);
			appendBytes(headerBytes);
			
			// Initialize ourselves.
			_mainTimer.start();
