diff --git a/mythtv/libs/libmythtv/deletemap.cpp b/mythtv/libs/libmythtv/deletemap.cpp
index 7cda7ac..bc42b43 100644
--- a/mythtv/libs/libmythtv/deletemap.cpp
+++ b/mythtv/libs/libmythtv/deletemap.cpp
@@ -66,7 +66,23 @@ void DeleteMap::UpdateSeekAmount(int change, double framerate)
     }
 }
 
-/**
+static QString createTimeString(uint64_t frame, uint64_t total,
+                                double frame_rate, bool full_resolution)
+{
+    int secs   = (int)(frame / frame_rate);
+    int frames = frame - (int)(secs * frame_rate);
+    int totalSecs = (int)(total / frame_rate);
+    QString timestr;
+    if (totalSecs >= 3600)
+        timestr = QString::number(secs / 3600) + ":";
+    timestr += QString("%1").arg((secs / 60) % 60, 2, 10, QChar(48)) +
+        QString(":%1").arg(secs % 60, 2, 10, QChar(48));
+    if (full_resolution)
+        timestr += QString(".%1").arg(frames, 2, 10, QChar(48));
+    return timestr;
+}
+
+ /**
  * \brief Show and update the edit mode On Screen Display. The cut regions
  *        are only refreshed if the deleteMap has been updated.
  */
@@ -84,22 +100,25 @@ void DeleteMap::UpdateOSD(uint64_t frame, uint64_t total, double frame_rate,
     infoMap.detach();
     ctx->UnlockPlayingInfo(__FILE__, __LINE__);
 
-    int secs   = (int)(frame / frame_rate);
-    int frames = frame - (int)(secs * frame_rate);
-    QString timestr = QString::number(secs / 3600) +
-                      QString(":%1").arg((secs / 60) % 60, 2, 10, QChar(48)) +
-                      QString(":%1").arg(secs % 60, 2, 10, QChar(48)) +
-                      QString(".%1").arg(frames, 2, 10, QChar(48));
-
     QString cutmarker = " ";
     if (IsInDelete(frame))
         cutmarker = QObject::tr("cut");
 
+    QString timestr = createTimeString(frame, total, frame_rate, true);
+    uint64_t relTotal = TranslatePositionAbsToRel(total);
+    QString relTimeDisplay = createTimeString(TranslatePositionAbsToRel(frame),
+                                              relTotal, frame_rate, false);
+    QString relLengthDisplay = createTimeString(relTotal,
+                                                relTotal, frame_rate, false);
     infoMap["timedisplay"]  = timestr;
     infoMap["framedisplay"] = QString::number(frame);
     infoMap["cutindicator"] = cutmarker;
     infoMap["title"]        = QObject::tr("Edit");
     infoMap["seekamount"]   = m_seekText;;
+    infoMap["reltimedisplay"] = relTimeDisplay;
+    infoMap["rellengthdisplay"] = relLengthDisplay;
+    infoMap["fulltimedisplay"] = timestr + " (" +
+        QObject::tr("%1 of %2").arg(relTimeDisplay).arg(relLengthDisplay) + ")";
 
     QHash<QString,float> posMap;
     posMap.insert("position", (float)((double)frame/(double)total));
@@ -721,3 +740,63 @@ bool DeleteMap::IsSaved(PlayerContext *ctx)
 
     return currentMap == savedMap;
 }
+
+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;
+}
diff --git a/mythtv/libs/libmythtv/deletemap.h b/mythtv/libs/libmythtv/deletemap.h
index e6a599b..5c4c2d5 100644
--- a/mythtv/libs/libmythtv/deletemap.h
+++ b/mythtv/libs/libmythtv/deletemap.h
@@ -46,6 +46,16 @@ class DeleteMap
     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);
diff --git a/mythtv/libs/libmythtv/mythdvdplayer.cpp b/mythtv/libs/libmythtv/mythdvdplayer.cpp
index 49e08af..8c8724f 100644
--- a/mythtv/libs/libmythtv/mythdvdplayer.cpp
+++ b/mythtv/libs/libmythtv/mythdvdplayer.cpp
@@ -437,7 +437,8 @@ void MythDVDPlayer::calcSliderPos(osdInfo &info, bool paddedFields)
     // 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,
diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
index 1705794..53d7681 100644
--- a/mythtv/libs/libmythtv/mythplayer.cpp
+++ b/mythtv/libs/libmythtv/mythplayer.cpp
@@ -4251,7 +4251,11 @@ void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields)
     info.values.insert("progbefore", 0);
     info.values.insert("progafter",  0);
 
-    int playbackLen = (totalDuration > 0) ? totalDuration : totalLength;
+    int rawPlaybackLen = (totalDuration > 0) ? totalDuration : totalLength;
+    // XXX- Note that the translated playbackLen uses the frame count
+    // with respect to a fixed frame rate, rather than the ffmpeg
+    // display timecode.
+    int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate;
        
     if (livetv && player_ctx->tvchain)
     {
@@ -4269,18 +4273,25 @@ void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields)
         islive = true;
     }
 
-    float secsplayed = (float)(disp_timecode / 1000.f);
-    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
+    // XXX- Note that the translated secsplayed uses the frame number
+    // with respect to a fixed frame rate, rather than the ffmpeg
+    // display timecode.
+    float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate);
+    calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive, false);
+    float rawSecsplayed = (float)(disp_timecode / 1000.f);
+    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;
@@ -4329,11 +4340,11 @@ void MythPlayer::calcSliderPosPriv(osdInfo &info, bool paddedFields,
         }
     }
 
-    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()
diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
index 3229f4a..eee9809 100644
--- a/mythtv/libs/libmythtv/mythplayer.h
+++ b/mythtv/libs/libmythtv/mythplayer.h
@@ -344,6 +344,12 @@ class MPUBLIC MythPlayer
     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);
+    }
 
     // Commercial stuff
     void SetAutoCommercialSkip(CommSkipMode autoskip)
@@ -521,7 +527,8 @@ class MPUBLIC MythPlayer
     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;
diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp
index 67f7869..d60baee 100644
--- a/mythtv/libs/libmythtv/osd.cpp
+++ b/mythtv/libs/libmythtv/osd.cpp
@@ -335,6 +335,18 @@ void OSD::SetValues(const QString &window, QHash<QString,int> &map,
             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);
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index 1fb0b38..a8824ab 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -539,10 +539,16 @@ void TV::InitKeys(void)
             "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",
@@ -553,8 +559,14 @@ void TV::InitKeys(void)
             "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",
@@ -3941,12 +3953,14 @@ bool TV::DiscMenuHandleAction(PlayerContext *ctx, const QStringList &actions)
             dvdrb->MoveButtonDown();
         }
         else if (has_action("LEFT", actions) ||
-                 has_action("SEEKRWND", actions))
+                 has_action("SEEKRWND", actions) ||
+                 has_action("SEEKRWNDNOCUTLIST", actions))
         {
             dvdrb->MoveButtonLeft();
         }
         else if (has_action("RIGHT", actions) ||
-                 has_action("SEEKFFWD", actions))
+                 has_action("SEEKFFWD", actions) ||
+                 has_action("SEEKFFWDNOCUTLIST", actions))
         {
             dvdrb->MoveButtonRight();
         }
@@ -4136,46 +4150,42 @@ bool TV::ActiveHandleAction(PlayerContext *ctx,
             }
         }
     }
-    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     rate     = ctx->player->GetFrameRate();
-        long long seekloc = (long long) ((bookmark - curloc) / rate);
+        float seekloc = ctx->player->TranslatePositionAbsToRel(bookmark) / rate;
         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
 
         if (bookmark > rate)
