diff --git a/package.json b/package.json
index f79c4e4c422e237f6aec400bda59b9e4a8482f9b..8ec1ea9773d9051a7c1c1a16b6aa643ee287aad8 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
     "material-design-lite": "^1.3.0",
     "minijanus": "^0.5.0",
     "mobile-detect": "^1.4.1",
+    "moving-average": "^1.0.0",
     "naf-janus-adapter": "https://github.com/mozilla/naf-janus-adapter#feature/disconnect",
     "networked-aframe": "https://github.com/mozillareality/networked-aframe#mr-social-client/master",
     "nipplejs": "^0.6.7",
diff --git a/src/assets/images/level_fill.png b/src/assets/images/level_fill.png
new file mode 100644
index 0000000000000000000000000000000000000000..99f77b5655e6a50e0444364a3c2cfb4882b3b2d9
Binary files /dev/null and b/src/assets/images/level_fill.png differ
diff --git a/src/assets/images/level_fill@2x.png b/src/assets/images/level_fill@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..477d9801bb6d33737b571fce454ff265ff79e77c
Binary files /dev/null and b/src/assets/images/level_fill@2x.png differ
diff --git a/src/assets/images/mic_level.png b/src/assets/images/mic_level.png
new file mode 100644
index 0000000000000000000000000000000000000000..5be15458d9ed41c46f861d8dd8435a11e452f80c
Binary files /dev/null and b/src/assets/images/mic_level.png differ
diff --git a/src/assets/images/mic_level@2x.png b/src/assets/images/mic_level@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..94739aa1977cc5d5317eeb770905ed212ff248b4
Binary files /dev/null and b/src/assets/images/mic_level@2x.png differ
diff --git a/src/assets/images/mic_small.png b/src/assets/images/mic_small.png
old mode 100755
new mode 100644
diff --git a/src/assets/images/mic_small@2x.png b/src/assets/images/mic_small@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b94cede41804adacdf7e268e6082baffca4403cb
Binary files /dev/null and b/src/assets/images/mic_small@2x.png differ
diff --git a/src/assets/images/package.json b/src/assets/images/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..0a5693e4ee3946b74a1a1e9632f9abb5ddbd5d35
--- /dev/null
+++ b/src/assets/images/package.json
@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "moving-average": "^1.0.0"
+  }
+}
diff --git a/src/assets/images/speaker_level.png b/src/assets/images/speaker_level.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ccedcc0350f90c95744d928128594829b5f5b90
Binary files /dev/null and b/src/assets/images/speaker_level.png differ
diff --git a/src/assets/images/speaker_level@2x.png b/src/assets/images/speaker_level@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a807745cbcaaf823e6e8e99deda15459d1ed1d9a
Binary files /dev/null and b/src/assets/images/speaker_level@2x.png differ
diff --git a/src/assets/images/yarn.lock b/src/assets/images/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..1f192c246a1da1e42b2e3482a5980de118f49339
--- /dev/null
+++ b/src/assets/images/yarn.lock
@@ -0,0 +1,7 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+moving-average@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/moving-average/-/moving-average-1.0.0.tgz#b1247ba8dd2d7927c619f1eac8036cf933d65adc"
diff --git a/src/react-components/ui-root.js b/src/react-components/ui-root.js
index 61dda7b6f08c7e42d0b3289f68490ad01f861c17..ed6b4e2d7db8960b98776c8482d7e9d16c51657e 100644
--- a/src/react-components/ui-root.js
+++ b/src/react-components/ui-root.js
@@ -8,6 +8,7 @@ import { SCHEMA } from "../storage/store";
 import MobileDetect from 'mobile-detect';
 import { IntlProvider, FormattedMessage, addLocaleData } from 'react-intl';
 import en from 'react-intl/locale-data/en';
+import MovingAverage from 'moving-average';
 
 const mobiledetect = new MobileDetect(navigator.userAgent);
 
@@ -175,6 +176,7 @@ class UIRoot extends Component {
     this.setupTestTone();
     this.props.concurrentLoadDetector.addEventListener("concurrentload", this.onConcurrentLoad);
     this.handleForcedVREntryType();
+    this.micLevelMovingAverage = MovingAverage(200);
     this.props.scene.addEventListener("loaded", this.onSceneLoaded);
   }
 
@@ -365,7 +367,9 @@ class UIRoot extends Component {
         v = Math.max(levels[x] - 127, v);
       }
 
-      this.setState({ micLevel: v / 128.0 })
+      const level = v / 128.0 ;
+      this.micLevelMovingAverage.push(Date.now(), level);
+      this.setState({ micLevel: this.micLevelMovingAverage.movingAverage() })
     }, 50);
 
     this.setState({ mediaStream, micUpdateInterval });
