Index: libs/libmythtv/deletemap.h
===================================================================
--- libs/libmythtv/deletemap.h	(revision 26586)
+++ libs/libmythtv/deletemap.h	(working copy)
@@ -45,6 +45,16 @@
     bool     IsTemporaryMark(uint64_t frame);
     bool     HasTemporaryMark(void);
     uint64_t GetLastFrame(uint64_t total);
+    uint64_t TranslatePositionAbsToRel(uint64_t absPosition) {
+        return TranslatePositionAbsToRel(m_deleteMap, absPosition);
+    }
+    uint64_t TranslatePositionRelToAbs(uint64_t relPosition) {
+        return TranslatePositionRelToAbs(m_deleteMap, relPosition);
+    }
+    static uint64_t TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap,
+                                              uint64_t absPosition);
+    static uint64_t TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap,
+                                              uint64_t relPosition);
 
     void TrackerReset(uint64_t frame, uint64_t total);
     bool TrackerWantsToJump(uint64_t frame, uint64_t total, uint64_t &to);
Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 26586)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -419,7 +419,8 @@
 
     bool SeekHandleAction(PlayerContext *actx, const QStringList &actions,
                           const bool isDVD);
-    void DoSeek(PlayerContext*, float time, const QString &mesg);
+    void DoSeek(PlayerContext*, float time, const QString &mesg,
+                bool timeIsOffset, bool honorCutlist=true);
     bool DoPlayerSeek(PlayerContext*, float time);
     enum ArbSeekWhence {
         ARBSEEK_SET = 0,
@@ -427,7 +428,7 @@
         ARBSEEK_FORWARD,
         ARBSEEK_END
     };
-    void DoArbSeek(PlayerContext*, ArbSeekWhence whence);
+    void DoArbSeek(PlayerContext*, ArbSeekWhence whence, bool honorCutlist=true);
     void NormalSpeed(PlayerContext*);
     void ChangeSpeed(PlayerContext*, int direction);
     void ToggleTimeStretch(PlayerContext*);
Index: libs/libmythtv/mythplayer.h
===================================================================
--- libs/libmythtv/mythplayer.h	(revision 26586)
+++ libs/libmythtv/mythplayer.h	(working copy)
@@ -232,6 +232,12 @@
     virtual long long CalcMaxFFTime(long long ff, bool setjump = true) const;
     long long CalcRWTime(long long rw) const;
     virtual void calcSliderPos(osdInfo &info, bool paddedFields = false);
+    uint64_t TranslatePositionAbsToRel(uint64_t absPosition) {
+        return deleteMap.TranslatePositionAbsToRel(absPosition);
+    }
+    uint64_t TranslatePositionRelToAbs(uint64_t relPosition) {
+        return deleteMap.TranslatePositionRelToAbs(relPosition);
+    }
 
     /// Non-const gets
     OSD         *GetOSD(void)                 { return osd; }
@@ -497,7 +503,8 @@
     void  JumpToProgram(void);
 
     void calcSliderPosPriv(osdInfo &info, bool paddedFields,
-                           int playbackLen, float secsplayed, bool islive);
+                           int playbackLen, float secsplayed, bool islive,
+                           bool isRaw);
 
   protected:
     DecoderBase   *decoder;
Index: libs/libmythtv/mythdvdplayer.cpp
===================================================================
--- libs/libmythtv/mythdvdplayer.cpp	(revision 26586)
+++ libs/libmythtv/mythdvdplayer.cpp	(working copy)
@@ -338,7 +338,8 @@
         // DVD playing non-functional under windows for now
         secsplayed = 0.0f;
 #endif
-    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
+        calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
+        calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, true);
 }
 
 void MythDVDPlayer::SeekForScreenGrab(uint64_t &number, uint64_t frameNum,
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 26586)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -548,10 +548,16 @@
             "Pause"), "P");
     REG_KEY("TV Playback", "SEEKFFWD", QT_TRANSLATE_NOOP("MythControls",
             "Fast Forward"), "Right");
