diff --git a/package.json b/package.json
index 58afa2ecce2e0a3a7fe0603f3e2e678d4eb4689d..7764fd51becddbe2098d8fc53adb2fbbef90a222 100644
--- a/package.json
+++ b/package.json
@@ -102,7 +102,7 @@
     "scratch-render": "0.1.0-prerelease.20180907144714",
     "scratch-storage": "1.0.2",
     "scratch-svg-renderer": "0.2.0-prerelease.20180907141232",
-    "scratch-vm": "0.2.0-prerelease.20180912162301",
+    "scratch-vm": "0.2.0-prerelease.20180912222010",
     "selenium-webdriver": "3.6.0",
     "startaudiocontext": "1.2.1",
     "style-loader": "^0.23.0",
diff --git a/src/containers/monitor.jsx b/src/containers/monitor.jsx
index b39358c08fef4a5e42d124f6bec606c9b861076c..2f04cb51b7fb2335e1de4d782a3fe533b68957cc 100644
--- a/src/containers/monitor.jsx
+++ b/src/containers/monitor.jsx
@@ -7,6 +7,7 @@ import MonitorComponent, {monitorModes} from '../components/monitor/monitor.jsx'
 import {addMonitorRect, getInitialPosition, resizeMonitorRect, removeMonitorRect} from '../reducers/monitor-layout';
 
 import {connect} from 'react-redux';
+import VM from 'scratch-vm';
 
 const availableModes = opcode => (
     monitorModes.filter(t => {
@@ -147,12 +148,14 @@ Monitor.propTypes = {
             PropTypes.number
         ]))
     ]), // eslint-disable-line react/no-unused-prop-types
+    vm: PropTypes.instanceOf(VM),
     width: PropTypes.number,
     x: PropTypes.number,
     y: PropTypes.number
 };
 const mapStateToProps = state => ({
-    monitorLayout: state.scratchGui.monitorLayout
+    monitorLayout: state.scratchGui.monitorLayout,
+    vm: state.scratchGui.vm
 });
 const mapDispatchToProps = dispatch => ({
     addMonitorRect: (id, rect, savePosition) =>
diff --git a/src/lib/monitor-adapter.js b/src/lib/monitor-adapter.js
index d7bdd304e3db546a4d1b6a083d230ea1c2a4fa36..be0b1db7199cca86045d5b200b7c7cf0d9a6cb9c 100644
--- a/src/lib/monitor-adapter.js
+++ b/src/lib/monitor-adapter.js
@@ -11,10 +11,13 @@ const isUndefined = a => typeof a === 'undefined';
  * @param {string} block.opcode - The opcode of the monitor
  * @param {object} block.params - Extra params to the monitor block
  * @param {string|number|Array} block.value - The monitor value
+ * @param {VirtualMachine} block.vm - the VM instance which owns the block
  * @return {object} The adapted monitor with label and category
  */
-export default function ({id, spriteName, opcode, params, value}) {
-    let {label, category, labelFn} = OpcodeLabels(opcode);
+export default function ({id, spriteName, opcode, params, value, vm}) {
+    // Extension monitors get their labels from the Runtime through `getLabelForOpcode`.
+    // Other monitors' labels are hard-coded in `OpcodeLabels`.
+    let {label, category, labelFn} = (vm && vm.runtime.getLabelForOpcode(opcode)) || OpcodeLabels(opcode);
 
     // Use labelFn if provided for dynamic labelling (e.g. variables)
     if (!isUndefined(labelFn)) label = labelFn(params);