diff --git a/mythtv/libs/libmythtv/bdringbuffer.cpp b/mythtv/libs/libmythtv/bdringbuffer.cpp
index 8028527..bd7fc9f 100644
--- a/mythtv/libs/libmythtv/bdringbuffer.cpp
+++ b/mythtv/libs/libmythtv/bdringbuffer.cpp
@@ -199,11 +199,13 @@ bool BDRingBuffer::HandleAction(const QStringList &actions, int64_t pts)
         PressButton(BD_VK_DOWN, pts);
     }
     else if (actions.contains(ACTION_LEFT) ||
+             actions.contains(ACTION_SEEKRWNDNOCUTLIST) ||
              actions.contains(ACTION_SEEKRWND))
     {
         PressButton(BD_VK_LEFT, pts);
     }
     else if (actions.contains(ACTION_RIGHT) ||
+             actions.contains(ACTION_SEEKFFWDNOCUTLIST) ||
              actions.contains(ACTION_SEEKFFWD))
     {
         PressButton(BD_VK_RIGHT, pts);
diff --git a/mythtv/libs/libmythtv/deletemap.cpp b/mythtv/libs/libmythtv/deletemap.cpp
index 0a1ac66..ef6d4ba 100644
--- a/mythtv/libs/libmythtv/deletemap.cpp
+++ b/mythtv/libs/libmythtv/deletemap.cpp
@@ -127,7 +127,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.
  */
@@ -145,22 +161,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));
@@ -819,3 +838,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)
+    {
+        if (first)
+            withinCut = (i.value() == MARK_CUT_END);
+        first = false;
+        if (i.key() > absPosition)
+            break;
+        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 2dfa190..ffdb2d0 100644
--- a/mythtv/libs/libmythtv/deletemap.h
+++ b/mythtv/libs/libmythtv/deletemap.h
@@ -59,6 +59,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/dvdringbuffer.cpp b/mythtv/libs/libmythtv/dvdringbuffer.cpp
index 318f8f8..fd20394 100644
--- a/mythtv/libs/libmythtv/dvdringbuffer.cpp
+++ b/mythtv/libs/libmythtv/dvdringbuffer.cpp
@@ -1143,11 +1143,13 @@ bool DVDRingBuffer::HandleAction(const QStringList &actions, int64_t pts)
         MoveButtonDown();
     }
     else if (actions.contains(ACTION_LEFT) ||
+             actions.contains(ACTION_SEEKRWNDNOCUTLIST) ||
              actions.contains(ACTION_SEEKRWND))
     {
         MoveButtonLeft();
     }
     else if (actions.contains(ACTION_RIGHT) ||
+             actions.contains(ACTION_SEEKFFWDNOCUTLIST) ||
              actions.contains(ACTION_SEEKFFWD))
     {
         MoveButtonRight();
diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
index 4757f16..ea6b7ee 100644
--- a/mythtv/libs/libmythtv/mythplayer.cpp
+++ b/mythtv/libs/libmythtv/mythplayer.cpp
@@ -4619,9 +4619,21 @@ void MythPlayer::calcSliderPos(osdInfo &info, bool paddedFields)
     playbackLen = max(playbackLen, 1);
     secsplayed  = min((float)playbackLen, max(secsplayed, 0.0f));
 
-    info.values.insert("secondsplayed", (int)secsplayed);
-    info.values.insert("totalseconds", playbackLen);
-    info.values["position"] = (int)(1000.0f * (secsplayed / (float)playbackLen));
+    // Set the raw values, followed by the translated values.
+    for (int i = 0; i < 2 ; ++i)
+    {
+        QString rawPrefix = (i == 0 ? "raw" : "");
+        if (i > 0)
+        {
+            playbackLen = deleteMap.TranslatePositionAbsToRel(playbackLen * video_frame_rate) /
+                video_frame_rate;
+            secsplayed = deleteMap.TranslatePositionAbsToRel(secsplayed * video_frame_rate) /
+                video_frame_rate;
+        }
+
+    info.values.insert(rawPrefix + "secondsplayed", (int)secsplayed);
+    info.values.insert(rawPrefix + "totalseconds", playbackLen);
+    info.values[rawPrefix + "position"] = (int)(1000.0f * (secsplayed / (float)playbackLen));
 
     int phours = (int)secsplayed / 3600;
     int pmins = ((int)secsplayed - phours * 3600) / 60;
@@ -4670,11 +4682,12 @@ void MythPlayer::calcSliderPos(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 56ddc01..dd8a296 100644
--- a/mythtv/libs/libmythtv/mythplayer.h
+++ b/mythtv/libs/libmythtv/mythplayer.h
@@ -353,6 +353,12 @@ class MTV_PUBLIC 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)
diff --git a/mythtv/libs/libmythtv/osd.cpp b/mythtv/libs/libmythtv/osd.cpp
index 56d6611..68ca122 100644
--- a/mythtv/libs/libmythtv/osd.cpp
+++ b/mythtv/libs/libmythtv/osd.cpp
@@ -344,6 +344,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_actions.h b/mythtv/libs/libmythtv/tv_actions.h
index 40cb096..33c61d2 100644
--- a/mythtv/libs/libmythtv/tv_actions.h
+++ b/mythtv/libs/libmythtv/tv_actions.h
@@ -38,6 +38,10 @@
 #define ACTION_JUMPFFWD             "JUMPFFWD"
 #define ACTION_JUMPRWND             "JUMPRWND"
 #define ACTION_JUMPBKMRK            "JUMPBKMRK"
+#define ACTION_SEEKRWNDNOCUTLIST    "SEEKRWNDNOCUTLIST"
+#define ACTION_SEEKFFWDNOCUTLIST    "SEEKFFWDNOCUTLIST"
+#define ACTION_JUMPRWNDNOCUTLIST    "JUMPRWNDNOCUTLIST"
+#define ACTION_JUMPFFWDNOCUTLIST    "JUMPFFWDNOCUTLIST"
 #define ACTION_JUMPSTART            "JUMPSTART"
 #define ACTION_JUMPTODVDROOTMENU    "JUMPTODVDROOTMENU"
 #define ACTION_JUMPTOPOPUPMENU      "JUMPTOPOPUPMENU"
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index f713b42..78aad4d 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -505,10 +505,16 @@ void TV::InitKeys(void)
             "Pause"), "P");
     REG_KEY("TV Playback", ACTION_SEEKFFWD, QT_TRANSLATE_NOOP("MythControls",
             "Fast Forward"), "Right");
