diff --git a/text/0000-callback-ref-cleanup.md b/text/0000-callback-ref-cleanup.md
new file mode 100644
index 00000000..76b329ed
--- /dev/null
+++ b/text/0000-callback-ref-cleanup.md
@@ -0,0 +1,242 @@
+- Start Date: 2021-09-08
+- RFC PR: https://github.com/reactjs/rfcs/pull/205
+- React Issue: https://github.com/facebook/react/issues/15176
+
+# Summary
+
+Callback Refs should allow returning a cleanup function which will be called when the ref is removed or changed.
+
+# Basic example
+
+```jsx
+function MyComponent(props) {
+ const exampleCallbackRef = useCallback((el) => {
+ /* effect code */
+ return () => { /* cleanup code */ };
+ }, [])
+
+ return ;
+}
+```
+
+# Motivation
+
+Similar to `useEffect`, Callback Refs often create resources that need cleaning up
+when an element is unmounted. In such situations, developers often keep a reference to
+the element in a mutable ref, and clean it up the next time Callback Ref is
+called with a `null` (See section `Alternatives`). But, as the example above shows,
+it is easier to clean up the effects of a Callback Ref when the element is already in the
+scope of the cleanup function.
+
+The lack of a cleanup mechanism becomes a problem when trying to use the same Callback Ref
+for multiple elements. Consider the following example:
+
+```jsx
+function exampleCallbackRef (el) {
+ /* effect code */
+ return () => { /* cleanup code */ };
+}
+
+function MyComponent(props) {
+ return <>
+
+
+
+ >;
+}
+```
+
+With the new feature, it will be possible to know which element is being unmounted in the cleanup code.
+
+# Detailed design
+
+The general design of the feature looks like this:
+
+```jsx
+
{
+ // Normal ref callback
+
+ return () => {
+ // Cleanup function which is called when the ref is removed or changed
+ };
+}} />
+```
+
+The behavior of the cleanup function should be similar to the behavior of the
+cleanup function of `useEffect`. Some points to keep in mind are:
+- The return value of the Callback Ref should be ignored if it's not a function.
+The return value should be called only if it is a function and there should not be
+an error when it is `null`, `undefined` or another type that is not a function.
+- It should be possible to conditionally return a cleanup function. This means the user
+can choose not to have a cleanup function for specific values of a ref.
+
+No changes needs to be done to the other ref types, that is mutable refs and string refs.
+
+## Handling of the last null value
+
+In the current implementation, when a ref is unmounted, the Callback Ref is called
+with `null`. To keep backward compatibility, Callback Refs should still be called
+with `null` when the element unmounts.
+
+The cleanup function should be called when the value of a ref changes from one value to
+another. This means that for the following code:
+
+```jsx
+function exampleCallbackRef(el) {
+ console.log('Callback ref called for:', el);
+ return () => console.log('Cleanup called for:', el);
+}
+
+...
+
+
+```
+
+The lifecycle of the Callback Ref should look like:
+
+```
+Callback ref called for: