diff --git a/applications/tools/simple_viewer/main.cpp b/applications/tools/simple_viewer/main.cpp
index d9d79dd13150cb1f0b814d37be0bb941fc72d653..80a591b3c2bac90067d158a1b7109975867918b1 100644
--- a/applications/tools/simple_viewer/main.cpp
+++ b/applications/tools/simple_viewer/main.cpp
@@ -154,7 +154,8 @@ static void run(ftl::Configurable *root) {
 				}
 
 				if (f.has(Channel::AudioStereo)) {
-					LOG(INFO) << "Got stereo";
+					const auto &audio = f.get<std::list<ftl::audio::Audio>>(Channel::AudioStereo).front();
+					LOG(INFO) << "Got stereo: " << audio.data().size();
 				}
 			}
 
diff --git a/components/audio/src/software_decoder.cpp b/components/audio/src/software_decoder.cpp
index c5516fa26ae2f71e5ab3a1f9c6e3257cd276e5a9..8dd11bda169f6f2ba93595502776ef14c663e9ee 100644
--- a/components/audio/src/software_decoder.cpp
+++ b/components/audio/src/software_decoder.cpp
@@ -78,6 +78,9 @@ bool SoftwareDecoder::_decodeOpus(const ftl::codecs::Packet &pkt, std::vector<sh
 
 	for (size_t i=0; i<pkt.data.size(); ) {
 		const short *len = (const short*)inptr;
+		LOG(INFO) << "LENGTH = " << *len;
+		if (*len == 0) break;
+
 		inptr += 2;
 		i += (*len)+2;
 		int samples = opus_multistream_decode(opus_decoder_, inptr, *len, outptr, FRAME_SIZE, 0);
diff --git a/components/audio/src/software_encoder.cpp b/components/audio/src/software_encoder.cpp
index 054bb886fee47d00b4231645925276bac9f80f9a..6eeda3dbb0cd44b8c99e891a4126d324df63cd96 100644
--- a/components/audio/src/software_encoder.cpp
+++ b/components/audio/src/software_encoder.cpp
@@ -105,7 +105,7 @@ bool SoftwareEncoder::_encodeOpus(const std::vector<short> &in, ftl::codecs::Pac
 		short *len = (short*)outptr;
 		outptr += 2;
 		int nbBytes = opus_multistream_encode(opus_encoder_, &in.data()[i], FRAME_SIZE, outptr, MAX_PACKET_SIZE);
-		//LOG(INFO) << "Opus encode: " << nbBytes << ", " << (in.size()-i);
+		LOG(INFO) << "Opus encode: " << nbBytes << ", " << (in.size()-i);
 		if (nbBytes <= 0) return false;
 
 		//if (nbBytes > 32000) LOG(WARNING) << "Packet exceeds size limit";
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index c3c59f06a30c9d8f1881cf89eda48c30d53446e9..24c2a54f23572a62df2ac8103028fde16cd9cc74 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -168,17 +168,23 @@ ftl::audio::Decoder *Receiver::_createAudioDecoder(InternalAudioStates &frame, c
 
 void Receiver::_processAudio(const StreamPacket &spkt, const Packet &pkt) {
 	// Audio Data
-	/*InternalAudioStates &frame = _getAudioFrame(spkt);
+	InternalAudioStates &state = _getAudioFrame(spkt);
+
+	//frame.frame.reset();
+	state.timestamp = spkt.timestamp;
+
+	auto fs = builder(spkt.streamID).get(spkt.timestamp, spkt.frame_number+pkt.frame_count-1);
+	auto &frame = fs->frames[0];
+
+	auto &audiolist = frame.createChange<std::list<ftl::audio::Audio>>(spkt.channel, ftl::data::ChangeType::FOREIGN, pkt);
+	auto &audio = audiolist.emplace_back();
 
-	frame.frame.reset();
-	frame.timestamp = spkt.timestamp;
-	auto &audio = frame.frame.create<ftl::audio::Audio>(spkt.channel);
 	//size_t size = pkt.data.size()/sizeof(short);
 	//audio.data().resize(size);
 	//auto *ptr = (short*)pkt.data.data();
 	//for (size_t i=0; i<size; i++) audio.data()[i] = ptr[i];
 
-	ftl::audio::Decoder *dec = _createAudioDecoder(frame, pkt);
+	ftl::audio::Decoder *dec = _createAudioDecoder(state, pkt);
 	if (!dec) {
 		LOG(ERROR) << "Could get an audio decoder";
 		return;
@@ -189,7 +195,7 @@ void Receiver::_processAudio(const StreamPacket &spkt, const Packet &pkt) {
 	}
 
 	// Generate settings from packet data
-	ftl::audio::AudioSettings settings;
+	/*ftl::audio::AudioSettings settings;
 	settings.channels = (spkt.channel == Channel::AudioStereo) ? 2 : 1;
 	settings.frame_size = 960;
 
@@ -197,12 +203,12 @@ void Receiver::_processAudio(const StreamPacket &spkt, const Packet &pkt) {
 	case definition_t::hz48000		: settings.sample_rate = 48000; break;
 	case definition_t::hz44100		: settings.sample_rate = 44100; break;
 	default: settings.sample_rate = 48000; break;
-	}
+	}*/
 
-	frame.state.setLeft(settings);
-	frame.frame.setOrigin(&frame.state);
+	//frame.state.setLeft(settings);
+	//frame.frame.setOrigin(&frame.state);
 
-	if (audio_cb_) {
+	/*if (audio_cb_) {
 		// Create an audio frameset wrapper.
 		ftl::audio::FrameSet fs;
 		fs.id = 0;
diff --git a/components/structures/src/new_frame.cpp b/components/structures/src/new_frame.cpp
index c5a146ff426b906d086dca9e036b4f2abaa7f3a5..3ce0238b18e18998877c7e4f61078aeab53426bd 100644
--- a/components/structures/src/new_frame.cpp
+++ b/components/structures/src/new_frame.cpp
@@ -328,6 +328,9 @@ void Frame::reset() {
 	for (auto &d : data_) {
 		d.second.status = ChannelStatus::INVALID;
 		d.second.encoded.clear();
+
+		// Note: Aggregate channels cannot memory pool and must be cleared.
+		if (ftl::data::isAggregate(d.first)) d.second.data.reset();
 	}
 	changed_.clear();
 	status_ = FrameStatus::CREATED;