diff --git a/package.json b/package.json
index 23701739cdaa1a70b46a114c96b3c364e8655862..c21c222584305afa8d681cc9ea19e4d476045a4b 100644
--- a/package.json
+++ b/package.json
@@ -96,13 +96,13 @@
     "redux-throttle": "0.1.1",
     "rimraf": "^2.6.1",
     "scratch-audio": "0.1.0-prerelease.20180625202813",
-    "scratch-blocks": "0.1.0-prerelease.1531482946",
-    "scratch-l10n": "3.0.20180712200642",
-    "scratch-paint": "0.2.0-prerelease.20180712195436",
+    "scratch-blocks": "0.1.0-prerelease.1532024291",
+    "scratch-l10n": "3.0.20180719145856",
+    "scratch-paint": "0.2.0-prerelease.20180718183615",
     "scratch-render": "0.1.0-prerelease.20180618173030",
     "scratch-storage": "0.5.1",
     "scratch-svg-renderer": "0.2.0-prerelease.20180712223402",
-    "scratch-vm": "0.1.0-prerelease.1531502959",
+    "scratch-vm": "0.2.0-prerelease.20180719205147",
     "selenium-webdriver": "3.6.0",
     "startaudiocontext": "1.2.1",
     "style-loader": "^0.21.0",
diff --git a/src/components/connection-modal/connecting-step.jsx b/src/components/connection-modal/connecting-step.jsx
index 063e67a826c79f4c9f55548e321d499d8c86d6a3..be378b3fdd54773f4a1bf9989364a930f9faf433 100644
--- a/src/components/connection-modal/connecting-step.jsx
+++ b/src/components/connection-modal/connecting-step.jsx
@@ -28,11 +28,7 @@ const ConnectingStep = props => (
         </Box>
         <Box className={styles.bottomArea}>
             <Box className={styles.instructions}>
-                <FormattedMessage
-                    defaultMessage="Connecting"
-                    description=""
-                    id="gui.connection.connecting"
-                />
+                {props.connectingMessage}
             </Box>
             <Dots
                 counter={1}
@@ -64,6 +60,7 @@ const ConnectingStep = props => (
 );
 
 ConnectingStep.propTypes = {
+    connectingMessage: PropTypes.node.isRequired,
     deviceImage: PropTypes.string.isRequired,
     onDisconnect: PropTypes.func
 };
diff --git a/src/components/connection-modal/connection-modal.css b/src/components/connection-modal/connection-modal.css
index b636b4af9cdb5e1d4c44505a12b62f3b405d7ecb..b8ca0634b32c81d1504f6f6bd915e1f2dc6380ea 100644
--- a/src/components/connection-modal/connection-modal.css
+++ b/src/components/connection-modal/connection-modal.css
@@ -183,8 +183,41 @@
     align-items: center;
 }
 
