diff --git a/mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp b/mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp
index 57ba817..9889c4c 100644
--- a/mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp
+++ b/mythtv/libs/libmythtv/iptv/iptvchannelfetcher.cpp
@@ -141,6 +141,7 @@ void IPTVChannelFetcher::run(void)
         QString channum = it.key();
         QString name    = (*it).m_name;
         QString xmltvid = (*it).m_xmltvid.isEmpty() ? "" : (*it).m_xmltvid;
+        uint serviceid  = (*it).m_serviceid;
         QString msg = QObject::tr("Channel #%1 : %2").arg(channum).arg(name);
 
         int chanid = ChannelUtil::GetChanID(_sourceid, channum);
@@ -154,7 +155,7 @@ void IPTVChannelFetcher::run(void)
             chanid = ChannelUtil::CreateChanID(_sourceid, channum);
             ChannelUtil::CreateChannel(
                 0, _sourceid, chanid, name, name, channum,
-                0, 0, 0, false, false, false, QString::null,
+                serviceid, 0, 0, false, false, false, QString::null,
                 QString::null, "Default", xmltvid);
         }
         else
@@ -166,7 +167,7 @@ void IPTVChannelFetcher::run(void)
             }
             ChannelUtil::UpdateChannel(
                 0, _sourceid, chanid, name, name, channum,
-                0, 0, 0, false, false, false, QString::null,
+                serviceid, 0, 0, false, false, false, QString::null,
                 QString::null, "Default", xmltvid);
         }
 
@@ -339,11 +340,13 @@ static bool parse_chan_info(const QString   &rawdata,
 {
     // #EXTINF:0,2 - France 2                <-- duration,channum - channame
     // #EXTMYTHTV:xmltvid=C2.telepoche.com   <-- optional line (myth specific)
+    // #EXTMYTHTV2:serviceid=1234            <-- optional if missing 1 is used (mythtv specific)
     // #...                                  <-- ignored comments
     // rtsp://maiptv.iptv.fr/iptvtv/201 <-- url
 
     QString name;
     QString xmltvid;
+    uint serviceid=1;
     while (true)
     {
         QString line = rawdata.section("\n", lineNum, lineNum);
@@ -365,6 +368,14 @@ static bool parse_chan_info(const QString   &rawdata,
                     xmltvid = data.mid(data.indexOf('=')+1);
                 }
             }
+            else if (line.startsWith("#EXTMYTHTV2:"))
+            {
+                QString data = line.mid(line.indexOf(':')+1);
+                if (data.startsWith("serviceid="))
+                {
+                    serviceid = data.mid(data.indexOf('=')+1).toUInt();
+                }
+            }
             else
             {
                 // Just ignore other comments
@@ -375,7 +386,7 @@ static bool parse_chan_info(const QString   &rawdata,
             if (name.isEmpty())
                 return false;
             QString url = line;
-            info = IPTVChannelInfo(name, url, xmltvid);
+            info = IPTVChannelInfo(name, url, xmltvid, serviceid);
             return true;
         }
     }
diff --git a/mythtv/libs/libmythtv/iptv/iptvchannelinfo.h b/mythtv/libs/libmythtv/iptv/iptvchannelinfo.h
index d18014b..23544c15 100644
--- a/mythtv/libs/libmythtv/iptv/iptvchannelinfo.h
+++ b/mythtv/libs/libmythtv/iptv/iptvchannelinfo.h
@@ -20,8 +20,9 @@ class IPTVChannelInfo
 
     IPTVChannelInfo(const QString &name,
                     const QString &url,
-                    const QString &xmltvid) :
-        m_name(name), m_url(url), m_xmltvid(xmltvid)
+                    const QString &xmltvid,
+                    const uint serviceid) :
+        m_name(name), m_url(url), m_xmltvid(xmltvid),m_serviceid(serviceid)
     {
     }
 
@@ -40,6 +41,7 @@ class IPTVChannelInfo
     QString m_name;
     QString m_url;
     QString m_xmltvid;
+    uint m_serviceid;
 };
 
 typedef QMap<QString,IPTVChannelInfo> fbox_chan_map_t;
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp b/mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp
index 16eb5c7..6c8e35d 100644
--- a/mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp
+++ b/mythtv/libs/libmythtv/iptv/iptvfeederwrapper.cpp
@@ -17,6 +17,7 @@ using namespace std;
 #include "iptvfeederrtp.h"
 #include "iptvfeederfile.h"
 #include "iptvfeederhls.h"
+#include "iptvfeederhttp.h"
 #include "mythcontext.h"
 #include "mythlogging.h"
 
@@ -74,6 +75,10 @@ bool IPTVFeederWrapper::InitFeeder(const QString &url)
     {
         tmp_feeder = new IPTVFeederHLS();
     }
