diff --git a/src/virtual-machine.js b/src/virtual-machine.js
index 764242d31..6f15c43d1 100644
--- a/src/virtual-machine.js
+++ b/src/virtual-machine.js
@@ -336,6 +336,17 @@ class VirtualMachine extends EventEmitter {
         });
     }
 
+    /*
+     * @type {Array<object>} Array of all costumes and sounds currently in the runtime
+     */
+    get assets () {
+        return this.runtime.targets.reduce((acc, target) => (
+            acc
+                .concat(target.sprite.sounds.map(sound => sound.asset))
+                .concat(target.sprite.costumes.map(costume => costume.asset))
+        ), []);
+    }
+
     _addFileDescsToZip (fileDescs, zip) {
         for (let i = 0; i < fileDescs.length; i++) {
             const currFileDesc = fileDescs[i];
diff --git a/test/unit/vm_collectAssets.js b/test/unit/vm_collectAssets.js
new file mode 100644
index 000000000..8c356a8fd
--- /dev/null
+++ b/test/unit/vm_collectAssets.js
@@ -0,0 +1,24 @@
+const test = require('tap').test;
+
+const RenderedTarget = require('../../src/sprites/rendered-target');
+const Sprite = require('../../src/sprites/sprite');
+const VirtualMachine = require('../../src/virtual-machine');
+
+test('collectAssets', t => {
+    const vm = new VirtualMachine();
+    const sprite = new Sprite(null, vm.runtime);
+    const target = new RenderedTarget(sprite, vm.runtime);
+    vm.runtime.targets = [target];
+    const [
+        soundAsset1,
+        soundAsset2,
+        costumeAsset1
+    ] = [{assetId: 1}, {assetId: 2}, {assetId: 3}];
+    sprite.sounds = [{id: 1, asset: soundAsset1}, {id: 2, asset: soundAsset2}];
+    sprite.costumes = [{id: 1, asset: costumeAsset1}];
+    const assets = vm.assets;
+    t.type(assets.length, 'number');
+    t.equal(assets.length, 3);
+    t.deepEqual(assets, [soundAsset1, soundAsset2, costumeAsset1]);
+    t.end();
+});