Index: programs/mythfrontend/globalsettings.cpp
===================================================================
--- programs/mythfrontend/globalsettings.cpp	(revision 24893)
+++ programs/mythfrontend/globalsettings.cpp	(working copy)
@@ -559,11 +559,14 @@
     return bc;
 }
 
-static GlobalCheckBox *CommSkipAllBlanks()
+static GlobalComboBox *CommSkipAllBlanks()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("CommSkipAllBlanks");
+    GlobalComboBox *bc = new GlobalComboBox("CommSkipAllBlanks");
     bc->setLabel(QObject::tr("Skip blank frames after commercials"));
-    bc->setValue(true);
+    bc->addSelection(QObject::tr("Never"), "0");
+    bc->addSelection(QObject::tr("Always"), "1");
+    bc->addSelection(QObject::tr("Skip half the blank frames"), "2");
+    bc->setValue(1);
     bc->setHelpText(QObject::tr("When using blank frame detection and "
                     "automatic flagging, include blank frames following "
                     "commercial breaks as part of the commercial break."));
Index: programs/mythcommflag/BlankFrameDetector.h
===================================================================
--- programs/mythcommflag/BlankFrameDetector.h	(revision 24893)
+++ programs/mythcommflag/BlankFrameDetector.h	(working copy)
@@ -31,7 +31,7 @@
         { return (index) ? blankMap : breakMap; }
 
     /* BlankFrameDetector interface. */
-    bool getSkipCommBlanks(void) const { return skipcommblanks; }
+    int getSkipCommBlanks(void) const { return skipcommblanks; }
     const FrameAnalyzer::FrameMap *getBlanks(void) const { return &blankMap; }
     int computeForLogoSurplus(const TemplateMatcher *tm);
     int computeForLogoDeficit(const TemplateMatcher *tm);
@@ -40,7 +40,7 @@
 private:
     HistogramAnalyzer       *histogramAnalyzer;
     float                   fps;
-    bool                    skipcommblanks;         /* skip commercial blanks */
+    int                     skipcommblanks;         /* skip commercial blanks */
 
     FrameAnalyzer::FrameMap blankMap;
     FrameAnalyzer::FrameMap breakMap;
Index: programs/mythcommflag/ClassicCommDetector.h
===================================================================
--- programs/mythcommflag/ClassicCommDetector.h	(revision 24893)
+++ programs/mythcommflag/ClassicCommDetector.h	(working copy)
@@ -153,7 +153,7 @@
         bool logoInfoAvailable;
         LogoDetectorBase* logoDetector;
 
-        bool skipAllBlanks;
+        int skipAllBlanks;
 
         unsigned char *framePtr;
 
Index: programs/mythcommflag/BlankFrameDetector.cpp
===================================================================
--- programs/mythcommflag/BlankFrameDetector.cpp	(revision 24893)
+++ programs/mythcommflag/BlankFrameDetector.cpp	(working copy)
@@ -204,7 +204,7 @@
 
 void
 computeBreakMap(FrameAnalyzer::FrameMap *breakMap,
-        const FrameAnalyzer::FrameMap *blankMap, float fps, bool skipcommblanks,
+        const FrameAnalyzer::FrameMap *blankMap, float fps, int skipcommblanks,
         int debugLevel)
 {
     /*
@@ -345,29 +345,28 @@
     {
         long long iib = iibreak.key();
         long long iie = iib + *iibreak;
+        FrameAnalyzer::FrameMap::iterator jjbreak = iibreak;
+        ++jjbreak;
+        breakMap->erase(iibreak);
 
-        if (!skipcommblanks)
+        if (skipcommblanks == 0 || skipcommblanks == 2)
         {
             /* Trim leading blanks from commercial break. */
-            FrameAnalyzer::FrameMap::const_iterator iiblank =
-                blankMap->find(iib);
-            FrameAnalyzer::FrameMap::iterator jjbreak = iibreak;
-            ++jjbreak;
-            iib += *iiblank;
-            breakMap->erase(iibreak);
-            breakMap->insert(iib, iie - iib);
-            iibreak = jjbreak;
+            long long addb = *blankMap->find(iib);
+            if (skipcommblanks == 2)
+                addb /= 2;
+            iib += addb;
         }
-        else
+        if (skipcommblanks == 1 || skipcommblanks == 2)
         {
             /* Add trailing blanks to commercial break. */
-            ++iibreak;
-            FrameAnalyzer::FrameMap::const_iterator jjblank =
-                blankMap->find(iie);
-            iie += *jjblank;
-            breakMap->remove(iib);
-            breakMap->insert(iib, iie - iib);
+            long long adde = *blankMap->find(iie);
+            if (skipcommblanks == 2)
+                adde /= 2;
+            iie += adde;
         }
+        breakMap->insert(iib, iie - iib);
+        iibreak = jjbreak;
     }
 }
 
