diff --git a/lib/ngtcp2_strm.c b/lib/ngtcp2_strm.c
index 2a0c0c918982323dd8439a74f512e58d56d8c7e3..7c46d9b64711106292db5ba6fcd8855a9ca9438e 100644
--- a/lib/ngtcp2_strm.c
+++ b/lib/ngtcp2_strm.c
@@ -367,6 +367,12 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc,
   if (left == 0) {
     /* datalen could be zero if 0 length STREAM has been sent */
     if (datalen || ngtcp2_ksl_len(strm->tx.streamfrq) > 1) {
+      rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &fr->offset, frc);
+      if (rv != 0) {
+        assert(ngtcp2_err_is_fatal(rv));
+        ngtcp2_frame_chain_del(frc, strm->mem);
+        return rv;
+      }
       *pfrc = NULL;
       return 0;
     }
diff --git a/tests/ngtcp2_strm_test.c b/tests/ngtcp2_strm_test.c
index 21f0ecd1886372761271cfc16bf86be2b0c85502..8d2d23d2adbc1792ed30a378f5b160d2e6734835 100644
--- a/tests/ngtcp2_strm_test.c
+++ b/tests/ngtcp2_strm_test.c
@@ -290,6 +290,17 @@ void test_ngtcp2_strm_streamfrq_pop(void) {
 
   ngtcp2_frame_chain_del(frc, mem);
   ngtcp2_strm_free(&strm);
+
+  /* left == 0 and there is outstanding data */
+  setup_strm_streamfrq_fixture(&strm, mem);
+
+  frc = NULL;
+  rv = ngtcp2_strm_streamfrq_pop(&strm, &frc, 0);
+
+  CU_ASSERT(0 == rv);
+  CU_ASSERT(NULL == frc);
+
+  ngtcp2_strm_free(&strm);
 }
 
 void test_ngtcp2_strm_streamfrq_unacked_offset(void) {