Index: OnlineVideos.MediaPortal1/Player/OnlineVideosPlayer.cs
===================================================================
--- OnlineVideos.MediaPortal1/Player/OnlineVideosPlayer.cs	(revision 1588)
+++ OnlineVideos.MediaPortal1/Player/OnlineVideosPlayer.cs	(working copy)
@@ -38,7 +38,7 @@
         }      
 
         float PercentageBuffered;
-
+        private double dBufferTime = 0.0d;
         DateTime lastProgressCheck = DateTime.MinValue;
         public override void Process()
         {
@@ -55,10 +55,26 @@
                         ((IAMOpenProgress)sourceFilter).QueryProgress(out total, out current);
                         PercentageBuffered = (float)current / (float)total * 100.0f;
                         GUIPropertyManager.SetProperty("#TV.Record.percent3", PercentageBuffered.ToString());
+                        if (PercentageBuffered > 0.0f)
+                        {
+                            dBufferTime = ((PercentageBuffered * m_dDuration) / 100) - 3;//3 sec margin
+                        }
+                        if (dBufferTime < m_dCurrentPos && dBufferTime != 0.0d)
+                        {
+                            if (g_Player.Speed > 1)
+                            {
+                                g_Player.Speed = 1;
+                            }
+                        }
                     }
+                    else
+                    {
+                        dBufferTime = 0.0d;
+                    }
                 }
                 catch (Exception ex)
                 {
+                    dBufferTime = 0.0d;
                     Log.Instance.Warn("Error Quering Progress: {0}", ex.Message);
                 }
                 finally
@@ -69,6 +85,110 @@
             base.Process();
         }
 
+        public override void SeekRelative(double dTime)
+        {
+            if (m_state != PlayState.Init)
+            {
+                if (mediaCtrl != null && mediaPos != null)
+                {
+                    double dCurTime;
+                    mediaPos.get_CurrentPosition(out dCurTime);
+                    dTime = dCurTime + dTime;
+                    if (dTime < 0.0d)
+                    {
+                        dTime = 0.0d;
+                    }
+                    if (dTime > dBufferTime && dBufferTime != 0.0d)
+                    {
+                        dTime = dBufferTime;
+                    }
+                    if (dTime < Duration && dTime > 0.0d)
+                    {
+                        mediaPos.put_CurrentPosition(dTime);
+                    }
+                }
+            }
+        }
+
+        public override void SeekAbsolute(double dTime)
+        {
+            if (m_state != PlayState.Init)
+            {
+                if (mediaCtrl != null && mediaPos != null)
+                {
+                    if (dTime < 0.0d)
+                    {
+                        dTime = 0.0d;
+                    }
+                    if (dTime > dBufferTime && dBufferTime != 0.0d)
+                    {
+                        dTime = dBufferTime;
+                    }
+                    if (dTime < Duration && dTime > 0.0d)
+                    {
+                        mediaPos.put_CurrentPosition(dTime);
+                    }
+                }
+            }
+        }
+
+        public override void SeekRelativePercentage(int iPercentage)
+        {
+            if (m_state != PlayState.Init)
+            {
+                if (mediaCtrl != null && mediaPos != null)
+                {
+                    double dCurrentPos;
+                    mediaPos.get_CurrentPosition(out dCurrentPos);
+                    double dDuration = Duration;
+                    double fCurPercent = (dCurrentPos / Duration) * 100.0d;
+                    double fOnePercent = Duration / 100.0d;
+                    fCurPercent = fCurPercent + (double)iPercentage;
+                    fCurPercent *= fOnePercent;
+                    if (fCurPercent < 0.0d)
+                    {
+                        fCurPercent = 0.0d;
+                    }
+                    if (fCurPercent > dBufferTime && dBufferTime != 0.0d)
+                    {
+                        fCurPercent = dBufferTime;
+                    }
+                    if (fCurPercent < Duration && fCurPercent > 0.0d)
+                    {
+                        mediaPos.put_CurrentPosition(fCurPercent);
+                    }
+                }
+            }
+        }
+
+        public override void SeekAsolutePercentage(int iPercentage)
+        {
+            if (m_state != PlayState.Init)
+            {
+                if (mediaCtrl != null && mediaPos != null)
+                {
+                    if (iPercentage < 0)
+                    {
+                        iPercentage = 0;
+                    }
+                    if (iPercentage >= 100)
+                    {
+                        iPercentage = 100;
+                    }
+                    double fPercent = Duration / 100.0f;
+                    fPercent *= (double)iPercentage;
+                    if (fPercent > dBufferTime && dBufferTime != 0.0d)
+                    {
+                        fPercent = dBufferTime;
+                    }
+                    if (fPercent > 0.0f)
+                    {
+                        mediaPos.put_CurrentPosition(fPercent);
+                    }
+                }
+            }
+        }
+
         public bool BufferingStopped { get; protected set; }
         public void StopBuffering() { BufferingStopped = true; }
 
@@ -227,6 +347,7 @@
                 {
                     DirectShowUtil.RenderUnconnectedOutputPins(graphBuilder, sourceFilter);
                     PercentageBuffered = 100.0f; // no progress reporing possible
+                    dBufferTime = 0.0d;
                     GUIPropertyManager.SetProperty("#TV.Record.percent3", PercentageBuffered.ToString());
                     PlaybackReady = true;
                 }
