 				updateNextLabel(loopBeginTime);
 			}
 			else if (min == loopEndTime && _looping)
+			{
+				for(i = 0; i < _labelTimes.length; ++i)
+				{
+					if (_labelTimes[i] == loopBeginTime && _nextLabelIds.indexOf(i) == -1)
+						_nextLabelIds.push(i);
+				}
+			}
+		}
+		
+		protected function updateNextLabel(currentTime: int = -1) : void
+		{
+			_nextLabelIds = [];
+			
+			if (!_labelTimes.length)
+				return;
+			
+			if (currentTime == -1)
+				currentTime = _currentTime;
+			
+			var comp : int = _reverse ? int.MIN_VALUE : int.MAX_VALUE;
+			
+			for(var i : int = 0; i < _labelTimes.length; ++i)
+			{
+				var time : int = _labelTimes[i];
+				
+				if (time < _loopBeginTime || time > _loopEndTime)
+					continue;
+				
+				if ((_reverse && time <= currentTime) || (!_reverse && time >= currentTime))
+				{
+					if ((_reverse && time > comp) || (!_reverse && time < comp))
+					{
+						comp = time;
+						_nextLabelIds = [i];
+					}
+					else if (time == comp)
+					{
+						_nextLabelIds.push(i);
+					}
+				}
+			}
+			
+			if (!_nextLabelIds.length)
+			{
+				updateNextLabel(loopBeginTime);
+			}
+			else if (comp == loopEndTime && _looping)
 			{
 				for(i = 0; i < _labelTimes.length; ++i)
 				{

			return this;
		}
		
		protected function updateNextLabel(currentTime : int = -1) : void
		{
			if (reverse)
				return updateNextLabelReverse(currentTime);

			}
			else
			{
				if (_reverse && ((previousTime > nextLabelTime && nextLabelTime >= newTime) || newTime == nextLabelTime))
					trigger = true;
				else if (!_reverse && ((previousTime < nextLabelTime && nextLabelTime <= newTime) || newTime == nextLabelTime))
					trigger = true;
			}
			if (trigger)
