Index: sitypes.h
===================================================================
--- sitypes.h	(revision 7565)
+++ sitypes.h	(working copy)
@@ -238,11 +238,13 @@
     QString loadStatus();
 
     int AddSection(tablehead *head);
+    bool isEmpty() { return Empty; }
 
 private:
     int16_t MaxSections;       // Max number of sections
     int8_t  Version;           // Table Version
     uint8_t Filled[0x100];     // Fill status of each section
+    bool    Empty;             // Any entries ?
 };
 
 // Tables to hold Actual Network Objects
Index: sitypes.cpp
===================================================================
--- sitypes.cpp	(revision 7565)
+++ sitypes.cpp	(working copy)
@@ -92,6 +92,7 @@
 {
     MaxSections = -1;
     Version = -1;
+    Empty = true;
     memset(&Filled, 0, sizeof(Filled));
 }
 
@@ -136,6 +137,7 @@
 
 int SectionTracker::AddSection(tablehead *head)
 {
+    Empty = false;
     if (MaxSections == -1)
     {
          MaxSections = head->section_last;
@@ -797,6 +799,7 @@
     status[key].requested = true;
     status[key].requestedEmit = true;
     status[key].emitted = false;
+    status[key].pulling = true;
 }
 
 bool EventHandler::EmitRequired()
@@ -814,29 +817,46 @@
         if (!(sttloaded))
             return false;
     }
+
     if (!(servicesloaded))
+    {
+#ifdef EIT_DEBUG_SID
+        static int n =0;
+        if (!(n++%100))
+            printf("EventHandler::EmitRequired no services\n");
+#endif
         return false;
+    }
 
     for (s = status.begin() ; s != status.end() ; ++s)
     {
+#ifdef EIT_DEBUG_SID
+        if (s.key()==EIT_DEBUG_SID)
+        {
+            if (s.data().emitted || !s.data().pulling)
+                 printf("EventHandler::EmitRequired %d: tracker not pulling\n",EIT_DEBUG_SID);
+        }
+#endif
         if (s.data().emitted || !s.data().pulling)
-        {
             continue;
-        }
 
+        if (TrackerSetup[s.key()] == false)
+            continue;
         AllComplete = true;
         /* Make sure all sections are being pulled otherwise your not done */
-        if (TrackerSetup[s.key()] == false)
-            AllComplete = false;
         for (i = Tracker[s.key()].begin() ; i != Tracker[s.key()].end() ; ++i)
         {
             if (!i.data().Complete())
             {
+#ifdef EIT_DEBUG_SID
+                if (s.key()==EIT_DEBUG_SID)
+                    printf("EventHandler::EmitRequired %d: 0%x is not complete\n",EIT_DEBUG_SID,i.key());
+#endif
                 AllComplete = false;
                 break;
             }
         }
-        if (SIStandard == SI_STANDARD_ATSC)
+        if (AllComplete && (SIStandard == SI_STANDARD_ATSC))
         {
             for (e = Events[s.key()].begin() ; e != Events[s.key()].end() ; ++e)
             {
@@ -857,6 +877,10 @@
                 }
             }
         }
+#ifdef EIT_DEBUG_SID
+        if (s.key()==EIT_DEBUG_SID)
+            printf("EventHandler::EmitRequired (End) %d: AllComplete=%d\n",EIT_DEBUG_SID,AllComplete);
+#endif
         if (AllComplete)
             return true;
     }
@@ -877,14 +901,18 @@
         {
             AllComplete = true;
             if (TrackerSetup[s.key()] == false)
-                AllComplete = false;
+                continue;
             /* Make sure all sections are being pulled otherwise your not done */
-            for (i = Tracker[s.key()].begin() ; i != Tracker[s.key()].end() ; ++i)
+            for (i = Tracker[s.key()].begin(); i != Tracker[s.key()].end(); ++i)
             {
                 if (!(i.data().Complete()))
+                {
                     AllComplete = false;
+                    break;
+                }
             }
-            if (SIStandard == SI_STANDARD_ATSC)
+
+            if (AllComplete && (SIStandard == SI_STANDARD_ATSC))
             {
                 for (e = Events[s.key()].begin() ; e != Events[s.key()].end() ; ++e)
                 {
@@ -967,6 +995,15 @@
     }
 #endif
 
+    //If we are interested in this but the tracker does not have any data
+    //in it then set the status back to pulling if appropriate
+    if (status[key0].requestedEmit && Tracker[key0][key1].isEmpty() &&
+        status[key0].emitted)
+    {
+        status[key0].pulling = true;
+        status[key0].emitted = false;
+    }
+
     if (SIStandard == SI_STANDARD_ATSC)
     {
         QMap_pidHandler::Iterator p;
