diff --git a/examples/lookWithMouse.js b/examples/lookWithMouse.js
index 70a98c0733..470a56bd63 100644
--- a/examples/lookWithMouse.js
+++ b/examples/lookWithMouse.js
@@ -86,4 +86,3 @@ MyAvatar.bodyRoll = 0;
 
 // would be nice to change to update
 Script.update.connect(update);
-Script.scriptEnding.connect(scriptEnding);
diff --git a/examples/progress.js b/examples/progress.js
index 6ee53c55e6..57a1fd1a07 100644
--- a/examples/progress.js
+++ b/examples/progress.js
@@ -13,9 +13,13 @@
 
 (function () {
 
-    var progress = 100,                             // %
+    var rawProgress = 100,                          // % raw value.
+        displayProgress = 100,                      // % smoothed value to display.
+        DISPLAY_PROGRESS_MINOR_MAXIMUM = 8,         // % displayed progress bar goes up to while 0% raw progress.
+        DISPLAY_PROGRESS_MINOR_INCREMENT = 0.1,     // % amount to increment display value each update when 0% raw progress.
+        DISPLAY_PROGRESS_MAJOR_INCREMENT = 5,       // % maximum amount to increment display value when >0% raw progress.
         alpha = 0.0,
-        alphaDelta = 0.0,                           // > 0 if fading in; < 0 if fading out/
+        alphaDelta = 0.0,                           // > 0 if fading in; < 0 if fading out.
         ALPHA_DELTA_IN = 0.15,
         ALPHA_DELTA_OUT = -0.02,
         fadeTimer = null,
@@ -23,18 +27,19 @@
         fadeWaitTimer = null,
         FADE_OUT_WAIT = 1000,                       // Wait before starting to fade out after progress 100%.
         visible = false,
-        BAR_WIDTH = 320,                            // Nominal dimension of SVG in pixels of visible portion (half) of the bar.
-        BAR_HEIGHT = 20,
+        BAR_WIDTH = 480,                            // Dimension of SVG in pixels of visible portion (half) of the bar.
+        BAR_HEIGHT = 30,
         BAR_URL = "http://hifi-public.s3.amazonaws.com/images/progress-bar.svg",
-        BACKGROUND_WIDTH = 360,
-        BACKGROUND_HEIGHT = 60,
-        BACKGROUND_URL = "http://hifi-public.s3.amazonaws.com/images/progress-bar-background.svg",
+        BACKGROUND_WIDTH = 540,
+        BACKGROUND_HEIGHT = 90,
+        BACKGROUND_URL = "http://ctrlaltstudio.com/hifi/progress-bar-background.svg",
+        //BACKGROUND_URL = "http://hifi-public.s3.amazonaws.com/images/progress-bar-background.svg",
         isOnHMD = false,
         windowWidth = 0,
         windowHeight = 0,
         background2D = {},
         bar2D = {},
-        SCALE_2D = 0.55,                            // Scale the SVGs for 2D display.
+        SCALE_2D = 0.35,                            // Scale the SVGs for 2D display.
         background3D = {},
         bar3D = {},
         ENABLE_VR_MODE_MENU_ITEM = "Enable VR Mode",
@@ -43,7 +48,7 @@
         PROGRESS_3D_ELEVATION = -0.8,               // Height of top middle of top notification relative to avatar eyes.
         PROGRESS_3D_YAW = 0.0,                      // Degrees relative to notifications direction.
         PROGRESS_3D_PITCH = -60.0,                  // Degrees from vertical.
-        SCALE_3D = 0.0017,                          // Scale the bar SVG for 3D display.
+        SCALE_3D = 0.0011,                          // Scale the bar SVG for 3D display.
         BACKGROUND_3D_SIZE = { x: 0.76, y: 0.08 },  // Match up with the 3D background with those of notifications.js notices.
         BACKGROUND_3D_COLOR = { red: 2, green: 2, blue: 2 },
         BACKGROUND_3D_ALPHA = 0.7;
@@ -89,56 +94,15 @@
     function onDownloadInfoChanged(info) {
         var i;
 
-        // Calculate progress
+        // Update raw progress value
         if (info.downloading.length + info.pending === 0) {
-            progress = 100;
+            rawProgress = 100;
         } else {
-            progress = 0;
+            rawProgress = 0;
             for (i = 0; i < info.downloading.length; i += 1) {
-                progress += info.downloading[i];
+                rawProgress += info.downloading[i];
             }
-            progress = progress / (info.downloading.length + info.pending);
-        }
-
-        // Update state
-        if (!visible) {  // Not visible because no recent downloads
-            if (progress < 100) {  // Have started downloading so fade in
-                visible = true;
-                alphaDelta = ALPHA_DELTA_IN;
-                fadeTimer = Script.setInterval(fade, FADE_INTERVAL);
-            }
-        } else if (alphaDelta !== 0.0) {  // Fading in or out
-            if (alphaDelta > 0) {
-                if (progress === 100) {  // Was donloading but now have finished so fade out
-                    alphaDelta = ALPHA_DELTA_OUT;
-                }
-            } else {
-                if (progress < 100) {  // Was finished downloading but have resumed so fade in
-                    alphaDelta = ALPHA_DELTA_IN;
-                }
-            }
-        } else {  // Fully visible because downloading or recently so
-            if (fadeWaitTimer === null) {
-                if (progress === 100) {  // Was downloading but have finished so fade out soon
-                    fadeWaitTimer = Script.setTimeout(function () {
-                        alphaDelta = ALPHA_DELTA_OUT;
-                        fadeTimer = Script.setInterval(fade, FADE_INTERVAL);
-                        fadeWaitTimer = null;
-                    }, FADE_OUT_WAIT);
-                }
-            } else {
-                if (progress < 100) {  // Was finished and waiting to fade out but have resumed downloading so don't fade out
-                    Script.clearInterval(fadeWaitTimer);
-                    fadeWaitTimer = null;
-                }
-            }
-        }
-
-        // Update progress bar
-        if (visible) {
-            Overlays.editOverlay(isOnHMD ? bar3D.overlay : bar2D.overlay, {
-                subImage: { x: BAR_WIDTH * (1 - progress / 100), y: 0, width: BAR_WIDTH, height: BAR_HEIGHT }
-            });
+            rawProgress = rawProgress / (info.downloading.length + info.pending);
         }
     }
 
@@ -200,7 +164,58 @@
             createOverlays();
         }
 
+        // Calculate progress value to display
+        if (rawProgress === 0 && displayProgress <= DISPLAY_PROGRESS_MINOR_MAXIMUM) {
+            displayProgress = Math.min(displayProgress + DISPLAY_PROGRESS_MINOR_INCREMENT, DISPLAY_PROGRESS_MINOR_MAXIMUM);
+        } else if (rawProgress < displayProgress) {
+            displayProgress = rawProgress;
+        } else if (rawProgress > displayProgress) {
+            displayProgress = Math.min(rawProgress, displayProgress + DISPLAY_PROGRESS_MAJOR_INCREMENT);
+        }  // else (rawProgress === displayProgress); do nothing.
+
+        // Update state
+        if (!visible) {  // Not visible because no recent downloads
+            if (displayProgress < 100) {  // Have started downloading so fade in
+                visible = true;
+                alphaDelta = ALPHA_DELTA_IN;
+                fadeTimer = Script.setInterval(fade, FADE_INTERVAL);
+            }
+        } else if (alphaDelta !== 0.0) {  // Fading in or out
+            if (alphaDelta > 0) {
+                if (displayProgress === 100) {  // Was downloading but now have finished so fade out
+                    alphaDelta = ALPHA_DELTA_OUT;
+                }
+            } else {
+                if (displayProgress < 100) {  // Was finished downloading but have resumed so fade in
+                    alphaDelta = ALPHA_DELTA_IN;
+                }
+            }
+        } else {  // Fully visible because downloading or recently so
+            if (fadeWaitTimer === null) {
+                if (displayProgress === 100) {  // Was downloading but have finished so fade out soon
+                    fadeWaitTimer = Script.setTimeout(function () {
+                        alphaDelta = ALPHA_DELTA_OUT;
+                        fadeTimer = Script.setInterval(fade, FADE_INTERVAL);
+                        fadeWaitTimer = null;
+                    }, FADE_OUT_WAIT);
+                }
+            } else {
+                if (displayProgress < 100) {  // Was finished and waiting to fade out but have resumed so don't fade out
+                    Script.clearInterval(fadeWaitTimer);
+                    fadeWaitTimer = null;
+                }
+            }
+        }
+
         if (visible) {
+
+            // Update progress bar
+            Overlays.editOverlay(isOnHMD ? bar3D.overlay : bar2D.overlay, {
+                visible: visible,
+                subImage: { x: BAR_WIDTH * (1 - displayProgress / 100), y: 0, width: BAR_WIDTH, height: BAR_HEIGHT }
+            });
+
+            // Update position
             if (isOnHMD) {
                 // Update 3D overlays to maintain positions relative to avatar
                 eyePosition = MyAvatar.getDefaultEyePosition();
diff --git a/interface/resources/icons/start-script.svg b/interface/resources/icons/start-script.svg
index 86354a555d..1401853fe4 100644
--- a/interface/resources/icons/start-script.svg
+++ b/interface/resources/icons/start-script.svg
@@ -536,22 +536,5 @@
        height="44.57473"
        x="84.498352"
        y="1050.0748" />
-    <g
-       id="g3322"
-       transform="translate(-46.607143,-3.5714285)">
-      <use
-         x="0"
-         y="0"
-         width="744.09448"
-         height="1052.3622"
-         transform="translate(0.5864354,0.4607839)"
-         xlink:href="#rect899"
-         id="use1503" />
-      <path
-         d="m 75.506508,1023.3478 1.372845,5.4631 -14.094975,-1.152 2.35e-4,7.2772 14.094975,-1.152 -1.372845,5.1249 13.761293,-7.6113 -13.761293,-7.9499 z"
-         id="rect899"
-         inkscape:connector-curvature="0"
-         style="fill:#d3d3d3;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.77974033;stroke-linecap:round;stroke-linejoin:round" />
-    </g>
   </g>
 </svg>
diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp
index 45820e2393..8cc27341d6 100644
--- a/interface/src/audio/AudioScope.cpp
+++ b/interface/src/audio/AudioScope.cpp
@@ -230,7 +230,7 @@ int AudioScope::addSilenceToScope(QByteArray* byteArray, int frameOffset, int si
     int samplesToBufferEnd = _samplesPerScope - frameOffset;
     if (silentSamples > samplesToBufferEnd) {
         memset(destination + frameOffset, 0, samplesToBufferEnd * sizeof(int16_t));
-        memset(destination, 0, silentSamples - samplesToBufferEnd * sizeof(int16_t));
+        memset(destination, 0, (silentSamples - samplesToBufferEnd) * sizeof(int16_t));
     } else {
         memset(destination + frameOffset, 0, silentSamples * sizeof(int16_t));
     }
diff --git a/libraries/audio/src/AudioEditBuffer.h b/libraries/audio/src/AudioEditBuffer.h
index b773fedfb8..66639f20bb 100644
--- a/libraries/audio/src/AudioEditBuffer.h
+++ b/libraries/audio/src/AudioEditBuffer.h
@@ -23,8 +23,8 @@ public:
     
     bool getZeroCrossing(uint32_t start, bool direction, float32_t epsilon, uint32_t& zero);
         
-    void linearFade(uint32_t start, uint32_t stop, bool slope);
-    void exponentialFade(uint32_t start, uint32_t stop, bool slope);
+    void linearFade(uint32_t start, uint32_t stop, bool increasing);
+    void exponentialFade(uint32_t start, uint32_t stop, bool increasing);
 };
 
 template< typename T >
@@ -74,7 +74,7 @@ inline bool AudioEditBuffer<T>::getZeroCrossing(uint32_t start, bool direction,
 }
 
 template< typename T >
-inline void AudioEditBuffer<T>::linearFade(uint32_t start, uint32_t stop, bool slope) {
+inline void AudioEditBuffer<T>::linearFade(uint32_t start, uint32_t stop, bool increasing) {
     
     if (start >= stop || start > this->_frameCount || stop > this->_frameCount ) {
         return;
@@ -84,7 +84,7 @@ inline void AudioEditBuffer<T>::linearFade(uint32_t start, uint32_t stop, bool s
     float32_t delta;
     float32_t gain;
     
-    if (slope) { // 0.0 to 1.0f in delta increments
+    if (increasing) { // 0.0 to 1.0f in delta increments
         delta = 1.0f / (float32_t)count;
         gain = 0.0f;
     } else { // 1.0f to 0.0f in delta increments
@@ -95,13 +95,13 @@ inline void AudioEditBuffer<T>::linearFade(uint32_t start, uint32_t stop, bool s
     for (uint32_t i = start; i < stop; ++i) {
         for (uint32_t j = 0; j < this->_channelCount; ++j) {
             this->_frameBuffer[j][i] *= gain;
-            gain += delta;
         }
+        gain += delta;
     }
 }
 
 template< typename T >
-inline void AudioEditBuffer<T>::exponentialFade(uint32_t start, uint32_t stop, bool slope) {
+inline void AudioEditBuffer<T>::exponentialFade(uint32_t start, uint32_t stop, bool increasing) {
     // TBD
 }
 
diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp
index 43f4dda565..c8c454ff14 100644
--- a/libraries/networking/src/LimitedNodeList.cpp
+++ b/libraries/networking/src/LimitedNodeList.cpp
@@ -310,20 +310,23 @@ int LimitedNodeList::updateNodeWithDataFromPacket(const SharedNodePointer& match
     
     matchingNode->setLastHeardMicrostamp(usecTimestampNow());
     
-    if (!matchingNode->getLinkedData() && linkedDataCreateCallback) {
+    NodeData* linkedData = matchingNode->getLinkedData();
+    if (!linkedData && linkedDataCreateCallback) {
         linkedDataCreateCallback(matchingNode.data());
     }
-    
-    QMutexLocker linkedDataLocker(&matchingNode->getLinkedData()->getMutex());
-    
-    return matchingNode->getLinkedData()->parseData(packet);
+   
+    if (linkedData) {
+        QMutexLocker linkedDataLocker(&linkedData->getMutex());
+        return linkedData->parseData(packet);
+    }
+    return 0;
 }
 
 int LimitedNodeList::findNodeAndUpdateWithDataFromPacket(const QByteArray& packet) {
     SharedNodePointer matchingNode = sendingNodeForPacket(packet);
     
     if (matchingNode) {
-        updateNodeWithDataFromPacket(matchingNode, packet);
+        return updateNodeWithDataFromPacket(matchingNode, packet);
     }
     
     // we weren't able to match the sender address to the address we have for this node, unlock and don't parse
diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp
index d35e11a1c3..f70c2d9b3c 100644
--- a/libraries/networking/src/NodeList.cpp
+++ b/libraries/networking/src/NodeList.cpp
@@ -347,7 +347,7 @@ void NodeList::handleICEConnectionToDomainServer() {
         qDebug() << "Sending ping packets to establish connectivity with domain-server with ID"
             << uuidStringWithoutCurlyBraces(_domainHandler.getICEDomainID());
         
-        // send the ping packet to the local and public sockets for this nodfe
+        // send the ping packet to the local and public sockets for this node
         QByteArray localPingPacket = constructPingPacket(PingType::Local, false, _domainHandler.getICEClientID());
         writeUnverifiedDatagram(localPingPacket, _domainHandler.getICEPeer().getLocalSocket());