-            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__);
-        seekloc = (int64_t) (-1.0 * ctx->player->GetFramesPlayed() /
-                             ctx->player->GetFrameRate());
-        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))
     {
@@ -4322,11 +4332,11 @@ bool TV::ActiveHandleAction(PlayerContext *ctx,
         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);
@@ -4525,7 +4535,7 @@ bool TV::ActivePostQHandleAction(PlayerContext *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);
     }
     else if (has_action("CHANNELDOWN", actions))
     {
@@ -4541,7 +4551,7 @@ bool TV::ActivePostQHandleAction(PlayerContext *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);
     }
     else if (has_action("DELETE", actions) && !islivetv)
     {
@@ -4766,18 +4776,19 @@ void TV::ProcessNetworkControlCommand(PlayerContext *ctx,
         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+$"))))
         {
             long long rel_frame = tokens[3].toInt();
-            rel_frame -= (long long) (fplay * (1.0 /
-                                      ctx->player->GetFrameRate()));
-            DoSeek(ctx, rel_frame, tr("Jump To"));
+            DoSeek(ctx, rel_frame / ctx->player->GetFrameRate(), tr("Jump To"),
+                   false, tokens[2] == "POSITION");
         }
     }
     else if (tokens.size() >= 3 && tokens[1] == "VOLUME")
@@ -5796,16 +5807,21 @@ bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions,
                           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))
@@ -5816,7 +5832,8 @@ bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions,
     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)
     {
@@ -5832,7 +5849,7 @@ bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions,
                              direction * (1.001 / rate);
             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)
@@ -5843,19 +5860,23 @@ bool TV::SeekHandleAction(PlayerContext *actx, const QStringList &actions,
     {
             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;
 
@@ -5869,12 +5890,25 @@ void TV::DoSeek(PlayerContext *ctx, float time, const QString &mesg)
         keyRepeatTimer.start();
         NormalSpeed(ctx);
         time += StopFFRew(ctx);
+        float framerate = ctx->player->GetFrameRate();
+        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);
@@ -5885,9 +5919,9 @@ void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
     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__);
@@ -5899,11 +5933,8 @@ void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
         if (whence == ARBSEEK_END)
             time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) /
                     ctx->player->GetFrameRate()) - time;
-        else
-            time = time - (ctx->player->GetFramesPlayed() - 1) /
-                    ctx->player->GetFrameRate();
         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
-        DoSeek(ctx, time, tr("Jump To"));
+        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist);
     }
 }
 
@@ -6838,6 +6869,7 @@ bool TV::CommitQueuedInput(PlayerContext *ctx)
     {
         commited = true;
         if (HasQueuedInput())
+            // XXX Should the cutlist be honored?
             DoArbSeek(ctx, ARBSEEK_FORWARD);
     }
     else if (StateIsLiveTV(GetState(ctx)))
@@ -11425,7 +11457,7 @@ void TV::DVDJumpBack(PlayerContext *ctx)
         uint chapterLength = dvdrb->GetChapterLength();
         if ((titleLength == chapterLength) && chapterLength > 300)
         {
-            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"));
+            DoSeek(ctx, -ctx->jumptime * 60, tr("Jump Back"), true);
         }
         else
         {
@@ -11473,7 +11505,7 @@ void TV::DVDJumpForward(PlayerContext *ctx)
              (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
         {
diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h
index 9207280..783d22c 100644
--- a/mythtv/libs/libmythtv/tv_play.h
+++ b/mythtv/libs/libmythtv/tv_play.h
@@ -411,7 +411,8 @@ class MPUBLIC TV : public QObject
 
     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,
@@ -419,7 +420,7 @@ class MPUBLIC TV : public QObject
         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*);
diff --git a/mythtv/themes/default-wide/osd.xml b/mythtv/themes/default-wide/osd.xml
index 6f8f4f5..ce378bc 100644
--- a/mythtv/themes/default-wide/osd.xml
+++ b/mythtv/themes/default-wide/osd.xml
@@ -352,7 +352,7 @@
             <area>770,10,300,30</area>
             <align>right,top</align>
         </textarea>
-        <textarea name="timedisplay" from="title">
+        <textarea name="fulltimedisplay" from="title">
             <area>10,50,1060,30</area>
             <align>hcenter,bottom</align>
         </textarea>
