diff --git a/write.go b/write.go
index 245827a235d72c6e445ae08ec15af90fc601bd97..28f139afd6498070e388ed1a857d69a65fd18cad 100644
--- a/write.go
+++ b/write.go
@@ -106,7 +106,7 @@ func (c *Conn) write(ctx context.Context, typ MessageType, p []byte) (int, error
 		return 0, err
 	}
 
-	if !c.flate() || len(p) < c.flateThreshold {
+	if !c.flate() {
 		defer c.msgWriter.mu.Unlock()
 		return c.writeFrame(ctx, true, false, c.msgWriter.opcode, p)
 	}
@@ -159,9 +159,16 @@ func (mw *msgWriter) Write(p []byte) (_ int, err error) {
 		return 0, xerrors.New("cannot use closed writer")
 	}
 
-	// TODO Write to buffer to detect whether to enable flate or not for this message.
-	if mw.c.flate() {
-		mw.ensureFlate()
+	if mw.opcode != opContinuation {
+		// First frame needs to be written.
+		if len(p) >= mw.c.flateThreshold {
+			// Only enables flate if the length crosses the
+			// threshold on the first write.
+			mw.ensureFlate()
+		}
+	}
+
+	if mw.flate {
 		return mw.flateWriter.Write(p)
 	}