diff --git a/src/service/apply.rs b/src/service/apply.rs
index 508efb17..0fa8d77b 100644
--- a/src/service/apply.rs
+++ b/src/service/apply.rs
@@ -1,7 +1,7 @@
 use std::marker::PhantomData;
 
 use futures::{Async, Future, Poll};
-use {NewService, Service, IntoNewService};
+use {IntoNewService, NewService, Service};
 
 /// `ApplyService` service combinator
 pub struct ApplyService<T, F, R, Req, Resp, Err> {
diff --git a/src/service/mod.rs b/src/service/mod.rs
index 81b6bff1..fe9a2443 100644
--- a/src/service/mod.rs
+++ b/src/service/mod.rs
@@ -1,4 +1,4 @@
-use futures::IntoFuture;
+use futures::{Future, IntoFuture};
 
 mod and_then;
 mod apply;
@@ -20,13 +20,23 @@ pub use self::map_request::{MapReq, MapReqNewService};
 use {NewService, Service};
 
 pub trait ServiceExt: Service {
-    fn and_then<F, B>(self, new_service: F) -> AndThen<Self, B>
+    fn apply<F, R, Req, Resp, Err>(self, f: F) -> ApplyService<Self, F, R, Req, Resp, Err>
+    where
+        Self: Sized,
+        Self::Error: Into<Err>,
+        F: Fn(Req, &mut Self) -> R,
+        R: Future<Item = Resp, Error = Err>,
+    {
+        ApplyService::new(f, self)
+    }
+
+    fn and_then<F, B>(self, service: F) -> AndThen<Self, B>
     where
         Self: Sized,
         F: IntoService<B>,
         B: Service<Request = Self::Response, Error = Self::Error>,
     {
-        AndThen::new(self, new_service.into_service())
+        AndThen::new(self, service.into_service())
     }
 
     fn map<F, R>(self, f: F) -> Map<Self, F, R>
@@ -47,6 +57,16 @@ pub trait ServiceExt: Service {
 }
 
 pub trait NewServiceExt: NewService {
+    fn apply<F, R, Req, Resp, Err>(self, f: F) -> Apply<Self, F, R, Req, Resp, Err>
+    where
+        Self: Sized,
+        Self::Error: Into<Err>,
+        F: Fn(Req, &mut Self::Service) -> R + Clone,
+        R: Future<Item = Resp, Error = Err>,
+    {
+        Apply::new(f, self)
+    }
+
     fn and_then<F, B>(self, new_service: F) -> AndThenNewService<Self, B>
     where
         Self: Sized,