diff --git a/mythtv/libs/libmythtv/mythplayer.cpp b/mythtv/libs/libmythtv/mythplayer.cpp
index 198e1fa..ac1c141 100644
--- a/mythtv/libs/libmythtv/mythplayer.cpp
+++ b/mythtv/libs/libmythtv/mythplayer.cpp
@@ -3317,7 +3317,7 @@ bool MythPlayer::IsReallyNearEnd(void) const
  *  \param margin minimum number of frames we want before being near end,
  *                defaults to 2 seconds of video.
  */
-bool MythPlayer::IsNearEnd(int64_t margin)
+bool MythPlayer::IsNearEnd(int64_t margin, bool allowVideo)
 {
     uint64_t framesRead, framesLeft = 0;
 
@@ -3325,7 +3325,7 @@ bool MythPlayer::IsNearEnd(int64_t margin)
         return false;
 
     player_ctx->LockPlayingInfo(__FILE__, __LINE__);
-    if (!player_ctx->playingInfo || player_ctx->playingInfo->IsVideo() ||
+    if (!player_ctx->playingInfo || (player_ctx->playingInfo->IsVideo() && !allowVideo) ||
         !decoder)
     {
         player_ctx->UnlockPlayingInfo(__FILE__, __LINE__);
@@ -3341,7 +3341,10 @@ bool MythPlayer::IsNearEnd(int64_t margin)
     framesRead = decoder->GetFramesRead();
 
     if (!player_ctx->IsPIP() &&
-        player_ctx->GetState() == kState_WatchingPreRecorded)
+        (player_ctx->GetState() == kState_WatchingPreRecorded ||
+         player_ctx->GetState() == kState_WatchingVideo ||
+         player_ctx->GetState() == kState_WatchingBD ||
+         player_ctx->GetState() == kState_WatchingDVD))
     {
         if (framesRead >= deleteMap.GetLastFrame(totalFrames))
             return true;
diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
index b776296..e67abf8 100644
--- a/mythtv/libs/libmythtv/mythplayer.h
+++ b/mythtv/libs/libmythtv/mythplayer.h
@@ -194,7 +194,7 @@ class MPUBLIC MythPlayer
     bool    IsPlaying(uint wait_ms = 0, bool wait_for = true) const;
     bool    AtNormalSpeed(void) const         { return next_normal_speed; }
     bool    IsReallyNearEnd(void) const;
-    bool    IsNearEnd(int64_t framesRemaining = -1);
+    bool    IsNearEnd(int64_t framesRemaining = -1, bool allowVideo = false);
     bool    HasAudioOut(void) const           { return audio.HasAudioOut(); }
     bool    IsPIPActive(void) const           { return pip_active; }
     bool    IsPIPVisible(void) const          { return pip_visible; }
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index d7a381c..2d13bc6 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -3085,14 +3085,21 @@ void TV::PrepToSwitchToRecordedProgram(PlayerContext *ctx,
     SetExitPlayer(true, true);
 }
 
-void TV::PrepareToExitPlayer(PlayerContext *ctx, int line, bool bookmark) const
+void TV::PrepareToExitPlayer(PlayerContext *ctx, int line, BookmarkAction bookmark) const
 {
-    bool bookmark_it = bookmark && IsBookmarkAllowed(ctx);
+    bool bm_basic = (bookmark == kBookmarkAlways ||
+                     (bookmark == kBookmarkAuto && db_playback_exit_prompt == 2));
+    bool bookmark_it = bm_basic && IsBookmarkAllowed(ctx);
     ctx->LockDeletePlayer(__FILE__, line);
     if (ctx->player)
     {
-        if (bookmark_it && !(ctx->player->IsNearEnd()))
-            ctx->player->SetBookmark();
+        if (bookmark_it)
+        {
+            if (ctx->player->IsNearEnd(-1, true))
+                ctx->player->ClearBookmark();
+            else
+                ctx->player->SetBookmark();
+        }
         if (db_auto_set_watched)
             ctx->player->SetWatched();
     }
@@ -3160,7 +3167,7 @@ void TV::HandleEndOfPlaybackTimerEvent(void)
         if (mctx == ctx)
         {
             endOfRecording = true;
-            PrepareToExitPlayer(mctx, __LINE__, false);
+            PrepareToExitPlayer(mctx, __LINE__);
             SetExitPlayer(true, true);
         }
     }
@@ -4283,7 +4290,7 @@ bool TV::ActiveHandleAction(PlayerContext *ctx,
                 ShowOSDStopWatchingRecording(ctx);
                 return handled;
             }
-            PrepareToExitPlayer(ctx, __LINE__, db_playback_exit_prompt == 2);
+            PrepareToExitPlayer(ctx, __LINE__);
             requestDelete = false;
             do_exit = true;
         }
@@ -8560,8 +8567,7 @@ void TV::customEvent(QEvent *e)
         for (uint i = 0; mctx && (i < player.size()); i++)
         {
             PlayerContext *ctx = GetPlayer(mctx, i);
-            PrepareToExitPlayer(ctx, __LINE__, db_playback_exit_prompt == 1 ||
-                                               db_playback_exit_prompt == 2);
+            PrepareToExitPlayer(ctx, __LINE__);
         }
 
         SetExitPlayer(true, true);
@@ -11747,7 +11753,7 @@ bool TV::HandleOSDVideoExit(PlayerContext *ctx, QString action)
     }
     else if (action == "SAVEPOSITIONANDEXIT" && bookmark_ok)
     {
-        PrepareToExitPlayer(ctx, __LINE__);
+        PrepareToExitPlayer(ctx, __LINE__, kBookmarkAlways);
         SetExitPlayer(true, true);
     }
     else if (action == "KEEPWATCHING" && !near_end)
@@ -11756,7 +11762,7 @@ bool TV::HandleOSDVideoExit(PlayerContext *ctx, QString action)
     }
     else/* (action == "JUSTEXIT")*/
     {
-        PrepareToExitPlayer(ctx, __LINE__, false);
+        PrepareToExitPlayer(ctx, __LINE__, kBookmarkNever);
         SetExitPlayer(true, true);
     }
 
diff --git a/mythtv/libs/libmythtv/tv_play.h b/mythtv/libs/libmythtv/tv_play.h
index 9207280..8830d06 100644
--- a/mythtv/libs/libmythtv/tv_play.h
+++ b/mythtv/libs/libmythtv/tv_play.h
@@ -331,8 +331,13 @@ class MPUBLIC TV : public QObject
     void SetErrored(PlayerContext*);
     void PrepToSwitchToRecordedProgram(PlayerContext*,
                                        const ProgramInfo &);
+    enum BookmarkAction {
+        kBookmarkAlways,
+        kBookmarkNever,
+        kBookmarkAuto // set iff db_playback_exit_prompt==2
+    };
     void PrepareToExitPlayer(PlayerContext*, int line,
-                             bool bookmark = true) const;
+                             BookmarkAction bookmark = kBookmarkAuto) const;
     void SetExitPlayer(bool set_it, bool wants_to) const;
     void SetUpdateOSDPosition(bool set_it);
 
