Index: libs/ardour/crossfade.cc
===================================================================
--- libs/ardour/crossfade.cc	(revision 2337)
+++ libs/ardour/crossfade.cc	(working copy)
@@ -268,6 +268,14 @@
 
 	offset = start - _position;
 
+	/* Prevent data from piling up in the crossfade buffers when reading a transparent region */
+	
+	if (!_out->opaque()) {
+		memset (crossfade_buffer_out, 0, sizeof (Sample) * to_write);
+	} else if (!_in->opaque()) {
+		memset (crossfade_buffer_in, 0, sizeof (Sample) * to_write);
+	}
+
 	_out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
 	_in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
 
@@ -332,6 +340,13 @@
 		return false;
 	}
 
+	/* Top layer shouldn't be transparent */
+
+	if (!(layer_relation > 0 ? _in : _out)->opaque()) {
+		Invalidated (shared_from_this());
+		return false;
+	}
+
 	/* layer ordering cannot change */
 
 	int32_t new_layer_relation = (int32_t) (_in->layer() - _out->layer());
Index: libs/ardour/playlist.cc
===================================================================
--- libs/ardour/playlist.cc	(revision 2337)
+++ libs/ardour/playlist.cc	(working copy)
@@ -1170,7 +1170,7 @@
 			save = !(_splicing || _nudging);
 		}
 		
-		if ((what_changed & Region::MuteChanged) && 
+		if ((what_changed & our_interests) && 
 		    !(what_changed &  Change (ARDOUR::PositionChanged|ARDOUR::LengthChanged))) {
 			check_dependents (region, false);
 		}
Index: libs/ardour/audio_playlist.cc
===================================================================
--- libs/ardour/audio_playlist.cc	(revision 2337)
+++ libs/ardour/audio_playlist.cc	(working copy)
@@ -380,6 +380,10 @@
 			top = other;
 			bottom = region;
 		}
+		
+		if (!top->opaque()) {
+			continue;
+		}
 
 
 
