diff -ur vdr-plugin-softhdodroid/audio.c vdr-plugin-softhdodroid-Test/audio.c
--- vdr-plugin-softhdodroid/audio.c	2022-06-22 11:24:29.839518942 +0200
+++ vdr-plugin-softhdodroid-Test/audio.c	2022-06-22 13:29:56.865468890 +0200
@@ -176,6 +176,7 @@
 static int AudioVolume;                 ///< current volume (0 .. 1000)
 
 extern int VideoAudioDelay;             ///< import audio/video delay
+extern char ConfigVideoFastSwitch;      ///< config fast channel switch
 
 /// default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8)
 static const unsigned AudioRingBufferSize = 3 * 5 * 7 * 8 * 2 * 1000;
@@ -1786,26 +1787,27 @@
 
         n = RingBufferUsedBytes(AudioRing[AudioRingWrite].RingBuffer);
 
-        if (isRadio < 75) {    // do not wait forever if it is a Radio Station. Each Enque is 24ms Audio 
-            
-            vpts = FirstVPTS;
-
-            if (vpts == AV_NOPTS_VALUE || AudioRing[AudioRingWrite].PTS == AV_NOPTS_VALUE) {
-                usleep(1000);
-                skip = n;   // Clear all audio until video is avail
-            }
-            else if ((unsigned long)AudioRing[AudioRingWrite].PTS  < vpts) {
-                skip = n;    // Clear Audio until Video PTS
-            } else  {
-                int i = 10;
-                while (SetCurrentPCR(0, (uint64_t)(AudioRing[AudioRingWrite].PTS - AudioBufferTime * 90 + VideoAudioDelay -24000 )) == 2 && i--) {
-                    usleep(5000);
+        if (!ConfigVideoFastSwitch) {
+            if (isRadio < 75) {    // do not wait forever if it is a Radio Station. Each Enque is 24ms Audio 
+
+                vpts = FirstVPTS;
+
+                if (vpts == AV_NOPTS_VALUE || AudioRing[AudioRingWrite].PTS == AV_NOPTS_VALUE) {
+                    usleep(1000);
+                    skip = n;   // Clear all audio until video is avail
                 }
+                else if ((unsigned long)AudioRing[AudioRingWrite].PTS  < vpts) {
+                    skip = n;    // Clear Audio until Video PTS
+                } else  {
+                    int i = 10;
+                    while (SetCurrentPCR(0, (uint64_t)(AudioRing[AudioRingWrite].PTS - AudioBufferTime * 90 + VideoAudioDelay -24000 )) == 2 && i--) {
+                        usleep(5000);
+                    }
+                }
+                isRadio++;
             }
-            isRadio++;
+            usleep(2000);
         }
-        usleep(2000);
-
         //        skip = AudioSkip;
         // FIXME: round to packet size
         
@@ -1832,8 +1834,10 @@
             // restart play-back
             // no lock needed, can wakeup next time
             AudioRunning = 1;
-            FirstVPTS = 0;
-            isRadio = 0;
+            if (!ConfigVideoFastSwitch) {      
+                FirstVPTS = 0;
+                isRadio = 0;
+            }    
             pthread_cond_signal(&AudioStartCond);
             Debug(3, "Start on AudioEnque Threshold %d n %d\n", AudioStartThreshold, n);
         }
diff -ur vdr-plugin-softhdodroid/softhddev.c vdr-plugin-softhdodroid-Test/softhddev.c
--- vdr-plugin-softhdodroid/softhddev.c	2022-06-22 11:24:29.843518883 +0200
+++ vdr-plugin-softhdodroid-Test/softhddev.c	2022-06-22 14:09:53.738015279 +0200
@@ -68,6 +68,7 @@
 //////////////////////////////////////////////////////////////////////////////
 
 extern int ConfigAudioBufferTime;       ///< config size ms of audio buffer
+extern char ConfigVideoBlackPicture;	///< config enable black picture mode
 char ConfigStartX11Server;              ///< flag start the x11 server
 static signed char ConfigStartSuspended;    ///< flag to start in suspend mode
 
@@ -1990,6 +1991,9 @@
 static void StopVideo(void)
 {
     VideoOsdExit();
+    //restore decoder default settings
+    amlSetInt("/sys/class/video/blackout_policy", 1);   //do this here to avoid freezing the last frame
+    amlSetInt("/sys/class/tsync/slowsync_enable", 1);
     VideoStreamClose(MyVideoStream, 0);
     VideoExit();
     AudioSyncStream = NULL;
@@ -2427,17 +2431,22 @@
 //extern void amlClearVideo();
 int SetPlayMode(int play_mode)
 {
+    int i;
     Debug(3, "Set Playmode %d\n", play_mode);
     switch (play_mode) {
         case 0:                        // audio/video from decoder
             // tell video parser we get new stream
             //amlClearVideo();
             if (MyVideoStream->Decoder && !MyVideoStream->SkipStream) {
-                amlSetInt("/sys/class/video/blackout_policy", 1);
-                // clear buffers on close configured always or replay only
-                if (MyVideoStream->ClearClose) {
-                    Clear();            // flush all buffers
-                    MyVideoStream->ClearClose = 0;
+                amlSetInt("/sys/class/video/blackout_policy", ConfigVideoBlackPicture);
+                VideoResetPacket(MyVideoStream);        // terminate work
+                MyVideoStream->ClearBuffers = 1;
+                if (!SkipAudio) {
+                    AudioFlushBuffers();
+                }
+                // wait for empty buffers
+                for (i = 0; MyVideoStream->ClearBuffers && i < 20; ++i) {
+                    usleep(1 * 1000);
                 }
                 if (MyVideoStream->CodecID != AV_CODEC_ID_NONE) {
                     MyVideoStream->NewStream = 1;
@@ -2555,13 +2564,8 @@
     MyVideoStream->ClearBuffers = 1;
     if (!SkipAudio) {
         AudioFlushBuffers();
-        //NewAudioStream = 1;
     }
-    
-    // FIXME: audio avcodec_flush_buffers, video is done by VideoClearBuffers
-
     // wait for empty buffers
-    // FIXME: without softstart sync VideoDecode isn't called.
     for (i = 0; MyVideoStream->ClearBuffers && i < 20; ++i) {
         usleep(1 * 1000);
     }
diff -ur vdr-plugin-softhdodroid/softhdodroid.cpp vdr-plugin-softhdodroid-Test/softhdodroid.cpp
--- vdr-plugin-softhdodroid/softhdodroid.cpp	2022-06-22 11:24:29.843518883 +0200
+++ vdr-plugin-softhdodroid-Test/softhdodroid.cpp	2022-06-22 14:32:58.837388398 +0200
@@ -59,7 +59,7 @@
 /// vdr-plugin version number.
 /// Makefile extracts the version number for generating the file name
 /// for the distribution archive.
-static const char *const VERSION = "3.4.1"
+static const char *const VERSION = "3.4.1-Test"
 #ifdef GIT_REV
     "-GIT-" GIT_REV
 #endif
@@ -90,6 +90,8 @@
 
 static int ConfigOsdWidth;              ///< config OSD width
 static int ConfigOsdHeight;             ///< config OSD height
+char ConfigVideoBlackPicture = 1;       ///< config enable black picture mode
+char ConfigVideoFastSwitch = 1;         ///< config enable fast channel switch
 static char ConfigVideoStudioLevels;    ///< config use studio levels
 
 static int ConfigVideoBrightness;       ///< config video brightness
@@ -957,6 +959,8 @@
     uint32_t Background;
     uint32_t BackgroundAlpha;
     int StudioLevels;
+    int BlackPicture;
+    int FastSwitch;
 
     int Brightness;
     int Contrast;
@@ -1103,6 +1107,8 @@
     if (Video) {
 
         //Add(new cMenuEditStraItem(tr("Monitor Type"), &TargetColorSpace, 4, target_colorspace));
+        Add(new cMenuEditBoolItem(tr("Black during channel switch"), &BlackPicture, trVDR("no"), trVDR("yes")));
+        Add(new cMenuEditBoolItem(tr("Fast channel switch"), &FastSwitch, trVDR("no"), trVDR("yes")));
         Add(new cMenuEditBoolItem(tr("Noise Reduction"), &Denoise, trVDR("no"), trVDR("yes")));
         Add(new cMenuEditBoolItem(tr("HDR to SDR Mode"), &HDR2SDR, trVDR("no"), trVDR("yes")));
         for (i = 0; i < RESOLUTIONS; ++i) {
@@ -1261,6 +1267,8 @@
       // no unsigned int menu item supported, split background color/alpha
  
     StudioLevels = ConfigVideoStudioLevels;
+    BlackPicture = ConfigVideoBlackPicture;
+    FastSwitch = ConfigVideoFastSwitch;
  
     Brightness = ConfigVideoBrightness;
     Contrast = ConfigVideoContrast;
@@ -1346,7 +1354,9 @@
     
     SetupStore("StudioLevels", ConfigVideoStudioLevels = StudioLevels);
     VideoSetStudioLevels(ConfigVideoStudioLevels);
-    
+    SetupStore("BlackPicture", ConfigVideoBlackPicture = BlackPicture);
+    SetupStore("FastSwitch", ConfigVideoFastSwitch = FastSwitch);
+    VideoSetFastSwitch(ConfigVideoFastSwitch);
     SetupStore("Brightness", ConfigVideoBrightness = Brightness);
     VideoSetBrightness(ConfigVideoBrightness);
     SetupStore("Contrast", ConfigVideoContrast = Contrast);
@@ -3004,6 +3014,14 @@
         VideoSetStudioLevels(ConfigVideoStudioLevels = atoi(value));
         return true;
     }
+    if (!strcasecmp(name, "BlackPicture")) {
+        ConfigVideoBlackPicture = atoi(value);
+        return true;
+    }
+    if (!strcasecmp(name, "FastSwitch")) {
+        ConfigVideoFastSwitch = atoi(value);
+        return true;
+    }
     if (!strcasecmp(name, "Brightness")) {
         int i;
 
@@ -3430,7 +3448,6 @@
 
         dsyslog("[softhddev]stopping Ogl Thread svdrp DETA");
         cSoftOsdProvider::StopOpenGlThread();
-
         cControl::Launch(new cSoftHdControl);
         cControl::Attach();
         Suspend(1, 1, 0);
@@ -3511,10 +3528,6 @@
         DoMakePrimary = primary;
         return "switching primary device requested";
     }
-    
-
-    
-
     return NULL;
 }
 
diff -ur vdr-plugin-softhdodroid/video.c vdr-plugin-softhdodroid-Test/video.c
--- vdr-plugin-softhdodroid/video.c	2022-06-22 11:24:29.843518883 +0200
+++ vdr-plugin-softhdodroid-Test/video.c	2022-06-22 14:09:51.142031783 +0200
@@ -107,6 +107,9 @@
 /// Default audio/video delay
 int VideoAudioDelay;
 
+///< config fast channel switch
+extern char ConfigVideoFastSwitch;
+
 enum ApiLevel
 {
 	UnknownApi = 0,
@@ -205,8 +208,10 @@
 /// Set soft start audio/video sync.
  void VideoSetSoftStartSync(int i) {};
 
-/// Set show black picture during channel switch.
- void VideoSetBlackPicture(int i) {};
+/// Set fast channel switch.
+ void VideoSetFastSwitch(int ConfigVideoFastSwitch) {
+	amlSetInt("/sys/class/tsync/slowsync_enable",ConfigVideoFastSwitch);
+};
 
 /// Set brightness adjustment.
  void VideoSetBrightness(int i) {};
@@ -1297,7 +1302,6 @@
 {
 
     Debug(3, "video: reset start\n");
-	//amlReset();
 
 }
 
@@ -1424,6 +1428,8 @@
 		return;
 	}
 	
+	VideoSetFastSwitch(ConfigVideoFastSwitch);
+	
 	amlGetString("/sys/class/display/mode",mode,sizeof(mode));
 	
 	getResolution(mode);
@@ -2638,7 +2644,7 @@
 		//codecMutex.Unlock();
 		printf("AMSTREAM_IOC_VPAUSE (0) failed.\n");
 	}
-    isRunning = true;
+	isRunning = true;
 	//codecMutex.Unlock();
 }
 
@@ -2646,24 +2652,15 @@
 void amlReset()
 {
 	Debug(3,"amlreset");
-	if (!isOpen)
-	{
+	if (!isOpen){
 		return;
 	}
 	// set the system blackout_policy to leave the last frame showing
-	int blackout_policy;
-	amlGetInt("/sys/class/video/blackout_policy", &blackout_policy);
 	amlSetInt("/sys/class/video/blackout_policy", 0);
-
 	InternalClose(0);
 	FirstVPTS = AV_NOPTS_VALUE;
 	isFirstVideoPacket = true;
 	InternalOpen(OdroidDecoders[0], videoFormat,FrameRate);
-
-	amlSetInt("/sys/class/video/blackout_policy", blackout_policy);
-	
-	//printf("amlReset\n");
-
 }
 
 void InternalClose(int pip)
diff -ur vdr-plugin-softhdodroid/video.h vdr-plugin-softhdodroid-Test/video.h
--- vdr-plugin-softhdodroid/video.h	2022-06-22 11:24:29.843518883 +0200
+++ vdr-plugin-softhdodroid-Test/video.h	2022-06-22 11:23:43.024238280 +0200
@@ -242,8 +242,8 @@
 /// Set soft start audio/video sync.
 extern void VideoSetSoftStartSync(int);
 
-/// Set show black picture during channel switch.
-extern void VideoSetBlackPicture(int);
+/// Set fast channel switch.
+extern void VideoSetFastSwitch(int);
 
 /// Set brightness adjustment.
 extern void VideoSetBrightness(int);
