diff --git a/libs/spandsp/src/t4_rx.c b/libs/spandsp/src/t4_rx.c
index 247b9ae726..5852de3ae6 100644
--- a/libs/spandsp/src/t4_rx.c
+++ b/libs/spandsp/src/t4_rx.c
@@ -663,31 +663,31 @@ SPAN_DECLARE(int) t4_rx_put_bit(t4_rx_state_t *s, int bit)
 
 SPAN_DECLARE(int) t4_rx_put(t4_rx_state_t *s, const uint8_t buf[], size_t len)
 {
+    uint8_t *buf2;
+
     s->line_image_size += 8*len;
-    switch (s->metadata.compression)
+
+    if (s->pre_encoded_len > 0)
     {
-    case T4_COMPRESSION_T4_1D:
-    case T4_COMPRESSION_T4_2D:
-    case T4_COMPRESSION_T6:
-        return t4_t6_decode_put(&s->decoder.t4_t6, buf, len);
-    case T4_COMPRESSION_T85:
-    case T4_COMPRESSION_T85_L0:
-        return t85_decode_put(&s->decoder.t85, buf, len);
-#if defined(SPANDSP_SUPPORT_T88)
-    case T4_COMPRESSION_T88:
-        break;
-#endif
-    case T4_COMPRESSION_T42_T81:
-        return t42_decode_put(&s->decoder.t42, buf, len);
-#if defined(SPANDSP_SUPPORT_T43)
-    case T4_COMPRESSION_T43:
-        return t43_decode_put(&s->decoder.t43, buf, len);
-#endif
-#if defined(SPANDSP_SUPPORT_T45)
-    case T4_COMPRESSION_T45:
-        break;
-#endif
+        if (s->pre_encoded_len < s->pre_encoded_ptr + 65536)
+        {
+            s->pre_encoded_len += 65536;
+            if ((buf2 = realloc(s->pre_encoded_buf, s->pre_encoded_len)) == NULL)
+            {
+                if (s->pre_encoded_buf)
+                    free(s->pre_encoded_buf);
+                return -1;
+            }
+            s->pre_encoded_buf = buf2;
+        }
+        memcpy(&s->pre_encoded_buf[s->pre_encoded_ptr], buf, len);
+        s->pre_encoded_ptr += len;
+        return T4_DECODE_MORE_DATA;
     }
+
+    if (s->image_put_handler)
+        return s->image_put_handler((void *) &s->decoder, buf, len);
+
     return T4_DECODE_OK;
 }
 /*- End of function --------------------------------------------------------*/
@@ -977,31 +977,42 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s)
 
     switch (s->metadata.compression)
     {
+    case 0:
+        s->pre_encoded_ptr = 0;
+        s->pre_encoded_len = 0;
+        s->image_put_handler = NULL;
+        break;
     case T4_COMPRESSION_T4_1D:
     case T4_COMPRESSION_T4_2D:
     case T4_COMPRESSION_T6:
         t4_t6_decode_restart(&s->decoder.t4_t6, s->metadata.image_width);
+        s->image_put_handler = (t4_image_put_handler_t) t4_t6_decode_put;
         break;
     case T4_COMPRESSION_T85:
     case T4_COMPRESSION_T85_L0:
         t85_decode_restart(&s->decoder.t85);
+        s->image_put_handler = (t4_image_put_handler_t) t85_decode_put;
         break;
 #if defined(SPANDSP_SUPPORT_T88)
     case T4_COMPRESSION_T88:
         t88_decode_restart(&s->decoder.t88);
+        s->image_put_handler = (t4_image_put_handler_t) t88_decode_put;
         break;
 #endif
     case T4_COMPRESSION_T42_T81:
         t42_decode_restart(&s->decoder.t42);
+        s->image_put_handler = (t4_image_put_handler_t) t42_decode_put;
         break;
 #if defined(SPANDSP_SUPPORT_T43)
     case T4_COMPRESSION_T43:
         t43_decode_restart(&s->decoder.t43);
+        s->image_put_handler = (t4_image_put_handler_t) t43_decode_put;
         break;
 #endif
 #if defined(SPANDSP_SUPPORT_T45)
     case T4_COMPRESSION_T45:
         t45_decode_restart(&s->decoder.t45);
+        s->image_put_handler = (t4_image_put_handler_t) t45_decode_put;
         break;
 #endif
     }
@@ -1041,27 +1052,25 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
     int length;
 
     length = 0;
+    if (s->image_put_handler)
+        s->image_put_handler((void *) &s->decoder, NULL, 0);
     switch (s->metadata.compression)
     {
     case T4_COMPRESSION_T4_1D:
     case T4_COMPRESSION_T4_2D:
     case T4_COMPRESSION_T6:
-        t4_t6_decode_put(&s->decoder.t4_t6, NULL, 0);
         length = t4_t6_decode_get_image_length(&s->decoder.t4_t6);
         break;
     case T4_COMPRESSION_T85:
     case T4_COMPRESSION_T85_L0:
-        t85_decode_put(&s->decoder.t85, NULL, 0);
         length = t85_decode_get_image_length(&s->decoder.t85);
         break;
 #if defined(SPANDSP_SUPPORT_T88)
     case T4_COMPRESSION_T88:
-        t88_decode_put(&s->decoder.t88, NULL, 0);
         length = t88_decode_get_image_length(&s->decoder.t88);
         break;
 #endif
     case T4_COMPRESSION_T42_T81:
-        t42_decode_put(&s->decoder.t42, NULL, 0);
         length = t42_decode_get_image_length(&s->decoder.t42);
         if (s->decoder.t42.samples_per_pixel == 3)
             select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT);
@@ -1070,13 +1079,11 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
         break;
 #if defined(SPANDSP_SUPPORT_T43)
     case T4_COMPRESSION_T43:
-        t43_decode_put(&s->decoder.t43, NULL, 0);
         length = t43_decode_get_image_length(&s->decoder.t43);
         break;
 #endif
 #if defined(SPANDSP_SUPPORT_T45)
     case T4_COMPRESSION_T45:
-        t45_decode_put(&s->decoder.t45, NULL, 0);
         length = t45_decode_get_image_length(&s->decoder.t45);
         break;
 #endif