diff --git a/flow/TDMetric.actor.h b/flow/TDMetric.actor.h
index 7ace1a2e9e..d01af058ae 100755
--- a/flow/TDMetric.actor.h
+++ b/flow/TDMetric.actor.h
@@ -97,9 +97,7 @@ struct KeyWithWriter {
 	KeyWithWriter( KeyWithWriter&& r ) : key(std::move(r.key)), writer(std::move(r.writer)), writerOffset(r.writerOffset) {}
 	void operator=( KeyWithWriter&& r ) { key = std::move(r.key); writer = std::move(r.writer); writerOffset = r.writerOffset; }
 
-	StringRef value() {
-		return StringRef(writer.toValue().substr(writerOffset));
-	}
+	StringRef value() const { return StringRef(writer.toValue().substr(writerOffset)); }
 };
 
 // This is a very minimal interface for getting metric data from the DB which is needed
@@ -238,7 +236,7 @@ struct MetricData {
 		start = r.start; rollTime = r.rollTime; appendStart = r.appendStart; writer = std::move(r.writer);
 	}
 
-	std::string toString();
+	std::string toString() const;
 };
 
 // Some common methods to reduce code redundancy across different metric definitions
@@ -452,12 +450,12 @@ struct FieldValueBlockEncoding<Standalone<StringRef>> {
 
 // Field level for value type of T using header type of Header.  Default header type is the default FieldHeader implementation for type T.
 template <class T, class Header = FieldHeader<T>, class Encoder = FieldValueBlockEncoding<T>>
-struct FieldLevel {
-
-	Deque<MetricData> metrics;
+class FieldLevel {
 	int64_t appendUsed;
+	Deque<MetricData> metrics;
 	Header header;
 
+public:
 	// The previous header and the last timestamp at which an out going MetricData block requires header patching
 	Optional<Header> previousHeader;
 	uint64_t lastTimeRequiringHeaderPatch;
@@ -465,15 +463,10 @@ struct FieldLevel {
 	Encoder enc;
 
 	explicit FieldLevel() : appendUsed(0) {
-		metrics.emplace_back(MetricData());
+		metrics.emplace_back();
 		metrics.back().writer << header;
 	}
 
-	FieldLevel(FieldLevel &&f)
-	  : metrics(std::move(f.metrics)), appendUsed(f.appendUsed), enc(f.enc), header(f.header),
-	    previousHeader(f.previousHeader), lastTimeRequiringHeaderPatch(f.lastTimeRequiringHeaderPatch) {
-	}
-
 	// update Header, use Encoder to write T v
 	void log( T v, uint64_t t, bool& overflow, int64_t& bytes ) {
 		int lastLength = metrics.back().writer.getLength();
@@ -504,7 +497,7 @@ struct FieldLevel {
 		}
 
 		metrics.back().rollTime = t;
-		metrics.emplace_back(MetricData());
+		metrics.emplace_back();
 		metrics.back().writer << header;
 		enc = Encoder();
 		appendUsed = 0;
@@ -517,9 +510,9 @@ struct FieldLevel {
 			metrics.back().rollTime = t;
 			appendUsed += metrics.back().writer.getLength();
 			if(metrics.back().appendStart)
-				metrics.emplace_back(MetricData(metrics.back().appendStart));
+				metrics.emplace_back(metrics.back().appendStart);
 			else
-				metrics.emplace_back(MetricData(metrics.back().start));
+				metrics.emplace_back(metrics.back().start);
 		}
 	}
 
diff --git a/flow/TDMetric.cpp b/flow/TDMetric.cpp
index f25737ea1c..b6c126eeed 100644
--- a/flow/TDMetric.cpp
+++ b/flow/TDMetric.cpp
@@ -211,6 +211,6 @@ void DynamicEventMetric::registerFields(MetricKeyRef const &mk, std::vector<Stan
 	fieldsToRegister.clear();
 }
 
-std::string MetricData::toString() {
+std::string MetricData::toString() const {
 	return format("MetricData(addr=%p start=%llu appendStart=%llu rollTime=%llu writerLen=%d)", this, start, appendStart, rollTime, writer.getLength());
 }
diff --git a/flow/serialize.h b/flow/serialize.h
index d671876719..cd60b1fa70 100644
--- a/flow/serialize.h
+++ b/flow/serialize.h
@@ -346,14 +346,14 @@ public:
 		*(T*)writeBytes(sizeof(T)) = t;
 	}
 	void* getData() { return data; }
-	int getLength() { return size; }
-	Standalone<StringRef> toValue() { return Standalone<StringRef>( StringRef(data,size), arena ); }
+	int getLength() const { return size; }
+	Standalone<StringRef> toValue() const { return Standalone<StringRef>(StringRef(data, size), arena); }
 	template <class VersionOptions>
 	explicit BinaryWriter( VersionOptions vo ) : data(nullptr), size(0), allocated(0) { vo.write(*this); }
 	BinaryWriter( BinaryWriter&& rhs ) : arena(std::move(rhs.arena)), data(rhs.data), size(rhs.size), allocated(rhs.allocated), m_protocolVersion(rhs.m_protocolVersion) {
 		rhs.size = 0;
 		rhs.allocated = 0;
-		rhs.data = 0;
+		rhs.data = nullptr;
 	}
 	void operator=( BinaryWriter&& r) {
 		arena = std::move(r.arena);
@@ -363,7 +363,7 @@ public:
 		m_protocolVersion = r.m_protocolVersion;
 		r.size = 0;
 		r.allocated = 0;
-		r.data = 0;
+		r.data = nullptr;
 	}
 
 	template <class T, class VersionOptions>