+	else if(IPTVFeederHTTP::IsHTTP(url))
+	{
+		tmp_feeder = new IPTVFeederHTTP();
+	}
     else
     {
         LOG(VB_RECORD, LOG_ERR, LOC +
diff --git a/mythtv/libs/libmythtv/iptvchannel.cpp b/mythtv/libs/libmythtv/iptvchannel.cpp
index bb7385e..822f8b9 100644
--- a/mythtv/libs/libmythtv/iptvchannel.cpp
+++ b/mythtv/libs/libmythtv/iptvchannel.cpp
@@ -95,7 +95,8 @@ bool IPTVChannel::SetChannelByString(const QString &channum)
         return false;
 
     // Verify that channel exists
-    if (!GetChanInfo(channum).isValid())
+    IPTVChannelInfo chaninfo=GetChanInfo(channum);
+    if (!chaninfo.isValid())
     {
         LOG(VB_GENERAL, LOG_ERR, LOC +
                 QString("SetChannelByString(%1)").arg(channum) +
@@ -110,7 +111,7 @@ bool IPTVChannel::SetChannelByString(const QString &channum)
     // Set the dtv channel info for any additional multiplex tuning
     SetDTVInfo(/*atsc_major*/ 0, /*atsc_minor*/ 0,
                /*netid*/ 0,
-               /*tsid*/ 0, /*mpeg_prog_num*/ 1);
+               /*tsid*/ 0, /*mpeg_prog_num*/ chaninfo.m_serviceid);
 
     HandleScript(channum /* HACK treat channum as freqid */);
 
diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
index c815431..b23aa5a 100644
--- a/mythtv/libs/libmythtv/libmythtv.pro
+++ b/mythtv/libs/libmythtv/libmythtv.pro
@@ -567,6 +567,7 @@ using_backend {
         HEADERS += iptv/iptvfeederfile.h      iptv/iptvfeederlive.h
         HEADERS += iptv/iptvfeederrtp.h       iptv/timeoutedtaskscheduler.h
         HEADERS += iptv/iptvfeederhls.h
+        HEADERS += iptv/iptvfeederhttp.h
 
         SOURCES += iptvchannel.cpp            iptvrecorder.cpp
         SOURCES += iptvsignalmonitor.cpp
@@ -577,6 +578,9 @@ using_backend {
         SOURCES += iptv/iptvfeederfile.cpp    iptv/iptvfeederlive.cpp
         SOURCES += iptv/iptvfeederrtp.cpp     iptv/timeoutedtaskscheduler.cpp
         SOURCES += iptv/iptvfeederhls.cpp
+        SOURCES += iptv/iptvfeederhttp.cpp
+
+        LIBS += -lccext2 -lccgnu2
 
         DEFINES += USING_IPTV
     }
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederhttp.cpp b/mythtv/libs/libmythtv/iptv/iptvfeederhttp.cpp
new file mode 100644
index 0000000..5fd3dd8
--- /dev/null
+++ b/mythtv/libs/libmythtv/iptv/iptvfeederhttp.cpp
@@ -0,0 +1,163 @@
+/** -*- Mode: c++ -*-
+ *  IPTVFeederHTTP -- 
+ *  Copyright (c) 
+ *  Distributed as part of MythTV under GPL v2 and later.
+ */
+#include <unistd.h>
+#include "iptvfeederhttp.h"
+
+// MythTV headers
+#include "mythlogging.h"
+#include "streamlisteners.h"
+
+#define LOC QString("IPTVHTTP: ")
+#define TS_SIZE 188
+#define BUFFER_SIZE (128 * TS_SIZE)
+
+
+IPTVFeederHTTP::IPTVFeederHTTP()
+	: _lock(),_abort(false),_running(false)
+{
+	_stream.setTimeout(5000);
+}
+
+IPTVFeederHTTP::~IPTVFeederHTTP()
+{
+	Close();
+}
+
+bool IPTVFeederHTTP::IsHTTP(const QString &url)
+{
+	return url.startsWith("http://", Qt::CaseInsensitive);
+}
+
+bool IPTVFeederHTTP::Open(const QString &url)
+{
+	QMutexLocker locker(&_lock);
+	QUrl parse(url);
+    if (parse.scheme().toLower() != "http")
+    {
+        LOG(VB_GENERAL, LOG_ERR, LOC + "Open() -- end 1");
+        return false;
+    }
+	QByteArray p=parse.toEncoded();
+
+	URLStream::Error status;
+	status = _stream.get(p.constData());
+	if(status)
+	{
+		LOG(VB_RECORD, LOG_INFO, LOC + QString("Open() -- failed to open stream, error %1").arg(status));
+		_stream.close();
+	}
+	return true;
+}
+
+void IPTVFeederHTTP::Close(void)
+{
+	LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- begin");
+    Stop();
+	
+	QMutexLocker locker(&_lock);
+	_stream.close();
+}
+
+void IPTVFeederHTTP::Run(void)
+{
+	LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- begin");
+    _lock.lock();
+    _running = true;
+    _abort   = false;
+    _lock.unlock();
+    LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- loop begin");
+
+	while(!_abort)
+	{
+		uint8_t buffer[BUFFER_SIZE];
+		if(!_stream.isConnected())
+		{
+			break;
+		}
+		
+		if(_listeners.empty())
+		{
+			usleep(50000);
+			continue;
+		}
+
+		_stream.read((char*)buffer,BUFFER_SIZE);
+		int size=_stream.gcount();
+		if(size>0)
+		{
+			//LOG(VB_RECORD, LOG_INFO, LOC + QString("Run() -- got %1 bytes of data").arg(size));
+			_lock.lock();
+			vector<TSDataListener*>::iterator it = _listeners.begin();
+			for (; it != _listeners.end(); ++it)
+				(*it)->AddData(buffer, size);
+			_lock.unlock();
+		}
+	}
+
+    LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- loop end");
+
+    _lock.lock();
+    _running = false;
+    _cond.wakeAll();
+    _lock.unlock();
+    LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- end");
+}
+
+void IPTVFeederHTTP::Stop(void)
+{
+	LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- begin");
+    QMutexLocker locker(&_lock);
+    _abort = true;
+
+    while (_running)
+        _cond.wait(&_lock, 500);
+    LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- end");
+}
+
+void IPTVFeederHTTP::AddListener(TSDataListener *item)
+{
+    LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin")
+        .arg((uint64_t)item,0,16));
+    if (!item)
+    {
+        LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
+            .arg((uint64_t)item,0,16));
+        return;
+    }
+
+    // avoid duplicates
+    RemoveListener(item);
+
+    // add to local list
+    QMutexLocker locker(&_lock);
+    _listeners.push_back(item);
+
+    LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end")
+        .arg((uint64_t)item,0,16));
+}
+
+void IPTVFeederHTTP::RemoveListener(TSDataListener *item)
+{
+    LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin")
+        .arg((uint64_t)item,0,16));
+    QMutexLocker locker(&_lock);
+    vector<TSDataListener*>::iterator it =
+    find(_listeners.begin(), _listeners.end(), item);
+
+    if (it == _listeners.end())
+    {
+        LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 1")
+            .arg((uint64_t)item,0,16));
+        return;
+    }
+
+    // remove from local list..
+    *it = *_listeners.rbegin();
+    _listeners.resize(_listeners.size() - 1);
+
+    LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end 2")
+        .arg((uint64_t)item,0,16));
+}
diff --git a/mythtv/libs/libmythtv/iptv/iptvfeederhttp.h b/mythtv/libs/libmythtv/iptv/iptvfeederhttp.h
new file mode 100644
index 0000000..fadb484
--- /dev/null
+++ b/mythtv/libs/libmythtv/iptv/iptvfeederhttp.h
@@ -0,0 +1,64 @@
+/** -*- Mode: c++ -*-
+ *  IPTVFeederHTTP
+ *  Copyright (c) 
+ *  Distributed as part of MythTV under GPL v2 and later.
+ */
+#ifndef _IPTV_FEEDER_HTTP_H_
+#define _IPTV_FEEDER_HTTP_H_
+
+// C++ headers
+#include <vector>
+using namespace std;
+#include <cc++/common.h>
+using namespace ost;
+
+#include <stdint.h>
+
+// Qt headers
+#include <QWaitCondition>
+#include <QMutex>
+#include <QUrl>
+
+// Mythtv headers
+#include "iptvfeeder.h"
+
+class QString;
+class TSDataListener;
+
+
+class IPTVFeederHTTP : public IPTVFeeder
+{
+  public:
+    IPTVFeederHTTP();
+    virtual ~IPTVFeederHTTP();
+
+	bool CanHandle(const QString &url) const { return IsHTTP(url); };
+	bool IsOpen(void) const { return _stream.isConnected(); };
+
+    bool Open(const QString &url);
+    void Close(void);
+
+    void Run(void);
+    void Stop(void);
+
+    void AddListener(TSDataListener*);
+    void RemoveListener(TSDataListener*);
+
+	static bool IsHTTP(const QString &url);
+
+  private:
+    IPTVFeederHTTP &operator=(const IPTVFeederHTTP&);
+    IPTVFeederHTTP(const IPTVFeederHTTP&);
+
+  protected:
+    mutable QMutex          _lock;
+    vector<TSDataListener*> _listeners;
+
+  private:
+    bool                    _abort;
+    bool                    _running;
+    QWaitCondition          _cond;
+	URLStream               _stream;
+};
+
+#endif // _IPTV_FEEDER_HTTP_H_
