Index: libs/libmythtv/deletemap.h
===================================================================
--- libs/libmythtv/deletemap.h	(revision 25179)
+++ libs/libmythtv/deletemap.h	(working copy)
@@ -44,6 +44,8 @@
     bool     IsInDelete(uint64_t frame);
     uint64_t GetNearestMark(uint64_t frame, uint64_t total, bool right);
     uint64_t GetLastFrame(uint64_t total);
+    uint64_t TranslatePositionAbsToRel(uint64_t absPosition);
+    uint64_t TranslatePositionRelToAbs(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/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 25179)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -3968,7 +3968,7 @@
     info.values.insert("progbefore", 0);
     info.values.insert("progafter",  0);
 
-    int playbackLen = totalLength;
+    int playbackLen = deleteMap.TranslatePositionAbsToRel(totalLength * video_frame_rate) / video_frame_rate;
 
     if (livetv && player_ctx->tvchain)
     {
@@ -3986,7 +3986,7 @@
         islive = true;
     }
 
-    float secsplayed = ((float)framesPlayed / video_frame_rate);
+    float secsplayed = ((float)deleteMap.TranslatePositionAbsToRel(framesPlayed) / video_frame_rate);
     calcSliderPosPriv(info, paddedFields, playbackLen, secsplayed, islive);
 }
 
Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 25179)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -416,7 +416,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=true);
     bool DoNVPSeek(PlayerContext*, float time);
     enum ArbSeekWhence {
         ARBSEEK_SET = 0,
Index: libs/libmythtv/NuppelVideoPlayer.h
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.h	(revision 25179)
+++ libs/libmythtv/NuppelVideoPlayer.h	(working copy)
@@ -233,6 +233,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; }
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 25179)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -3983,32 +3983,21 @@
     else if (has_action("JUMPBKMRK", actions))
     {
         ctx->LockDeleteNVP(__FILE__, __LINE__);
-        long long bookmark = ctx->nvp->GetBookmark();
-        long long curloc   = ctx->nvp->GetFramesPlayed();
+        uint64_t bookmark = ctx->nvp->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->nvp->TranslatePositionAbsToRel(bookmark) * mult;
         ctx->UnlockDeleteNVP(__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->LockDeleteNVP(__FILE__, __LINE__);
-        if (ctx->nvp && ctx->last_framerate >= 0.0001f)
-        {
-            seekloc = (int64_t) (-1.0 * ctx->nvp->GetFramesPlayed() /
-                                 ctx->last_framerate);
-        }
-        ctx->UnlockDeleteNVP(__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))
     {
@@ -4591,7 +4580,7 @@
         ctx->UnlockDeleteNVP(__FILE__, __LINE__);
 
         if (tokens[2] == "BEGINNING")
-            DoSeek(ctx, -fplay, tr("Jump to Beginning"));
+            DoSeek(ctx, 0, tr("Jump to Beginning"), false);
         else if (tokens[2] == "FORWARD")
             DoSeek(ctx, ctx->fftime, tr("Skip Ahead"));
         else if (tokens[2] == "BACKWARD")
@@ -4601,8 +4590,7 @@
                  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);
         }
     }
     else if (tokens.size() >= 3 && tokens[1] == "QUERY")
@@ -5637,7 +5625,8 @@
     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 limitkeys = false;
 
@@ -5651,6 +5640,17 @@
         keyRepeatTimer.start();
         NormalSpeed(ctx);
         time += StopFFRew(ctx);
+        float framerate = ctx->last_framerate;
+        uint64_t currentFrameAbs = ctx->nvp->GetFramesPlayed();
+        uint64_t currentFrameRel =
+            ctx->nvp->TranslatePositionAbsToRel(currentFrameAbs);
+        int64_t desiredFrameRel = (timeIsOffset ? currentFrameRel : 0) +
+            time * framerate + 0.5;
+        if (desiredFrameRel < 0)
+            desiredFrameRel = 0;
+        uint64_t desiredFrameAbs =
+            ctx->nvp->TranslatePositionRelToAbs(desiredFrameRel);
+        time = ((int64_t)desiredFrameAbs - (int64_t)currentFrameAbs) / framerate;
         DoNVPSeek(ctx, time);
         UpdateOSDSeekMessage(ctx, mesg, true);
     }
@@ -5681,11 +5681,8 @@
         if (whence == ARBSEEK_END)
             time = (ctx->nvp->CalcMaxFFTime(LONG_MAX, false) /
                     ctx->last_framerate) - time;
-        else
-            time = time - (ctx->nvp->GetFramesPlayed() - 1) /
-                    ctx->last_framerate;
         ctx->UnlockDeleteNVP(__FILE__, __LINE__);
-        DoSeek(ctx, time, tr("Jump To"));
+        DoSeek(ctx, time, tr("Jump To"), (whence != ARBSEEK_SET));
     }
 }
 
Index: libs/libmythtv/deletemap.cpp
===================================================================
--- libs/libmythtv/deletemap.cpp	(revision 25179)
+++ libs/libmythtv/deletemap.cpp	(working copy)
@@ -505,3 +505,61 @@
         result = it.key();
     return result;
 }
+
+uint64_t DeleteMap::TranslatePositionAbsToRel(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 = m_deleteMap.constBegin();
+         i != m_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(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 = m_deleteMap.constBegin(); i != m_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;
+}
