diff --git a/src/write.c b/src/write.c
index 2e6890c..530a3b4 100644
--- a/src/write.c
+++ b/src/write.c
@@ -29,9 +29,6 @@
 static void fillConfigBox(avifCodec * codec, const avifImage * image, avifBool alpha);
 static void writeConfigBox(avifRWStream * s, avifCodecConfigurationBox * cfg);
 
-static avifResult avifEncoderWriteItems(avifEncoder * encoder, avifRWData * output);
-static avifResult avifEncoderWriteTracks(avifEncoder * encoder, avifRWData * output);
-
 // ---------------------------------------------------------------------------
 // avifCodecEncodeOutput
 
@@ -332,25 +329,9 @@
             } else {
                 encoder->ioStats.colorOBUSize = obuSize;
             }
-
-            if (item->encodeOutput->samples.count == 1) {
-                // Detected a single image (non-sequence). Hand over the only sample to item->content
-                // so that the image is encoded with items instead of tracks.
-                memcpy(&item->content, &item->encodeOutput->samples.sample[0].data, sizeof(avifRWData));
-                memset(&item->encodeOutput->samples.sample[0].data, 0, sizeof(avifRWData));
-                item->encodeOutput->samples.count = 0;
-            }
         }
     }
 
-    if (encoder->data->frames.count > 1) {
-        return avifEncoderWriteTracks(encoder, output);
-    }
-    return avifEncoderWriteItems(encoder, output);
-}
-
-static avifResult avifEncoderWriteItems(avifEncoder * encoder, avifRWData * output)
-{
     // -----------------------------------------------------------------------
     // Begin write stream
 
@@ -414,12 +395,18 @@
 
     for (uint32_t itemIndex = 0; itemIndex < encoder->data->items.count; ++itemIndex) {
         avifEncoderItem * item = &encoder->data->items.item[itemIndex];
-        avifRWStreamWriteU16(&s, item->id);                     // unsigned int(16) item_ID;
-        avifRWStreamWriteU16(&s, 0);                            // unsigned int(16) data_reference_index;
-        avifRWStreamWriteU16(&s, 1);                            // unsigned int(16) extent_count;
-        item->infeOffsetOffset = avifRWStreamOffset(&s);        //
-        avifRWStreamWriteU32(&s, 0 /* set later */);            // unsigned int(offset_size*8) extent_offset;
-        avifRWStreamWriteU32(&s, (uint32_t)item->content.size); // unsigned int(length_size*8) extent_length;
+
+        uint32_t contentSize = (uint32_t)item->content.size;
+        if (item->encodeOutput->samples.count > 0) {
+            contentSize = (uint32_t)item->encodeOutput->samples.sample[0].data.size;
+        }
+
+        avifRWStreamWriteU16(&s, item->id);              // unsigned int(16) item_ID;
+        avifRWStreamWriteU16(&s, 0);                     // unsigned int(16) data_reference_index;
+        avifRWStreamWriteU16(&s, 1);                     // unsigned int(16) extent_count;
+        item->infeOffsetOffset = avifRWStreamOffset(&s); //
+        avifRWStreamWriteU32(&s, 0 /* set later */);     // unsigned int(offset_size*8) extent_offset;
+        avifRWStreamWriteU32(&s, (uint32_t)contentSize); // unsigned int(length_size*8) extent_length;
     }
 
     avifRWStreamFinishBox(&s, iloc);
@@ -602,17 +589,31 @@
     avifRWStreamFinishBox(&s, meta);
 
     // -----------------------------------------------------------------------
+    // Write tracks (if an image sequence
+
+    if (encoder->data->frames.count > 1) {
+        // TODO
+    }
+
+    // -----------------------------------------------------------------------
     // Write mdat
 
     avifBoxMarker mdat = avifRWStreamWriteBox(&s, "mdat", -1, 0);
     for (uint32_t itemIndex = 0; itemIndex < encoder->data->items.count; ++itemIndex) {
         avifEncoderItem * item = &encoder->data->items.item[itemIndex];
-        if (item->content.size == 0) {
+        if ((item->content.size == 0) && (item->encodeOutput->samples.count == 0)) {
             continue;
         }
 
         uint32_t infeOffset = (uint32_t)s.offset;
-        avifRWStreamWrite(&s, item->content.data, item->content.size);
+        if (item->encodeOutput->samples.count > 0) {
+            for (uint32_t sampleIndex = 0; sampleIndex < item->encodeOutput->samples.count; ++sampleIndex) {
+                avifEncodeSample * sample = &item->encodeOutput->samples.sample[sampleIndex];
+                avifRWStreamWrite(&s, sample->data.data, sample->data.size);
+            }
+        } else {
+            avifRWStreamWrite(&s, item->content.data, item->content.size);
+        }
 
         if (item->infeOffsetOffset != 0) {
             size_t prevOffset = avifRWStreamOffset(&s);
@@ -631,13 +632,6 @@
     return AVIF_RESULT_OK;
 }
 
-static avifResult avifEncoderWriteTracks(avifEncoder * encoder, avifRWData * output)
-{
-    (void)encoder;
-    (void)output;
-    return AVIF_RESULT_UNKNOWN_ERROR;
-}
-
 avifResult avifEncoderWrite(avifEncoder * encoder, const avifImage * image, avifRWData * output)
 {
     avifResult addImageResult = avifEncoderAddImage(encoder, image, NULL);