@@ -446,29 +450,38 @@ class UIRoot extends Component {
 
     const selectedMicDeviceId = this.state.micDevices.filter(d => d.label === selectedMicLabel).map(d => d.deviceId)[0];
 
+    const maxLevelHeight = 111;
+    const micClip = { clip: `rect(${maxLevelHeight - Math.floor(this.state.micLevel * maxLevelHeight)}px, 111px, 111px, 0px)` };
+    const speakerClip = { clip: `rect(${this.state.tonePlaying ? 0 : maxLevelHeight}px, 111px, 111px, 0px)` };
+
     const audioSetupPanel = this.state.entryStep === ENTRY_STEPS.audio_setup
     ? (
         <div className="audio-setup-panel">
-          <div className="audio-setup-panel--title">
+          <div className="audio-setup-panel__title">
             <FormattedMessage id="audio.title"/>
           </div>
-          <div className="audio-setup-panel--subtitle">
+          <div className="audio-setup-panel__subtitle">
             { mobiledetect.mobile() || this.state.enterInVR  && (<FormattedMessage id={ mobiledetect.mobile() ? "audio.subtitle-mobile" : "audio.subtitle-desktop" }/>) }
           </div>
-          <div className="audio-setup-panel--device-chooser">
-            <select className="audio-setup-panel--device-chooser--dropdown" value={selectedMicDeviceId} onChange={this.micDeviceChanged}>
+          <div className="audio-setup-panel__levels">
+            <div className="audio-setup-panel__levels__mic">
+              <img src="./src/assets/images/mic_level.png" srcSet="mic_level@2x.png 2x" className="audio-setup-panel__levels__mic_icon"/>
+              <img src="./src/assets/images/level_fill.png" srcSet="level_fill@2x.png 2x" className="audio-setup-panel__levels__level" style={ micClip }/>
+            </div>
+            <div className="audio-setup-panel__levels__speaker">
+              <img src="./src/assets/images/speaker_level.png" srcSet="speaker_level@2x.png 2x" className="audio-setup-panel__levels__speaker_icon"/>
+              <img src="./src/assets/images/level_fill.png" srcSet="level_fill@2x.png 2x" className="audio-setup-panel__levels__level" style={ speakerClip }/>
+            </div>
+          </div>
+          <div className="audio-setup-panel__device-chooser">
+            <select className="audio-setup-panel__device-chooser__dropdown" value={selectedMicDeviceId} onChange={this.micDeviceChanged}>
               { this.state.micDevices.map(d => (<option key={ d.deviceId } value={ d.deviceId }>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{d.label}</option>)) }
             </select>
-            <div className="audio-setup-panel--device-chooser--mic-icon">
-              <img src="./src/assets/images/mic_small.png"/>
+            <div className="audio-setup-panel__device-chooser__mic-icon">
+              <img src="./src/assets/images/mic_small.png" srcSet="mic_small@2x.png 2x"/>
             </div>
           </div>
-          <br/>
-          { this.state.tonePlaying && (<div>Tone</div>) }
-          <br/>
-          { this.state.micLevel }
-          <br/>
-          <div className="audio-setup-panel--enter-button" onClick={this.onAudioReadyButton}>
+          <div className="audio-setup-panel__enter-button" onClick={this.onAudioReadyButton}>
             <FormattedMessage id="audio.enter-now"/>
           </div>
         </div>
diff --git a/src/room.scss b/src/room.scss
index 75a99a2dd2b9761b9ed76046de620bec34b078a7..10386c8e6d691a4cba7346729e8bdca0e8fcd2eb 100644
--- a/src/room.scss
+++ b/src/room.scss
@@ -225,16 +225,16 @@ $darker-grey: rgba(64, 64, 64, 1.0);
   align-items: center;
 }
 
-.audio-setup-panel--title {
+.audio-setup-panel__title {
   font-size: 1.3em;
 }
 
-.audio-setup-panel--subtitle {
+.audio-setup-panel__subtitle {
   font-size: 1.0em;
   padding-top: 4px;
 }
 
-.audio-setup-panel--device-chooser {
+.audio-setup-panel__device-chooser {
   display: flex;
   flex-direction: column;
   justify-content: center;
@@ -242,11 +242,11 @@ $darker-grey: rgba(64, 64, 64, 1.0);
   position: relative;
 }
 
-.audio-setup-panel--enter-button {
+.audio-setup-panel__enter-button {
   @extend %bottom-button;
 }
 
-.audio-setup-panel--device-chooser--dropdown {
+.audio-setup-panel__device-chooser__dropdown {
   @extend %rounded-border;
   @extend %default-font;
 
@@ -257,8 +257,52 @@ $darker-grey: rgba(64, 64, 64, 1.0);
   width: 90%;
 }
 
-.audio-setup-panel--device-chooser--mic-icon {
+.audio-setup-panel__device-chooser__mic-icon {
   position: absolute;
   left: 7.5%;
   top: 10px;
 }
+
+.audio-setup-panel__levels {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  display: flex;
+  justify-content: space-evenly;
+  align-items: center;
+  width: 100%;
+}
+
+.audio-setup-panel__levels__mic {
+  position:relative;
+  width: 111px;
+  height: 111px;
+}
+
+.audio-setup-panel__levels__mic_icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 2;
+}
+
+.audio-setup-panel__levels__speaker {
+  position:relative;
+  width: 111px;
+  height: 111px;
+}
+
+.audio-setup-panel__levels__speaker_icon {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 2;
+}
+
+.audio-setup-panel__levels__level {
+  position: absolute;
+  top: 0;
+  left: 0;
+  opacity: 1.0;
+  z-index: 1;
+}
+
diff --git a/yarn.lock b/yarn.lock
index 5537648881ac821176d0ea06de1f151ee01e3fe0..427f56fd979b463ecc157fc334f9318dea64628a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5113,6 +5113,10 @@ move-concurrently@^1.0.1:
     rimraf "^2.5.4"
     run-queue "^1.0.3"
 
+moving-average@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/moving-average/-/moving-average-1.0.0.tgz#b1247ba8dd2d7927c619f1eac8036cf933d65adc"
+
 ms@0.7.1:
   version "0.7.1"
   resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"