Index: src/squeezeplay/share/jive/audio/Playback.lua
===================================================================
--- src/squeezeplay/share/jive/audio/Playback.lua	(revision 9297)
+++ src/squeezeplay/share/jive/audio/Playback.lua	(working copy)
@@ -118,6 +118,8 @@
 		slimproto:capability("Spdirect", cap)
 	end
 
+	slimproto:capability("ImmediateCrossfade")
+	
 	Rtmp:init(slimproto)
 
 	self.mode = 0
Index: src/squeezeplay/src/audio/decode/decode_output.c
===================================================================
--- src/squeezeplay/src/audio/decode/decode_output.c	(revision 9296)
+++ src/squeezeplay/src/audio/decode/decode_output.c	(working copy)
@@ -285,6 +285,18 @@
 		
 		if (decode_transition_type & TRANSITION_CROSSFADE) {
 			size_t crossfadeBytes;
+			fft_fixed interval;
+
+			if (decode_transition_type & TRANSITION_IMMEDIATE) {
+				size_t wanted = SAMPLES_TO_BYTES(decode_transition_period * decode_audio->track_sample_rate);
+				size_t used = fifo_bytes_used(&decode_audio->fifo);
+
+				if (used > wanted) {
+					size_t skip = used - wanted;
+					if (skip > decode_audio->fifo.wptr) decode_audio->fifo.wptr += decode_audio->fifo.size;
+					decode_audio->fifo.wptr -= skip;
+				}
+			}
 
 			/* We are being asked to do a crossfade. Find out
 			 * if it is possible.
@@ -289,7 +301,7 @@
 			/* We are being asked to do a crossfade. Find out
 			 * if it is possible.
 			 */
-			fft_fixed interval = determine_transition_interval(sample_rate, decode_transition_period, &crossfadeBytes);
+			interval = determine_transition_interval(sample_rate, decode_transition_period, &crossfadeBytes);
 
 			if (interval) {
 				LOG_DEBUG(log_audio_decode, "Starting CROSSFADE over %d seconds, requiring %d bytes", fixed_to_s32(interval), (unsigned int)crossfadeBytes);
@@ -298,7 +310,8 @@
 				crossfade_ptr = decode_audio->fifo.wptr;
 
 				/* Buffer position to start crossfade */
-				decode_audio->fifo.wptr = (crossfadeBytes <= decode_audio->fifo.wptr) ? (decode_audio->fifo.wptr - crossfadeBytes) : (decode_audio->fifo.wptr - crossfadeBytes + decode_audio->fifo.size);
+				if (crossfadeBytes > decode_audio->fifo.wptr) decode_audio->fifo.wptr += decode_audio->fifo.size;
+				decode_audio->fifo.wptr -= crossfadeBytes;
 
 				/* Gain steps */
 				transition_gain_step = fixed_div(FIXED_ONE, fixed_mul(interval, s32_to_fixed(TRANSITION_STEPS_PER_SECOND)));
@@ -491,6 +504,9 @@
 		/* Halve the period for fade in/fade out */
 		decode_transition_period >>= 1;
 		break;
+	case 5:
+		decode_transition_type = TRANSITION_CROSSFADE | TRANSITION_IMMEDIATE;
+		break;
 	}
 }
 
Index: src/squeezeplay/src/audio/decode/decode.c
===================================================================
--- src/squeezeplay/src/audio/decode/decode.c	(revision 9296)
+++ src/squeezeplay/src/audio/decode/decode.c	(working copy)
@@ -265,6 +265,15 @@
 	}
 	mqueue_read_complete(&decode_mqueue);
 
+	if (decoder) {
+		decoder->stop(decoder_data);
+
+		decoder = NULL;
+		decoder_data = NULL;
+
+		current_decoder_state = 0;
+	}
+
 	for (i=0; i<(sizeof(all_decoders)/sizeof(struct decode_module *)); i++) {
 		if (all_decoders[i]->id == decoder_id) {
 			decoder = all_decoders[i];
Index: src/squeezeplay/src/audio/decode/decode_priv.h
===================================================================
--- src/squeezeplay/src/audio/decode/decode_priv.h	(revision 9296)
+++ src/squeezeplay/src/audio/decode/decode_priv.h	(working copy)
@@ -20,6 +20,7 @@
 #define TRANSITION_CROSSFADE    0x1
 #define TRANSITION_FADE_IN      0x2
 #define TRANSITION_FADE_OUT     0x4
+#define TRANSITION_IMMEDIATE    0x8
 
 /* Transition steps per second should be a common factor
  * of all supported sample rates.