diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx
index 47d12661cfebe65ee23e33efa6efd8d7332ad388..c1a7a2f60e15c8b097dfa6f2839b5bc0a7bdc5f6 100644
--- a/src/containers/blocks.jsx
+++ b/src/containers/blocks.jsx
@@ -175,7 +175,9 @@ class Blocks extends React.Component {
         // When we change sprites, update the toolbox to have the new sprite's blocks
         if (this.props.vm.editingTarget) {
             const target = this.props.vm.editingTarget;
-            this.props.updateToolboxState(makeToolboxXML(target.isStage, target.id));
+            const dynamicBlocksXML = this.props.vm.runtime.getBlocksXML();
+            const toolboxXML = makeToolboxXML(target.isStage, target.id, dynamicBlocksXML);
+            this.props.updateToolboxState(toolboxXML);
         }
 
         if (this.props.vm.editingTarget && !this.state.workspaceMetrics[this.props.vm.editingTarget.id]) {
diff --git a/test/integration/test.js b/test/integration/test.js
index 4096c2d909b081756d8345df7d892a75013c7d5c..9624fb8a76770a959ba6020c736008428c7bbdd5 100644
--- a/test/integration/test.js
+++ b/test/integration/test.js
@@ -156,6 +156,9 @@ describe('costumes, sounds and variables', () => {
         await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for scroll animation
         await clickText('stamp', blocksTabScope); // Would fail if didn't scroll back
 
+        // Make sure switching sprites doesn't clear extensions
+        await clickText('Backdrops'); // Switch to the backdrop
+        await findByText('Pen', blocksTabScope); // Pen extension should still be loaded
 
         const logs = await getLogs(errorWhitelist);
         await expect(logs).toEqual([]);