diff --git a/packages/react-call-return/src/__tests__/ReactCallReturn-test.js b/packages/react-call-return/src/__tests__/ReactCallReturn-test.js
index 45cd4dedc7a1..088108d338f3 100644
--- a/packages/react-call-return/src/__tests__/ReactCallReturn-test.js
+++ b/packages/react-call-return/src/__tests__/ReactCallReturn-test.js
@@ -255,4 +255,66 @@ describe('ReactCallReturn', () => {
ReactNoop.flush();
expect(ReactNoop.getChildren()).toEqual([span(100), span(200), span(500)]);
});
+
+ it('should unmount and remount children', () => {
+ let ops = [];
+
+ class Call extends React.Component {
+ render() {
+ return ReactCallReturn.unstable_createCall(
+ this.props.children,
+ (p, returns) => returns,
+ {},
+ );
+ }
+ }
+
+ class Return extends React.Component {
+ render() {
+ ops.push(`Return ${this.props.value}`);
+ return ReactCallReturn.unstable_createReturn(this.props.children);
+ }
+
+ componentWillMount() {
+ ops.push(`Mount Return ${this.props.value}`);
+ }
+
+ componentWillUnmount() {
+ ops.push(`Unmount Return ${this.props.value}`);
+ }
+ }
+
+ ReactNoop.render(
+
+
+
+ ,
+ );
+ ReactNoop.flush();
+
+ expect(ops).toEqual([
+ 'Mount Return 1',
+ 'Return 1',
+ 'Mount Return 2',
+ 'Return 2',
+ ]);
+
+ ops = [];
+
+ ReactNoop.render();
+ ReactNoop.flush();
+
+ expect(ops).toEqual(['Unmount Return 1', 'Unmount Return 2']);
+
+ ops = [];
+
+ ReactNoop.render(
+
+
+ ,
+ );
+ ReactNoop.flush();
+
+ expect(ops).toEqual(['Mount Return 3', 'Return 3']);
+ });
});
diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js
index 42f53a28a0a5..6c962576e02e 100644
--- a/packages/react-reconciler/src/ReactFiberBeginWork.js
+++ b/packages/react-reconciler/src/ReactFiberBeginWork.js
@@ -559,7 +559,7 @@ export default function(
} else {
workInProgress.stateNode = reconcileChildFibers(
workInProgress,
- workInProgress.stateNode,
+ current.stateNode,
nextChildren,
renderExpirationTime,
);