diff --git a/actix-codec/Cargo.toml b/actix-codec/Cargo.toml
index cab79a9e..3c7a93bc 100644
--- a/actix-codec/Cargo.toml
+++ b/actix-codec/Cargo.toml
@@ -24,4 +24,4 @@ futures-sink = { version = "0.3.4", default-features = false }
 tokio = { version = "0.2.4", default-features=false }
 tokio-util = { version = "0.2.0", default-features=false, features=["codec"] }
 log = "0.4"
-pin-project = "0.4.8"
+pin-project = "0.4.17"
diff --git a/actix-ioframe/Cargo.toml b/actix-ioframe/Cargo.toml
index f9c144a7..efc81740 100644
--- a/actix-ioframe/Cargo.toml
+++ b/actix-ioframe/Cargo.toml
@@ -24,7 +24,7 @@ bytes = "0.5.3"
 either = "1.5.3"
 futures-sink = { version = "0.3.4", default-features = false }
 futures-core = { version = "0.3.4", default-features = false }
-pin-project = "0.4.6"
+pin-project = "0.4.17"
 log = "0.4"
 
 [dev-dependencies]
diff --git a/actix-ioframe/src/service.rs b/actix-ioframe/src/service.rs
index a562fbb5..f3b5ab85 100644
--- a/actix-ioframe/src/service.rs
+++ b/actix-ioframe/src/service.rs
@@ -8,7 +8,6 @@ use actix_codec::{AsyncRead, AsyncWrite, Decoder, Encoder, Framed};
 use actix_service::{IntoService, IntoServiceFactory, Service, ServiceFactory};
 use either::Either;
 use futures_core::{ready, stream::Stream};
-use pin_project::project;
 
 use crate::connect::{Connect, ConnectResult};
 use crate::dispatcher::Dispatcher;
@@ -336,7 +335,7 @@ where
     }
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = FramedServiceImplResponseInnerProj)]
 enum FramedServiceImplResponseInner<St, Io, Codec, Out, C, T>
 where
     C: Service<Request = Connect<Io, Codec>, Response = ConnectResult<Io, St, Codec, Out>>,
