diff --git a/src/react-components/2d-hud.css b/src/assets/stylesheets/2d-hud.css
similarity index 79%
rename from src/react-components/2d-hud.css
rename to src/assets/stylesheets/2d-hud.css
index 556431ac6ca824e0bbcf4cf4d5644e05be4dc309..a8324a5bb8b054c4da44f82aadfe96647c5cb45b 100644
--- a/src/react-components/2d-hud.css
+++ b/src/assets/stylesheets/2d-hud.css
@@ -30,14 +30,16 @@
   width: 48px;
   height: 48px;
   background-size: 100%;
-  background-image: url(../assets/hud/avatar.jpg);
+  background-image: url(../hud/avatar.jpg);
 }
 
 :local(.mic) {
   display: flex;
   width: 48px;
   height: 48px;
-  mask: url(../assets/hud/unmuted.png);
+  -webkit-mask: url(../hud/unmuted.png);
+  -webkit-mask-size: 48px;
+  mask: url(../hud/unmuted.png);
   mask-size: 48px;
   background-color: white;
   cursor: pointer;
@@ -56,7 +58,9 @@
 }
 
 :local(.mic.muted) {
-  mask: url(../assets/hud/muted.png);
+  -webkit-mask: url(../hud/muted.png);
+  -webkit-mask-size: 48px;
+  mask: url(../hud/muted.png);
   mask-size: 48px;
 }
 
diff --git a/src/components/debug.js b/src/components/debug.js
index 77202f03295be677b9156e1ff16f11100ab19351..6448bf236966876e05069f96192153cf0f8400b6 100644
--- a/src/components/debug.js
+++ b/src/components/debug.js
@@ -1,25 +1,30 @@
 AFRAME.registerComponent("lifecycle-checker", {
   schema: {
+    name: { type: "string" },
     tick: { default: false }
   },
   init: function() {
-    console.log("init", this.el);
+    this.log("init");
   },
   update: function() {
-    console.log("update", this.el);
+    this.log("update");
   },
   tick: function() {
     if (this.data.tick) {
-      console.log("tick", this.el);
+      this.log("tick");
     }
   },
   remove: function() {
-    console.log("remove", this.el);
+    this.log("remove");
   },
   pause: function() {
-    console.log("pause", this.el);
+    this.log("pause");
   },
   play: function() {
-    console.log("play", this.el);
+    this.log("play");
+  },
+
+  log: function(method) {
+    console.info(`lifecycle-checker:${this.data.name} ${method}`);
   }
 });
