diff --git a/text/3318-field-projection.md b/text/3318-field-projection.md
new file mode 100644
index 00000000000..4263c9dcf14
--- /dev/null
+++ b/text/3318-field-projection.md
@@ -0,0 +1,409 @@
+- Feature Name: `field_projection`
+- Start Date: 2022-09-10
+- RFC PR: [rust-lang/rfcs#3318](https://github.com/rust-lang/rfcs/pull/3318)
+- Rust Issue: [rust-lang/rust#0000](https://github.com/rust-lang/rust/issues/0000)
+
+# Summary
+[summary]: #summary
+
+Introduce ways to refer to fields of structs via the type system.
+
+# Motivation
+[motivation]: #motivation
+
+Accessing field information is at the moment only possible for macros. Allowing the type system to also access some information about fields enables writing code that generalizes over fields.
+One important application is field projection. Rust often employs the use of wrapper types, for example `Pin
`, `NonNull`, `Cell`, `UnsafeCell`, `MaybeUninit` and more. These types provide additional properties for the wrapped type and often also logically affect their fields. For example, if a struct is uninitialized, its fields are also uninitialized. Giving the type system access to field information allows creating safe projection functions.
+
+Current projection functions cannot be safe, since they take a projection closure that might execute arbitrary code. They also cannot automatically uphold type invariants of the projected struct. A prime example is `Pin`, the projection functions are `unsafe` and accessing fields is natural and often required. This leads to code littered with `unsafe` projections:
+```rust
+struct RaceFutures {
+ fut1: F1,
+ fut2: F2,
+}
+
+impl Future for RaceFutures
+where
+ F1: Future,
+ F2: Future