Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 23324)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -300,6 +300,13 @@
     text_size = 8 * (sizeof(teletextsubtitle) + VT_WIDTH);
     for (int i = 0; i < MAXTBUFFER; i++)
         txtbuffers[i].buffer = new unsigned char[text_size + 1];
+
+    // Read the global audio sync (lipsync) settings
+    db_audio_sync = gContext->GetNumSettingOnHost(
+            "AudioSync", gContext->GetHostName(), 0);
+
+    VERBOSE(VB_IMPORTANT, LOC_ERR + QString("Saved audio timecode offset of %1").arg(db_audio_sync));
+    SaveAudioTimecodeOffset(db_audio_sync);
 }
 
 NuppelVideoPlayer::~NuppelVideoPlayer(void)
@@ -4902,7 +4909,7 @@
     if (savedAudioTimecodeOffset)
     {
         tc_wrap[TC_AUDIO] = savedAudioTimecodeOffset;
-        savedAudioTimecodeOffset = 0;
+        //savedAudioTimecodeOffset = 0;
     }
 
     SetPrebuffering(true);
Index: libs/libmythtv/NuppelVideoPlayer.h
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.h	(revision 23324)
+++ libs/libmythtv/NuppelVideoPlayer.h	(working copy)
@@ -807,6 +807,7 @@
     bool       decode_extra_audio;
     float      m_stored_audio_stretchfactor;
     bool       audio_paused;
+    long long  db_audio_sync;
 
     // Audio warping stuff
     bool       usevideotimebase;
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 23324)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -8110,7 +8110,7 @@
 // dir in 10ms jumps
 void TV::ChangeAudioSync(PlayerContext *ctx, int dir, bool allowEdit)
 {
-    long long newval;
+    long long newval = 0;
 
     ctx->LockDeleteNVP(__FILE__, __LINE__);
     if (!ctx->nvp)
@@ -8119,9 +8119,18 @@
         return;
     }
 
+    VERBOSE(VB_PLAYBACK, LOC + QString("ChangeAudioSync (%1, %2)")
+            .arg(audiosyncBaseline)
+            .arg(audiosyncAdjustment));
+
     if (!audiosyncAdjustment && LONG_LONG_MIN == audiosyncBaseline)
         audiosyncBaseline = ctx->nvp->GetAudioTimecodeOffset();
 
+    VERBOSE(VB_PLAYBACK, LOC + QString("ChangeAudioSync (%1, %2, %3)")
+            .arg(audiosyncBaseline)
+            .arg(audiosyncAdjustment)
+            .arg(dir));
+
     audiosyncAdjustment = allowEdit;
 
     if (dir == 1000000)
@@ -8136,17 +8145,21 @@
                  audiosyncBaseline;
         audiosyncBaseline = ctx->nvp->GetAudioTimecodeOffset();
     }
-    else
+    else if (dir != 0)
     {
         newval = ctx->nvp->AdjustAudioTimecodeOffset(dir*10) -
                  audiosyncBaseline;
     }
+
+    VERBOSE(VB_PLAYBACK, LOC + QString("ChangeAudioSync - newval: %1")
+            .arg(newval));
+
     ctx->UnlockDeleteNVP(__FILE__, __LINE__);
 
     OSD *osd = GetOSDLock(ctx);
     if (osd && !browsemode)
     {
-        QString text = QString(" %1 ms").arg(newval);
+        QString text = QString(" %1 ms (+ %2 ms)").arg(newval).arg(audiosyncBaseline);
         int val = (int)newval;
         if (dir == 1000000 || dir == -1000000)
         {
Index: programs/mythfrontend/globalsettings.cpp
===================================================================
--- programs/mythfrontend/globalsettings.cpp	(revision 23324)
+++ programs/mythfrontend/globalsettings.cpp	(working copy)
@@ -2701,7 +2701,6 @@
 
 static HostCheckBox *UseFixedWindowSize()
 {
-{
     HostCheckBox *gc = new HostCheckBox("UseFixedWindowSize");
     gc->setLabel(QObject::tr("Use fixed window size"));
     gc->setValue(true);
@@ -2710,6 +2709,14 @@
                         "window can be resized"));
     return gc;
 }
+
+static HostSpinBox *AudioSync()
+{
+    HostSpinBox *gs = new HostSpinBox("AudioSync", -1600, 1600, 8, true);
+    gs->setLabel(QObject::tr("Audio sync offset"));
+    gs->setValue(0);
+    gs->setHelpText(QObject::tr("The global offset for audio synchronization (Lipsync)"));
+    return gs;
 }
 
 
@@ -3420,6 +3427,7 @@
         setUseLabel(false);
 
         addChild(AudioOutputDevice());
+	addChild(AudioSync());
         addChild(PassThroughOutputDevice());
 
         addChild(MaxAudioChannels());
