swin = win << sender->td_scale;
                        sender->td_maxwin = (swin == 0 ? 1 : swin);
                        sender->td_maxend = end + sender->td_maxwin;
-                       /*
-                        * We haven't seen traffic in the other direction yet
-                        * but we have to tweak window tracking to pass III
-                        * and IV until that happens.
-                        */
-                       if (receiver->td_maxwin == 0)
+                       if (receiver->td_maxwin == 0) {
+                               /* We haven't seen traffic in the other
+                                * direction yet but we have to tweak window
+                                * tracking to pass III and IV until that
+                                * happens.
+                                */
                                receiver->td_end = receiver->td_maxend = sack;
+                       } else if (sack == receiver->td_end + 1) {
+                               /* Likely a reply to a keepalive.
+                                * Needed for III.
+                                */
+                               receiver->td_end++;
+                       }
+
                }
        } else if (((state->state == TCP_CONNTRACK_SYN_SENT
                     && dir == IP_CT_DIR_ORIGINAL)