--- mythtv/programs/mythfrontend/globalsettings.cpp	2009-11-19 12:34:41.412950656 +0100
+++ mythtv/programs/mythfrontend/globalsettings.cpp	2009-11-28 13:22:56.416257520 +0100
@@ -2757,7 +2757,6 @@
 
 static HostCheckBox *UseFixedWindowSize()
 {
-{
     HostCheckBox *gc = new HostCheckBox("UseFixedWindowSize");
     gc->setLabel(QObject::tr("Use fixed window size"));
     gc->setValue(true);
@@ -2766,6 +2765,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;
 }
 
 static HostComboBox *MythDateFormat()
@@ -3504,6 +3511,7 @@
     vcg->setUseLabel(false);
 
     vcg->addChild(AudioOutputDevice());
+    vcg->addChild(AudioSync());
 
     Setting *numchannels = MaxAudioChannels();
     vcg->addChild(numchannels);
--- mythtv/libs/libmythtv/tv_play.cpp	2009-11-19 12:34:01.591945869 +0100
+++ mythtv/libs/libmythtv/tv_play.cpp	2009-11-28 13:19:59.436006433 +0100
@@ -8132,7 +8132,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)
@@ -8141,9 +8141,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)
@@ -8158,17 +8167,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)
         {
--- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	2009-11-25 18:22:26.833584919 +0100
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	2009-11-28 13:19:59.408009016 +0100
@@ -294,6 +294,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)
@@ -4784,7 +4789,7 @@
     if (savedAudioTimecodeOffset)
     {
         tc_wrap[TC_AUDIO] = savedAudioTimecodeOffset;
-        savedAudioTimecodeOffset = 0;
+        //savedAudioTimecodeOffset = 0;
     }
 
     SetPrebuffering(true);
--- mythtv/libs/libmythtv/NuppelVideoPlayer.h 2009-11-19 12:34:01.418700673 +0100
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.h   2009-11-28 13:19:59.384000668 +0100
@@ -803,6 +803,7 @@
     bool       decode_extra_audio;
     float      m_stored_audio_stretchfactor;
     bool       audio_paused;
+    long long  db_audio_sync;

	 // Audio warping stuff
	 bool       usevideotimebase;
