diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
index bedd20d..87314ea 100644
--- a/mythtv/libs/libmythtv/avformatdecoder.cpp
+++ b/mythtv/libs/libmythtv/avformatdecoder.cpp
@@ -920,6 +920,9 @@ int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo,
 
     InitByteContext();
 
+    if (ringBuffer->IsStream() && !ringBuffer->StartFromBeginning())
+        return -1;
+
     int err = av_open_input_stream(&ic, ic->pb, filename, fmt, &params);
     if (err < 0)
     {
@@ -931,7 +934,7 @@ int AvFormatDecoder::OpenFile(RingBuffer *rbuffer, bool novideo,
     int ret = FindStreamInfo();
 
     // Reset DVD/bluray ringbuffers
-    if (!ringBuffer->StartFromBeginning())
+    if (ringBuffer->IsDisc() && !ringBuffer->StartFromBeginning())
         return -1;
     ringBuffer->IgnoreWaitStates(false);
 
diff --git a/mythtv/libs/libmythtv/ringbuffer.cpp b/mythtv/libs/libmythtv/ringbuffer.cpp
index feaf411..405a304 100644
--- a/mythtv/libs/libmythtv/ringbuffer.cpp
+++ b/mythtv/libs/libmythtv/ringbuffer.cpp
@@ -114,7 +114,8 @@ RingBuffer *RingBuffer::Create(
     bool is_dvd = false;
     bool is_bd  = false;
 
-    if (lfilename.startsWith("http://"))
+    if (lfilename.startsWith("http://") ||
+        lfilename.contains(QRegExp("^rtmp.?://")))
     {
         return new StreamingRingBuffer(lfilename);
     }
@@ -1413,6 +1414,11 @@ void RingBuffer::IgnoreLiveEOF(bool ignore)
     rwlock.unlock();
 }
 
+const StreamingRingBuffer  *RingBuffer::Stream(void) const
+{
+    return dynamic_cast<const StreamingRingBuffer*>(this);
+}
+
 const DVDRingBuffer *RingBuffer::DVD(void) const
 {
     return dynamic_cast<const DVDRingBuffer*>(this);
@@ -1433,4 +1439,9 @@ BDRingBuffer  *RingBuffer::BD(void)
     return dynamic_cast<BDRingBuffer*>(this);
 }
 
+StreamingRingBuffer  *RingBuffer::Stream(void)
+{
+    return dynamic_cast<StreamingRingBuffer*>(this);
+}
+
 /* vim: set expandtab tabstop=4 shiftwidth=4: */
diff --git a/mythtv/libs/libmythtv/ringbuffer.h b/mythtv/libs/libmythtv/ringbuffer.h
index 69a5c0b..157b452 100644
--- a/mythtv/libs/libmythtv/ringbuffer.h
+++ b/mythtv/libs/libmythtv/ringbuffer.h
@@ -27,6 +27,7 @@ extern "C" {
 class ThreadedFileWriter;
 class DVDRingBuffer;
 class BDRingBuffer;
+class StreamingRingBuffer;
 class LiveTVChain;
 class RemoteFile;
 
@@ -69,10 +70,13 @@ class MTV_PUBLIC RingBuffer : protected QThread
     bool IsDisc(void) const { return IsDVD() || IsBD(); }
     bool IsDVD(void)  const { return DVD() != NULL;     }
     bool IsBD(void)   const { return BD()  != NULL;     }
+    bool IsStream(void) const { return Stream() != NULL;  }
+    const StreamingRingBuffer *Stream(void) const;
     const DVDRingBuffer *DVD(void) const;
     const BDRingBuffer  *BD(void)  const;
     DVDRingBuffer *DVD(void);
     BDRingBuffer  *BD(void);
+    StreamingRingBuffer *Stream(void);
     virtual bool StartFromBeginning(void)                   { return true;  }
     virtual void IgnoreWaitStates(bool ignore)              { }
     virtual bool IsInDiscMenuOrStillFrame(void) const       { return false; }
diff --git a/mythtv/libs/libmythtv/streamingringbuffer.cpp b/mythtv/libs/libmythtv/streamingringbuffer.cpp
index ac5d557..94d885c 100644
--- a/mythtv/libs/libmythtv/streamingringbuffer.cpp
+++ b/mythtv/libs/libmythtv/streamingringbuffer.cpp
@@ -44,15 +44,35 @@ bool StreamingRingBuffer::OpenFile(const QString &lfilename, uint retry_ms)
     return true;
 }
 
+bool StreamingRingBuffer::StartFromBeginning(void)
+{
+    if (m_context)
+    {
+        url_close(m_context);
+        m_context = NULL;
+    }
+
+    return OpenFile(filename);
+}
+
 long long StreamingRingBuffer::Seek(long long pos, int whence, bool has_lock)
 {
+    if (m_context)
+    {
+        if (url_seek(m_context, pos, whence) < 0)
+        {
+            ateof = true;
+            return 0;
+        }
+        return pos;
+    }
     return 0;
 }
 
 int StreamingRingBuffer::safe_read(void *data, uint sz)
 {
     if (m_context)
-        return url_read(m_context, (unsigned char*)data, sz);
+        return url_read_complete(m_context, (unsigned char*)data, sz);
     return 0;
 }
 
diff --git a/mythtv/libs/libmythtv/streamingringbuffer.h b/mythtv/libs/libmythtv/streamingringbuffer.h
index 69e3f14..48f09b2 100644
--- a/mythtv/libs/libmythtv/streamingringbuffer.h
+++ b/mythtv/libs/libmythtv/streamingringbuffer.h
@@ -20,6 +20,7 @@ class StreamingRingBuffer : public RingBuffer
     virtual long long Seek(long long pos, int whence, bool has_lock);
     virtual long long GetRealFileSize(void);
     virtual bool IsStreamed(void) { return true; }
+    bool StartFromBeginning(void);
 
   protected:
     virtual int safe_read(void *data, uint sz);
diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp
index 2d32c3b..1cdfd2b 100644
--- a/mythtv/programs/mythfrontend/main.cpp
+++ b/mythtv/programs/mythfrontend/main.cpp
@@ -784,7 +784,9 @@ static int internal_play_media(const QString &mrl, const QString &plot,
     QFile checkFile(mrl);
     if ((!checkFile.exists() && !mrl.startsWith("dvd:")
          && !mrl.startsWith("bd:")
-         && !mrl.startsWith("myth:")))
+         && !mrl.startsWith("myth:")
+         && !mrl.startsWith("http:")
+         && !mrl.contains(QRegExp("^rtmp.?://"))))
     {
         QString errorText = QObject::tr("Failed to open \n '%1' in %2 \n"
                                         "Check if the video exists")
