diff --git a/text/0000-async.md b/text/0000-async.md
new file mode 100644
index 00000000000..dc7e3450e01
--- /dev/null
+++ b/text/0000-async.md
@@ -0,0 +1,916 @@
+- Feature Name: (fill me in with a unique ident, my_awesome_feature)
+- Start Date: 2018-04-04
+- RFC PR: (leave this empty)
+- Rust Issue: (leave this empty)
+
+# Summary
+[summary]: #summary
+
+This RFC provides the library component for the first-class `async`/`await`
+syntax proposed in a [companion RFC]. It is intentionally minimal, including the
+smallest set of mechanisms needed to support async/await with borrowing and
+interoperation with the futures crate. Those mechanisms are:
+
+- The task system of the futures crate, which will be moved into `libcore`
+- A new `Future` trait, which integrates the [`PinMut` APIs][pin] with the task system to
+ provide async values that can interoperate with futures.
+
+[pin]: https://github.com/rust-lang/rfcs/pull/2349
+[companion RFC]: https://github.com/rust-lang/rfcs/pull/2394
+
+The RFC also covers the intended ecosystem migration path.
+
+# Motivation
+[motivation]: #motivation
+
+The basic motivation for this RFC is to provide a supporting mechanism for
+`async`/`await` syntax:
+
+```rust
+async fn function(argument: &str) -> usize {
+ // ...
+}
+```
+
+The syntax itself is motivated in the [companion RFC], and there is
+a [blog post](http://aturon.github.io/2018/04/24/async-borrowing/) that goes
+through its importance in greater detail. As with closures, the syntax involves
+producing an anonymous type, so that the above declaration is equivalent to:
+
+```rust
+fn function<'a>(argument: &'a str) -> _Anonymous<'a, usize> {
+ // ...
+}
+```
+
+Again like a closure the anonymous type is only usable through the trait it
+implements: `Future`. The goal of this RFC is to provide a concrete proposal for
+this `Future` trait, based on the work pioneered by the futures crate.
+
+A secondary benefit of this RFC is that it enshrines the *task system* currently
+defined by the futures crate into `libcore`, thereby standardizing and
+ultimately stabilizing the async ecosystem around a single lightweight task
+mechanism.
+
+# Guide-level explanation
+[guide-level-explanation]: #guide-level-explanation
+
+The `Future` trait represents an *asynchronous* and lazy computation that may
+eventually produce a final value, but doesn't have to block the current thread
+to do so.
+
+Futures can be constructed through `async` blocks or `async` functions, e.g.,
+
+```rust
+async fn read_frame(socket: &TcpStream) -> Result { ... }
+```
+
+This `async` function, when invoked, produces a future that represents the
+completion of reading a frame from the given socket. The function signature
+is equivalent to:
+
+```rust
+fn read_frame<'sock>(socket: &'sock TcpStream)
+ -> impl Future