 +                       "http3 output header: \"date: %V\"",
 +                       &ngx_cached_http_time);
 +
-+        h = ngx_array_push(headers);
++        h = ngx_array_push(out);
 +        if (h == NULL) {
 +            return NGX_ERROR;
 +        }

+        h->name = (u_char *) "content-length";
+        h->name_len = sizeof("content-length") - 1;
+
+        h->value = content_len;
+        h->value_len =
+            ngx_sprintf(content_len, "%O", r->headers_out.content_length_n) -
+            content_len;
+    }
+
+    /* Generate Last-Modified header. */
+    if (r->headers_out.last_modified == NULL
+        && r->headers_out.last_modified_time != -1)
+    {
+        h = ngx_array_push(headers);
+        if (h == NULL) {
+            return NGX_ERROR;
+        }
+
+        ngx_http_time(last_modified, r->headers_out.last_modified_time);
+
+        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, fc->log, 0,
+                       "http3 output header: \"last-modified: %*.s\"",
+                       sizeof(last_modified), last_modified);
+
+        h->name = (u_char *) "last-modified";
+        h->name_len = sizeof("last-modified") - 1;
+
+        h->value = last_modified;
+        h->value_len = sizeof(last_modified);
+    }
+
+    /* Generate Location header. */

+}
diff --git a/src/http/v3/ngx_http_v3.h b/src/http/v3/ngx_http_v3.h
new file mode 100644
index 000000000..2ac1f4593
--- /dev/null
+++ b/src/http/v3/ngx_http_v3.h
@@ -0,0 +1,79 @@
+
+/*
+ * Copyright (C) Cloudflare, Inc.
