Improving our example 4-pinning to the rescue 243 Since self is now Pin<&mut Self>, there are several small changes we need to make so that the borrow checker stays happy. Let's start from the top: ch09/e-coroutines-pin/src/http. rs let id = self. id; if self. stream. is_none() { println!("FIRST POLL-START OPERATION"); self. write_request(); let stream = (&mut self). stream. as_mut(). unwrap(); runtime::reactor(). register(stream, Interest::READABLE, id); runtime::reactor(). set_waker(waker, self. id); } The reason for assigning id to a variable at the top is that the borrow checker gives us some minor trouble when trying to pass in both &mut self and &self as arguments to the register/deregister functions, so we just assign id to a variable at the top and everyone is happy. There are only two more lines to change, and that is where we create a String type from our internal buffer and deregister interest with the reactor: ch09/e-coroutines-pin/src/http. rs let s = String::from_utf8_lossy(&self. buffer). to_string() ; runtime::reactor(). deregister(self. stream. as_mut(). unwrap(), id); break Poll State::Ready( s); Important Notice that this future is Unpin. There is nothing that makes it unsafe to move Http Get Future around, and this is indeed the case for most futures like this. Only the ones created by async/await are self-referential by design. That means there is no need for any unsafe here. Next, let's move on to main. rs since there are some important changes we need to make there.