+    REG_KEY("TV Playback", "SEEKFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Fast Forward ignoring cutlist"), "");
     REG_KEY("TV Playback", "SEEKRWND", QT_TRANSLATE_NOOP("MythControls",
             "Rewind"), "Left");
+    REG_KEY("TV Playback", "SEEKRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Rewind ignoring cutlist"), "");
     REG_KEY("TV Playback", "ARBSEEK", QT_TRANSLATE_NOOP("MythControls",
             "Arbitrary Seek"), "*");
+    REG_KEY("TV Playback", "ARBSEEKNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Arbitrary Seek ignoring cutlist"), "");
     REG_KEY("TV Playback", "CHANNELUP", QT_TRANSLATE_NOOP("MythControls",
             "Channel up"), "Up");
     REG_KEY("TV Playback", "CHANNELDOWN", QT_TRANSLATE_NOOP("MythControls",
@@ -562,8 +568,14 @@
             "Switch to the previous channel"), "H");
     REG_KEY("TV Playback", "JUMPFFWD", QT_TRANSLATE_NOOP("MythControls",
             "Jump ahead"), "PgDown");
+    REG_KEY("TV Playback", "JUMPFFWDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Jump ahead ignoring cutlist"), "");
     REG_KEY("TV Playback", "JUMPRWND", QT_TRANSLATE_NOOP("MythControls",
             "Jump back"), "PgUp");
+    REG_KEY("TV Playback", "JUMPRWNDNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Jump back ignoring cutlist"), "");
+    REG_KEY("TV Playback", "INFONOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Info ignoring cutlist"), "");
     REG_KEY("TV Playback", "JUMPBKMRK", QT_TRANSLATE_NOOP("MythControls",
             "Jump to bookmark"), "K");
     REG_KEY("TV Playback", "FFWDSTICKY", QT_TRANSLATE_NOOP("MythControls",
@@ -3986,12 +3998,14 @@
             ctx->buffer->DVD()->MoveButtonDown();
         }
         else if (has_action("LEFT", actions) ||
-                 has_action("SEEKRWND", actions))
+                 has_action("SEEKRWND", actions) ||
+                 has_action("SEEKRWNDNOCUTLIST", actions))
         {
             ctx->buffer->DVD()->MoveButtonLeft();
         }
         else if (has_action("RIGHT", actions) ||
-                 has_action("SEEKFFWD", actions))
+                 has_action("SEEKFFWD", actions) ||
+                 has_action("SEEKFFWDNOCUTLIST", actions))
         {
             ctx->buffer->DVD()->MoveButtonRight();
         }
@@ -4092,53 +4106,46 @@
             }
         }
     }
-    else if (has_action("JUMPRWND", actions))
+    else if (has_action("JUMPRWND", actions) ||
+             has_action("JUMPRWNDNOCUTLIST", actions))
     {
         if (isDVD)
             DVDJumpBack(ctx);
         else if (GetNumChapters(ctx) > 0)
             DoJumpChapter(ctx, -1);
         else
-            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
+            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"),
+                   true, has_action("JUMPRWND", actions));
     }