diff --git a/src/components/gltf-bundle.js b/src/components/gltf-bundle.js
index 791fa7eef9076b44eda996192181dc488e755846..85238043fb2319dd1a6e55bc953186890fd2e721 100644
--- a/src/components/gltf-bundle.js
+++ b/src/components/gltf-bundle.js
@@ -17,8 +17,8 @@ AFRAME.registerComponent("gltf-bundle", {
     for (let i = 0; i < bundleJson.assets.length; i++) {
       const asset = bundleJson.assets[i];
       const src = asset.src;
-      const gltfEl = document.createElement("a-gltf-entity");
-      gltfEl.setAttribute("src", src);
+      const gltfEl = document.createElement("a-entity");
+      gltfEl.setAttribute("gltf-model-plus", { src });
       gltfEl.setAttribute("position", "0 0 0");
       loaded.push(new Promise(resolve => gltfEl.addEventListener("model-loaded", resolve)));
       this.el.appendChild(gltfEl);
diff --git a/src/elements/a-gltf-entity.js b/src/components/gltf-model-plus.js
similarity index 56%
rename from src/elements/a-gltf-entity.js
rename to src/components/gltf-model-plus.js
index 33489e2bc1792aa2b9dd4bddca360caaa39c509b..f1993414fc6ec0029e5b918d452c7a009ab6c3fd 100644
--- a/src/elements/a-gltf-entity.js
+++ b/src/components/gltf-model-plus.js
@@ -1,6 +1,6 @@
 const GLTFCache = {};
 
-AFRAME.AGLTFEntity = {
+AFRAME.GLTFModelPlus = {
   defaultInflator(el, componentName, componentData) {
     if (!AFRAME.components[componentName]) {
       throw new Error(`Inflator failed. "${componentName}" component does not exist.`);
@@ -14,8 +14,8 @@ AFRAME.AGLTFEntity = {
     }
   },
   registerComponent(componentKey, componentName, inflator) {
-    AFRAME.AGLTFEntity.components[componentKey] = {
-      inflator: inflator || AFRAME.AGLTFEntity.defaultInflator,
+    AFRAME.GLTFModelPlus.components[componentKey] = {
+      inflator: inflator || AFRAME.GLTFModelPlus.defaultInflator,
       componentName
     };
   },
@@ -128,7 +128,7 @@ const inflateEntities = function(parentEl, node) {
   if (entityComponents) {
     for (const prop in entityComponents) {
       if (entityComponents.hasOwnProperty(prop)) {
-        const { inflator, componentName } = AFRAME.AGLTFEntity.components[prop];
+        const { inflator, componentName } = AFRAME.GLTFModelPlus.components[prop];
 
         if (inflator) {
           inflator(el, componentName, entityComponents[prop]);
@@ -190,138 +190,94 @@ function cachedLoadGLTF(src, onProgress) {
   });
 }
 
-AFRAME.registerElement("a-gltf-entity", {
-  prototype: Object.create(AFRAME.AEntity.prototype, {
-    load: {
-      async value() {
-        if (this.hasLoaded || !this.parentEl) {
-          return;
-        }
-
-        // The code above and below this are from AEntity.prototype.load, we need to monkeypatch in gltf loading mid function
-        this.loadTemplates();
-        await this.applySrc(this.getAttribute("src"));
-        //
-
-        AFRAME.ANode.prototype.load.call(this, () => {
-          // Check if entity was detached while it was waiting to load.
-          if (!this.parentEl) {
-            return;
-          }
+AFRAME.registerComponent("gltf-model-plus", {
+  schema: {
+    src: { type: "string" },
+    inflate: { default: false }
+  },
 
-          this.updateComponents();
-          if (this.isScene || this.parentEl.isPlaying) {
-            this.play();
-          }
-        });
-      }
-    },
-
-    loadTemplates: {
-      value() {
-        this.templates = [];
-        this.querySelectorAll(":scope > template").forEach(templateEl =>
-          this.templates.push({
-            selector: templateEl.getAttribute("data-selector"),
-            templateRoot: document.importNode(
-              templateEl.firstElementChild || templateEl.content.firstElementChild,
-              true
-            )
-          })
-        );
-      }
-    },
-
-    applySrc: {
-      async value(src) {
-        try {
-          // If the src attribute is a selector, get the url from the asset item.
-          if (src && src.charAt(0) === "#") {
-            const assetEl = document.getElementById(src.substring(1));
-            if (!assetEl) { 
-              console.warn(`Attempted to use non-existent asset ${src} as src for`, this);
-              return;
-            }
-
-            const fallbackSrc = assetEl.getAttribute("src");
-            const highSrc = assetEl.getAttribute("high-src");
-            const lowSrc = assetEl.getAttribute("low-src");
-
-            if (highSrc && window.APP.quality === "high") {
-              src = highSrc;
-            } else if (lowSrc && window.APP.quality === "low") {
-              src = lowSrc;
-            } else {
-              src = fallbackSrc;
-            }
-          }
+  init() {
+    this.loadTemplates();
+  },
 
-          if (src === this.lastSrc) return;
-          this.lastSrc = src;
+  update() {
+    this.applySrc(this.data.src);
+  },
 
-          if (!src) {
-            if (this.inflatedEl) {
-              console.warn("gltf-entity set to an empty source, unloading inflated model.");
-              this.removeInflatedEl();
-            }
-            return;
-          }
+  loadTemplates() {
+    this.templates = [];
+    this.el.querySelectorAll(":scope > template").forEach(templateEl =>
+      this.templates.push({
+        selector: templateEl.getAttribute("data-selector"),
+        templateRoot: document.importNode(templateEl.firstElementChild || templateEl.content.firstElementChild, true)
+      })
+    );
+  },
 
-          const model = await cachedLoadGLTF(src);
+  async applySrc(src) {
+    try {
+      // If the src attribute is a selector, get the url from the asset item.
+      if (src && src.charAt(0) === "#") {
+        const assetEl = document.getElementById(src.substring(1));
+
+        const fallbackSrc = assetEl.getAttribute("src");
+        const highSrc = assetEl.getAttribute("high-src");
+        const lowSrc = assetEl.getAttribute("low-src");
+
+        if (highSrc && window.APP.quality === "high") {
+          src = highSrc;
+        } else if (lowSrc && window.APP.quality === "low") {
+          src = lowSrc;
+        } else {
+          src = fallbackSrc;
+        }
+      }
 
-          // If we started loading something else already
-          // TODO: there should be a way to cancel loading instead
-          if (src != this.lastSrc) return;
+      if (src === this.lastSrc) return;
+      this.lastSrc = src;
 
-          // If we had inflated something already before, clean that up
+      if (!src) {
+        if (this.inflatedEl) {
+          console.warn("gltf-model-plus set to an empty source, unloading inflated model.");
           this.removeInflatedEl();
+        }
+        return;
+      }
 
-          this.model = model.scene || model.scenes[0];
-          this.model.animations = model.animations;
+      const model = await cachedLoadGLTF(src);
 
-          this.setObject3D("mesh", this.model);
+      // If we started loading something else already
+      // TODO: there should be a way to cancel loading instead
+      if (src != this.lastSrc) return;
 
-          if (this.getAttribute("inflate")) {
-            this.inflatedEl = inflateEntities(this, this.model);
-            // TODO: Still don't fully understand the lifecycle here and how it differs between browsers, we should dig in more
-            // Wait one tick for the appended custom elements to be connected before attaching templates
-            await nextTick();
-            if (src != this.lastSrc) return; // TODO: there must be a nicer pattern for this
-            this.templates.forEach(attachTemplate.bind(null, this));
-          }
+      // If we had inflated something already before, clean that up
+      this.removeInflatedEl();
 
-          this.emit("model-loaded", { format: "gltf", model: this.model });
-        } catch (e) {
-          console.error("Failed to load glTF model", e.message, this);
-          this.emit("model-error", { format: "gltf", src });
-        }
-      }
-    },
+      this.model = model.scene || model.scenes[0];
+      this.model.animations = model.animations;
 
-    removeInflatedEl: {
-      value() {
-        if (this.inflatedEl) {
-          this.inflatedEl.parentNode.removeChild(this.inflatedEl);
-          delete this.inflatedEl;
-        }
-      }
-    },
+      this.el.setObject3D("mesh", this.model);
 
-    attributeChangedCallback: {
-      value(attr, oldVal, newVal) {
-        if (attr === "src") {
-          this.applySrc(newVal);
-        }
+      if (this.data.inflate) {
+        this.inflatedEl = inflateEntities(this.el, this.model);
+        // TODO: Still don't fully understand the lifecycle here and how it differs between browsers, we should dig in more
+        // Wait one tick for the appended custom elements to be connected before attaching templates
+        await nextTick();
+        if (src != this.lastSrc) return; // TODO: there must be a nicer pattern for this
+        this.templates.forEach(attachTemplate.bind(null, this.el));
       }
-    },
 
-    setAttribute: {
-      value(attr, arg1, arg2) {
-        if (attr === "src") {
-          this.applySrc(arg1);
-        }
-        AFRAME.AEntity.prototype.setAttribute.call(this, attr, arg1, arg2);
-      }
+      this.el.emit("model-loaded", { format: "gltf", model: this.model });
+    } catch (e) {
+      console.error("Failed to load glTF model", e.message, this);
+      this.emit("model-error", { format: "gltf", src });
     }
-  })
+  },
+
+  removeInflatedEl() {
+    if (this.inflatedEl) {
+      this.inflatedEl.parentNode.removeChild(this.inflatedEl);
+      delete this.inflatedEl;
+    }
+  }
 });
diff --git a/src/components/player-info.js b/src/components/player-info.js
index ac2fc6b55fcdaf0215e26327368c07dd67e88fcc..fc94e6092ae18bb654a5e344a37649ab41be9d11 100644
--- a/src/components/player-info.js
+++ b/src/components/player-info.js
@@ -25,7 +25,7 @@ AFRAME.registerComponent("player-info", {
 
     const modelEl = this.el.querySelector(".model");
     if (this.data.avatarSrc && modelEl) {
-      modelEl.setAttribute("src", this.data.avatarSrc);
+      modelEl.setAttribute("gltf-model-plus", "src", this.data.avatarSrc);
     }
   }
 });
diff --git a/src/gltf-component-mappings.js b/src/gltf-component-mappings.js
index e4cf086733ad1e0dc547abafe3fb37ed025a5608..7c6b6a8d8774eeeda0de6f0fb074848a5e78be51 100644
--- a/src/gltf-component-mappings.js
+++ b/src/gltf-component-mappings.js
@@ -1,4 +1,4 @@
-import "./elements/a-gltf-entity";
+import "./components/gltf-model-plus";
 
-AFRAME.AGLTFEntity.registerComponent("scale-audio-feedback", "scale-audio-feedback");
-AFRAME.AGLTFEntity.registerComponent("loop-animation", "loop-animation");
+AFRAME.GLTFModelPlus.registerComponent("scale-audio-feedback", "scale-audio-feedback");
+AFRAME.GLTFModelPlus.registerComponent("loop-animation", "loop-animation");
diff --git a/src/hub.html b/src/hub.html
index fd276abaec43666e9f57842b8e96a0da8c6b1ead..ad2b769bb4d1c53146cddc7dcc1ce747e4cf3f4a 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -112,7 +112,7 @@
 
                     <a-entity class="right-controller"></a-entity>
 
-                    <a-gltf-entity class="model" inflate="true">
+                    <a-entity class="model" gltf-model-plus="inflate: true">
                         <template data-selector=".RootScene">
                             <a-entity ik-controller animation-mixer></a-entity>
                         </template>
@@ -145,13 +145,13 @@
                         <template data-selector=".RightHand">
                             <a-entity personal-space-invader ></a-entity>
                         </template>
-                    </a-gltf-entity>
+                    </a-entity>
                 </a-entity>
             </template>
 
             <template id="interactable-template">
                 <a-entity
-                    gltf-model="#interactable-duck"
+                    gltf-model-plus="src: #interactable-duck"
                     scale="2 2 2"
                     class="interactable" 
                     super-networked-interactable="counter: #counter; mass: 5;"
@@ -176,8 +176,8 @@
         <!-- Interactables -->
         <a-entity id="counter" networked-counter="max: 3; ttl: 120"></a-entity>
 
-        <a-entity
-            gltf-model="#interactable-duck"
+        <a-entity 
+            gltf-model-plus="src: #interactable-duck"
             scale="2 2 2"
             class="interactable" 
             super-spawner="template: #interactable-template;" 
@@ -264,7 +264,7 @@
                 app-mode-toggle-attribute__line="mode: hud; property: visible;"
             ></a-entity>
 
-            <a-gltf-entity class="model" inflate="true">
+            <a-entity gltf-model-plus="inflate: true;" class="model">
                 <template data-selector=".RootScene">
                     <a-entity
                         ik-controller
@@ -285,14 +285,14 @@
 
                 <template data-selector=".LeftHand">
                     <a-entity>
-                        <a-gltf-entity
+                        <a-entity
                             id="watch"
-                            src="#watch-model"
+                            gltf-model-plus="src: #watch-model"
                             bone-mute-state-indicator
                             scale="1.5 1.5 1.5"
                             rotation="0 -90 90"
                             position="0 -0.04 0"
-                        ></a-gltf-entity>
+                        ></a--entity>
                         <a-entity
                             event-repeater="events: action_grab, action_release; eventSource: #player-left-controller"
                             static-body="shape: sphere; sphereRadius: 0.02"
@@ -313,7 +313,7 @@
                     </a-entity>
                 </template>
 
-            </a-gltf-entity>
+            </a-entity>
         </a-entity>
 
         <!-- Lights -->
diff --git a/src/hub.js b/src/hub.js
index 887e470250fd224c616ec66e8f53e2ceaea703fe..5ed6373c2f08fa2316f3e18a2d08c23e5874828e 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -41,6 +41,7 @@ import "./components/player-info";
 import "./components/debug";
 import "./components/animation-mixer";
 import "./components/loop-animation";
+import "./components/gltf-model-plus";
 import "./components/gltf-bundle";
 
 import ReactDOM from "react-dom";
@@ -50,8 +51,6 @@ import UIRoot from "./react-components/ui-root";
 import "./systems/personal-space-bubble";
 import "./systems/app-mode";
 
-import "./elements/a-gltf-entity";
-
 import "./gltf-component-mappings";
 
 import { App } from "./App";
diff --git a/src/react-components/2d-hud.js b/src/react-components/2d-hud.js
index fda3ae06ad0ce63b7b773d5a69f4141b52389c9f..73c23c82f39548e1770e8ba1ab8e9b44ab0affae 100644
--- a/src/react-components/2d-hud.js
+++ b/src/react-components/2d-hud.js
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
 
-import styles from "./2d-hud.css";
+import styles from "../assets/stylesheets/2d-hud.css";
 
 const TwoDHUD = ({ name, muted, onToggleMute }) => (
   <div className={styles.container}>
diff --git a/src/react-components/avatar-selector.js b/src/react-components/avatar-selector.js
index 6ce9a8a172726bb1b6d6194e13d5f88aa29185b5..5cb456ee578bd0c966c02653296457d425c31326 100644
--- a/src/react-components/avatar-selector.js
+++ b/src/react-components/avatar-selector.js
@@ -56,7 +56,7 @@ class AvatarSelector extends Component {
 
     const avatarEntities = this.props.avatars.map((avatar, i) => (
       <a-entity key={avatar.id} position="0 0 0" rotation={`0 ${360 * -i / this.props.avatars.length} 0`}>
-        <a-gltf-entity position="0 0 5" rotation="0 0 0" src={"#" + avatar.id} inflate="true">
+        <a-entity position="0 0 5" rotation="0 0 0" gltf-model-plus={`src: #${avatar.id}`} inflate="true">
           <template data-selector=".RootScene">
             <a-entity animation-mixer />
           </template>
@@ -66,7 +66,7 @@ class AvatarSelector extends Component {
             to={`0 ${this.getAvatarIndex() === i ? 360 : 0} 0`}
             repeat="indefinite"
           />
-        </a-gltf-entity>
+        </a-entity>
       </a-entity>
     ));
 
@@ -100,7 +100,7 @@ class AvatarSelector extends Component {
             position="0 5 -15"
           />
           <a-entity hide-when-quality="low" light="type: ambient; color: #FFF" />
-          <a-gltf-entity id="meeting-space" src="#meeting-space1-mesh" position="0 0 0" />
+          <a-entity id="meeting-space" gltf-model-plus="src: #meeting-space1-mesh" position="0 0 0" />
         </a-scene>
         <button className="avatar-selector__previous-button" onClick={this.emitChangeToPrevious}>
           <FontAwesomeIcon icon={faAngleLeft} />
diff --git a/webpack.config.js b/webpack.config.js
index 1fdc22406d4a3ab182b072c6aca32e96cb4d6b23..4cf14964c2deca54e3f83e4380d16e6facd36532 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -213,7 +213,8 @@ const config = {
       inject: "head"
     }),
     // Extract required css and add a content hash.
-    new ExtractTextPlugin("assets/stylesheets/[name]-[contenthash].css", {
+    new ExtractTextPlugin({
+      filename: "assets/stylesheets/[name]-[contenthash].css",
       disable: process.env.NODE_ENV !== "production"
     }),
     // Transform the output of the html-loader using _.template
diff --git a/yarn.lock b/yarn.lock
index 18f7727e7dd7217a0e581df22c2ddfc12a8ff16a..6d7eff66533271ad414691dff10bb0394993a7e0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -440,16 +440,6 @@ assert@^1.1.1, assert@^1.4.0:
   dependencies:
     util "0.10.3"
 
-assets-webpack-plugin@^3.5.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-3.5.1.tgz#931ce0d66d42e88ed5e7f18d65522943c57a387d"
-  dependencies:
-    camelcase "^1.2.1"
-    escape-string-regexp "^1.0.3"
-    lodash.assign "^3.2.0"
-    lodash.merge "^3.3.2"
-    mkdirp "^0.5.1"
-
 assign-symbols@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
@@ -1719,10 +1709,6 @@ camelcase-keys@^2.0.0:
     camelcase "^2.0.0"
     map-obj "^1.0.0"
 
-camelcase@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
-
 camelcase@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
@@ -2858,7 +2844,7 @@ escape-html@^1.0.3, escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
 
-escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
+escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 
@@ -4745,57 +4731,6 @@ locate-path@^2.0.0:
     p-locate "^2.0.0"
     path-exists "^3.0.0"
 
-lodash._arraycopy@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1"
-
-lodash._arrayeach@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e"
-
-lodash._baseassign@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash.keys "^3.0.0"
-
-lodash._basecopy@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
-
-lodash._basefor@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2"
-
-lodash._bindcallback@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
-
-lodash._createassigner@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
-  dependencies:
-    lodash._bindcallback "^3.0.0"
-    lodash._isiterateecall "^3.0.0"
-    lodash.restparam "^3.0.0"
-
-lodash._getnative@^3.0.0:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-
-lodash._isiterateecall@^3.0.0:
-  version "3.0.9"
-  resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
-
-lodash.assign@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"
-  dependencies:
-    lodash._baseassign "^3.0.0"
-    lodash._createassigner "^3.0.0"
-    lodash.keys "^3.0.0"
-
 lodash.assign@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@@ -4812,49 +4747,14 @@ lodash.endswith@^4.2.1:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09"
 
-lodash.isarguments@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
-
-lodash.isarray@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
-
 lodash.isfunction@^3.0.8:
   version "3.0.9"
   resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051"
 
-lodash.isplainobject@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz#9a8238ae16b200432960cd7346512d0123fbf4c5"
-  dependencies:
-    lodash._basefor "^3.0.0"
-    lodash.isarguments "^3.0.0"
-    lodash.keysin "^3.0.0"
-
 lodash.isstring@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
 
-lodash.istypedarray@^3.0.0:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62"
-
-lodash.keys@^3.0.0:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
-  dependencies:
-    lodash._getnative "^3.0.0"
-    lodash.isarguments "^3.0.0"
-    lodash.isarray "^3.0.0"
-
-lodash.keysin@^3.0.0:
-  version "3.0.8"
-  resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f"
-  dependencies:
-    lodash.isarguments "^3.0.0"
-    lodash.isarray "^3.0.0"
-
 lodash.memoize@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@@ -4863,30 +4763,10 @@ lodash.memoize@~3.0.3:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
 
-lodash.merge@^3.3.2:
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-3.3.2.tgz#0d90d93ed637b1878437bb3e21601260d7afe994"
-  dependencies:
-    lodash._arraycopy "^3.0.0"
-    lodash._arrayeach "^3.0.0"
-    lodash._createassigner "^3.0.0"
-    lodash._getnative "^3.0.0"
-    lodash.isarguments "^3.0.0"
-    lodash.isarray "^3.0.0"
-    lodash.isplainobject "^3.0.0"
-    lodash.istypedarray "^3.0.0"
-    lodash.keys "^3.0.0"
-    lodash.keysin "^3.0.0"
-    lodash.toplainobject "^3.0.0"
-
 lodash.mergewith@^4.6.0:
   version "4.6.1"
   resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927"
 
-lodash.restparam@^3.0.0:
-  version "3.6.1"
-  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
-
 lodash.startswith@^4.2.1:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c"
@@ -4895,13 +4775,6 @@ lodash.tail@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
 
-lodash.toplainobject@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz#28790ad942d293d78aa663a07ecf7f52ca04198d"
-  dependencies:
-    lodash._basecopy "^3.0.0"
-    lodash.keysin "^3.0.0"
-
 lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@@ -4995,10 +4868,6 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
-material-design-lite@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/material-design-lite/-/material-design-lite-1.3.0.tgz#d004ce3fee99a1eeb74a78b8a325134a5f1171d3"
-
 math-expression-evaluator@^1.2.14:
   version "1.2.17"
   resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"