diff --git a/components/structures/src/new_frame.cpp b/components/structures/src/new_frame.cpp
index f969023fc3ea6a4715a74a0b9ee57bb1ebc1faf5..7c8f1081471fa6047ec2ff2a1bb52b69d67ed6f7 100644
--- a/components/structures/src/new_frame.cpp
+++ b/components/structures/src/new_frame.cpp
@@ -100,14 +100,21 @@ const Frame::ChannelData &Frame::_getData(ftl::codecs::Channel c) const {
 std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t) {
 	if (status_ != FrameStatus::CREATED) throw FTL_Error("Cannot apply change after store " << static_cast<int>(status_));
 
-	//UNIQUE_LOCK(mutex(), lk);
-
-	auto &d = data_[c];
-	if (d.status != ftl::data::ChannelStatus::FLUSHED) {
-		d.status = ftl::data::ChannelStatus::DISPATCHED;
-		d.encoded.clear();
+	ftl::data::Frame::ChannelData *d;
+	
+	if (parent_) {
+		UNIQUE_LOCK(mutex(), lk);
+		d = &(data_[c]);
 		touch(c, t);
-		return d.data;
+	} else {
+		d = &(data_[c]);
+		touch(c, t);
+	}
+
+	if (d->status != ftl::data::ChannelStatus::FLUSHED) {
+		d->status = ftl::data::ChannelStatus::DISPATCHED;
+		d->encoded.clear();
+		return d->data;
 	} else {
 		throw FTL_Error("Channel is flushed and read-only: " << static_cast<unsigned int>(c));
 	}
@@ -116,14 +123,21 @@ std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t
 std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t, ftl::codecs::Packet &data) {
 	if (status_ != FrameStatus::CREATED) throw FTL_Error("Cannot apply change after store " << static_cast<int>(status_));
 
-	//UNIQUE_LOCK(mutex(), lk);
-
-	auto &d = data_[c];
-	if (d.status != ftl::data::ChannelStatus::FLUSHED) {
-		d.status = ftl::data::ChannelStatus::DISPATCHED;
-		d.encoded.push_back(data);
+	ftl::data::Frame::ChannelData *d;
+	
+	if (parent_) {
+		UNIQUE_LOCK(mutex(), lk);
+		d = &(data_[c]);
 		touch(c, t);
-		return d.data;
+	} else {
+		d = &(data_[c]);
+		touch(c, t);
+	}
+
+	if (d->status != ftl::data::ChannelStatus::FLUSHED) {
+		d->status = ftl::data::ChannelStatus::DISPATCHED;
+		d->encoded.push_back(data);
+		return d->data;
 	} else {
 		throw FTL_Error("Channel is flushed and read-only: " << static_cast<unsigned int>(c));
 	}