-    else if (has_action("JUMPFFWD", actions))
+    else if (has_action("JUMPFFWD", actions) ||
+             has_action("JUMPFFWDNOCUTLIST", actions))
     {
         if (isDVD)
             DVDJumpForward(ctx);
         else if (GetNumChapters(ctx) > 0)
             DoJumpChapter(ctx, 9999);
         else
-            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
+            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"),
+                   true, has_action("JUMPFFWD", actions));
     }
     else if (has_action("JUMPBKMRK", actions))
     {
         ctx->LockDeletePlayer(__FILE__, __LINE__);
-        long long bookmark = ctx->player->GetBookmark();
-        long long curloc   = ctx->player->GetFramesPlayed();
+        uint64_t bookmark = ctx->player->GetBookmark();
         float mult = 1.0f;
         if (ctx->last_framerate)
             mult = 1.0f / ctx->last_framerate;
-        long long seekloc = (long long) ((bookmark - curloc) * mult);
+        float seekloc = ctx->player->TranslatePositionAbsToRel(bookmark) * mult;
         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
 
         if (bookmark > ctx->last_framerate)
         {
-            DoSeek(ctx, seekloc, tr("Jump to Bookmark"));
+            DoSeek(ctx, seekloc, tr("Jump to Bookmark"), false);
         }
     }
     else if (has_action("JUMPSTART",actions))
     {
-        long long seekloc = +1;
-        ctx->LockDeletePlayer(__FILE__, __LINE__);
-        if (ctx->player && ctx->last_framerate >= 0.0001f)
-        {
-            seekloc = (int64_t) (-1.0 * ctx->player->GetFramesPlayed() /
-                                 ctx->last_framerate);
-        }
-        ctx->UnlockDeletePlayer(__FILE__, __LINE__);
-
-        if (seekloc <= 0)
-            DoSeek(ctx, seekloc, tr("Jump to Beginning"));
+        DoSeek(ctx, 0, tr("Jump to Beginning"), false);
     }
     else if (has_action("CLEAROSD", actions))
     {
@@ -4285,11 +4292,11 @@
         ChangeTimeStretch(ctx, -1);
     else if (has_action("MENU", actions))
         ShowOSDMenu(ctx);
-    else if (has_action("INFO", actions))
+    else if (has_action("INFO", actions) || has_action("INFONOCUTLIST", actions))
     {
         if (HasQueuedInput())
         {
-            DoArbSeek(ctx, ARBSEEK_SET);
+            DoArbSeek(ctx, ARBSEEK_SET, !has_action("INFONOCUTLIST", actions));
         }
         else
             ToggleOSD(ctx, true);
@@ -4486,7 +4493,7 @@
         else if (GetNumChapters(ctx) > 0)
             DoJumpChapter(ctx, -1);
         else
-            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
+            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
     }
     else if (has_action("CHANNELDOWN", actions))
     {
@@ -4502,7 +4509,7 @@
         else if (GetNumChapters(ctx) > 0)
             DoJumpChapter(ctx, 9999);
         else
-            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
+            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true);
     }
     else if (has_action("DELETE", actions) && !islivetv)
     {
@@ -4727,18 +4734,20 @@
         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
 
         if (tokens[2] == "BEGINNING")
-            DoSeek(ctx, -fplay, tr("Jump to Beginning"));
-        else if (tokens[2] == "FORWARD")
-            DoSeek(ctx, ctx->fftime, tr("Skip Ahead"));
-        else if (tokens[2] == "BACKWARD")
-            DoSeek(ctx, -ctx->rewtime, tr("Skip Back"));
-        else if ((tokens[2] == "POSITION") && (tokens.size() == 4) &&
+            DoSeek(ctx, 0, tr("Jump to Beginning"), false);
+        else if (tokens[2] == "FORWARD" || tokens[2] == "FORWARDNOCUTLIST")
+            DoSeek(ctx, ctx->fftime, tr("Skip Ahead"), true, tokens[2] == "FORWARD");
+        else if (tokens[2] == "BACKWARD" || tokens[2] == "BACKWARDNOCUTLIST")
+            DoSeek(ctx, -ctx->rewtime, tr("Skip Back"), true, tokens[2] == "BACKWARD");
+        else if ((tokens[2] == "POSITION" ||
+                  tokens[2] == "POSITIONNOCUTLIST") &&
+                 (tokens.size() == 4) &&
                  (tokens[3].contains(QRegExp("^\\d+$"))) &&
                  ctx->last_framerate)
         {
             long long rel_frame = tokens[3].toInt();
-            rel_frame -= (long long) (fplay * (1.0 / ctx->last_framerate)),
-            DoSeek(ctx, rel_frame, tr("Jump To"));
+            DoSeek(ctx, rel_frame / ctx->last_framerate, tr("Jump To"),
+                   false, tokens[2] == "POSITION");
         }
     }
     else if (tokens.size() >= 3 && tokens[1] == "VOLUME")
@@ -5778,16 +5787,21 @@
                           const bool isDVD)
 {
     const int kRewind = 4, kForward = 8, kSticky = 16, kSlippery = 32,
-              kRelative = 64, kAbsolute = 128, kWhenceMask = 3;
+              kRelative = 64, kAbsolute = 128, kIgnoreCutlist = 256,
+              kWhenceMask = 3;
     int flags = 0;
     if (has_action("SEEKFFWD", actions))
         flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative;
+    else if (has_action("SEEKFFWDNOCUTLIST", actions))
+        flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative | kIgnoreCutlist;
     else if (has_action("FFWDSTICKY", actions))
         flags = ARBSEEK_END     | kForward | kSticky   | kAbsolute;
     else if (has_action("RIGHT", actions))
         flags = ARBSEEK_FORWARD | kForward | kSticky   | kRelative;
     else if (has_action("SEEKRWND", actions))
         flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative;
+    else if (has_action("SEEKRWNDNOCUTLIST", actions))
+        flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative | kIgnoreCutlist;
     else if (has_action("RWNDSTICKY", actions))
         flags = ARBSEEK_SET     | kRewind  | kSticky   | kAbsolute;
     else if (has_action("LEFT", actions))
@@ -5798,7 +5812,8 @@
     int direction = (flags & kRewind) ? -1 : 1;
     if (HasQueuedInput())
     {
-        DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask));
+        DoArbSeek(actx, static_cast<ArbSeekWhence>(flags & kWhenceMask),
+                  !(flags & kIgnoreCutlist));
     }
     else if (actx->paused)
     {
@@ -5808,7 +5823,7 @@
                              direction * (1.001 / actx->last_framerate);
             QString message = (flags & kRewind) ? QString(tr("Rewind")) :
                                                  QString(tr("Forward"));
-            DoSeek(actx, time, message);
+            DoSeek(actx, time, message, true, !(flags & kIgnoreCutlist));
         }
     }
     else if (flags & kSticky)
