diff --git a/src/globals.c b/src/globals.c
index 1174c58..1feab41 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -1374,6 +1374,7 @@ transport_instance  transport_defaults = {
     NULL,                     /* rewrite_rules */
     0,                        /* rewrite_existflags */
     300,                      /* filter_timeout */
+    FALSE,                    /* prefilter_size */
     FALSE,                    /* body_only */
     FALSE,                    /* delivery_date_add */
     FALSE,                    /* envelope_to_add */
diff --git a/src/macros.h b/src/macros.h
index b7dd337..b57ab91 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -787,6 +787,7 @@ enum {
 #define topt_no_headers         0x020  /* Omit headers */
 #define topt_no_body            0x040  /* Omit body */
 #define topt_escape_headers     0x080  /* Apply escape check to headers */
+#define topt_use_prefilter_size 0x100  /* Return size passed to filter */
 
 #ifdef EXPERIMENTAL_DSN
 /* Flags for recipient_block, used in DSN support */
diff --git a/src/structs.h b/src/structs.h
index 71ac5d8..1fe4724 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -175,6 +175,7 @@ typedef struct transport_instance {
   rewrite_rule *rewrite_rules;    /* Parsed rewriting rules */
   int     rewrite_existflags;     /* Bits showing which headers are rewritten */
   int     filter_timeout;         /* For transport filter timing */
+  BOOL    use_prefilter_size;     /* Use transport counts passed to filter */
   BOOL    body_only;              /* Deliver only the body */
   BOOL    delivery_date_add;      /* Add Delivery-Date header */
   BOOL    envelope_to_add;        /* Add Envelope-To header */
diff --git a/src/transport.c b/src/transport.c
index 3648bfc..facd5d2 100644
--- a/src/transport.c
+++ b/src/transport.c
@@ -15,6 +15,10 @@ transports. */
 #include <sys/sendfile.h>
 #endif
 
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+#endif /* HAVE_MMAP */
+
 /* Structure for keeping list of addresses that have been added to
 Envelope-To:, in order to avoid duplication. */
 
@@ -102,6 +106,8 @@ optionlist optionlist_transports[] = {
                  (void *)offsetof(transport_instance, filter_command) },
   { "transport_filter_timeout", opt_time|opt_public,
                  (void *)offsetof(transport_instance, filter_timeout) },
+  { "use_prefilter_size", opt_bool|opt_public,
+                 (void *)offsetof(transport_instance, use_prefilter_size) },
   { "user",             opt_expand_uid|opt_public,
                  (void *)offsetof(transport_instance, uid) }
 };
@@ -1202,6 +1208,7 @@ BOOL use_crlf;
 BOOL last_filter_was_NL = TRUE;
 int rc, len, yield, fd_read, fd_write, save_errno;
 int pfd[2];
+int *pf_size, *pf_lines;
 pid_t filter_pid, write_pid;
 
 transport_filter_timed_out = FALSE;
@@ -1256,6 +1263,17 @@ DEBUG(D_transport)
 via a(nother) pipe. While writing to the filter, we do not do the CRLF,
 smtp dots, or check string processing. */
 
+
+#ifdef HAVE_MMAP
+ if (options & topt_use_prefilter_size)
+   {
+     pf_size = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
+             MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+     pf_lines = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
+              MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+   }
+#endif /* HAVE_MMAP */
+ 
 if (pipe(pfd) != 0) goto TIDY_UP;      /* errno set */
 if ((write_pid = fork()) == 0)
   {
@@ -1268,6 +1286,13 @@ if ((write_pid = fork()) == 0)
     size_limit, add_headers, remove_headers, NULL, NULL,
     rewrite_rules, rewrite_existflags);
   save_errno = errno;
+#ifdef HAVE_MMAP
+  if (options & topt_use_prefilter_size)
+    {
+      *pf_size = transport_count;
+      *pf_lines = transport_newlines;
+    }
+#endif /* HAVE_MMAP */
   if (  write(pfd[pipe_write], (void *)&rc, sizeof(BOOL))
         != sizeof(BOOL)
      || write(pfd[pipe_write], (void *)&save_errno, sizeof(int))
@@ -1429,6 +1454,16 @@ if (yield)
   }
 else errno = save_errno;      /* From some earlier error */
 
+#ifdef HAVE_MMAP
+ if (options & topt_use_prefilter_size)
+   {
+     transport_count = *pf_size;
+     transport_newlines = *pf_lines;
+     munmap(pf_size, sizeof(int));
+     munmap(pf_lines, sizeof(int));
+   }
+#endif /* HAVE_MMAP */
+ 
 DEBUG(D_transport)
   {
   debug_printf("end of filtering transport writing: yield=%d\n", yield);
diff --git a/src/transports/appendfile.c b/src/transports/appendfile.c
index f56862b..644ca99 100644
--- a/src/transports/appendfile.c
+++ b/src/transports/appendfile.c
@@ -555,7 +555,8 @@ ob->options |=
   (tblock->return_path_add? topt_add_return_path : 0) |
   (tblock->delivery_date_add? topt_add_delivery_date : 0) |
   (tblock->envelope_to_add? topt_add_envelope_to : 0) |
-  ((ob->use_crlf || ob->mbx_format)? topt_use_crlf : 0);
+  ((ob->use_crlf || ob->mbx_format)? topt_use_crlf : 0) |
+  (tblock->use_prefilter_size? topt_use_prefilter_size : 0 );
 }
 
 