+    REG_KEY("TV Playback", ACTION_SEEKFFWDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls",
+            "Fast Forward ignoring cutlist"), "");
     REG_KEY("TV Playback", ACTION_SEEKRWND, QT_TRANSLATE_NOOP("MythControls",
             "Rewind"), "Left");
+    REG_KEY("TV Playback", ACTION_SEEKRWNDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls",
+            "Rewind ignoring cutlist"), "");
     REG_KEY("TV Playback", ACTION_SEEKARB, QT_TRANSLATE_NOOP("MythControls",
             "Arbitrary Seek"), "*");
+    REG_KEY("TV Playback", "ARBSEEKNOCUTLIST", QT_TRANSLATE_NOOP("MythControls",
+            "Arbitrary Seek ignoring cutlist"), "");
     REG_KEY("TV Playback", ACTION_SEEKABSOLUTE, QT_TRANSLATE_NOOP("MythControls",
             "Seek to a position in seconds"), "");
     REG_KEY("TV Playback", ACTION_CHANNELUP, QT_TRANSLATE_NOOP("MythControls",
@@ -521,8 +527,14 @@ void TV::InitKeys(void)
             "Switch to the previous channel"), "H");
     REG_KEY("TV Playback", ACTION_JUMPFFWD, QT_TRANSLATE_NOOP("MythControls",
             "Jump ahead"), "PgDown");
+    REG_KEY("TV Playback", ACTION_JUMPFFWDNOCUTLIST, QT_TRANSLATE_NOOP("MythControls",
+            "Jump ahead ignoring cutlist"), "");
     REG_KEY("TV Playback", ACTION_JUMPRWND, QT_TRANSLATE_NOOP("MythControls",
             "Jump back"), "PgUp");