@@ -378,7 +377,6 @@ where
     <Codec as Encoder>::Error: std::fmt::Debug,
     Out: Stream<Item = <Codec as Encoder>::Item> + Unpin,
 {
-    #[project]
     fn poll(
         self: Pin<&mut Self>,
         cx: &mut Context<'_>,
@@ -386,9 +384,8 @@ where
         FramedServiceImplResponseInner<St, Io, Codec, Out, C, T>,
         Poll<Result<(), ServiceError<C::Error, Codec>>>,
     > {
-        #[project]
         match self.project() {
-            FramedServiceImplResponseInner::Connect(fut, handler) => match fut.poll(cx) {
+            FramedServiceImplResponseInnerProj::Connect(fut, handler) => match fut.poll(cx) {
                 Poll::Ready(Ok(res)) => Either::Left(FramedServiceImplResponseInner::Handler(
                     handler.new_service(res.state),
                     Some(res.framed),
@@ -397,7 +394,7 @@ where
                 Poll::Pending => Either::Right(Poll::Pending),
                 Poll::Ready(Err(e)) => Either::Right(Poll::Ready(Err(e.into()))),
             },
-            FramedServiceImplResponseInner::Handler(fut, framed, out) => {
+            FramedServiceImplResponseInnerProj::Handler(fut, framed, out) => {
                 match fut.poll(cx) {
                     Poll::Ready(Ok(handler)) => {
                         Either::Left(FramedServiceImplResponseInner::Dispatcher(
@@ -408,7 +405,7 @@ where
                     Poll::Ready(Err(e)) => Either::Right(Poll::Ready(Err(e.into()))),
                 }
             }
-            FramedServiceImplResponseInner::Dispatcher(fut) => {
+            FramedServiceImplResponseInnerProj::Dispatcher(fut) => {
                 Either::Right(fut.poll(cx))
             }
         }
diff --git a/actix-service/Cargo.toml b/actix-service/Cargo.toml
index 939ed178..cb2b2cdb 100644
--- a/actix-service/Cargo.toml
+++ b/actix-service/Cargo.toml
@@ -17,7 +17,7 @@ path = "src/lib.rs"
 
 [dependencies]
 futures-util = "0.3.1"
-pin-project = "0.4.6"
+pin-project = "0.4.17"
 
 [dev-dependencies]
 actix-rt = "1.0.0"
diff --git a/actix-service/benches/and_then.rs b/actix-service/benches/and_then.rs
index 1094fdaf..0b78a9c0 100644
--- a/actix-service/benches/and_then.rs
+++ b/actix-service/benches/and_then.rs
@@ -81,7 +81,7 @@ where
     state: State<A, B>,
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = StateProj)]
 enum State<A, B>
 where
     A: Service,
@@ -99,13 +99,11 @@ where
 {
     type Output = Result<B::Response, A::Error>;
 
-    #[pin_project::project]
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let mut this = self.as_mut().project();
 
-        #[project]
         match this.state.as_mut().project() {
-            State::A(fut, b) => match fut.poll(cx)? {
+            StateProj::A(fut, b) => match fut.poll(cx)? {
                 Poll::Ready(res) => {
                     let b = b.take().unwrap();
                     this.state.set(State::Empty); // drop fut A
@@ -115,11 +113,11 @@ where
                 }
                 Poll::Pending => Poll::Pending,
             },
-            State::B(fut) => fut.poll(cx).map(|r| {
+            StateProj::B(fut) => fut.poll(cx).map(|r| {
                 this.state.set(State::Empty);
                 r
             }),
-            State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
+            StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
         }
     }
 }
@@ -179,7 +177,7 @@ where
 	 state: StateRC<A, B>,
  }
  
- #[pin_project::pin_project]
+ #[pin_project::pin_project(project = StateRCProj)]
  enum StateRC<A, B>
  where
 	 A: Service,
@@ -196,14 +194,12 @@ where
 	 B: Service<Request = A::Response, Error = A::Error>,
  {
 	 type Output = Result<B::Response, A::Error>;
- 
-	 #[pin_project::project]
+
 	 fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
 		 let mut this = self.as_mut().project();
- 
-		 #[project]
+
 		 match this.state.as_mut().project() {
-			 StateRC::A(fut, b) => match fut.poll(cx)? {
+			 StateRCProj::A(fut, b) => match fut.poll(cx)? {
 				 Poll::Ready(res) => {
 					 let b = b.take().unwrap();
 					 this.state.set(StateRC::Empty); // drop fut A
@@ -213,11 +209,11 @@ where
 				 }
 				 Poll::Pending => Poll::Pending,
 			 },
-			 StateRC::B(fut) => fut.poll(cx).map(|r| {
+			 StateRCProj::B(fut) => fut.poll(cx).map(|r| {
 				 this.state.set(StateRC::Empty);
 				 r
 			 }),
-			 StateRC::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
+			 StateRCProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
 		 }
 	 }
  }
diff --git a/actix-service/src/and_then.rs b/actix-service/src/and_then.rs
index 76ed35e9..74b64b38 100644
--- a/actix-service/src/and_then.rs
+++ b/actix-service/src/and_then.rs
@@ -66,7 +66,7 @@ where
     state: State<A, B>,
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = StateProj)]
 enum State<A, B>
 where
     A: Service,
@@ -84,13 +84,11 @@ where
 {
     type Output = Result<B::Response, A::Error>;
 
-    #[pin_project::project]
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let mut this = self.as_mut().project();
 
-        #[project]
         match this.state.as_mut().project() {
-            State::A(fut, b) => match fut.poll(cx)? {
+            StateProj::A(fut, b) => match fut.poll(cx)? {
                 Poll::Ready(res) => {
                     let mut b = b.take().unwrap();
                     this.state.set(State::Empty); // drop fut A
@@ -100,11 +98,11 @@ where
                 }
                 Poll::Pending => Poll::Pending,
             },
-            State::B(fut) => fut.poll(cx).map(|r| {
+            StateProj::B(fut) => fut.poll(cx).map(|r| {
                 this.state.set(State::Empty);
                 r
             }),
-            State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
+            StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
         }
     }
 }
diff --git a/actix-service/src/and_then_apply_fn.rs b/actix-service/src/and_then_apply_fn.rs
index 07f3b50d..de0cfac9 100644
--- a/actix-service/src/and_then_apply_fn.rs
+++ b/actix-service/src/and_then_apply_fn.rs
@@ -98,7 +98,7 @@ where
     state: State<A, B, F, Fut, Res, Err>,
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = StateProj)]
 enum State<A, B, F, Fut, Res, Err>
 where
     A: Service,
@@ -123,13 +123,11 @@ where
 {
     type Output = Result<Res, Err>;
 
-    #[pin_project::project]
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let mut this = self.as_mut().project();
 
-        #[project]
         match this.state.as_mut().project() {
-            State::A(fut, b) => match fut.poll(cx)? {
+            StateProj::A(fut, b) => match fut.poll(cx)? {
                 Poll::Ready(res) => {
                     let mut b = b.take().unwrap();
                     this.state.set(State::Empty);
@@ -140,11 +138,11 @@ where
                 }
                 Poll::Pending => Poll::Pending,
             },
-            State::B(fut) => fut.poll(cx).map(|r| {
+            StateProj::B(fut) => fut.poll(cx).map(|r| {
                 this.state.set(State::Empty);
                 r
             }),
-            State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
+            StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
         }
     }
 }
diff --git a/actix-service/src/apply_cfg.rs b/actix-service/src/apply_cfg.rs
index 5c69b813..cee7b8c7 100644
--- a/actix-service/src/apply_cfg.rs
+++ b/actix-service/src/apply_cfg.rs
@@ -177,7 +177,7 @@ where
     state: State<T, R, S>,
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = StateProj)]
 enum State<T, R, S>
 where
     T: ServiceFactory<Config = ()>,
@@ -200,20 +200,18 @@ where
 {
     type Output = Result<S, T::InitError>;
 
-    #[pin_project::project]
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let mut this = self.as_mut().project();
 
-        #[project]
         match this.state.as_mut().project() {
-            State::A(fut) => match fut.poll(cx)? {
+            StateProj::A(fut) => match fut.poll(cx)? {
                 Poll::Pending => Poll::Pending,
                 Poll::Ready(srv) => {
                     this.state.set(State::B(srv));
                     self.poll(cx)
                 }
             },
-            State::B(srv) => match srv.poll_ready(cx)? {
+            StateProj::B(srv) => match srv.poll_ready(cx)? {
                 Poll::Ready(_) => {
                     let fut = (this.store.get_mut().1)(this.cfg.take().unwrap(), srv);
                     this.state.set(State::C(fut));
@@ -221,7 +219,7 @@ where
                 }
                 Poll::Pending => Poll::Pending,
             },
-            State::C(fut) => fut.poll(cx),
+            StateProj::C(fut) => fut.poll(cx),
         }
     }
 }
diff --git a/actix-service/src/then.rs b/actix-service/src/then.rs
index 53ff1753..1286e742 100644
--- a/actix-service/src/then.rs
+++ b/actix-service/src/then.rs
@@ -66,7 +66,7 @@ where
     state: State<A, B>,
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = StateProj)]
 enum State<A, B>
 where
     A: Service,
@@ -84,13 +84,11 @@ where
 {
     type Output = Result<B::Response, B::Error>;
 
-    #[pin_project::project]
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let mut this = self.as_mut().project();
 
-        #[project]
         match this.state.as_mut().project() {
-            State::A(fut, b) => match fut.poll(cx) {
+            StateProj::A(fut, b) => match fut.poll(cx) {
                 Poll::Ready(res) => {
                     let mut b = b.take().unwrap();
                     this.state.set(State::Empty); // drop fut A
@@ -100,11 +98,11 @@ where
                 }
                 Poll::Pending => Poll::Pending,
             },
-            State::B(fut) => fut.poll(cx).map(|r| {
+            StateProj::B(fut) => fut.poll(cx).map(|r| {
                 this.state.set(State::Empty);
                 r
             }),
-            State::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
+            StateProj::Empty => panic!("future must not be polled after it returned `Poll::Ready`"),
         }
     }
 }
diff --git a/actix-service/src/transform.rs b/actix-service/src/transform.rs
index 27704986..dc55f533 100644
--- a/actix-service/src/transform.rs
+++ b/actix-service/src/transform.rs
@@ -211,7 +211,7 @@ where
     state: ApplyTransformFutureState<T, S>,
 }
 
-#[pin_project::pin_project]
+#[pin_project::pin_project(project = ApplyTransformFutureStateProj)]
 pub enum ApplyTransformFutureState<T, S>
 where
     S: ServiceFactory,
@@ -228,13 +228,11 @@ where
 {
     type Output = Result<T::Transform, T::InitError>;
 
-    #[pin_project::project]
     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
         let mut this = self.as_mut().project();
 
-        #[project]
         match this.state.as_mut().project() {
-            ApplyTransformFutureState::A(fut) => match fut.poll(cx)? {
+            ApplyTransformFutureStateProj::A(fut) => match fut.poll(cx)? {
                 Poll::Ready(srv) => {
                     let fut = this.store.0.new_transform(srv);
                     this.state.set(ApplyTransformFutureState::B(fut));
@@ -242,7 +240,7 @@ where
                 }
                 Poll::Pending => Poll::Pending,
             },
-            ApplyTransformFutureState::B(fut) => fut.poll(cx),
+            ApplyTransformFutureStateProj::B(fut) => fut.poll(cx),
         }
     }
 }
diff --git a/actix-utils/Cargo.toml b/actix-utils/Cargo.toml
index 4c55da05..f32ad5b5 100644
--- a/actix-utils/Cargo.toml
+++ b/actix-utils/Cargo.toml
@@ -25,6 +25,6 @@ either = "1.5.3"
 futures-channel = { version = "0.3.4", default-features = false }
 futures-sink = { version = "0.3.4", default-features = false }
 futures-util = { version = "0.3.4", default-features = false }
-pin-project = "0.4.6"
+pin-project = "0.4.17"
 log = "0.4"
 slab = "0.4"