@@ -379,10 +378,10 @@
     , fps(0.0f)
     , debugLevel(0)
 {
-    skipcommblanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1) != 0;
+    skipcommblanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);
 
     VERBOSE(VB_COMMFLAG, QString("BlankFrameDetector: skipcommblanks=%1")
-            .arg(skipcommblanks ? "true" : "false"));
+            .arg(skipcommblanks));
 
     /*
      * debugLevel:
Index: programs/mythcommflag/TemplateMatcher.cpp
===================================================================
--- programs/mythcommflag/TemplateMatcher.cpp	(revision 24893)
+++ programs/mythcommflag/TemplateMatcher.cpp	(working copy)
@@ -673,7 +673,7 @@
 TemplateMatcher::adjustForBlanks(const BlankFrameDetector *blankFrameDetector,
     long long nframes)
 {
-    const bool skipCommBlanks = blankFrameDetector->getSkipCommBlanks();
+    const int skipCommBlanks = blankFrameDetector->getSkipCommBlanks();
     const FrameAnalyzer::FrameMap *blankMap = blankFrameDetector->getBlanks();
 
     /*
@@ -778,8 +778,10 @@
         if (jj != blankMap->constEnd())
         {
             newbrkb = jj.key();
-            if (!skipCommBlanks)
+            if (skipCommBlanks == 0)
                 newbrkb += *jj;
+            else if (skipCommBlanks == 2)
+                newbrkb += *jj / 2;
         }
 
         /*
@@ -796,8 +798,10 @@
         if (kk != blankMap->constEnd())
         {
             newbrke = kk.key();
-            if (skipCommBlanks)
+            if (skipCommBlanks == 1)
                 newbrke += *kk;
+            else if (skipCommBlanks == 2)
+                newbrke += *kk / 2;
         }
 
         /*
Index: programs/mythcommflag/ClassicCommDetector.cpp
===================================================================
--- programs/mythcommflag/ClassicCommDetector.cpp	(revision 24893)
+++ programs/mythcommflag/ClassicCommDetector.cpp	(working copy)
@@ -170,7 +170,7 @@
     commDetectMaxCommLength =
         gCoreContext->GetNumSetting("CommDetectMaxCommLength", 125);
 
-    skipAllBlanks = !!gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);
+    skipAllBlanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);
     commDetectBlankCanHaveLogo =
         !!gCoreContext->GetNumSetting("CommDetectBlankCanHaveLogo", 1);
 }
@@ -1791,19 +1791,20 @@
     {
         if (*it == MARK_COMM_START)
         {
-            lastStart = it.key();
-            if (skipAllBlanks)
-            {
-                while ((lastStart > 0) &&
-                        (frameInfo[lastStart - 1].flagMask & COMM_FRAME_BLANK))
-                    lastStart--;
-            }
-            else
-            {
-                while ((lastStart < (framesProcessed - (2 * fps))) &&
-                        (frameInfo[lastStart + 1].flagMask & COMM_FRAME_BLANK))
-                    lastStart++;
-            }
+            uint64_t lastStartLower = it.key();
+            uint64_t lastStartUpper = it.key();
+            while ((lastStartLower > 0) &&
+                   (frameInfo[lastStartLower - 1].flagMask & COMM_FRAME_BLANK))
+                lastStartLower--;
+            while ((lastStartUpper < (framesProcessed - (2 * fps))) &&
+                   (frameInfo[lastStartUpper + 1].flagMask & COMM_FRAME_BLANK))
+                lastStartUpper++;
+            if (skipAllBlanks == 0)
+                lastStart = lastStartUpper;
+            else if (skipAllBlanks == 2)
+                lastStart = (lastStartLower + lastStartUpper) / 2;
+            else // default is 1
+                lastStart = lastStartLower;
 
             if (verboseDebugging)
                 VERBOSE(VB_COMMFLAG, QString("Start Mark: %1 -> %2")
@@ -1814,19 +1815,20 @@
         }
         else
         {
-            lastEnd = it.key();
-            if (skipAllBlanks)
-            {
-                while ((lastEnd < (framesProcessed - (2 * fps))) &&
-                        (frameInfo[lastEnd + 1].flagMask & COMM_FRAME_BLANK))
-                    lastEnd++;
-            }
-            else
-            {
-                while ((lastEnd > 0) &&
-                        (frameInfo[lastEnd - 1].flagMask & COMM_FRAME_BLANK))
-                    lastEnd--;
-            }
+            uint64_t lastEndLower = it.key();
+            uint64_t lastEndUpper = it.key();
+            while ((lastEndUpper < (framesProcessed - (2 * fps))) &&
+                   (frameInfo[lastEndUpper + 1].flagMask & COMM_FRAME_BLANK))
+                lastEndUpper++;
+            while ((lastEndLower > 0) &&
+                   (frameInfo[lastEndLower - 1].flagMask & COMM_FRAME_BLANK))
+                lastEndLower--;
+            if (skipAllBlanks == 0)
+                lastEnd = lastEndLower;
+            else if (skipAllBlanks == 2)
+                lastEnd = (lastEndLower + lastEndUpper) / 2;
+            else // default is 1
+                lastEnd = lastEndUpper;
 
             if (verboseDebugging)
                 VERBOSE(VB_COMMFLAG, QString("End Mark  : %1 -> %2")
@@ -1939,6 +1941,7 @@
     for(; i < (commercials-1); i++)
     {
         long long r = c_start[i];
+        long long adjustment = 0;
 
         if ((r < (30 * fps)) &&
             (first_comm))
@@ -1961,17 +1964,27 @@
             }
 
             if (skipAllBlanks)
+            {
                 while((blankFrameMap.contains(r+1)) &&
                         (c_start[i+1] != (r+1)))
+                {
                     r++;
+                    adjustment++;
+                }
+            }
         }
         else
         {
             if (skipAllBlanks)
                 while(blankFrameMap.contains(r+1))
+                {
                     r++;
+                    adjustment++;
+                }
         }
 
+        if (skipAllBlanks == 2)
+            r -= (adjustment / 2);
         blankCommMap[r] = MARK_COMM_END;
         first_comm = false;
     }
