diff --git a/docs/extensions.md b/docs/extensions.md
index a1c982146..fd5343edd 100644
--- a/docs/extensions.md
+++ b/docs/extensions.md
@@ -129,7 +129,7 @@ The possible types of block arguments are as follows:
 - Angle - an input similar to the number input, but it has an additional UI to be able to pick an angle from a
 circular dial
 - Boolean - an input for a boolean (hexagonal shaped) reporter block. This field is not type-able.
-- Color - an input which displays a color swatch. This field has additional UI to pick a color by choosing values for the color's hue, saturation and brightness.
+- Color - an input which displays a color swatch. This field has additional UI to pick a color by choosing values for the color's hue, saturation and brightness. Optionally, the defaultValue for the color picker can also be chosen if the extension developer wishes to display the same color every time the extension is added. If the defaultValue is left out, the default behavior of picking a random color when the block is created will be used.
 - Matrix - an input which displays a 5 x 5 matrix of cells, where each cell can be filled in or clear.
 - Note - a numeric input which can select a musical note. This field has additional UI to select a note from a
 visual keyboard.
diff --git a/src/engine/runtime.js b/src/engine/runtime.js
index f6b8bc40b..75c7f7e41 100644
--- a/src/engine/runtime.js
+++ b/src/engine/runtime.js
@@ -51,38 +51,58 @@ const defaultExtensionColors = ['#0FBD8C', '#0DA57A', '#0B8E69'];
 const ArgumentTypeMap = (() => {
     const map = {};
     map[ArgumentType.ANGLE] = {
-        shadowType: 'math_angle',
-        fieldType: 'NUM'
+        shadow: {
+            type: 'math_angle',
+            // We specify fieldNames here so that we can pick
+            // create and populate a field with the defaultValue
+            // specified in the extension.
+            // When the `fieldName` property is not specified,
+            // the <field></field> will be left out of the XML and
+            // the scratch-blocks defaults for that field will be
+            // used instead (e.g. default of 0 for number fields)
+            fieldName: 'NUM'
+        }
     };
     map[ArgumentType.COLOR] = {
-        shadowType: 'colour_picker'
+        shadow: {
+            type: 'colour_picker',
+            fieldName: 'COLOUR'
+        }
     };
     map[ArgumentType.NUMBER] = {
-        shadowType: 'math_number',
-        fieldType: 'NUM'
+        shadow: {
+            type: 'math_number',
+            fieldName: 'NUM'
+        }
     };
     map[ArgumentType.STRING] = {
-        shadowType: 'text',
-        fieldType: 'TEXT'
+        shadow: {
+            type: 'text',
+            fieldName: 'TEXT'
+        }
     };
     map[ArgumentType.BOOLEAN] = {
         check: 'Boolean'
     };
     map[ArgumentType.MATRIX] = {
-        shadowType: 'matrix',
-        fieldType: 'MATRIX'
+        shadow: {
+            type: 'matrix',
+            fieldName: 'MATRIX'
+        }
     };
     map[ArgumentType.NOTE] = {
-        shadowType: 'note',
-        fieldType: 'NOTE'
+        shadow: {
+            type: 'note',
+            fieldName: 'NOTE'
+        }
     };
     map[ArgumentType.IMAGE] = {
-        // TODO was going to use fieldType here, but I didn't want to
-        // confuse it with how fieldType is being used in all these
+        // TODO was going to use shadowFieldName here, but I didn't want to
+        // confuse it with how shadowFieldName is being used in all these
         // other argument type cases
         // Inline images are weird because they're not actually "arguments".
         // They are more analagous to the label on a block.
-        type: 'IMAGE'
+        fieldType: 'field_image'
     };
     return map;
 })();
@@ -1242,26 +1262,29 @@ class Runtime extends EventEmitter {
 
         // Most field types are inputs (slots on the block that can have other blocks plugged into them)
         // check if this is not one of those cases. E.g. an inline image on a block.
-        if (argTypeInfo.type && !argTypeInfo.shadowType && !argTypeInfo.fieldType) {
-            if (argTypeInfo.type === 'IMAGE') {
-                if (!argInfo.dataURI) {
-                    log.warn('Missing data URI in extension block with argument type IMAGE');
-                }
-                argJSON = {
-                    type: 'field_image',
-                    alt: argInfo.alt || '',
-                    src: argInfo.dataURI || '',
-                    // TODO these probably shouldn't be hardcoded...?
-                    width: 24,
-                    height: 24,
-                    // Whether or not the inline image should be flipped horizontally
-                    // in RTL languages. Defaults to false, indicating that the
-                    // image will not be flipped.
-                    // TODO is false a good default here?
-                    flip_rtl: argInfo.flipRTL || false
-                };
+        switch (argTypeInfo.fieldType) {
+        case 'field_image': {
+            if (!argInfo.dataURI) {
+                log.warn('Missing data URI in extension block with argument type IMAGE');
             }
-        } else {
+            argJSON = {
+                type: 'field_image',
+                alt: argInfo.alt || '',
+                src: argInfo.dataURI || '',
+                // TODO these probably shouldn't be hardcoded...?
+                width: 24,
+                height: 24,
+                // Whether or not the inline image should be flipped horizontally
+                // in RTL languages. Defaults to false, indicating that the
+                // image will not be flipped.
+                // TODO is false a good default here?
+                flip_rtl: argInfo.flipRTL || false
+            };
+            break;
+        }
+        default: {
+            // Construct input value
+
             // Layout a block argument (e.g. an input slot on the block)
             argJSON = {
                 type: 'input_value',
@@ -1297,8 +1320,8 @@ class Runtime extends EventEmitter {
                 }
             } else {
                 valueName = placeholder;
-                shadowType = argTypeInfo.shadowType;
-                fieldName = argTypeInfo.fieldType;
+                shadowType = argTypeInfo.shadow.type || null;
+                fieldName = argTypeInfo.shadow.fieldName || null;
             }
 
             // <value> is the ScratchBlocks name for a block input.
@@ -1313,7 +1336,8 @@ class Runtime extends EventEmitter {
             }
 
             // A <field> displays a dynamic value: a user-editable text field, a drop-down menu, etc.
-            if (fieldName) {
+            // Leave out the field if defaultValue or fieldName are not specified
+            if (defaultValue && fieldName) {
                 context.inputList.push(`<field name="${fieldName}">${defaultValue}</field>`);
             }
 
@@ -1325,6 +1349,7 @@ class Runtime extends EventEmitter {
                 context.inputList.push('</value>');
             }
         }
+        }
 
         const argsName = `args${context.outLineNum}`;
         const blockArgs = (context.blockJSON[argsName] = context.blockJSON[argsName] || []);