diff --git a/text/0213-suspense-in-react-18.md b/text/0213-suspense-in-react-18.md
new file mode 100644
index 00000000..19346f80
--- /dev/null
+++ b/text/0213-suspense-in-react-18.md
@@ -0,0 +1,287 @@
+- Start Date: 2022-03-23
+- RFC PR: https://github.com/reactjs/rfcs/pull/213
+- React Issue: https://github.com/facebook/react/issues/13206
+
+_Note: This RFC is closer to an "intent to ship" and is different than the
+process we typically do because it is the result of years of research into
+concurrency, Suspense, and server rendering. All of what is posted here was
+designed and discussed over the last year in the React 18 Working Group
+([available here](https://github.com/reactwg/react-18/discussions)) and iterated
+on in public experimental releases since 2018. **We'd like to get one final
+round of broad public feedback from the community before shipping in case there
+are new concerns that have not been discussed before.** You can consider the
+Working Group to be a part of the RFC, so please feel free to quote and discuss
+any content from it when commenting on the RFC here._
+
+# Summary
+
+This RFC describes several changes that we'd like to make to the behavior of the `` component:
+
+- Behavior change: **Committed trees are always consistent**
+- New feature: **Server-side rendering support with streaming**
+- New feature: **Using transitions to avoid hiding existing content**
+- Behavior change: **Layout effects re-run when content reappears**
+
+The Suspense API itself does not change.
+
+This RFC *does not* add support for data fetching. The changes in this RFC are prerequisites for that future step.
+
+# Basic example
+
+Suspense lets you declaratively specify the loading state for a part of the component tree if it's not yet ready to be displayed:
+
+```js
+}>
+
+
+```
+
+Suspense makes the "UI loading state" a first-class declarative concept in the React programming model. This lets us build higher-level features on top of it. This RFC does not change the Suspense API itself, but it **refines its semantics and adds some new features** on top.
+
+# Motivation
+
+With the initial release in [React 16.6.0](https://reactjs.org/blog/2018/10/23/react-v-16-6.html), Suspense only supported a single use case: [code splitting on the client with `React.lazy`](https://github.com/reactjs/rfcs/pull/64). So even though you could add `` boundaries in your component trees, they were not being used by React for any other purposes. Moreover, you couldn't use them with server rendering. This made their usefulness very limited.
+
+The full motivation has always been to extend the support so that eventually, the same declarative Suspense fallback can handle any asynchronous operations (loading code, data, images, etc). You can learn more about the full vision for Suspense in the [React 18 Keynote](https://youtu.be/FZ0cG47msEk?t=409).
+
+This set of changes is the first step towards making Suspense more powerful.
+
+# Detailed design
+
+We'll first briefly recap how Suspense works, and then describe the changes.
+
+## Recap: How Suspense works
+
+Suspense lets you declaratively specify what React should show when a part of the tree is not yet ready to render:
+
+```js
+}>
+
+
+
+
+ }>
+
+
+
+
+
+```
+
+Conceptually, you can think of `Suspense` as being similar to a `catch` block. However, instead of catching errors, it catches components "suspending". Any component in the tree can "suspend", which means that it's not ready to render. (The reason is arbitrary, but usually it could be due to missing code, data, etc.)
+
+In JavaScript, when you `throw`, the closest `catch` above "wins", even if it's several function calls higher. Although Suspense works differently under the hood, the mental model is similar: if a component suspends, the closest `Suspense` component above the suspending component "catches" it, no matter how many components that are in between. In the above example, if `ProfileHeader ` suspends, then the entire page will be replaced with the `PageGlimmer`. However, if either `Comments` or `Photos` suspend, they together will be replaced with the `LeftColumnGlimmer`. This lets you safely add and remove Suspense boundaries according to the granularity of your visual UI design and without worrying which components exactly might depend on asynchronous code and data.
+
+The exact mechanism of an arbitrary component "suspending" is out of scope of this RFC. The built-in `React.lazy` component suspends automatically if the code associated with the import has not yet loaded, and tells React to retry rendering when the code has loaded. We expect to add an API for an arbitrary component to suspend in a future RFC. Regardless of how the details of that API, for the purposes of this RFC, we can assume that any component might want to suspend and provide React with a Promise. React will *not* use the result of this Promise, but it will retry rendering. This can result in a completed render, an error, or getting suspended again (and displaying the fallback).
+
+Importantly, Suspense is completely decoupled from *how* the code/data is being loaded. There are many possible strategies using different transport layers (e.g. GraphQL or REST), different places to fetch data (e.g. framework method vs ad-hoc), different performance characteristics (e.g. waterfall vs parallel pre-fetched), and different environments (e.g. client vs server). Suspense is only a mechanism to make React aware of the declarative loading states, and it does not prescribe any particular choice in how the data or code are fetched.
+
+The changes in this RFC are independent of what suspends and why. They are focused on React's behavior after a component suspends.
+
+## Behavior change: Committed trees are always consistent
+
+Consider code like this:
+
+```js
+
+ {showComments && (
+
}>
+
+
+
+
+ )}
+
+```
+
+Suppose that `showComments` turns from `false` to `true`. React starts rendering the contents of the `Panel`, but `Comments` suspends. This means we can't show the `Panel` either: the entire contents up to the closest `Suspense` fallback needs to be hidden until the tree is ready. Only the `Spinner` should be visible until then.
+
+Previously, React would do this in a sequence that goes like this:
+
+1. Place `Panel` content into the DOM, but with a "hole" instead of `Comments` content.
+1. Add `display: none` to the incomplete `Panel` content so that it does not appear visible.
+1. Add the `Spinner` content into the DOM.
+1. Fire the `Panel` effects because technically it has "mounted" (even though not fully).
+1. Wait for the `Comments` to be ready.
+1. Then, attempt rendering again.
+1. Remove the `Spinner` content from the DOM.
+1. Place the `Comments` content into the `Panel` content that was already in the DOM.
+1. Remove `display: none` from the `Panel` content.
+
+With this RFC, the proposed order is different:
+
+1. **(New)** Throw away the `Panel` content instead of putting it into the DOM.
+1. Add the `Spinner` content into the DOM.
+1. Wait for the `Comments` to be ready.
+1. Then, attempt rendering again.
+1. Remove the `Spinner` content from the DOM.
+1. Place the `Panel` content with `Comments` into the DOM.
+1. **(Moved)** Fire the `Panel` effects.
+
+This order is more intiutive because incomplete trees don't get committed at all. If a tree is not ready, it gets discarded, and a later attempt inserts a complete tree. Effects always observe a complete tree without "holes" in it.
+
+The reason we didn't go with this approach in React 16.6 was for backwards compatibility reasons. At the time, most React code used classes, and many classes contained the `componentWillMount` method. This is why we renamed it to `UNSAFE_componentWillMount` in 2018 and [described](https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html) strategies ot migrate away from it. The problem with `UNSAFE_componentWillMount` is that it fires during rendering (so, before we know whether child components suspended or not). If we throw away an incomplete tree after `UNSAFE_componentWillMount` has already fired, it will not receive a matching `componentDidMount` or `componentWillUnmount` call. (During a retry, there will be another `UNSAFE_componentWillMount` call because we need to render the same tree again.) So code that relies on `UNSAFE_componentWillMount` and `componentWillUnmount` being called the same number of times might cause mistakes or memory leaks.
+
+We don't think this concern is relevant anymore for several reasons. `UNSAFE_componentWillMount` was marked as "unsafe" in 2018, and most popular open source libraries have long migrated away from it. This issue also only affects components "between" the `` node and the component that actually suspends. So it is very local in scope, and is easy to fix. Finally, Hooks have become a popular alternative to classes, and don't have the same issue. On the other hand, the current behavior [has been causing issues](https://github.com/facebook/react/issues/14536) for using popular component libraries with Suspense. This is why we think now is a good idea to make that change.
+
+Read https://github.com/reactwg/react-18/discussions/7 for more details on the proposed new behavior.
+
+## New feature: Server-side rendering support with streaming
+
+Previously, if a component suspends during server rendering, React would throw a hard error. In practice, it meant that apps using server rendering (or built with an SSR framework like Next.js or Remix) could not use Suspense for code splitting in a supported way.
+
+We are adding a new server renderer that supports streaming HTML out-of-order. Unlike the old server renderer that synchronously produces a string, the new server renderer produces a stream. That stream starts with the initial HTML that can be flushed early. However, the new renderer is also fully integrated with Suspense, which means that it's able to "wait" for parts of the tree that are not ready, and emit fallback HTML (e.g. spinners) for them. When the content is ready, React emits the content HTML in the same stream along with a small inline `