@@ -5819,19 +5834,23 @@
     {
             if (smartForward)
                 doSmartForward = true;
-            DoSeek(actx, -actx->rewtime, tr("Skip Back"));
+            DoSeek(actx, -actx->rewtime, tr("Skip Back"),
+                   true, !(flags & kIgnoreCutlist));
     }
     else
     {
         if (smartForward & doSmartForward)
-            DoSeek(actx, actx->rewtime, tr("Skip Ahead"));
+            DoSeek(actx, actx->rewtime, tr("Skip Ahead"),
+                   true, !(flags & kIgnoreCutlist));
         else
-            DoSeek(actx, actx->fftime, tr("Skip Ahead"));
+            DoSeek(actx, actx->fftime, tr("Skip Ahead"),
+                   true, !(flags & kIgnoreCutlist));
     }
     return true;
 }
 
-void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg)
+void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg,
+                bool timeIsOffset, bool honorCutlist)
 {
     bool limitkeys = false;
 
@@ -5845,12 +5864,25 @@
         keyRepeatTimer.start();
         NormalSpeed(ctx);
         time += StopFFRew(ctx);
+        float framerate = ctx->last_framerate;
+        uint64_t currentFrameAbs = ctx->player->GetFramesPlayed();
+        uint64_t currentFrameRel = honorCutlist ?
+            ctx->player->TranslatePositionAbsToRel(currentFrameAbs) :
+            currentFrameAbs;
+        int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) +
+            time * framerate + 0.5;
+        if (desiredFrameRel < 0)
+            desiredFrameRel = 0;
+        uint64_t desiredFrameAbs = honorCutlist ?
+            ctx->player->TranslatePositionRelToAbs(desiredFrameRel) :
+            desiredFrameRel;
+        time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate;
         DoPlayerSeek(ctx, time);
         UpdateOSDSeekMessage(ctx, mesg, kOSDTimeout_Med);
     }
 }
 