+    REG_KEY("TV Playback", ACTION_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", ACTION_JUMPBKMRK, QT_TRANSLATE_NOOP("MythControls",
             "Jump to bookmark"), "K");
     REG_KEY("TV Playback", "FFWDSTICKY", QT_TRANSLATE_NOOP("MythControls",
@@ -4013,31 +4025,27 @@ bool TV::ActiveHandleAction(PlayerContext *ctx,
         }
     }
     else if (has_action(ACTION_JUMPRWND, actions))
-        DoJumpRWND(ctx);
+        DoJumpRWND(ctx, true);
+    else if (has_action(ACTION_JUMPRWNDNOCUTLIST, actions))
+        DoJumpRWND(ctx, false);
     else if (has_action(ACTION_JUMPFFWD, actions))
-        DoJumpFFWD(ctx);
+        DoJumpFFWD(ctx, true);
+    else if (has_action(ACTION_JUMPFFWDNOCUTLIST, actions))
+        DoJumpFFWD(ctx, false);
     else if (has_action(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(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(ACTION_CLEAROSD, actions))
     {
@@ -4195,11 +4203,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);
@@ -4437,7 +4445,7 @@ bool TV::ActivePostQHandleAction(PlayerContext *ctx, const QStringList &actions)
                 ChangeChannel(ctx, CHANNEL_DIRECTION_UP);
         }
         else
-            DoJumpRWND(ctx);
+            DoJumpRWND(ctx, true);
     }
     else if (has_action(ACTION_CHANNELDOWN, actions))
     {
@@ -4449,7 +4457,7 @@ bool TV::ActivePostQHandleAction(PlayerContext *ctx, const QStringList &actions)
                 ChangeChannel(ctx, CHANNEL_DIRECTION_DOWN);
         }
         else
-            DoJumpFFWD(ctx);
+            DoJumpFFWD(ctx, true);
     }
     else if (has_action("DELETE", actions) && !islivetv)
     {
@@ -4678,15 +4686,18 @@ 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+$"))))
         {
-            DoSeekAbsolute(ctx, tokens[3].toInt());
+            DoSeekAbsolute(ctx, tokens[3].toInt(),
+                           tokens[2] == "POSITION");
         }
     }
     else if (tokens.size() >= 3 && tokens[1] == "VOLUME")
@@ -5720,16 +5731,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(ACTION_SEEKFFWD, actions))
         flags = ARBSEEK_FORWARD | kForward | kSlippery | kRelative;
+    else if (has_action(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(ACTION_RIGHT, actions))
         flags = ARBSEEK_FORWARD | kForward | kSticky   | kRelative;
     else if (has_action(ACTION_SEEKRWND, actions))
         flags = ARBSEEK_REWIND  | kRewind  | kSlippery | kRelative;
+    else if (has_action(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(ACTION_LEFT, actions))
@@ -5740,7 +5756,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 (ContextIsPaused(actx, __FILE__, __LINE__))
     {
@@ -5755,7 +5772,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)
@@ -5766,19 +5783,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;
 
@@ -5792,12 +5813,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::DoSeekAbsolute(PlayerContext *ctx, long long seconds)
+void TV::DoSeekAbsolute(PlayerContext *ctx, long long seconds, bool honorCutlist)
 {
     ctx->LockDeletePlayer(__FILE__, __LINE__);
     if (!ctx->player)
@@ -5807,10 +5841,10 @@ void TV::DoSeekAbsolute(PlayerContext *ctx, long long seconds)
     }
     seconds -= (ctx->player->GetFramesPlayed() - 1) / ctx->player->GetFrameRate();
     ctx->UnlockDeletePlayer(__FILE__, __LINE__);
-    DoSeek(ctx, seconds, tr("Jump To"));
+    DoSeek(ctx, seconds, tr("Jump To"), honorCutlist);
 }
 
-void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
+void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence, bool honorCutlist)
 {
     bool ok = false;
     int seek = GetQueuedInputAsInt(&ok);
@@ -5821,9 +5855,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 if (whence == ARBSEEK_END)
     {
         ctx->LockDeletePlayer(__FILE__, __LINE__);
@@ -5835,10 +5869,10 @@ void TV::DoArbSeek(PlayerContext *ctx, ArbSeekWhence whence)
         time = (ctx->player->CalcMaxFFTime(LONG_MAX, false) /
                 ctx->player->GetFrameRate()) - time;
         ctx->UnlockDeletePlayer(__FILE__, __LINE__);
-        DoSeek(ctx, time, tr("Jump To"));
+        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET), honorCutlist);
     }
     else
