         public function get bufferLength() : Number {
             switch(_hls.seekState) {
                 case HLSSeekStates.SEEKING:
-                    return  Math.max(0, max_pos - _seekPositionRequested);
+                    /* max_pos is a relative max, seekPositionRequested is absolute. we need to add _playlistSlidingMain
+                       in order to compare apple to apple */
+                    return  Math.max(0, max_pos + _playlistSlidingMain - _seekPositionRequested);
                 case HLSSeekStates.SEEKED:
                     if (audioExpected) {
                         if (videoExpected) {


        public function appendTags(fragmentType : int, fragLevel : int, fragSN : int, tags : Vector.<FLVTag>, min_pts : Number, max_pts : Number, continuity : int, startPosition : Number) : void {
            // compute playlist sliding here :  it is the difference between  expected start position and real start position
            var sliding:Number = 0, _nextRelativeStartPos: Number = startPosition + (max_pts - min_pts) / 1000, headerAppended : Boolean = false, metaAppended : Boolean = false;
            // compute sliding in case of live playlist, or in case of VoD playlist that slided in the past (live sliding ended playlist)
            if(_hls.type == HLSTypes.LIVE  || _playlistSlidingMain || _playlistSlidingAltAudio) {
                if(fragmentType == HLSLoaderTypes.FRAGMENT_MAIN) {
                    // if -1 : it is not the first appending for this fragment type : we can compute playlist sliding
                    if(_nextExpectedAbsoluteStartPosMain !=-1) {
                        sliding = _playlistSlidingMain = _nextExpectedAbsoluteStartPosMain - startPosition;
                    }
                    _nextExpectedAbsoluteStartPosMain = _nextRelativeStartPos + sliding;
                } else if(fragmentType == HLSLoaderTypes.FRAGMENT_ALTAUDIO) {
                    // if -1 : it is not the first appending for this fragment type : we can compute playlist sliding
                    if(_nextExpectedAbsoluteStartPosAltAudio !=-1) {
                        sliding = _playlistSlidingAltAudio = _nextExpectedAbsoluteStartPosAltAudio - startPosition;
                    }
                    _nextExpectedAbsoluteStartPosAltAudio = _nextRelativeStartPos + sliding;
                }
            }

            var fragIdx : int;
            if(fragmentType == HLSLoaderTypes.FRAGMENT_MAIN) {
                if(fragLevel != _fragMainLevel || fragSN != _fragMainSN) {
                    _fragMainLevel = fragLevel;
                    _fragMainSN = fragSN;
                    _fragMainIdx++;
                    CONFIG::LOGGING {
                        Log.debug('new main frag,start/sliding/idx:' + startPosition + '/' + sliding + '/' + _fragMainIdx);
                    }
                }
                fragIdx = _fragMainIdx;
            } else {
                if(fragLevel != _fragAltAudioLevel || fragSN != _fragAltAudioSN) {
                    _fragAltAudioLevel = fragLevel;
                    _fragAltAudioSN = fragSN;
                    _fragAltAudioIdx++;
                    CONFIG::LOGGING {
                        Log.debug('new altaudio frag,start/sliding/idx:' + startPosition + '/' + sliding + '/' + _fragAltAudioIdx);
                    }

            // loop through all tags and find index position of header tags located before start position
            for (var i : int = 0; i < tags.length; i++) {
                var data : FLVData = tags[i];
                if (data.positionAbsolute <= absoluteStartPosition) {
                    lastIdx = i;
                    // current tag is before requested start position
                    // grab AVC/AAC/DISCONTINUITY/METADATA/KEYFRAMES tag located just before