-void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
+void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence, bool honorCutlist)
 {
     bool ok = false;
     int seek = GetQueuedInputAsInt(&ok);
@@ -5861,9 +5893,9 @@
     float time = ((seek / 100) * 3600) + ((seek % 100) * 60);
 
     if (whence == ARBSEEK_FORWARD)
-        DoSeek(ctx, time, tr("Jump Ahead"));
+        DoSeek(ctx, time, tr("Jump Ahead"), true, honorCutlist);
     else if (whence == ARBSEEK_REWIND)
-        DoSeek(ctx, -time, tr("Jump Back"));
+        DoSeek(ctx, -time, tr("Jump Back"), true, honorCutlist);
     else
     {
         ctx->LockDeletePlayer(__FILE__, __LINE__);
@@ -5875,11 +5907,8 @@
         if (whence == ARBSEEK_END)
             time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) /
                     ctx->last_framerate) - time;
-        else
-            time = time - (ctx->player->GetFramesPlayed() - 1) /
-                    ctx->last_framerate;
         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
-        DoSeek(ctx, time, tr("Jump To"));
+        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist);
     }
 }
 
@@ -6815,6 +6844,7 @@
     {
         commited = true;
         if (HasQueuedInput())
+            // XXX Should the cutlist be honored?
             DoArbSeek(ctx, ARBSEEK_FORWARD);
     }
     else if (StateIsLiveTV(GetState(ctx)))
@@ -11406,7 +11436,7 @@
         uint chapterLength = ctx->buffer->DVD()->GetChapterLength();
         if ((titleLength == chapterLength) && chapterLength > 300)
         {
-            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
+            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
         }
         else
         {
@@ -11451,7 +11481,7 @@
              (currentTime < (chapterLength - (ctx->jumptime * 60))) &&
              chapterLength > 300)
         {
-            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"));
+            DoSeek(ctx, ctx->jumptime * 60, tr("Jump Ahead"), true);
         }
         else
         {
Index: libs/libmythtv/deletemap.cpp
===================================================================
--- libs/libmythtv/deletemap.cpp	(revision 26586)
+++ libs/libmythtv/deletemap.cpp	(working copy)
@@ -695,3 +695,63 @@
         result = it.key();
     return result;
 }
+
+uint64_t DeleteMap::TranslatePositionAbsToRel(const frm_dir_map_t &deleteMap,
+                                              uint64_t absPosition)
+{
+    uint64_t subtraction = 0;
+    uint64_t startOfCutRegion = 0;
+    frm_dir_map_t::const_iterator i;
+    bool withinCut = false;
+    bool first = true;
+    for (i = deleteMap.constBegin();
+         i != deleteMap.constEnd() && i.key() <= absPosition;
+         i++)
+    {
+        if (first)
+            withinCut = (i.value() == MARK_CUT_END);
+        first = false;
+        if (i.value() == MARK_CUT_START && !withinCut)
+        {
+            withinCut = true;
+            startOfCutRegion = i.key();
+        }
+        else if (i.value() == MARK_CUT_END && withinCut)
+        {
+            withinCut = false;
+            subtraction += (i.key() - startOfCutRegion);
+        }
+    }
+    if (withinCut)
+        subtraction += (absPosition - startOfCutRegion);
+    return absPosition - subtraction;
+}
+
+uint64_t DeleteMap::TranslatePositionRelToAbs(const frm_dir_map_t &deleteMap,
+                                              uint64_t relPosition)
+{
+    uint64_t addition = 0;
+    uint64_t startOfCutRegion = 0;
+    frm_dir_map_t::const_iterator i;
+    bool withinCut = false;
+    bool first = true;
+    for (i = deleteMap.constBegin(); i != deleteMap.constEnd(); i++)
+    {
+        if (first)
+            withinCut = (i.value() == MARK_CUT_END);
+        first = false;
+        if (i.value() == MARK_CUT_START && !withinCut)
+        {
+            withinCut = true;
+            startOfCutRegion = i.key();
+            if (relPosition + addition <= startOfCutRegion)
+                break;
+        }
+        else if (i.value() == MARK_CUT_END && withinCut)
+        {
+            withinCut = false;
+            addition += (i.key() - startOfCutRegion);
+        }
+    }
+    return relPosition + addition;
+}
Index: libs/libmythtv/mythplayer.cpp
===================================================================
--- libs/libmythtv/mythplayer.cpp	(revision 26586)
+++ libs/libmythtv/mythplayer.cpp	(working copy)
@@ -4142,7 +4142,8 @@
     info.values.insert("progbefore", 0);
     info.values.insert("progafter",  0);
 