-        DoSeekAbsolute(ctx, time);
+        DoSeekAbsolute(ctx, time, honorCutlist);
 }
 
 void TV::NormalSpeed(PlayerContext *ctx)
@@ -6763,6 +6797,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)))
@@ -9800,9 +9835,13 @@ void TV::OSDDialogEvent(int result, QString text, QString action)
         SetExitPlayer(true, true);
     }
     else if (action == ACTION_JUMPFFWD)
-        DoJumpFFWD(actx);
+        DoJumpFFWD(actx, true);
+    else if (action == ACTION_JUMPFFWDNOCUTLIST)
+        DoJumpFFWD(actx, false);
     else if (action == ACTION_JUMPRWND)
-        DoJumpRWND(actx);
+        DoJumpRWND(actx, true);
+    else if (action == ACTION_JUMPRWNDNOCUTLIST)
+        DoJumpRWND(actx, false);
     else if (action.startsWith("DEINTERLACER"))
         HandleDeinterlacer(actx, action);
     else if (action == ACTION_TOGGLEOSDDEBUG)
@@ -11633,24 +11672,24 @@ void TV::ITVRestart(PlayerContext *ctx, bool isLive)
     ctx->UnlockDeletePlayer(__FILE__, __LINE__);
 }
 
-void TV::DoJumpFFWD(PlayerContext *ctx)
+void TV::DoJumpFFWD(PlayerContext *ctx, bool honorCutlist)
 {
     if (GetState(ctx) == kState_WatchingDVD)
         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, honorCutlist);
 }
 
-void TV::DoJumpRWND(PlayerContext *ctx)
+void TV::DoJumpRWND(PlayerContext *ctx, bool honorCutlist)
 {
     if (GetState(ctx) == kState_WatchingDVD)
         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, honorCutlist);
 }
 
 /*  \fn TV::DVDJumpBack(PlayerContext*)
@@ -11676,7 +11715,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
         {
@@ -11719,7 +11758,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 f9cedca..ad495b5 100644
--- a/mythtv/libs/libmythtv/tv_play.h
+++ b/mythtv/libs/libmythtv/tv_play.h
@@ -383,7 +383,8 @@ class MTV_PUBLIC TV : public QObject
     ProgramInfo *GetLastProgram(void) const;
 
     // Seek, skip, jump, speed
-    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,
@@ -391,10 +392,10 @@ class MTV_PUBLIC TV : public QObject
         ARBSEEK_FORWARD,
         ARBSEEK_END
     };
-    void DoSeekAbsolute(PlayerContext *ctx, long long seconds);
-    void DoArbSeek(PlayerContext*, ArbSeekWhence whence);
-    void DoJumpFFWD(PlayerContext *ctx);
-    void DoJumpRWND(PlayerContext *ctx);
+    void DoSeekAbsolute(PlayerContext *ctx, long long seconds, bool honorCutlist=true);
+    void DoArbSeek(PlayerContext*, ArbSeekWhence whence, bool honorCutlist=true);
+    void DoJumpFFWD(PlayerContext *ctx, bool honorCutlist);
+    void DoJumpRWND(PlayerContext *ctx, bool honorCutlist);
     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 b711a3c..6f60e2e 100644
--- a/mythtv/themes/default-wide/osd.xml
+++ b/mythtv/themes/default-wide/osd.xml
@@ -519,7 +519,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>
