diff --git a/src/lib/monitor-adapter.js b/src/lib/monitor-adapter.js
index f458f67c6bd75a50ef96d5a9f981e031162c32c5..25d80c39a824bd35483a3dc56a47c355e5aa44fc 100644
--- a/src/lib/monitor-adapter.js
+++ b/src/lib/monitor-adapter.js
@@ -3,8 +3,6 @@
  * - Convert opcode to a label and a category
  * - Add missing XY position data if needed
  */
-const log = require('./log');
-
 const OpcodeLabels = require('../lib/opcode-labels.js');
 
 const PADDING = 5;
@@ -13,17 +11,10 @@ const MONITOR_HEIGHT = 23;
 const isUndefined = a => typeof a === 'undefined';
 
 module.exports = function ({id, opcode, params, value, x, y}, monitorIndex) {
-    let opcodeData = OpcodeLabels[opcode];
-    if (isUndefined(opcodeData)) {
-        log.error(`No data found for opcode: ${opcode}`);
-        opcodeData = {category: 'data', label: opcode};
-    }
+    let {label, category, labelFn} = OpcodeLabels(opcode);
 
-    // Use labelFn with fields if provided for dynamic labelling (e.g. variables)
-    let {label, category, labelFn} = opcodeData;
-    if (!isUndefined(labelFn)) {
-        label = labelFn(params);
-    }
+    // Use labelFn if provided for dynamic labelling (e.g. variables)
+    if (!isUndefined(labelFn)) label = labelFn(params);
 
     // Simple layout if x or y are undefined
     // @todo scratch2 has a more complex layout behavior we may want to adopt
diff --git a/src/lib/opcode-labels.js b/src/lib/opcode-labels.js
index 9dbdcb59f358252739d5d867a49d167808cc3952..bebe14743630de643343e9b88318b88fdf312b07 100644
--- a/src/lib/opcode-labels.js
+++ b/src/lib/opcode-labels.js
@@ -1,4 +1,4 @@
-module.exports = {
+const opcodeMap = {
     // Motion
     motion_direction: {
         category: 'motion',
@@ -65,3 +65,11 @@ module.exports = {
         label: 'timer'
     }
 };
+
+module.exports = function (opcode) {
+    if (opcode in opcodeMap) return opcodeMap[opcode];
+    return {
+        category: 'data',
+        label: opcode
+    };
+};