--- a/playlist/playlist.h
+++ b/playlist/playlist.h
@@ -85,21 +85,16 @@
     virtual void psl_load_playlist();
     virtual void psl_save_playlist();
 
-    virtual void psl_change_track(int num) {
-        m_insertion_point = -1;
-        psl_change_track_impl(num);
-    }
+    virtual void psl_change_track(int num) final;
+    virtual void psl_change_track_impl(int) = 0;
+
     virtual void psl_seek(int secs) = 0;
 
-    virtual void psl_change_track_impl(int) = 0;
-
     // Information from the remote end
-    virtual void onRemoteTpState(int, const char *);
+    virtual void onRemoteTpState(int, const char *) final;
     // Maybe also tell the subclass about these
     virtual void onRemoteTpState_impl(int, const char *) {}
-    void onRemoteSecsInSong(quint32 s) {
-        onRemoteSecsInSong_impl(s);
-    }
+    virtual void onRemoteSecsInSong(quint32 s) final;
     virtual void onRemoteSecsInSong_impl(quint32) {}
     
     // Mode change requested by UI
@@ -107,7 +102,8 @@
     virtual void psl_clear_playlist();
     virtual void psl_clear_playlist_impl() = 0;
     virtual void psl_play() = 0;
-    virtual void psl_pause() = 0;
+    virtual void psl_pause() final;
+    virtual void psl_pause_impl() = 0;
     virtual void psl_stop() = 0;
     virtual void psl_forward() = 0;
     virtual void psl_backward() = 0;
@@ -136,7 +132,7 @@
     int m_selection_min_row;
     int m_insertion_point;
     int m_tpstate;
-
+    
     virtual void remove_row(int row);
     virtual bool valid_row(int row) {
         return row >= 0 && row < int(m_meta.size());