+.scratch-link-help {
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+    height: 100%;
+    padding: 1rem 0;
+}
+
+.scratch-link-help-step {
+    display: flex;
+    flex-direction: row;
+    justify-content: flex-start;
+    align-items: center;
+    margin-left: 3rem;
+}
+
 .scratch-link-icon {
-    max-width: 150px;
+    max-width: 50px;
+}
+
+.help-step-image {
+    margin-right: 0.5rem;
+}
+
+.help-step-number {
+    background: $pen-primary;
+    border-radius: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    color: $ui-white;
+    font-weight: bold;
+    margin-right: 0.5rem;
+    min-width: 2rem;
+    height: 2rem;
 }
 
 .button-row {
@@ -262,7 +295,7 @@
 
 .instructions {
     text-align: center;
-    padding: 1rem;
+    margin-top: 1rem;
 }
 
 .dots-row {
@@ -270,7 +303,7 @@
     flex-direction: row;
     justify-content: center;
     align-items: center;
-    padding-bottom: 1rem;
+    margin: 1rem;
 }
 
 .dots-holder {
diff --git a/src/components/connection-modal/connection-modal.jsx b/src/components/connection-modal/connection-modal.jsx
index 9a77e92f56ebd4cb439f0c12cbf0cc0a7b46d09e..c6566e954db7c3b5de3b32a8de3a2d6439115838 100644
--- a/src/components/connection-modal/connection-modal.jsx
+++ b/src/components/connection-modal/connection-modal.jsx
@@ -27,6 +27,7 @@ const ConnectionModalComponent = props => (
         contentLabel={props.name}
         headerClassName={styles.header}
         headerImage={props.smallDeviceImage}
+        onHelp={props.onHelp}
         onRequestClose={props.onCancel}
     >
         <Box className={styles.body}>
@@ -40,8 +41,10 @@ const ConnectionModalComponent = props => (
 );
 
 ConnectionModalComponent.propTypes = {
+    connectingMessage: PropTypes.node,
     name: PropTypes.node,
     onCancel: PropTypes.func.isRequired,
+    onHelp: PropTypes.func.isRequired,
     phase: PropTypes.oneOf(Object.keys(PHASES)).isRequired,
     smallDeviceImage: PropTypes.string,
     title: PropTypes.string.isRequired
diff --git a/src/components/connection-modal/error-step.jsx b/src/components/connection-modal/error-step.jsx
index 681d74b72a2b278b13ae23d39d853becf5b4116d..194e95678fed2fae311e583c35f0a676acc58aa8 100644
--- a/src/components/connection-modal/error-step.jsx
+++ b/src/components/connection-modal/error-step.jsx
@@ -26,7 +26,7 @@ const ErrorStep = props => (
                 <FormattedMessage
                     defaultMessage="Oops, looks like something went wrong."
                     description="The device connection process has encountered an error."
-                    id="gui.connection.errorMessage"
+                    id="gui.connection.error.errorMessage"
                 />
             </div>
             <Dots
@@ -45,7 +45,7 @@ const ErrorStep = props => (
                     <FormattedMessage
                         defaultMessage="Try again"
                         description="Button to initiate trying the device connection again after an error"
-                        id="gui.connection.tryagainbutton"
+                        id="gui.connection.error.tryagainbutton"
                     />
                 </button>
                 <button
@@ -59,7 +59,7 @@ const ErrorStep = props => (
                     <FormattedMessage
                         defaultMessage="Help"
                         description="Button to view help content"
-                        id="gui.connection.helpbutton"
+                        id="gui.connection.error.helpbutton"
                     />
                 </button>
             </Box>
diff --git a/src/components/connection-modal/icons/bluetooth.svg b/src/components/connection-modal/icons/bluetooth.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ebec155b4398ed010a30ab4d10ecb4597c52ad8c
Binary files /dev/null and b/src/components/connection-modal/icons/bluetooth.svg differ
diff --git a/src/components/connection-modal/icons/scratch-link.png b/src/components/connection-modal/icons/scratch-link.png
deleted file mode 100644
index af7ceed4baac35730f1b803bc9477aa1b4f208a9..0000000000000000000000000000000000000000
Binary files a/src/components/connection-modal/icons/scratch-link.png and /dev/null differ
diff --git a/src/components/connection-modal/icons/scratchlink.svg b/src/components/connection-modal/icons/scratchlink.svg
new file mode 100644
index 0000000000000000000000000000000000000000..de2011a5efd5fd213ad0bd269bce6ba9e5d17a93
Binary files /dev/null and b/src/components/connection-modal/icons/scratchlink.svg differ
diff --git a/src/components/connection-modal/scanning-step.jsx b/src/components/connection-modal/scanning-step.jsx
index 1728e1fd5d55df75790f0301ef00386783d95b15..0b0b4999d11cdb7ee78e0c0ca59a34676cd44dff 100644
--- a/src/components/connection-modal/scanning-step.jsx
+++ b/src/components/connection-modal/scanning-step.jsx
@@ -30,7 +30,7 @@ const ScanningStep = props => (
                         </div>
                     </div>
                 ) : (
-                    <Box className={styles.deviceTilePane}>
+                    <div className={styles.deviceTilePane}>
                         {props.deviceList.map(device =>
                             (<DeviceTile
                                 key={device.peripheralId}
@@ -41,7 +41,7 @@ const ScanningStep = props => (
                                 onConnecting={props.onConnecting}
                             />)
                         )}
-                    </Box>
+                    </div>
                 )
             ) : (
                 <Box className={styles.instructions}>
diff --git a/src/components/connection-modal/unavailable-step.jsx b/src/components/connection-modal/unavailable-step.jsx
index 2f789cbdb0e1a1d070e0c7e4abbe4d93a6143b18..975a66debe7d0b14b25a87c632c04a494775ac4d 100644
--- a/src/components/connection-modal/unavailable-step.jsx
+++ b/src/components/connection-modal/unavailable-step.jsx
@@ -6,30 +6,54 @@ import Box from '../box/box.jsx';
 import Dots from './dots.jsx';
 import helpIcon from './icons/help.svg';
 import backIcon from './icons/back.svg';
-import scratchLinkIcon from './icons/scratch-link.png';
+import bluetoothIcon from './icons/bluetooth.svg';
+import scratchLinkIcon from './icons/scratchlink.svg';
 
 import styles from './connection-modal.css';
 
 const UnavailableStep = props => (
     <Box className={styles.body}>
         <Box className={styles.activityArea}>
-            <Box className={styles.centeredRow}>
-                <div className={styles.deviceActivity}>
-                    <img
-                        className={styles.scratchLinkIcon}
-                        src={scratchLinkIcon}
-                    />
+            <div className={styles.scratchLinkHelp}>
+                <div className={styles.scratchLinkHelpStep}>
+                    <div className={styles.helpStepNumber}>
+                        {'1'}
+                    </div>
+                    <div className={styles.helpStepImage}>
+                        <img
+                            className={styles.scratchLinkIcon}
+                            src={scratchLinkIcon}
+                        />
+                    </div>
+                    <div className={styles.helpStepText}>
+                        <FormattedMessage
+                            defaultMessage="Make sure you have Scratch Link installed and running"
+                            description="Message for getting Scratch Link installed"
+                            id="gui.connection.unavailable.installscratchlink"
+                        />
+                    </div>
                 </div>
-            </Box>
+                <div className={styles.scratchLinkHelpStep}>
+                    <div className={styles.helpStepNumber}>
+                        {'2'}
+                    </div>
+                    <div className={styles.helpStepImage}>
+                        <img
+                            className={styles.scratchLinkIcon}
+                            src={bluetoothIcon}
+                        />
+                    </div>
+                    <div className={styles.helpStepText}>
+                        <FormattedMessage
+                            defaultMessage="Check that Bluetooth is enabled"
+                            description="Message for making sure Bluetooth is enabled"
+                            id="gui.connection.unavailable.enablebluetooth"
+                        />
+                    </div>
+                </div>
+            </div>
         </Box>
         <Box className={styles.bottomArea}>
-            <div className={styles.instructions}>
-                <FormattedMessage
-                    defaultMessage="Please start Scratch Link and turn on Bluetooth."
-                    description="Scratch link is not installed message"
-                    id="gui.connection.unavailableMessage"
-                />
-            </div>
             <Dots
                 error
                 total={3}
@@ -46,7 +70,7 @@ const UnavailableStep = props => (
                     <FormattedMessage
                         defaultMessage="Try again"
                         description="Button to initiate trying the device connection again after an error"
-                        id="gui.connection.tryagainbutton"
+                        id="gui.connection.unavailable.tryagainbutton"
                     />
                 </button>
                 <button
@@ -60,7 +84,7 @@ const UnavailableStep = props => (
                     <FormattedMessage
                         defaultMessage="Help"
                         description="Button to view help content"
-                        id="gui.connection.helpbutton"
+                        id="gui.connection.unavailable.helpbutton"
                     />
                 </button>
             </Box>
diff --git a/src/components/custom-procedures/custom-procedures.jsx b/src/components/custom-procedures/custom-procedures.jsx
index 08131ea5b1de63c406bc32cbede0b45151a54d03..81756e762ee9e8ffd64492a35b59b2849aada0a7 100644
--- a/src/components/custom-procedures/custom-procedures.jsx
+++ b/src/components/custom-procedures/custom-procedures.jsx
@@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
 import React from 'react';
 import Modal from '../modal/modal.jsx';
 import Box from '../box/box.jsx';
-import {FormattedMessage} from 'react-intl';
+import {defineMessages, injectIntl, intlShape, FormattedMessage} from 'react-intl';
 
 import booleanInputIcon from './icon--boolean-input.svg';
 import textInputIcon from './icon--text-input.svg';
@@ -10,10 +10,18 @@ import labelIcon from './icon--label.svg';
 
 import styles from './custom-procedures.css';
 
+const messages = defineMessages({
+    myblockModalTitle: {
+        defaultMessage: 'Make a Block',
+        description: 'Title for the modal where you create a custom block.',
+        id: 'gui.customProcedures.myblockModalTitle'
+    }
+});
+
 const CustomProcedures = props => (
     <Modal
         className={styles.modalContent}
-        contentLabel="Make a Block"
+        contentLabel={props.intl.formatMessage(messages.myblockModalTitle)}
         onRequestClose={props.onCancel}
     >
         <Box
@@ -133,6 +141,7 @@ const CustomProcedures = props => (
 
 CustomProcedures.propTypes = {
     componentRef: PropTypes.func.isRequired,
+    intl: intlShape,
     onAddBoolean: PropTypes.func.isRequired,
     onAddLabel: PropTypes.func.isRequired,
     onAddTextNumber: PropTypes.func.isRequired,
@@ -142,4 +151,4 @@ CustomProcedures.propTypes = {
     warp: PropTypes.bool.isRequired
 };
 
-export default CustomProcedures;
+export default injectIntl(CustomProcedures);
diff --git a/src/components/gui/gui.css b/src/components/gui/gui.css
index b53f17b55ebd42e6cc7cad2dae2d6903dbcb44cb..e40b025735171530f8006dbbfd589e48879a82e3 100644
--- a/src/components/gui/gui.css
+++ b/src/components/gui/gui.css
@@ -201,7 +201,7 @@
 }
 
 .extension-button-container {
-    width: 3.25rem;
+    width: 3.75rem;
     height: 3.25rem;
     position: absolute;
     bottom: 0;
diff --git a/src/components/library/library.jsx b/src/components/library/library.jsx
index c58d3608c94b7f74ca2573c0857e18267f7fe88a..2da09f2720deed4e72e02943665175af3cdbe46b 100644
--- a/src/components/library/library.jsx
+++ b/src/components/library/library.jsx
@@ -9,6 +9,7 @@ import Modal from '../../containers/modal.jsx';
 import Divider from '../divider/divider.jsx';
 import Filter from '../filter/filter.jsx';
 import TagButton from '../../containers/tag-button.jsx';
+import analytics from '../../lib/analytics';
 
 import styles from './library.css';
 
@@ -28,6 +29,7 @@ class LibraryComponent extends React.Component {
         super(props);
         bindAll(this, [
             'handleBlur',
+            'handleClose',
             'handleFilterChange',
             'handleFilterClear',
             'handleFocus',
@@ -56,9 +58,17 @@ class LibraryComponent extends React.Component {
         this.handleMouseEnter(id);
     }
     handleSelect (id) {
-        this.props.onRequestClose();
+        this.handleClose();
         this.props.onItemSelected(this.getFilteredData()[id]);
     }
+    handleClose () {
+        analytics.event({
+            category: 'library',
+            action: `${this.props.id}: close with search`,
+            label: this.state.filterQuery || '(empty)'
+        });
+        this.props.onRequestClose();
+    }
     handleTagClick (tag) {
         this.setState({
             filterQuery: '',
@@ -111,7 +121,7 @@ class LibraryComponent extends React.Component {
                 fullScreen
                 contentLabel={this.props.title}
                 id={this.props.id}
-                onRequestClose={this.props.onRequestClose}
+                onRequestClose={this.handleClose}
             >
                 {(this.props.filterable || this.props.tags) && (
                     <div className={styles.filterBar}>
diff --git a/src/components/menu-bar/menu-bar.jsx b/src/components/menu-bar/menu-bar.jsx
index b843e05b45aafbbd4b817b7c097d7d4586315ee2..08bd6b5561446df26a4968c64d559ce1d0d3f2bc 100644
--- a/src/components/menu-bar/menu-bar.jsx
+++ b/src/components/menu-bar/menu-bar.jsx
@@ -159,8 +159,9 @@ class MenuBar extends React.Component {
                             })}
                             onMouseUp={this.handleLanguageMouseUp}
                         >
+                            {/* @TODO: remove coming soon tooltip wrapper  https://github.com/LLK/scratch-gui/issues/2664  */}
                             <MenuBarItemTooltip
-                                enable={window.location.search.indexOf('enable=language') !== -1}
+                                enable
                                 id="menubar-selector"
                                 place="right"
                             >
diff --git a/src/components/modal/modal.css b/src/components/modal/modal.css
index 9a5a035a7de18edba2d6d5343fdc4fa97f213878..8bf2b6cb8fab403f28a867468b7d437c5f4de684 100644
--- a/src/components/modal/modal.css
+++ b/src/components/modal/modal.css
@@ -122,3 +122,14 @@ $sides: 20rem;
     font-weight: normal;
     padding-left: 0;
 }
+
+.header-item-help {
+    padding: 0;
+    margin-right: -4.75rem;
+}
+
+.help-button {
+    font-weight: normal;
+    padding-right: 0;
+    font-size: 0.75rem;
+}
diff --git a/src/components/modal/modal.jsx b/src/components/modal/modal.jsx
index 940af75586f59e05291f9970b5bf972f353ccdb3..acce21993d86b23137104f5f7bddc1215c1d26bf 100644
--- a/src/components/modal/modal.jsx
+++ b/src/components/modal/modal.jsx
@@ -9,6 +9,7 @@ import Button from '../button/button.jsx';
 import CloseButton from '../close-button/close-button.jsx';
 
 import backIcon from '../../lib/assets/icon--back.svg';
+import helpIcon from '../../lib/assets/icon--help.svg';
 
 import styles from './modal.css';
 
@@ -27,6 +28,26 @@ const ModalComponent = props => (
             grow={1}
         >
             <div className={classNames(styles.header, props.headerClassName)}>
+                {props.onHelp ? (
+                    <div
+                        className={classNames(
+                            styles.headerItem,
+                            styles.headerItemHelp
+                        )}
+                    >
+                        <Button
+                            className={styles.helpButton}
+                            iconSrc={helpIcon}
+                            onClick={props.onHelp}
+                        >
+                            <FormattedMessage
+                                defaultMessage="Help"
+                                description="Help button in modal"
+                                id="gui.modal.help"
+                            />
+                        </Button>
+                    </div>
+                ) : null}
                 <div
                     className={classNames(
                         styles.headerItem,
@@ -82,6 +103,7 @@ ModalComponent.propTypes = {
     fullScreen: PropTypes.bool,
     headerClassName: PropTypes.string,
     headerImage: PropTypes.string,
+    onHelp: PropTypes.func,
     onRequestClose: PropTypes.func
 };
 
diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx
index 1de665e33422b5372322ec02018912b18fd8da29..cd3d4ff5383e60427b86bd11cf4137b93b6b5ee9 100644
--- a/src/containers/blocks.jsx
+++ b/src/containers/blocks.jsx
@@ -94,7 +94,11 @@ class Blocks extends React.Component {
         addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange);
 
         this.attachVM();
-        this.setLocale();
+        // Only update blocks/vm locale when visible to avoid sizing issues
+        // If locale changes while not visible it will get handled in didUpdate
+        if (this.props.isVisible) {
+            this.setLocale();
+        }
 
         analytics.pageview('/editors/blocks');
     }
@@ -117,10 +121,6 @@ class Blocks extends React.Component {
             this.ScratchBlocks.hideChaff();
         }
 
-        if (prevProps.locale !== this.props.locale) {
-            this.setLocale();
-        }
-
         if (prevProps.toolboxXML !== this.props.toolboxXML) {
             // rather than update the toolbox "sync" -- update it in the next frame
             clearTimeout(this.toolboxUpdateTimeout);
@@ -139,9 +139,15 @@ class Blocks extends React.Component {
         // @todo hack to reload the workspace due to gui bug #413
         if (this.props.isVisible) { // Scripts tab
             this.workspace.setVisible(true);
-            this.props.vm.refreshWorkspace();
-            // Re-enable toolbox refreshes without causing one. See #updateToolbox for more info.
-            this.workspace.toolboxRefreshEnabled_ = true;
+            if (prevProps.locale !== this.props.locale || this.props.locale !== this.props.vm.getLocale()) {
+                // call setLocale if the locale has changed, or changed while the blocks were hidden.
+                // vm.getLocale() will be out of sync if locale was changed while not visible
+                this.setLocale();
+            } else {
+                this.props.vm.refreshWorkspace();
+                this.updateToolbox();
+            }
+
             window.dispatchEvent(new Event('resize'));
         } else {
             this.workspace.setVisible(false);
@@ -158,8 +164,8 @@ class Blocks extends React.Component {
         this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);
         this.props.vm.setLocale(this.props.locale, this.props.messages)
             .then(() => {
-                this.workspace.updateToolbox(this.props.toolboxXML);
                 this.props.vm.refreshWorkspace();
+                this.updateToolbox();
                 this.workspace.getFlyout().setRecyclingEnabled(true);
             });
     }
@@ -355,7 +361,9 @@ class Blocks extends React.Component {
                 extensionId: extensionId,
                 deviceImage: extension.deviceImage,
                 smallDeviceImage: extension.smallDeviceImage,
-                name: extension.name
+                name: extension.name,
+                connectingMessage: extension.connectingMessage,
+                helpLink: extension.helpLink
             }});
         }
     }
@@ -419,8 +427,10 @@ class Blocks extends React.Component {
                 ) : null}
                 {this.state.connectionModal ? (
                     <ConnectionModal
+                        connectingMessage={this.state.connectionModal.connectingMessage}
                         deviceImage={this.state.connectionModal.deviceImage}
                         extensionId={this.state.connectionModal.extensionId}
+                        helpLink={this.state.connectionModal.helpLink}
                         name={this.state.connectionModal.name}
                         smallDeviceImage={this.state.connectionModal.smallDeviceImage}
                         vm={vm}
diff --git a/src/containers/connection-modal.jsx b/src/containers/connection-modal.jsx
index 3b1a68b3adc72942123b1275b18484fa12623067..50862fbd2b31e6e830f756484fcd47e0fcbac0e8 100644
--- a/src/containers/connection-modal.jsx
+++ b/src/containers/connection-modal.jsx
@@ -12,7 +12,8 @@ class ConnectionModal extends React.Component {
             'handleConnected',
             'handleConnecting',
             'handleDisconnect',
-            'handleError'
+            'handleError',
+            'handleHelp'
         ]);
         this.state = {
             phase: PHASES.scanning
@@ -76,11 +77,12 @@ class ConnectionModal extends React.Component {
         });
     }
     handleHelp () {
-        // @todo: implement the help button
+        window.open(this.props.helpLink, '_blank');
     }
     render () {
         return (
             <ConnectionModalComponent
+                connectingMessage={this.props.connectingMessage}
                 deviceImage={this.props.deviceImage}
                 extensionId={this.props.extensionId}
                 name={this.props.name}
@@ -100,8 +102,10 @@ class ConnectionModal extends React.Component {
 }
 
 ConnectionModal.propTypes = {
+    connectingMessage: PropTypes.node.isRequired,
     deviceImage: PropTypes.string.isRequired,
     extensionId: PropTypes.string.isRequired,
+    helpLink: PropTypes.string.isRequired,
     name: PropTypes.node.isRequired,
     onCancel: PropTypes.func.isRequired,
     onStatusButtonUpdate: PropTypes.func.isRequired,
diff --git a/src/containers/project-loader.jsx b/src/containers/project-loader.jsx
index 7f178b6232416aca90e22d35c36c56af7c53ba92..507b716523796e14fb9b73fbb93cca44df2785f8 100644
--- a/src/containers/project-loader.jsx
+++ b/src/containers/project-loader.jsx
@@ -2,8 +2,10 @@ import bindAll from 'lodash.bindall';
 import PropTypes from 'prop-types';
 import React from 'react';
 import {connect} from 'react-redux';
+import {defineMessages, injectIntl, intlShape} from 'react-intl';
 
 import analytics from '../lib/analytics';
+import log from '../lib/log';
 
 import {
     openLoadingProject,
@@ -26,6 +28,15 @@ import {
  *     </MyCoolComponent>
  * )}</ProjectLoader>
  */
+
+const messages = defineMessages({
+    loadError: {
+        id: 'gui.projectLoader.loadError',
+        defaultMessage: 'The project file that was selected failed to load.',
+        description: 'An error that displays when a local project file fails to load.'
+    }
+});
+
 class ProjectLoader extends React.Component {
     constructor (props) {
         super(props);
@@ -35,10 +46,6 @@ class ProjectLoader extends React.Component {
             'handleChange',
             'handleClick'
         ]);
-        this.state = {
-            loadingError: false,
-            errorMessage: ''
-        };
     }
     handleChange (e) {
         // Remove the hash if any (without triggering a hash change event or a reload)
@@ -58,7 +65,12 @@ class ProjectLoader extends React.Component {
                 thisFileInput.value = null;
             })
             .catch(error => {
-                this.setState({loadingError: true, errorMessage: error});
+                log.warn(error);
+                alert(this.props.intl.formatMessage(messages.loadError)); // eslint-disable-line no-alert
+                this.props.closeLoadingState();
+                // Reset the file input after project is loaded
+                // This is necessary in case the user wants to reload a project
+                thisFileInput.value = null;
             });
         if (thisFileInput.files) { // Don't attempt to load if no file was selected
             this.props.openLoadingState();
@@ -83,10 +95,6 @@ class ProjectLoader extends React.Component {
         );
     }
     render () {
-        if (this.state.loadingError) {
-            throw new Error(
-                `Failed to load project from file: ${this.state.errorMessage}`);
-        }
         const {
             /* eslint-disable no-unused-vars */
             children,
@@ -103,6 +111,7 @@ class ProjectLoader extends React.Component {
 ProjectLoader.propTypes = {
     children: PropTypes.func,
     closeLoadingState: PropTypes.func,
+    intl: intlShape.isRequired,
     openLoadingState: PropTypes.func,
     vm: PropTypes.shape({
         loadProject: PropTypes.func
@@ -121,4 +130,4 @@ const mapDispatchToProps = dispatch => ({
 export default connect(
     mapStateToProps,
     mapDispatchToProps
-)(ProjectLoader);
+)(injectIntl(ProjectLoader));
diff --git a/src/containers/scanning-step.jsx b/src/containers/scanning-step.jsx
index ecc19318913845154c248f716dfad6d440147c2e..07595d5266d937c577f2e44634995b7849e3e5fb 100644
--- a/src/containers/scanning-step.jsx
+++ b/src/containers/scanning-step.jsx
@@ -32,7 +32,10 @@ class ScanningStep extends React.Component {
             'PERIPHERAL_SCAN_TIMEOUT', this.handlePeripheralScanTimeout);
     }
     handlePeripheralScanTimeout () {
-        this.setState({scanning: false});
+        this.setState({
+            scanning: false,
+            deviceList: []
+        });
     }
     handlePeripheralListUpdate (newList) {
         // TODO: sort peripherals by signal strength? so they don't jump around
@@ -53,6 +56,7 @@ class ScanningStep extends React.Component {
             <ScanningStepComponent
                 deviceList={this.state.deviceList}
                 phase={this.state.phase}
+                scanning={this.state.scanning}
                 smallDeviceImage={this.props.smallDeviceImage}
                 title={this.props.extensionId}
                 onConnected={this.props.onConnected}
diff --git a/src/containers/tips-library.jsx b/src/containers/tips-library.jsx
index ebbee3f3022175f797e021e1e0253a0821f5258c..009c8c2fae9f3c9e0f3fd9f0cd3bcac04ca44acc 100644
--- a/src/containers/tips-library.jsx
+++ b/src/containers/tips-library.jsx
@@ -54,6 +54,7 @@ class TipsLibrary extends React.PureComponent {
             <LibraryComponent
                 data={decksLibraryThumbnailData}
                 filterable={false}
+                id="tipsLibrary"
                 title={this.props.intl.formatMessage(messages.tipsLibraryTitle)}
                 visible={this.props.visible}
                 onItemSelected={this.handleItemSelect}
diff --git a/src/lib/assets/icon--help.svg b/src/lib/assets/icon--help.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2938e8340ebb54dd699f80eaf48794bd383a96a4
Binary files /dev/null and b/src/lib/assets/icon--help.svg differ
diff --git a/src/lib/libraries/backdrops.json b/src/lib/libraries/backdrops.json
index 14f82655b643c8d84de25d60d768a9115d7b1c62..91e9b1cf4897ce78d19281ae1bdc64cc03525d71 100644
--- a/src/lib/libraries/backdrops.json
+++ b/src/lib/libraries/backdrops.json
@@ -442,7 +442,7 @@
         ]
     },
     {
-        "name": "Jurrasic",
+        "name": "Jurassic",
         "md5": "64025bdca5db4938f65597e3682fddcf.svg",
         "type": "backdrop",
         "tags": [
diff --git a/src/lib/libraries/costumes.json b/src/lib/libraries/costumes.json
index 88cd587e7ae30e8f7846f57759ffb92e7d6a9f0d..e58f907c3217d1b550898654bec691d7127daea8 100644
--- a/src/lib/libraries/costumes.json
+++ b/src/lib/libraries/costumes.json
@@ -73,6 +73,82 @@
             2
         ]
     },
+    {
+        "name": "Andie-a",
+        "md5": "936abdaaac3a3f7d27e5f30b3da00e5f.svg",
+        "type": "costume",
+        "tags": [
+            "sports",
+            "basketball",
+            "people",
+            "wheelchair",
+            "handicap",
+            "handicapable",
+            "alex eben meyer"
+        ],
+        "info": [
+            86,
+            77,
+            1
+        ]
+    },
+    {
+        "name": "Andie-b",
+        "md5": "cc2953492b40e231fdee3d8c9994a646.svg",
+        "type": "costume",
+        "tags": [
+            "sports",
+            "basketball",
+            "people",
+            "wheelchair",
+            "handicap",
+            "handicapable",
+            "alex eben meyer"
+        ],
+        "info": [
+            46,
+            77,
+            1
+        ]
+    },
+    {
+        "name": "Andie-c",
+        "md5": "76e26ccb79a94d3e89f67e64b4cb9731.svg",
+        "type": "costume",
+        "tags": [
+            "sports",
+            "basketball",
+            "people",
+            "wheelchair",
+            "handicap",
+            "handicapable",
+            "alex eben meyer"
+        ],
+        "info": [
+            52,
+            36,
+            1
+        ]
+    },
+    {
+        "name": "Andie-d",
+        "md5": "80fa011244f3e3be56b96ebcb9e40d59.svg",
+        "type": "costume",
+        "tags": [
+            "sports",
+            "basketball",
+            "people",
+            "wheelchair",
+            "handicap",
+            "handicapable",
+            "alex eben meyer"
+        ],
+        "info": [
+            86,
+            43,
+            1
+        ]
+    },
     {
         "name": "Anina Pop Down",
         "md5": "e3698b76cb0864df2fbaba80e6bd8067.png",
@@ -659,7 +735,7 @@
     },
     {
         "name": "Bat-a",
-        "md5": "a68f7a0b2af7514c729bb083d04dbbde.svg",
+        "md5": "3b6274510488d5b26447c1c266475801.svg",
         "type": "costume",
         "tags": [
             "fantasy",
@@ -670,14 +746,14 @@
             "alex eben meyer"
         ],
         "info": [
-            51,
-            47,
+            65,
+            61,
             1
         ]
     },
     {
         "name": "Bat-b",
-        "md5": "4ea5bb61370e189d2eba763312680201.svg",
+        "md5": "8b20987d450379a445cbfc41ff2a3874.svg",
         "type": "costume",
         "tags": [
             "fantasy",
@@ -688,14 +764,14 @@
             "alex eben meyer"
         ],
         "info": [
-            51,
-            47,
+            65,
+            61,
             1
         ]
     },
     {
         "name": "Bat-c",
-        "md5": "9ed4deead22db511202f38abadf508c4.svg",
+        "md5": "c6d6a6892638e489902fbba803050de1.svg",
         "type": "costume",
         "tags": [
             "fantasy",
@@ -706,14 +782,14 @@
             "alex eben meyer"
         ],
         "info": [
-            51,
-            47,
+            65,
+            61,
             1
         ]
     },
     {
         "name": "Bat-d",
-        "md5": "293a7b03badd2f3b49e50acfb9c242ec.svg",
+        "md5": "e3da64838b2c74b6dd9a080b030e327e.svg",
         "type": "costume",
         "tags": [
             "fantasy",
@@ -724,8 +800,8 @@
             "alex eben meyer"
         ],
         "info": [
-            51,
-            47,
+            65,
+            61,
             1
         ]
     },
@@ -1698,26 +1774,23 @@
         ]
     },
     {
-        "name": "Cat1",
-        "md5": "09dc888b0b7df19f70d81588ae73420e.svg",
+        "name": "Cat 2",
+        "md5": "01ae57fd339529445cb890978ef8a054.svg",
         "type": "costume",
         "tags": [
-            "animals",
-            "cat",
-            "kitten",
             "kitty",
-            "mammal",
-            "orange",
-            "scratch cat"
+            "kitten",
+            "animals",
+            "mammal"
         ],
         "info": [
-            47,
-            55,
+            87,
+            39,
             1
         ]
     },
     {
-        "name": "Cat1 Flying-a",
+        "name": "Cat Flying-a",
         "md5": "1e81725d2d2c7de4a2dd4a145198a43c.svg",
         "type": "costume",
         "tags": [
@@ -1733,7 +1806,7 @@
         ]
     },
     {
-        "name": "Cat1 Flying-b",
+        "name": "Cat Flying-b",
         "md5": "0d192725870ef0eda50d91cab0e3c9c5.svg",
         "type": "costume",
         "tags": [
@@ -1750,7 +1823,26 @@
         ]
     },
     {
-        "name": "Cat2",
+        "name": "Cat-a",
+        "md5": "09dc888b0b7df19f70d81588ae73420e.svg",
+        "type": "costume",
+        "tags": [
+            "animals",
+            "cat",
+            "kitten",
+            "kitty",
+            "mammal",
+            "orange",
+            "scratch cat"
+        ],
+        "info": [
+            47,
+            55,
+            1
+        ]
+    },
+    {
+        "name": "Cat-b",
         "md5": "3696356a03a8d938318876a593572843.svg",
         "type": "costume",
         "tags": [
@@ -2839,16 +2931,16 @@
     },
     {
         "name": "Dm Stance",
-        "md5": "b30a60d31aebead577b73affd22bf30f.svg",
+        "md5": "09dc9d82f097edfc6b2b6e4b5009c5f6.png",
         "type": "costume",
         "tags": [
             "people",
             "dance"
         ],
         "info": [
-            55,
-            119,
-            1
+            212,
+            476,
+            2
         ]
     },
     {
@@ -2867,7 +2959,7 @@
     },
     {
         "name": "Dm Top R Leg",
-        "md5": "6cea0c29c460e571226cc4cff5b97c28.png",
+        "md5": "12db59633a1709a2c39534d35263791f.png",
         "type": "costume",
         "tags": [
             "people",
@@ -2892,7 +2984,7 @@
     },
     {
         "name": "Dm Top Stand",
-        "md5": "051c36758b9fd1136b511efc5dd6234a.png",
+        "md5": "a22da98e5e63de7b2883355afd0184f0.png",
         "type": "costume",
         "tags": [
             "people",
@@ -5254,7 +5346,7 @@
         ]
     },
     {
-        "name": "Jamie-a",
+        "name": "Jamal-a",
         "md5": "90f9166fe6500d0c0caad8b1964d6b74.svg",
         "type": "costume",
         "tags": [
@@ -5270,7 +5362,7 @@
         ]
     },
     {
-        "name": "Jamie-b",
+        "name": "Jamal-b",
         "md5": "c3d96ef7e99440c2fa76effce1235d3f.svg",
         "type": "costume",
         "tags": [
@@ -5286,7 +5378,7 @@
         ]
     },
     {
-        "name": "Jamie-c",
+        "name": "Jamal-c",
         "md5": "1fb8b9ca79f2c0a327913bd647b53fe5.svg",
         "type": "costume",
         "tags": [
@@ -5302,7 +5394,7 @@
         ]
     },
     {
-        "name": "Jamie-d",
+        "name": "Jamal-d",
         "md5": "4adb87e6123161fcaf02f7ac022a5757.svg",
         "type": "costume",
         "tags": [
@@ -8941,34 +9033,33 @@
         ]
     },
     {
-        "name": "Taco-a",
-        "md5": "d4a2cea411c6030f017f25184562559d.svg",
+        "name": "Taco",
+        "md5": "bc78fb90ed373d56c11d5fafa4203ccd.svg",
         "type": "costume",
         "tags": [
             "food",
-            "waffle",
-            "yum",
-            "delicious"
+            "designerd"
         ],
         "info": [
-            19,
-            15,
+            78,
+            48,
             1
         ]
     },
     {
-        "name": "Taco-b",
-        "md5": "cef6f6d7c92fc1f008077319ac12dc5e.svg",
+        "name": "Taco-wizard",
+        "md5": "5e9e65db20d403b590578ed44b1a3792.svg",
         "type": "costume",
         "tags": [
             "food",
-            "waffle",
-            "yum",
-            "delicious"
+            "fantasy",
+            "abrakadabra",
+            "alakazam",
+            "designerd"
         ],
         "info": [
-            56,
-            15,
+            125,
+            82,
             1
         ]
     },
diff --git a/src/lib/libraries/decks/animate/lib_animate-a-name.jpg b/src/lib/libraries/decks/animate/lib_animate-a-name.jpg
index 139f3f98662f6404daa77d45c162779e2f6a5fad..391eb8971e84e8bb6bf9ff4386d644d59c9fe62b 100644
Binary files a/src/lib/libraries/decks/animate/lib_animate-a-name.jpg and b/src/lib/libraries/decks/animate/lib_animate-a-name.jpg differ
diff --git a/src/lib/libraries/decks/chase-game/lib-chasegame.jpg b/src/lib/libraries/decks/chase-game/lib-chasegame.jpg
index ec9861467d7d1ab4c1b6a3c8ce26275a47299fa4..6e74c21287268cc7670a037df0099da57a77ac78 100644
Binary files a/src/lib/libraries/decks/chase-game/lib-chasegame.jpg and b/src/lib/libraries/decks/chase-game/lib-chasegame.jpg differ
diff --git a/src/lib/libraries/decks/game/lib-pop.jpg b/src/lib/libraries/decks/game/lib-pop.jpg
index 4392196fe46382e077e323c082f1c4762cd8c4d3..dfe78f637783619f329a01c3a75ac2d7c4c3c38b 100644
Binary files a/src/lib/libraries/decks/game/lib-pop.jpg and b/src/lib/libraries/decks/game/lib-pop.jpg differ
diff --git a/src/lib/libraries/decks/index.jsx b/src/lib/libraries/decks/index.jsx
index 941ec9c8ff144eca61ade3749e8062d5d7faa7df..290acaca4b6358a22d22e9d9199f3ebba8768e1a 100644
--- a/src/lib/libraries/decks/index.jsx
+++ b/src/lib/libraries/decks/index.jsx
@@ -42,6 +42,10 @@ import stepScoreWhenTouch from './chase-game/chase-game-change-score.gif';
 
 // Make-A-Game
 import libraryMakeAGame from './game/lib-pop.jpg';
+import stepGamePickSprite from './game/game-pick-sprite.gif';
+import stepGamePlaySound from './game/game-play-sound.gif';
+import stepGameAddScore from './game/game-add-score.gif';
+import stepGameChangeScore from './game/game-change-score.gif';
 import stepRandom from './game/game-random-position.gif';
 import stepGameChangeColor from './game/game-change-color.gif';
 import stepResetScore from './game/game-reset-score.gif';
@@ -70,7 +74,7 @@ export default {
 
         img: libraryIntro,
         steps: [{
-            video: 'https://www.youtube.com/embed/4CexmCCREZw'
+            video: 'https://www.youtube.com/embed/h9x8IPGN3SI'
         }, {
             title: (
                 <FormattedMessage
@@ -108,7 +112,7 @@ export default {
         ),
         img: libraryAnimate,
         steps: [{
-            video: 'https://www.youtube.com/embed/q3nnXj6wr5k'
+            video: 'https://www.youtube.com/embed/RUih6RnEdPg'
         }, {
             title: (
                 <FormattedMessage
@@ -182,7 +186,7 @@ export default {
         ),
         img: libraryMakeMusic,
         steps: [{
-            video: 'https://www.youtube.com/embed/o3ih7d_4uv0'
+            video: 'https://www.youtube.com/embed/UQHHAQGuhl8'
         },
         {
             title: (
@@ -250,14 +254,51 @@ export default {
         ),
         img: libraryMakeAGame,
         steps: [{
-            video: 'https://www.youtube.com/embed/XIz32K91vAk'
+            video: 'https://www.youtube.com/embed/3G2miGV4TbQ'
         },
         {
+            title: (
+                <FormattedMessage
+                    defaultMessage="Pick A Sprite"
+                    description="Step name for 'Pick A Sprite' step"
+                    id="gui.howtos.Make-A-Game.step_GamePickSprite"
+                />
+            ),
+            image: stepGamePickSprite
+        }, {
+            title: (
+                <FormattedMessage
+                    defaultMessage="Play Sound When Clicked"
+                    description="Play Sound When Clicked' step"
+                    id="gui.howtos.make-a-game.step_GamePlaySound"
+                />
+            ),
+            image: stepGamePlaySound
+        }, {
+            title: (
+                <FormattedMessage
+                    defaultMessage="Create Score Variable"
+                    description="Step name for 'Create Score Variable' step"
+                    id="gui.howtos.make-a-game.step_GameAddScore"
+                />
+            ),
+            image: stepGameAddScore
+        }, {
+            title: (
+                <FormattedMessage
+                    defaultMessage="When Clicked Increase Score"
+                    description="Step name for 'When Clicked Increase Score' step"
+                    id="gui.howtos.make-a-game.step_GameChangeScore"
+                />
+            ),
+
+            image: stepGameChangeScore
+        }, {
             title: (
                 <FormattedMessage
                     defaultMessage="Go to a random position"
                     description="Step name for 'Go to a random position' step"
-                    id="gui.howtos.Make-A-Game.step_RandomPosition"
+                    id="gui.howtos.make-a-game.step_Random"
                 />
             ),
             image: stepRandom
@@ -266,7 +307,7 @@ export default {
                 <FormattedMessage
                     defaultMessage="Change Color"
                     description="Step name for 'Change Color' step"
-                    id="gui.howtos.make-a-game.step_ChangeColor"
+                    id="gui.howtos.make-music.step_GameChangeColor"
                 />
             ),
             image: stepGameChangeColor
@@ -282,8 +323,8 @@ export default {
         }, {
             deckIds: [
                 'add-a-backdrop',
-                'add-effects',
-                'move-around-with-arrow-keys'
+                'move-around-with-arrow-keys',
+                'add-effects'
             ]
         }
         ]
@@ -299,7 +340,7 @@ export default {
         ),
         img: libraryChaseGame,
         steps: [{
-            video: 'https://www.youtube.com/embed/PoQO35QmlVA'
+            video: 'https://www.youtube.com/embed/IRf9-P8PiZo'
         },
         {
             title: (
@@ -430,12 +471,12 @@ export default {
         ),
         img: addBackdropThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/WpV05Q7AbPU'
+            video: 'https://www.youtube.com/embed/Xv3Z80yy2l0'
         }, {
             deckIds: [
-                'add-a-backdrop',
+                'change-size',
                 'switch-costume',
-                'change-size'
+                'spin-video'
             ]
         }]
     },
@@ -449,12 +490,12 @@ export default {
         ),
         img: changeSizeThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/NiK9KcghZ9s'
+            video: 'https://www.youtube.com/embed/PJijGbhcT3E'
         }, {
             deckIds: [
-                'add-a-backdrop',
-                'switch-costume',
-                'change-size'
+                'glide-around',
+                'spin-video',
+                'switch-costume'
             ]
         }]
     },
@@ -468,7 +509,7 @@ export default {
         ),
         img: glideAroundThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/WUcmsMEIbGg'
+            video: 'https://www.youtube.com/embed/KYmbgLX1xDs'
         }, {
             deckIds: [
                 'add-a-backdrop',
@@ -488,7 +529,7 @@ export default {
         ),
         img: recordASound,
         steps: [{
-            video: 'https://www.youtube.com/embed/epZQpVdf884'
+            video: 'https://www.youtube.com/embed/1WaU6e70Zig'
         }, {
             deckIds: [
                 'Make-Music',
@@ -502,7 +543,7 @@ export default {
         name: 'Make It Spin',
         img: spinThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/rHP3aojB_6w'
+            video: 'https://www.youtube.com/embed/C76V5cuI9XM'
         }, {
             deckIds: [
                 'add-a-backdrop',
@@ -521,7 +562,7 @@ export default {
         ),
         img: hideAndShowThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/jpvqnlfsDTU'
+            video: 'https://www.youtube.com/embed/6yWUvRU19ms'
         }, {
             deckIds: [
                 'add-a-backdrop',
@@ -541,7 +582,7 @@ export default {
         ),
         img: switchCostumeThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/AUBoFxQDPWA'
+            video: 'https://www.youtube.com/embed/vppgw1Xiegw'
         }, {
             deckIds: [
                 'add-a-backdrop',
@@ -555,7 +596,7 @@ export default {
         name: 'Use Arrow Keys',
         img: moveArrowKeysThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/7DUA_Yl0B_M'
+            video: 'https://www.youtube.com/embed/uf6agkKnXJw'
         }, {
             deckIds: [
                 'add-a-backdrop',
@@ -574,7 +615,7 @@ export default {
         ),
         img: addEffectsThumb,
         steps: [{
-            video: 'https://www.youtube.com/embed/ORuohhkx15g'
+            video: 'https://www.youtube.com/embed/w3kGWEzRtxY'
         }, {
             deckIds: [
                 'add-a-backdrop',
diff --git a/src/lib/libraries/decks/intro/lib-getting-started.jpg b/src/lib/libraries/decks/intro/lib-getting-started.jpg
index fd081dbd36ffc5e098211d8dcc9d0ce9f71e9a32..553e881d9a3bdd035dfa5063cdf7cdd2af9910f5 100644
Binary files a/src/lib/libraries/decks/intro/lib-getting-started.jpg and b/src/lib/libraries/decks/intro/lib-getting-started.jpg differ
diff --git a/src/lib/libraries/decks/make-music/lib-make-music.jpg b/src/lib/libraries/decks/make-music/lib-make-music.jpg
index 7fbde54be655be317eb6812c96a04bf74cff10ad..a00248320ac137cac71092d5c4ed2fc17d142ab3 100644
Binary files a/src/lib/libraries/decks/make-music/lib-make-music.jpg and b/src/lib/libraries/decks/make-music/lib-make-music.jpg differ
diff --git a/src/lib/libraries/decks/spin/change-color.gif b/src/lib/libraries/decks/spin/change-color.gif
deleted file mode 100644
index dca51dad4e1c4b8de89436c025ce38d0f03c45c4..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/change-color.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/click-control.gif b/src/lib/libraries/decks/spin/click-control.gif
deleted file mode 100644
index 24128a0edd07854a4415e0c467d273558b70afa5..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/click-control.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/click-forever.gif b/src/lib/libraries/decks/spin/click-forever.gif
deleted file mode 100644
index f9d465bc093cb70428ad09e1db37ba2b78057977..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/click-forever.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/click-turn.gif b/src/lib/libraries/decks/spin/click-turn.gif
deleted file mode 100644
index af887244849f335a7b29b0abbcac2b96f2db0ef9..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/click-turn.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/drag-forever.gif b/src/lib/libraries/decks/spin/drag-forever.gif
deleted file mode 100644
index a51d6b4385d2d4d45d6bc15aca2913f0c4f9b6bc..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/drag-forever.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/drag-turn.gif b/src/lib/libraries/decks/spin/drag-turn.gif
deleted file mode 100644
index 8df663eaf9316622017ee86a8d100750e97670f4..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/drag-turn.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/library-spin.gif b/src/lib/libraries/decks/spin/library-spin.gif
deleted file mode 100644
index 12e60ecf79b543f77a9840fa687a903d69c3db32..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/library-spin.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/spin/thumb-spin.gif b/src/lib/libraries/decks/spin/thumb-spin.gif
deleted file mode 100644
index e151455be735a0a8a65af10a2c85691ff66790f1..0000000000000000000000000000000000000000
Binary files a/src/lib/libraries/decks/spin/thumb-spin.gif and /dev/null differ
diff --git a/src/lib/libraries/decks/sprite/cover-add-sprite.jpg b/src/lib/libraries/decks/sprite/cover-add-sprite.jpg
index c0a0359e0c4e7918ab5c11126667bf9cf6181d00..e7a13449072b9a9c61e6868799032b06b5242169 100644
Binary files a/src/lib/libraries/decks/sprite/cover-add-sprite.jpg and b/src/lib/libraries/decks/sprite/cover-add-sprite.jpg differ
diff --git a/src/lib/libraries/decks/videos/add-backdrop.jpg b/src/lib/libraries/decks/videos/add-backdrop.jpg
index ec5062c82d92cee30fcb42256fcf3619aaf4e0bc..f046afb70cca9a66707b74171cec2473ab9030e6 100644
Binary files a/src/lib/libraries/decks/videos/add-backdrop.jpg and b/src/lib/libraries/decks/videos/add-backdrop.jpg differ
diff --git a/src/lib/libraries/decks/videos/add-effects.jpg b/src/lib/libraries/decks/videos/add-effects.jpg
index 2f266057c6f122b455d49aec35b619820cc7c63d..bb773b2ea6d926c8ac53678ca5df0e709f0f963d 100644
Binary files a/src/lib/libraries/decks/videos/add-effects.jpg and b/src/lib/libraries/decks/videos/add-effects.jpg differ
diff --git a/src/lib/libraries/decks/videos/animate-sprite.jpg b/src/lib/libraries/decks/videos/animate-sprite.jpg
index e6eb10d67018f2dafa471766c56096130d77b92b..b67c47bbb0f7014dc47d809df376508b3d8eb80e 100644
Binary files a/src/lib/libraries/decks/videos/animate-sprite.jpg and b/src/lib/libraries/decks/videos/animate-sprite.jpg differ
diff --git a/src/lib/libraries/decks/videos/change-size.jpg b/src/lib/libraries/decks/videos/change-size.jpg
index 6f391b78f0e03784d2ca0238a48948a87b053cd3..e496a7d81fe4ccca1d49578d0a361a89005783d0 100644
Binary files a/src/lib/libraries/decks/videos/change-size.jpg and b/src/lib/libraries/decks/videos/change-size.jpg differ
diff --git a/src/lib/libraries/decks/videos/glide-around.jpg b/src/lib/libraries/decks/videos/glide-around.jpg
index ee006c3bef02cf0296eec4e9779be06507a3924a..b9e140c452e45ea01f81bf89fe0854c6579ea54c 100644
Binary files a/src/lib/libraries/decks/videos/glide-around.jpg and b/src/lib/libraries/decks/videos/glide-around.jpg differ
diff --git a/src/lib/libraries/decks/videos/hide-and-show.jpg b/src/lib/libraries/decks/videos/hide-and-show.jpg
index a5e561c61ae84a1ad25968bd3653f6d7948b345e..564d6b958d2579a07c87915470a7ad438ef268b6 100644
Binary files a/src/lib/libraries/decks/videos/hide-and-show.jpg and b/src/lib/libraries/decks/videos/hide-and-show.jpg differ
diff --git a/src/lib/libraries/decks/videos/move-arrow-keys.jpg b/src/lib/libraries/decks/videos/move-arrow-keys.jpg
index ada61ee67adee18fcfff0fb8484fa00dfa332449..6524b5d6c7416cdf9d6e91041cb4c49987d38bc6 100644
Binary files a/src/lib/libraries/decks/videos/move-arrow-keys.jpg and b/src/lib/libraries/decks/videos/move-arrow-keys.jpg differ
diff --git a/src/lib/libraries/decks/videos/record-a-sound.jpg b/src/lib/libraries/decks/videos/record-a-sound.jpg
index afc27c0ce8f8a6d07c7d689daf0554957bf8f0d9..355ff325b4aeda571281e99ff43231d91efab2be 100644
Binary files a/src/lib/libraries/decks/videos/record-a-sound.jpg and b/src/lib/libraries/decks/videos/record-a-sound.jpg differ
diff --git a/src/lib/libraries/decks/videos/spin.jpg b/src/lib/libraries/decks/videos/spin.jpg
index c9c541fc5338103a6e209e63bb2b44f2ae932623..8c7004f39202252f384b452def63595258dcdd0c 100644
Binary files a/src/lib/libraries/decks/videos/spin.jpg and b/src/lib/libraries/decks/videos/spin.jpg differ
diff --git a/src/lib/libraries/extensions/index.jsx b/src/lib/libraries/extensions/index.jsx
index dfe1416464f6c3a063b68b4a9ee55fbbb39cf65f..316980efe165795e21614439d23e32c29a4679c8 100644
--- a/src/lib/libraries/extensions/index.jsx
+++ b/src/lib/libraries/extensions/index.jsx
@@ -4,18 +4,15 @@ import {FormattedMessage} from 'react-intl';
 import musicImage from './music.png';
 import penImage from './pen.png';
 import videoImage from './video-sensing.png';
-import speechImage from './speech.png';
+import translateImage from './translate.png';
 import microbitImage from './microbit.png';
-import wedoImage from './wedo.png';
 import ev3Image from './ev3.png';
-import boostImage from './boost.png';
-import translateImage from './translate.png';
-
-import ev3DeviceImage from './device-connection/ev3/ev3-hub-illustration.svg';
-import ev3MenuImage from './device-connection/ev3/ev3-small.svg';
+import wedoImage from './wedo.png';
 
 import microbitDeviceImage from './device-connection/microbit/microbit-illustration.svg';
 import microbitMenuImage from './device-connection/microbit/microbit-small.svg';
+import ev3DeviceImage from './device-connection/ev3/ev3-hub-illustration.svg';
+import ev3MenuImage from './device-connection/ev3/ev3-small.svg';
 
 export default [
     {
@@ -59,37 +56,18 @@ export default [
     {
         name: (
             <FormattedMessage
-                defaultMessage="Google Translate"
-                description="Name for the 'Google Translate' extension"
-                id="gui.extension.googletranslate.name"
-            />
-        ),
-        extensionId: 'translate',
-        iconURL: translateImage,
-        description: (
-            <FormattedMessage
-                defaultMessage="Translate text into many languages."
-                description="Description for the 'Google Translate' extension. Do not translate 'Google'"
-                id="gui.extension.googletranslate.description"
-            />
-        ),
-        featured: true
-    },
-    {
-        name: (
-            <FormattedMessage
-                defaultMessage="Video Motion"
-                description="Name for the 'Video Motion' extension"
-                id="gui.extension.videomotion.name"
+                defaultMessage="Video Sensing"
+                description="Name for the 'Video Sensing' extension"
+                id="gui.extension.videosensing.name"
             />
         ),
         extensionId: 'videoSensing',
         iconURL: videoImage,
         description: (
             <FormattedMessage
-                defaultMessage="Detect motion with the camera."
-                description="Description for the 'Video Motion' extension"
-                id="gui.extension.videomotion.description"
+                defaultMessage="Sense motion with the camera."
+                description="Description for the 'Video Sensing' extension"
+                id="gui.extension.videosensing.description"
             />
         ),
         featured: true
@@ -97,22 +75,21 @@ export default [
     {
         name: (
             <FormattedMessage
-                defaultMessage="Speech Recognition"
-                description="Name for the 'Speech Recognition' extension"
-                id="gui.extension.speechrecognition.name"
+                defaultMessage="Google Translate"
+                description="Name for the 'Google Translate' extension. Do not translate 'Google'."
+                id="gui.extension.googletranslate.name"
             />
         ),
-        extensionId: 'speech',
-        iconURL: speechImage,
+        extensionId: 'translate',
+        iconURL: translateImage,
         description: (
             <FormattedMessage
-                defaultMessage="Talk to your projects."
-                description="Description for the 'Speech Recognition' extension"
-                id="gui.extension.speechrecognition.description"
+                defaultMessage="Translate text into many languages."
+                description="Description for the 'Google Translate' extension"
+                id="gui.extension.googletranslate.description"
             />
         ),
-        featured: true,
-        disabled: true
+        featured: true
     },
     {
         name: 'micro:bit',
@@ -126,24 +103,18 @@ export default [
             />
         ),
         featured: true,
-        disabled: true,
+        disabled: false,
         launchDeviceConnectionFlow: true,
         deviceImage: microbitDeviceImage,
-        smallDeviceImage: microbitMenuImage
-    },
-    {
-        name: 'LEGO WeDo 2.0',
-        extensionId: 'wedo2',
-        iconURL: wedoImage,
-        description: (
+        smallDeviceImage: microbitMenuImage,
+        connectingMessage: (
             <FormattedMessage
-                defaultMessage="Build with motors and sensors."
-                description="Description for the 'LEGO WeDo 2.0' extension"
-                id="gui.extension.wedo2.description"
+                defaultMessage="Connecting"
+                description="Message to help people connect to their micro:bit."
+                id="gui.extension.microbit.connectingMessage"
             />
         ),
-        featured: true,
-        disabled: true
+        helpLink: 'https://scratch.mit.edu/microbit'
     },
     {
         name: 'LEGO MINDSTORMS EV3',
@@ -157,20 +128,28 @@ export default [
             />
         ),
         featured: true,
-        disabled: true,
+        disabled: false,
         launchDeviceConnectionFlow: true,
         deviceImage: ev3DeviceImage,
-        smallDeviceImage: ev3MenuImage
+        smallDeviceImage: ev3MenuImage,
+        connectingMessage: (
+            <FormattedMessage
+                defaultMessage="Connecting. Make sure the pin on your EV3 is set to 1234."
+                description="Message to help people connect to their EV3. Must note the PIN should be 1234."
+                id="gui.extension.ev3.connectingMessage"
+            />
+        ),
+        helpLink: 'https://scratch.mit.edu/ev3'
     },
     {
-        name: 'LEGO Boost',
-        extensionId: 'boost',
-        iconURL: boostImage,
+        name: 'LEGO WeDo 2.0',
+        extensionId: 'wedo2',
+        iconURL: wedoImage,
         description: (
             <FormattedMessage
                 defaultMessage="Build with motors and sensors."
-                description="Description for the 'LEGO Boost' extension"
-                id="gui.extension.boost.description"
+                description="Description for the 'LEGO WeDo 2.0' extension"
+                id="gui.extension.wedo2.description"
             />
         ),
         featured: true,
diff --git a/src/lib/libraries/sounds.json b/src/lib/libraries/sounds.json
index f62f90b02916ee36d31ed3be3a5c530cda1d054c..15934e3574340bba9e1b5ce197fa1a9c262e2320 100644
--- a/src/lib/libraries/sounds.json
+++ b/src/lib/libraries/sounds.json
@@ -1118,6 +1118,14 @@
             "electronic"
         ]
     },
+    {
+        "name": "Dance Celebrate2",
+        "md5": "0edb8fb88af19e6e17d0f8cf64c1d136.wav",
+        "sampleCount": 176401,
+        "rate": 22050,
+        "format": "adpcm",
+        "tags": []
+    },
     {
         "name": "Dance Chill Out",
         "md5": "b235da45581b1f212c9e9cce70d2a2dc.wav",
diff --git a/src/lib/libraries/sprites.json b/src/lib/libraries/sprites.json
index 904d2ae9387a85b1e53c31708f474dea1e352a1c..0c69aa5ebb741e487114abb5a77cc4554f9c0ea9 100644
--- a/src/lib/libraries/sprites.json
+++ b/src/lib/libraries/sprites.json
@@ -116,6 +116,81 @@
             "spriteInfo": {}
         }
     },
+    {
+        "name": "Andie",
+        "md5": "936abdaaac3a3f7d27e5f30b3da00e5f.svg",
+        "type": "sprite",
+        "tags": [
+            "sports",
+            "basketball",
+            "people",
+            "wheelchair",
+            "handicap",
+            "handicapable",
+            "alex eben meyer"
+        ],
+        "info": [
+            0,
+            4,
+            1
+        ],
+        "json": {
+            "objName": "Andie",
+            "sounds": [
+                {
+                    "soundName": "pop",
+                    "soundID": -1,
+                    "md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav",
+                    "sampleCount": 258,
+                    "rate": 11025,
+                    "format": ""
+                }
+            ],
+            "costumes": [
+                {
+                    "costumeName": "andie-a",
+                    "baseLayerID": -1,
+                    "baseLayerMD5": "936abdaaac3a3f7d27e5f30b3da00e5f.svg",
+                    "bitmapResolution": 1,
+                    "rotationCenterX": 86,
+                    "rotationCenterY": 77
+                },
+                {
+                    "costumeName": "andie-b",
+                    "baseLayerID": -1,
+                    "baseLayerMD5": "cc2953492b40e231fdee3d8c9994a646.svg",
+                    "bitmapResolution": 1,
+                    "rotationCenterX": 46,
+                    "rotationCenterY": 77
+                },
+                {
+                    "costumeName": "andie-c",
+                    "baseLayerID": -1,
+                    "baseLayerMD5": "76e26ccb79a94d3e89f67e64b4cb9731.svg",
+                    "bitmapResolution": 1,
+                    "rotationCenterX": 52,
+                    "rotationCenterY": 36
+                },
+                {
+                    "costumeName": "andie-d",
+                    "baseLayerID": -1,
+                    "baseLayerMD5": "80fa011244f3e3be56b96ebcb9e40d59.svg",
+                    "bitmapResolution": 1,
+                    "rotationCenterX": 86,
+                    "rotationCenterY": 43
+                }
+            ],
+            "currentCostumeIndex": 0,
+            "scratchX": -129,
+            "scratchY": -73,
+            "scale": 1,
+            "direction": 90,
+            "rotationStyle": "normal",
+            "isDraggable": false,
+            "visible": true,
+            "spriteInfo": {}
+        }
+    },
     {
         "name": "Anina Dance",
         "md5": "9374e067ca4b66427fc64a0822f6e468.png",
@@ -810,8 +885,8 @@
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": 77,
-            "scratchY": -115,
+            "scratchX": 202,
+            "scratchY": -108,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -822,7 +897,7 @@
     },
     {
         "name": "Bat",
-        "md5": "a68f7a0b2af7514c729bb083d04dbbde.svg",
+        "md5": "3b6274510488d5b26447c1c266475801.svg",
         "type": "sprite",
         "tags": [
             "fantasy",
@@ -853,39 +928,39 @@
                 {
                     "costumeName": "bat-a",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "a68f7a0b2af7514c729bb083d04dbbde.svg",
+                    "baseLayerMD5": "3b6274510488d5b26447c1c266475801.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 51,
-                    "rotationCenterY": 47
+                    "rotationCenterX": 65,
+                    "rotationCenterY": 61
                 },
                 {
                     "costumeName": "bat-b",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "4ea5bb61370e189d2eba763312680201.svg",
+                    "baseLayerMD5": "8b20987d450379a445cbfc41ff2a3874.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 51,
-                    "rotationCenterY": 47
+                    "rotationCenterX": 65,
+                    "rotationCenterY": 61
                 },
                 {
                     "costumeName": "bat-c",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "9ed4deead22db511202f38abadf508c4.svg",
+                    "baseLayerMD5": "c6d6a6892638e489902fbba803050de1.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 51,
-                    "rotationCenterY": 47
+                    "rotationCenterX": 65,
+                    "rotationCenterY": 61
                 },
                 {
                     "costumeName": "bat-d",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "293a7b03badd2f3b49e50acfb9c242ec.svg",
+                    "baseLayerMD5": "e3da64838b2c74b6dd9a080b030e327e.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 51,
-                    "rotationCenterY": 47
+                    "rotationCenterX": 65,
+                    "rotationCenterY": 61
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": -39,
-            "scratchY": 121,
+            "scratchX": -48,
+            "scratchY": 109,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -2090,7 +2165,7 @@
             "costumes": [
                 {
                     "costumeName": "cake-a",
-                    "baseLayerID": 0,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "e1e8e8a765b8778d6181035c5c66984d.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 64,
@@ -2098,7 +2173,7 @@
                 },
                 {
                     "costumeName": "cake-b",
-                    "baseLayerID": 1,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "460268a804e7682c9fabf37e4b70071c.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 64,
@@ -2343,7 +2418,7 @@
             ],
             "costumes": [
                 {
-                    "costumeName": "cat1",
+                    "costumeName": "cat-a",
                     "baseLayerID": -1,
                     "baseLayerMD5": "09dc888b0b7df19f70d81588ae73420e.svg",
                     "bitmapResolution": 1,
@@ -2351,7 +2426,7 @@
                     "rotationCenterY": 55
                 },
                 {
-                    "costumeName": "cat2",
+                    "costumeName": "cat-b",
                     "baseLayerID": -1,
                     "baseLayerMD5": "3696356a03a8d938318876a593572843.svg",
                     "bitmapResolution": 1,
@@ -2371,53 +2446,46 @@
         }
     },
     {
-        "name": "Cat1 Flying",
-        "md5": "1e81725d2d2c7de4a2dd4a145198a43c.svg",
+        "name": "Cat 2",
+        "md5": "01ae57fd339529445cb890978ef8a054.svg",
         "type": "sprite",
         "tags": [
-            "animals",
             "cat",
             "kitty",
-            "kitten"
+            "kitten",
+            "animal",
+            "mammal"
         ],
         "info": [
             0,
-            2,
+            1,
             1
         ],
         "json": {
-            "objName": "Cat1 Flying",
+            "objName": "Cat 2",
             "sounds": [
                 {
-                    "soundName": "pop",
+                    "soundName": "meow2",
                     "soundID": -1,
-                    "md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav",
-                    "sampleCount": 258,
+                    "md5": "cf51a0c4088942d95bcc20af13202710.wav",
+                    "sampleCount": 6512,
                     "rate": 11025,
                     "format": ""
                 }
             ],
             "costumes": [
                 {
-                    "costumeName": "cat1 flying-a",
-                    "baseLayerID": -1,
-                    "baseLayerMD5": "1e81725d2d2c7de4a2dd4a145198a43c.svg",
-                    "bitmapResolution": 1,
-                    "rotationCenterX": 67,
-                    "rotationCenterY": 48
-                },
-                {
-                    "costumeName": "cat1 flying-b",
+                    "costumeName": "cat 2",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "0d192725870ef0eda50d91cab0e3c9c5.svg",
+                    "baseLayerMD5": "01ae57fd339529445cb890978ef8a054.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 42,
-                    "rotationCenterY": 44
+                    "rotationCenterX": 87,
+                    "rotationCenterY": 39
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": -53,
-            "scratchY": -14,
+            "scratchX": -71,
+            "scratchY": 1,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -2427,46 +2495,53 @@
         }
     },
     {
-        "name": "Cat2",
-        "md5": "01ae57fd339529445cb890978ef8a054.svg",
+        "name": "Cat Flying",
+        "md5": "1e81725d2d2c7de4a2dd4a145198a43c.svg",
         "type": "sprite",
         "tags": [
+            "animals",
             "cat",
             "kitty",
-            "kitten",
-            "animal",
-            "mammal"
+            "kitten"
         ],
         "info": [
             0,
-            1,
+            2,
             1
         ],
         "json": {
-            "objName": "Cat2",
+            "objName": "Cat Flying",
             "sounds": [
                 {
-                    "soundName": "meow2",
+                    "soundName": "pop",
                     "soundID": -1,
-                    "md5": "cf51a0c4088942d95bcc20af13202710.wav",
-                    "sampleCount": 6512,
+                    "md5": "83a9787d4cb6f3b7632b4ddfebf74367.wav",
+                    "sampleCount": 258,
                     "rate": 11025,
                     "format": ""
                 }
             ],
             "costumes": [
                 {
-                    "costumeName": "cat2",
+                    "costumeName": "cat flying-a",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "01ae57fd339529445cb890978ef8a054.svg",
+                    "baseLayerMD5": "1e81725d2d2c7de4a2dd4a145198a43c.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 87,
-                    "rotationCenterY": 39
+                    "rotationCenterX": 67,
+                    "rotationCenterY": 48
+                },
+                {
+                    "costumeName": "cat flying-b",
+                    "baseLayerID": -1,
+                    "baseLayerMD5": "0d192725870ef0eda50d91cab0e3c9c5.svg",
+                    "bitmapResolution": 1,
+                    "rotationCenterX": 42,
+                    "rotationCenterY": 44
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": -71,
-            "scratchY": 1,
+            "scratchX": -53,
+            "scratchY": -14,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -3144,7 +3219,7 @@
     },
     {
         "name": "D-Money Dance",
-        "md5": "b30a60d31aebead577b73affd22bf30f.svg",
+        "md5": "09dc9d82f097edfc6b2b6e4b5009c5f6.png",
         "type": "sprite",
         "tags": [
             "people",
@@ -3171,23 +3246,23 @@
                 {
                     "costumeName": "dm stance",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "b30a60d31aebead577b73affd22bf30f.svg",
-                    "bitmapResolution": 1,
-                    "rotationCenterX": 55,
-                    "rotationCenterY": 119
+                    "baseLayerMD5": "09dc9d82f097edfc6b2b6e4b5009c5f6.png",
+                    "bitmapResolution": 2,
+                    "rotationCenterX": 106,
+                    "rotationCenterY": 238
                 },
                 {
                     "costumeName": "dm top stand",
-                    "baseLayerID": -1,
-                    "baseLayerMD5": "051c36758b9fd1136b511efc5dd6234a.png",
+                    "baseLayerID": 0,
+                    "baseLayerMD5": "a22da98e5e63de7b2883355afd0184f0.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 82,
                     "rotationCenterY": 244
                 },
                 {
                     "costumeName": "dm top R leg",
-                    "baseLayerID": -1,
-                    "baseLayerMD5": "6cea0c29c460e571226cc4cff5b97c28.png",
+                    "baseLayerID": 1,
+                    "baseLayerMD5": "12db59633a1709a2c39534d35263791f.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 218,
                     "rotationCenterY": 232
@@ -4177,8 +4252,8 @@
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": -108,
-            "scratchY": -61,
+            "scratchX": -24,
+            "scratchY": -57,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -5457,8 +5532,8 @@
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": -110,
-            "scratchY": -24,
+            "scratchX": -115,
+            "scratchY": -46,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -7239,7 +7314,7 @@
             "costumes": [
                 {
                     "costumeName": "headband",
-                    "baseLayerID": 0,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "237f77cb3e41c70f714c6d2aa4d38ea1.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 53,
@@ -7458,7 +7533,7 @@
             "costumes": [
                 {
                     "costumeName": "hedgehog-a",
-                    "baseLayerID": 0,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "32416e6b2ef8e45fb5fd10778c1b9a9f.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 71,
@@ -7466,7 +7541,7 @@
                 },
                 {
                     "costumeName": "hedgehog-b",
-                    "baseLayerID": 1,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "4d3ccc06660e07b55bd38246e1f82f7f.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 71,
@@ -7474,7 +7549,7 @@
                 },
                 {
                     "costumeName": "hedgehog-c",
-                    "baseLayerID": 2,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "2446f79c0f553594cfbcdbe6b1e459a5.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 71,
@@ -7482,7 +7557,7 @@
                 },
                 {
                     "costumeName": "hedgehog-d",
-                    "baseLayerID": 3,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "bdb7c8e86125092da0c4848d1ffd901c.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 71,
@@ -7490,7 +7565,7 @@
                 },
                 {
                     "costumeName": "hedgehog-e",
-                    "baseLayerID": 4,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "78a0e3789f6d778e20f9bf3d308a0b19.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 61,
@@ -7846,7 +7921,7 @@
         }
     },
     {
-        "name": "Jamie",
+        "name": "Jamal",
         "md5": "90f9166fe6500d0c0caad8b1964d6b74.svg",
         "type": "sprite",
         "tags": [
@@ -7861,7 +7936,7 @@
             1
         ],
         "json": {
-            "objName": "Jamie",
+            "objName": "Jamal",
             "sounds": [
                 {
                     "soundName": "pop",
@@ -7874,7 +7949,7 @@
             ],
             "costumes": [
                 {
-                    "costumeName": "jamie-a",
+                    "costumeName": "jamal-a",
                     "baseLayerID": -1,
                     "baseLayerMD5": "90f9166fe6500d0c0caad8b1964d6b74.svg",
                     "bitmapResolution": 1,
@@ -7882,7 +7957,7 @@
                     "rotationCenterY": 105
                 },
                 {
-                    "costumeName": "jamie-b",
+                    "costumeName": "jamal-b",
                     "baseLayerID": -1,
                     "baseLayerMD5": "c3d96ef7e99440c2fa76effce1235d3f.svg",
                     "bitmapResolution": 1,
@@ -7890,7 +7965,7 @@
                     "rotationCenterY": 105
                 },
                 {
-                    "costumeName": "jamie-c",
+                    "costumeName": "jamal-c",
                     "baseLayerID": -1,
                     "baseLayerMD5": "1fb8b9ca79f2c0a327913bd647b53fe5.svg",
                     "bitmapResolution": 1,
@@ -7898,7 +7973,7 @@
                     "rotationCenterY": 105
                 },
                 {
-                    "costumeName": "jamie-d",
+                    "costumeName": "jamal-d",
                     "baseLayerID": -1,
                     "baseLayerMD5": "4adb87e6123161fcaf02f7ac022a5757.svg",
                     "bitmapResolution": 1,
@@ -8224,7 +8299,7 @@
                 },
                 {
                     "costumeName": "jo top L leg",
-                    "baseLayerID": 0,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "a12f40b18067bb31746f9cf461de88aa.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 208,
@@ -8232,7 +8307,7 @@
                 },
                 {
                     "costumeName": "jo top R cross",
-                    "baseLayerID": 1,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "c2d5519e8a0f2214ff757117038c28dc.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 144,
@@ -8240,7 +8315,7 @@
                 },
                 {
                     "costumeName": "jo top L cross",
-                    "baseLayerID": 2,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "2e2a6534d33883fdd2f8471a1adbebb7.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 84,
@@ -8248,7 +8323,7 @@
                 },
                 {
                     "costumeName": "jo pop front",
-                    "baseLayerID": 3,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "3d3ea804243800981acabc7caba10939.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 70,
@@ -8256,7 +8331,7 @@
                 },
                 {
                     "costumeName": "jo pop down",
-                    "baseLayerID": 4,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "a55fbb529c10f70bcb374aef8a63571b.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 68,
@@ -8264,7 +8339,7 @@
                 },
                 {
                     "costumeName": "jo pop left",
-                    "baseLayerID": 5,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "ea812b4c2b2405aa2b73158023298f71.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 196,
@@ -8272,7 +8347,7 @@
                 },
                 {
                     "costumeName": "jo pop right",
-                    "baseLayerID": 6,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "01dd2f553c7262329ebaba2516e3a2b1.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 66,
@@ -8280,7 +8355,7 @@
                 },
                 {
                     "costumeName": "jo pop L arm",
-                    "baseLayerID": 7,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "a9fbc01a4124d555da12630312e46197.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 108,
@@ -8288,7 +8363,7 @@
                 },
                 {
                     "costumeName": "jo pop stand",
-                    "baseLayerID": 8,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "75ee2383fd83992b401c8a0730521d94.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 78,
@@ -8296,7 +8371,7 @@
                 },
                 {
                     "costumeName": "jo pop R arm",
-                    "baseLayerID": 9,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "a35a3bbc4e21ce2f5de940adb7017fa6.png",
                     "bitmapResolution": 2,
                     "rotationCenterX": 108,
@@ -10361,7 +10436,7 @@
             "costumes": [
                 {
                     "costumeName": "panther-a",
-                    "baseLayerID": 0,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "04ca2c122cff11b9bc23834d6f79361e.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 125,
@@ -10369,7 +10444,7 @@
                 },
                 {
                     "costumeName": "panther-b",
-                    "baseLayerID": 1,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "f8c33765d1105f3bb4cd145fad0f717e.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 125,
@@ -10377,7 +10452,7 @@
                 },
                 {
                     "costumeName": "panther-c",
-                    "baseLayerID": 2,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "096bf9cad84def12eef2b5d84736b393.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 125,
@@ -11333,7 +11408,7 @@
             "costumes": [
                 {
                     "costumeName": "rabbit-a",
-                    "baseLayerID": 5,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "2f42891c3f3d63c0e591aeabc5946533.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 84,
@@ -11341,7 +11416,7 @@
                 },
                 {
                     "costumeName": "rabbit-b",
-                    "baseLayerID": 6,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "80e05ff501040cdc9f52fa6782e06fd2.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 84,
@@ -11349,7 +11424,7 @@
                 },
                 {
                     "costumeName": "rabbit-c",
-                    "baseLayerID": 7,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "88ed8b7925baa025b6c7fc628a64b9b1.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 84,
@@ -11357,7 +11432,7 @@
                 },
                 {
                     "costumeName": "rabbit-d",
-                    "baseLayerID": 8,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "5f3b8df4d6ab8a72e887f89f554db0be.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 84,
@@ -11365,7 +11440,7 @@
                 },
                 {
                     "costumeName": "rabbit-e",
-                    "baseLayerID": 9,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "3003f1135f4aa3b6c361734243621260.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 84,
@@ -12888,7 +12963,7 @@
             "costumes": [
                 {
                     "costumeName": "snake-a",
-                    "baseLayerID": 3,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "4d06e12d90479461303d828f0970f2d4.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 142,
@@ -12896,7 +12971,7 @@
                 },
                 {
                     "costumeName": "snake-b",
-                    "baseLayerID": 4,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "a8546a5f9ccaa2bdb678a362c50a17ec.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 142,
@@ -12904,7 +12979,7 @@
                 },
                 {
                     "costumeName": "snake-c",
-                    "baseLayerID": 5,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "d993a7d70179777c14ac91a07e711d90.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 142,
@@ -13598,13 +13673,11 @@
     },
     {
         "name": "Taco",
-        "md5": "d4a2cea411c6030f017f25184562559d.svg",
+        "md5": "bc78fb90ed373d56c11d5fafa4203ccd.svg",
         "type": "sprite",
         "tags": [
             "food",
-            "waffle",
-            "yum",
-            "delicious"
+            "designerd"
         ],
         "info": [
             0,
@@ -13625,25 +13698,25 @@
             ],
             "costumes": [
                 {
-                    "costumeName": "taco-a",
+                    "costumeName": "Taco",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "d4a2cea411c6030f017f25184562559d.svg",
+                    "baseLayerMD5": "bc78fb90ed373d56c11d5fafa4203ccd.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 19,
-                    "rotationCenterY": 15
+                    "rotationCenterX": 78,
+                    "rotationCenterY": 48
                 },
                 {
-                    "costumeName": "taco-b",
+                    "costumeName": "Taco-wizard",
                     "baseLayerID": -1,
-                    "baseLayerMD5": "cef6f6d7c92fc1f008077319ac12dc5e.svg",
+                    "baseLayerMD5": "5e9e65db20d403b590578ed44b1a3792.svg",
                     "bitmapResolution": 1,
-                    "rotationCenterX": 56,
-                    "rotationCenterY": 15
+                    "rotationCenterX": 125,
+                    "rotationCenterY": 82
                 }
             ],
             "currentCostumeIndex": 0,
-            "scratchX": 7,
-            "scratchY": -45,
+            "scratchX": 0,
+            "scratchY": 0,
             "scale": 1,
             "direction": 90,
             "rotationStyle": "normal",
@@ -14017,7 +14090,7 @@
             "costumes": [
                 {
                     "costumeName": "toucan-a",
-                    "baseLayerID": 6,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "6c8798e606abd728b112aecedb5dc249.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 80,
@@ -14025,7 +14098,7 @@
                 },
                 {
                     "costumeName": "toucan-b",
-                    "baseLayerID": 7,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "a3e12be9efa0e7aa83778f6054c9c541.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 80,
@@ -14033,7 +14106,7 @@
                 },
                 {
                     "costumeName": "toucan-c",
-                    "baseLayerID": 8,
+                    "baseLayerID": -1,
                     "baseLayerMD5": "56522b58a9959fd6152060346129f7cb.svg",
                     "bitmapResolution": 1,
                     "rotationCenterX": 80,
diff --git a/src/playground/index.ejs b/src/playground/index.ejs
index 3d2394d662f8fd3a36b1aef660f568ba4986b4a3..7a8bb16135e376103098b367b098699b2017d320 100644
--- a/src/playground/index.ejs
+++ b/src/playground/index.ejs
@@ -3,6 +3,7 @@
   <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="google" value="notranslate">
     <link rel="shortcut icon" href="static/favicon.ico">
     <title><%= htmlWebpackPlugin.options.title %></title>
     <% if (htmlWebpackPlugin.options.sentryConfig) { %>
diff --git a/src/reducers/cards.js b/src/reducers/cards.js
index 6f4add89d20b6936e55646f46771072d8d0904f9..ba1c50d8e28af9d3e7a3c234417ccdc09e0b3f07 100644
--- a/src/reducers/cards.js
+++ b/src/reducers/cards.js
@@ -1,3 +1,5 @@
+import analytics from '../lib/analytics';
+
 import decks from '../lib/libraries/decks/index.jsx';
 
 const CLOSE_CARDS = 'scratch-gui/cards/CLOSE_CARDS';
@@ -38,6 +40,11 @@ const reducer = function (state, action) {
         });
     case NEXT_STEP:
         if (state.activeDeckId !== null) {
+            analytics.event({
+                category: 'how-to',
+                action: 'next step',
+                label: `${state.activeDeckId} - ${state.step}`
+            });
             return Object.assign({}, state, {
                 step: state.step + 1
             });
diff --git a/test/integration/localization.test.js b/test/integration/localization.test.js
index deaf1a78814631daa00c044bd595fd31bb6c2fa1..101d3ce8613bd27e89b4e69ddfdfdbe483cfae6f 100644
--- a/test/integration/localization.test.js
+++ b/test/integration/localization.test.js
@@ -4,11 +4,9 @@ import SeleniumHelper from '../helpers/selenium-helper';
 const {
     clickText,
     clickXpath,
-    findByText,
     getDriver,
     getLogs,
-    loadUri,
-    scope
+    loadUri
 } = new SeleniumHelper();
 
 const uri = path.resolve(__dirname, '../../build/index.html');
@@ -24,24 +22,21 @@ describe('Localization', () => {
         await driver.quit();
     });
 
-    // Skipped temporarily while the language selector is marked as
-    // "Coming Soon"
-    test.skip('Localization', async () => {
+    test('Localization', async () => {
         await loadUri(uri);
         await clickXpath('//button[@title="tryit"]');
-        await clickText('Code');
-        await clickXpath('//button[@title="Add Extension"]');
-        await clickText('Pen', scope.modal); // Modal closes
-        await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for scroll animation
+        await clickXpath('//*[@aria-label="language selector"]');
         await clickText('English');
         await clickText('Deutsch');
         await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks refresh
-        await clickText('Pen'); // will need to be updated when 'Pen' is translated
 
-        // Make sure "Add Sprite" has changed to "Figur hinzufügen"
-        await findByText('Figur hinzufügen');
-        // Find the stamp block in German
-        await findByText('Abdruck');
+        // Make sure the blocks are translating
+        await clickText('Fühlen'); // Sensing category in German
+        await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll
+        await clickText('Antwort'); // Find the "answer" block in German
+
+        // Change to the costumes tab to confirm other parts of the GUI are translating
+        await clickText('Kostüme');
 
         const logs = await getLogs();
         await expect(logs).toEqual([]);
diff --git a/test/smoke/browser.test.js b/test/smoke/browser.test.js
index b822cd1b16515de23db8697bf5f7e61e702eba00..aa894a05578bcebb74f335469ed5e6a2d85710f8 100644
--- a/test/smoke/browser.test.js
+++ b/test/smoke/browser.test.js
@@ -38,8 +38,7 @@ describe('Smoke tests on older browsers', () => {
         return expect(isDisplayed).toEqual(true);
     });
 
-    // Safari 9 has always been blank screened due to lack of Intl polyfill
-    test.skip('Safari 9 should not be unsupported', async () => {
+    test('Safari 9 should be supported', async () => {
         const driverConfig = {
             browserName: 'safari',
             platform: 'OS X 10.11',
@@ -55,7 +54,7 @@ describe('Smoke tests on older browsers', () => {
         return expect(isDisplayed).toEqual(true);
     });
 
-    test('Safari 10 should not be unsupported', async () => {
+    test('Safari 10 should be supported', async () => {
         const driverConfig = {
             browserName: 'safari',
             platform: 'OS X 10.11',