-    int playbackLen = totalLength;
+    int rawPlaybackLen = totalLength;
+    int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate;
 
     if (livetv && player_ctx->tvchain)
     {
@@ -4160,18 +4161,22 @@
         islive = true;
     }
 
-    float secsplayed = ((float)framesPlayed / video_frame_rate);
-    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
+    float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate);
+    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
+    float rawSecsplayed = ((float)framesPlayed / video_frame_rate);
+    calcSliderPosPriv(info, paddedFields, rawPlaybackLen, rawSecsplayed, islive, true);
 }
 
 void MythPlayer::calcSliderPosPriv(osdInfo &info, bool paddedFields,
                                    int playbackLen, float secsplayed,
-                                   bool islive)
+                                   bool islive, bool isRaw)
 {
+    QString rawPrefix = isRaw ? "raw" : "";
     playbackLen = max(playbackLen, 1);
     secsplayed  = min((float)playbackLen, max(secsplayed, 0.0f));
 
-    info.values["position"] = (int)(1000.0f * (secsplayed / (float)playbackLen));
+    info.values[rawPrefix + "position"] =
+        (int)(1000.0f * (secsplayed / (float)playbackLen));
 
     int phours = (int)secsplayed / 3600;
     int pmins = ((int)secsplayed - phours * 3600) / 60;
@@ -4220,11 +4225,11 @@
         }
     }
 
-    info.text["description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);
-    info.text["playedtime"] = text1;
-    info.text["totaltime"] = text2;
-    info.text["remainingtime"] = islive ? QString() : text3;
-    info.text["behindtime"] = islive ? text3 : QString();
+    info.text[rawPrefix + "description"] = QObject::tr("%1 of %2").arg(text1).arg(text2);
+    info.text[rawPrefix + "playedtime"] = text1;
+    info.text[rawPrefix + "totaltime"] = text2;
+    info.text[rawPrefix + "remainingtime"] = islive ? QString() : text3;
+    info.text[rawPrefix + "behindtime"] = islive ? text3 : QString();
 }
 
 int MythPlayer::GetNumChapters()
Index: libs/libmythtv/osd.cpp
===================================================================
--- libs/libmythtv/osd.cpp	(revision 26586)
+++ libs/libmythtv/osd.cpp	(working copy)
@@ -313,6 +313,18 @@
             found = true;
         }
     }
+    if (map.contains("rawposition"))
+    {
+        MythUIProgressBar *bar = dynamic_cast<MythUIProgressBar *> (win->GetChild("rawposition"));
+        if (bar)
+        {
+            bar->SetVisible(true);
+            bar->SetStart(0);
+            bar->SetTotal(1000);
+            bar->SetUsed(map.value("rawposition"));
+            found = true;
+        }
+    }
 
     if (found)
         SetExpiry(window, timeout);
