diff --git a/lib/ngtcp2_acktr.c b/lib/ngtcp2_acktr.c
index cb7b926fe33d23df49df510d23c2a1f80c673cc1..12331e22afb4d1f65a07aa61fdd7d66336da8c8f 100644
--- a/lib/ngtcp2_acktr.c
+++ b/lib/ngtcp2_acktr.c
@@ -168,9 +168,14 @@ static void acktr_remove(ngtcp2_acktr *acktr, ngtcp2_acktr_entry **pent) {
   *pent = (*pent)->next;
   if (*pent) {
     (*pent)->pprev = pent;
+  } else {
+    acktr->tail =
+        ngtcp2_struct_of((ngtcp2_acktr_entry *)pent, ngtcp2_acktr_entry, next);
   }
 
   ngtcp2_acktr_entry_del(ent, acktr->mem);
+
+  --acktr->nack;
 }
 
 static void acktr_on_ack(ngtcp2_acktr *acktr, size_t ack_ent_offset) {
@@ -191,7 +196,7 @@ static void acktr_on_ack(ngtcp2_acktr *acktr, size_t ack_ent_offset) {
     }
   }
   if (*pent == NULL) {
-    return;
+    goto fin;
   }
 
   min_ack = largest_ack - fr->first_ack_blklen;
@@ -229,6 +234,9 @@ static void acktr_on_ack(ngtcp2_acktr *acktr, size_t ack_ent_offset) {
     largest_ack = min_ack;
     ++i;
   }
+
+fin:
+  ngtcp2_ringbuf_resize(&acktr->acks, ack_ent_offset);
 }
 
 void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr,
diff --git a/tests/main.c b/tests/main.c
index 271e6fb64d2893f7b0cf2f68d6b7978b1df579f3..f0c04bcdee92b125f03f6510a017d0ed654cf945 100644
--- a/tests/main.c
+++ b/tests/main.c
@@ -116,6 +116,7 @@ int main() {
       !CU_add_test(pSuite, "acktr_add", test_ngtcp2_acktr_add) ||
       !CU_add_test(pSuite, "acktr_eviction", test_ngtcp2_acktr_eviction) ||
       !CU_add_test(pSuite, "acktr_forget", test_ngtcp2_acktr_forget) ||
+      !CU_add_test(pSuite, "acktr_recv_ack", test_ngtcp2_acktr_recv_ack) ||
       !CU_add_test(pSuite, "encode_transport_params",
                    test_ngtcp2_encode_transport_params) ||
       !CU_add_test(pSuite, "rtb_add", test_ngtcp2_rtb_add) ||
diff --git a/tests/ngtcp2_acktr_test.c b/tests/ngtcp2_acktr_test.c
index 46982aa00fa0f40a207e7aab6af57771061edc26..7d82482f5c9cdb216faad3e155aa006e0f7f5c3e 100644
--- a/tests/ngtcp2_acktr_test.c
+++ b/tests/ngtcp2_acktr_test.c
@@ -179,7 +179,7 @@ void test_ngtcp2_acktr_recv_ack(void) {
   uint64_t pkt_nums[] = {
       4500, 4499, 4497, 4496, 4494, 4493, 4491, 4490, 4488, 4487,
   };
-  ngtcp2_acktr_entry *ent;
+  ngtcp2_acktr_entry *ent, *next;
 
   ngtcp2_acktr_init(&acktr, mem);
 
@@ -192,14 +192,16 @@ void test_ngtcp2_acktr_recv_ack(void) {
   fr.largest_ack = 4500;
   fr.ack_delay = 0;
   fr.first_ack_blklen = 1;
-  fr.num_blks = 2;
-  fr.blks[0].gap = 5;
+  fr.num_blks = 3;
+  fr.blks[0].gap = 4;
   fr.blks[0].blklen = 2;
   fr.blks[1].gap = 1;
   fr.blks[1].blklen = 1;
+  fr.blks[2].gap = 3;
+  fr.blks[2].blklen = 1;
 
-  ngtcp2_acktr_add_ack(&acktr, 999, &fr, 0);
   ngtcp2_acktr_add_ack(&acktr, 998, &fr, 0);
+  ngtcp2_acktr_add_ack(&acktr, 999, &fr, 0);
 
   fr.type = NGTCP2_FRAME_ACK;
   fr.largest_ack = 999;
@@ -210,7 +212,7 @@ void test_ngtcp2_acktr_recv_ack(void) {
   ngtcp2_acktr_recv_ack(&acktr, &fr, 0);
 
   CU_ASSERT(0 == ngtcp2_ringbuf_len(&acktr.acks));
-  CU_ASSERT(5 == acktr.nack);
+  CU_ASSERT(4 == acktr.nack);
 
   ent = acktr.ent;
 
@@ -221,8 +223,13 @@ void test_ngtcp2_acktr_recv_ack(void) {
   CU_ASSERT(4490 == ent->pkt_num);
   ent = ent->next;
   CU_ASSERT(4488 == ent->pkt_num);
-  ent = ent->next;
-  CU_ASSERT(4487 == ent->pkt_num);
+  CU_ASSERT(ent == acktr.tail);
 
   ngtcp2_acktr_free(&acktr);
+
+  for (ent = acktr.ent; ent;) {
+    next = ent->next;
+    ngtcp2_acktr_entry_del(ent, mem);
+    ent = next;
+  }
 }