diff --git a/src/server/h1writer.rs b/src/server/h1writer.rs
index 5bb23dd9..6f10fc71 100644
--- a/src/server/h1writer.rs
+++ b/src/server/h1writer.rs
@@ -1,6 +1,6 @@
 #![cfg_attr(feature = "cargo-clippy", allow(redundant_field_names))]
 
-use bytes::BufMut;
+use bytes::{BytesMut, BufMut};
 use futures::{Async, Poll};
 use std::io;
 use std::rc::Rc;
@@ -45,7 +45,7 @@ impl<T: AsyncWrite, H: 'static> H1Writer<T, H> {
         stream: T, buf: SharedBytes, settings: Rc<WorkerSettings<H>>,
     ) -> H1Writer<T, H> {
         H1Writer {
-            flags: Flags::empty(),
+            flags: Flags::KEEPALIVE,
             encoder: ContentEncoder::empty(buf.clone()),
             written: 0,
             headers_size: 0,
@@ -62,7 +62,7 @@ impl<T: AsyncWrite, H: 'static> H1Writer<T, H> {
 
     pub fn reset(&mut self) {
         self.written = 0;
-        self.flags = Flags::empty();
+        self.flags = Flags::KEEPALIVE;
     }
 
     pub fn disconnected(&mut self) {
@@ -100,6 +100,16 @@ impl<T: AsyncWrite, H: 'static> Writer for H1Writer<T, H> {
         self.written
     }
 
+    #[inline]
+    fn set_date(&self, dst: &mut BytesMut) {
+        self.settings.set_date(dst)
+    }
+
+    #[inline]
+    fn buffer(&self) -> &mut BytesMut {
+        self.buffer.get_mut()
+    }
+
     fn start(
         &mut self, req: &mut HttpInnerMessage, msg: &mut HttpResponse,
         encoding: ContentEncoding,
@@ -108,9 +118,9 @@ impl<T: AsyncWrite, H: 'static> Writer for H1Writer<T, H> {
         self.encoder =
             ContentEncoder::for_server(self.buffer.clone(), req, msg, encoding);
         if msg.keep_alive().unwrap_or_else(|| req.keep_alive()) {
-            self.flags.insert(Flags::STARTED | Flags::KEEPALIVE);
+            self.flags = Flags::STARTED | Flags::KEEPALIVE;
         } else {
-            self.flags.insert(Flags::STARTED);
+            self.flags = Flags::STARTED;
         }
 
         // Connection upgrade
diff --git a/src/server/h2writer.rs b/src/server/h2writer.rs
index a20d7759..5fc13154 100644
--- a/src/server/h2writer.rs
+++ b/src/server/h2writer.rs
@@ -71,6 +71,16 @@ impl<H: 'static> Writer for H2Writer<H> {
         self.written
     }
 
+    #[inline]
+    fn set_date(&self, dst: &mut BytesMut) {
+        self.settings.set_date(dst)
+    }
+
+    #[inline]
+    fn buffer(&self) -> &mut BytesMut {
+        self.buffer.get_mut()
+    }
+
     fn start(
         &mut self, req: &mut HttpInnerMessage, msg: &mut HttpResponse,
         encoding: ContentEncoding,
diff --git a/src/server/helpers.rs b/src/server/helpers.rs
index 7f2f4734..f447a6ca 100644
--- a/src/server/helpers.rs
+++ b/src/server/helpers.rs
@@ -143,7 +143,7 @@ pub(crate) fn write_status_line(version: Version, mut n: u16, bytes: &mut BytesM
 }
 
 /// NOTE: bytes object has to contain enough space
-pub(crate) fn write_content_length(mut n: usize, bytes: &mut BytesMut) {
+pub fn write_content_length(mut n: usize, bytes: &mut BytesMut) {
     if n < 10 {
         let mut buf: [u8; 21] = [
             b'\r', b'\n', b'c', b'o', b'n', b't', b'e', b'n', b't', b'-', b'l', b'e',
diff --git a/src/server/mod.rs b/src/server/mod.rs
index 36d80e2d..51ec3216 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -3,7 +3,8 @@ use std::net::Shutdown;
 use std::{io, time};
 
 use actix;
-use futures::Poll;
+use bytes::BytesMut;
+use futures::{Async, Poll};
 use tokio_core::net::TcpStream;
 use tokio_io::{AsyncRead, AsyncWrite};
 
@@ -24,6 +25,9 @@ mod worker;
 pub use self::settings::ServerSettings;
 pub use self::srv::HttpServer;
 
+#[doc(hidden)]
+pub use self::helpers::write_content_length;
+
 use body::Binary;
 use error::Error;
 use header::ContentEncoding;
@@ -132,13 +136,15 @@ impl HttpHandler for Box<HttpHandler> {
 #[doc(hidden)]
 pub trait HttpHandlerTask {
     /// Poll task, this method is used before or after *io* object is available
-    fn poll(&mut self) -> Poll<(), Error>;
+    fn poll(&mut self) -> Poll<(), Error>{
+        Ok(Async::Ready(()))
+    }
 
     /// Poll task when *io* object is available
     fn poll_io(&mut self, io: &mut Writer) -> Poll<bool, Error>;
 
     /// Connection is disconnected
-    fn disconnected(&mut self);
+    fn disconnected(&mut self) {}
 }
 
 /// Conversion helper trait
@@ -168,8 +174,16 @@ pub enum WriterState {
 #[doc(hidden)]
 /// Stream writer
 pub trait Writer {
+    /// number of bytes written to the stream
     fn written(&self) -> u64;
 
+    #[doc(hidden)]
+    fn set_date(&self, st: &mut BytesMut);
+
+    #[doc(hidden)]
+    #[cfg_attr(feature = "cargo-clippy", allow(mut_from_ref))]
+    fn buffer(&self) -> &mut BytesMut;
+
     fn start(
         &mut self, req: &mut HttpInnerMessage, resp: &mut HttpResponse,
         encoding: ContentEncoding,