diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 3890eae4c3..ec452cb260 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -2170,7 +2170,7 @@ bool Application::event(QEvent* event) {
     // handle custom URL
     if (event->type() == QEvent::FileOpen) {
 
-		QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event);
+        QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event);
 
         QUrl url = fileEvent->url();
 
@@ -4361,8 +4361,13 @@ namespace render {
                     auto scene = DependencyManager::get<SceneScriptingInterface>()->getStage();
                     auto sceneKeyLight = scene->getKeyLight();
                     auto defaultSkyboxAmbientTexture = qApp->getDefaultSkyboxAmbientTexture();
-                    sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance());
-                    sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture);
+                    if (defaultSkyboxAmbientTexture) {
+                        sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance());
+                        sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture);
+                    } else {
+                        static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex(
+                            "Failed to get a valid Default Skybox Ambient Texture ? probably because it couldn't be find during initialization step");
+                    }
                     // fall through: render defaults skybox
                 } else {
                     break;
diff --git a/interface/src/scripting/MenuScriptingInterface.cpp b/interface/src/scripting/MenuScriptingInterface.cpp
index 7eb80b5946..2fa7470561 100644
--- a/interface/src/scripting/MenuScriptingInterface.cpp
+++ b/interface/src/scripting/MenuScriptingInterface.cpp
@@ -125,3 +125,8 @@ void MenuScriptingInterface::setIsOptionChecked(const QString& menuOption, bool
                 Q_ARG(const QString&, menuOption),
                 Q_ARG(bool, isChecked));
 }
+
+void MenuScriptingInterface::triggerOption(const QString& menuOption) {
+    QMetaObject::invokeMethod(Menu::getInstance(), "triggerOption", Q_ARG(const QString&, menuOption));    
+}
+
diff --git a/interface/src/scripting/MenuScriptingInterface.h b/interface/src/scripting/MenuScriptingInterface.h
index 03ff4b512a..5b8a437529 100644
--- a/interface/src/scripting/MenuScriptingInterface.h
+++ b/interface/src/scripting/MenuScriptingInterface.h
@@ -48,6 +48,8 @@ public slots:
     
     bool isOptionChecked(const QString& menuOption);
     void setIsOptionChecked(const QString& menuOption, bool isChecked);
+
+    void triggerOption(const QString& menuOption);
     
 signals:
     void menuItemEvent(const QString& menuItem);
diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp
index c528c26b99..0f9dd698fd 100644
--- a/interface/src/scripting/WindowScriptingInterface.cpp
+++ b/interface/src/scripting/WindowScriptingInterface.cpp
@@ -206,3 +206,7 @@ void WindowScriptingInterface::takeSnapshot(bool notify, float aspectRatio) {
 void WindowScriptingInterface::shareSnapshot(const QString& path) {
     qApp->shareSnapshot(path);
 }
+
+bool WindowScriptingInterface::isPhysicsEnabled() {
+    return qApp->isPhysicsEnabled();
+}
diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h
index 9303636a1f..f4a89ae221 100644
--- a/interface/src/scripting/WindowScriptingInterface.h
+++ b/interface/src/scripting/WindowScriptingInterface.h
@@ -54,6 +54,7 @@ public slots:
     void copyToClipboard(const QString& text);
     void takeSnapshot(bool notify = true, float aspectRatio = 0.0f);
     void shareSnapshot(const QString& path);
+    bool isPhysicsEnabled();
 
 signals:
     void domainChanged(const QString& domainHostname);
diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp
index 3e6e53ffc3..36b7b4886f 100644
--- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp
+++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp
@@ -511,9 +511,7 @@ void GL45Texture::stripToMip(uint16_t newMinMip) {
     _minMip = newMinMip;
     // Re-sync the sampler to force access to the new mip level
     syncSampler();
-    size_t oldSize = _size;
     updateSize();
-    Q_ASSERT(_size > oldSize);
 
 
     // Re-insert into the texture-by-mips map if appropriate
diff --git a/libraries/ui/src/ui/Menu.h b/libraries/ui/src/ui/Menu.h
index 895e40fe68..ee60a031c3 100644
--- a/libraries/ui/src/ui/Menu.h
+++ b/libraries/ui/src/ui/Menu.h
@@ -62,7 +62,6 @@ public:
     MenuWrapper* getMenu(const QString& menuName);
     MenuWrapper* getSubMenuFromName(const QString& menuName, MenuWrapper* menu);
 
-    void triggerOption(const QString& menuOption);
     QAction* getActionForOption(const QString& menuOption);
 
     QAction* addActionToQMenuAndActionHash(MenuWrapper* destinationMenu,
@@ -112,6 +111,8 @@ public slots:
 
     void toggleDeveloperMenus();
     void toggleAdvancedMenus();
+    
+    void triggerOption(const QString& menuOption);
 
     static bool isSomeSubmenuShown() { return _isSomeSubmenuShown; }
 
diff --git a/scripts/developer/tests/performance/domain-check.js b/scripts/developer/tests/performance/domain-check.js
index eceffa278b..f085c3f685 100644
--- a/scripts/developer/tests/performance/domain-check.js
+++ b/scripts/developer/tests/performance/domain-check.js
@@ -20,15 +20,18 @@ var EXPECTED_HMD_FRAMERATE = 90;
 var MAXIMUM_LOAD_TIME = 60;         // seconds
 var MINIMUM_AVATARS = 25;             // FIXME: not implemented yet. Requires agent scripts. Idea is to have them organize themselves to the right number.
 
-var version = 1;
+var version = 2;
 function debug() {
     print.apply(null, [].concat.apply(['hrs fixme', version], [].map.call(arguments, JSON.stringify)));
 }
 
-var emptyishPlace = 'empty';
-var cachePlaces = ['localhost', 'Welcome'];
-var isInCachePlace = cachePlaces.indexOf(location.hostname) >= 0;
-var defaultPlace = isInCachePlace ? 'Playa' : location.hostname;
+function isNowIn(place) { // true if currently in specified place
+    return location.hostname.toLowerCase() === place.toLowerCase();
+}
+
+var cachePlaces = ['dev-Welcome', 'localhost']; // For now, list the lighter weight one first.
+var isInCachePlace = cachePlaces.some(isNowIn);
+var defaultPlace = isInCachePlace ? 'dev-Playa' : location.hostname;
 var prompt = "domain-check.js version " + version + "\n\nWhat place should we enter?";
 debug(cachePlaces, isInCachePlace, defaultPlace, prompt);
 var entryPlace = Window.prompt(prompt, defaultPlace);
@@ -73,10 +76,17 @@ function startTwirl(targetRotation, degreesPerUpdate, interval, strafeDistance,
 
 function doLoad(place, continuationWithLoadTime) { // Go to place and call continuationWithLoadTime(loadTimeInSeconds)
     var start = Date.now(), timeout, onDownloadUpdate, finishedTwirl = false, loadTime;
+    // There are two ways to learn of changes: connect to change signals, or poll.
+    // Until we get reliable results, we'll poll.
+    var POLL_INTERVAL = 500, poll;
+    function setHandlers() {
+        //Stats.downloadsPendingChanged.connect(onDownloadUpdate); downloadsChanged, and physics...
+        poll = Script.setInterval(onDownloadUpdate, POLL_INTERVAL);
+    }
     function clearHandlers() {
         debug('clearHandlers');
-        Stats.downloadsPendingChanged.disconnect(onDownloadUpdate);
-        Stats.downloadsChanged.disconnect(onDownloadUpdate);
+        //Stats.downloadsPendingChanged.disconnect(onDownloadUpdate); downloadsChanged, and physics..
+        Script.clearInterval(poll);
     }
     function waitForLoad(flag) {
         debug('entry', place, 'initial downloads/pending', Stats.downloads, Stats.downloadsPending);
@@ -93,13 +103,11 @@ function doLoad(place, continuationWithLoadTime) { // Go to place and call conti
                 continuationWithLoadTime(loadTime);
             }
         });
-        Stats.downloadsPendingChanged.connect(onDownloadUpdate);
-        Stats.downloadsChanged.connect(onDownloadUpdate);
+        setHandlers();
     }
     function isLoading() {
-        // FIXME: This tells us when download are completed, but it doesn't tell us when the objects are parsed and loaded.
-        // We really want something like _physicsEnabled, but that isn't signalled.
-        return Stats.downloads || Stats.downloadsPending;
+        // FIXME: We should also confirm that textures have loaded.
+        return Stats.downloads || Stats.downloadsPending || !Window.isPhysicsEnabled();
     }
     onDownloadUpdate = function onDownloadUpdate() {
         debug('update downloads/pending', Stats.downloads, Stats.downloadsPending);
@@ -114,17 +122,9 @@ function doLoad(place, continuationWithLoadTime) { // Go to place and call conti
         }
     };
 
-    function doit() {
-        debug('go', place);
-        location.hostChanged.connect(waitForLoad);
-        location.handleLookupString(place);
-    }
-    if (location.placename.toLowerCase() === place.toLowerCase()) {
-        location.handleLookupString(emptyishPlace);
-        Script.setTimeout(doit, 1000);
-    } else {
-        doit();
-    }
+    debug('go', place);
+    location.hostChanged.connect(waitForLoad);
+    location.handleLookupString(place);
 }
 
 var config = Render.getConfig("Stats");
@@ -144,6 +144,7 @@ function doRender(continuation) {
     });
 }
 
+var TELEPORT_PAUSE = 500;
 function maybePrepareCache(continuation) {
     var prepareCache = Window.confirm("Prepare cache?\n\n\
 Should we start with all and only those items cached that are encountered when visiting:\n" + cachePlaces.join(', ') + "\n\
@@ -151,8 +152,6 @@ If 'yes', cache will be cleared and we will visit these two, with a turn in each
 You would want to say 'no' (and make other preparations) if you were testing these places.");
 
     if (prepareCache) {
-        location.handleLookupString(emptyishPlace);
-        Window.alert("Please do menu Edit->Reload Content (Clears all caches) and THEN press 'ok'.");
         function loadNext() {
             var place = cachePlaces.shift();
             doLoad(place, function (prepTime) {
@@ -164,16 +163,19 @@ You would want to say 'no' (and make other preparations) if you were testing the
                 }
             });
         }
-        loadNext();
+        location.handleLookupString(cachePlaces[cachePlaces.length - 1]);
+        Menu.triggerOption("Reload Content (Clears all caches)");
+        Script.setTimeout(loadNext, TELEPORT_PAUSE);
     } else {
-        continuation();
+        location.handleLookupString(isNowIn(cachePlaces[0]) ? cachePlaces[1] : cachePlaces[0]);
+        Script.setTimeout(continuation, TELEPORT_PAUSE);
     }
 }
 
 function maybeRunTribbles(continuation) {
     if (Window.confirm("Run tribbles?\n\n\
 At most, only one participant should say yes.")) {
-        Script.load('http://howard-stearns.github.io/models/scripts/tests/performance/tribbles.js'); // FIXME: replace with AWS
+        Script.load('http://cdn.highfidelity.com/davidkelly/production/scripts/tests/performance/tribbles.js');
         Script.setTimeout(continuation, 3000);
     } else {
         continuation();
diff --git a/scripts/developer/tests/performance/tribbles.js b/scripts/developer/tests/performance/tribbles.js
index c9ae347a82..4c04f8b5b7 100644
--- a/scripts/developer/tests/performance/tribbles.js
+++ b/scripts/developer/tests/performance/tribbles.js
@@ -54,42 +54,46 @@ function randomVector(range) {
     };
 }
 
-Script.setInterval(function () {
-    if (!Entities.serversExist() || !Entities.canRez()) {
-        return;
-    }
-    if (totalCreated >= NUMBER_TO_CREATE) {
-        print("Created " + totalCreated + " tribbles.");
-        Script.stop();
-    }
+if (!Entities.canRezTmp()) {
+    Window.alert("Cannot create temp objects here.");
+    Script.stop();
+} else {
+    Script.setInterval(function () {
+        if (!Entities.serversExist()) {
+            return;
+        }
+        if (totalCreated >= NUMBER_TO_CREATE) {
+            print("Created " + totalCreated + " tribbles.");
+            Script.stop();
+        }
 
-    var i, numToCreate = RATE_PER_SECOND * (SCRIPT_INTERVAL / 1000.0);
-    var parameters = JSON.stringify({
-        moveTimeout: MOVE_TIMEOUT,
-        moveRate: MOVE_RATE,
-        editTimeout: EDIT_TIMEOUT,
-        editRate: EDIT_RATE,
-        debug: {flow: false, send: false, receive: false}
-    });
-    for (i = 0; (i < numToCreate) && (totalCreated < NUMBER_TO_CREATE); i++) {
-        Entities.addEntity({
-            userData: parameters,
-            type: TYPE,
-            name: "tribble-" + totalCreated,
-            position: Vec3.sum(center, randomVector({ x: RANGE, y: RANGE, z: RANGE })),
-            dimensions: {x: SIZE, y: SIZE, z: SIZE},
-            color: {red: Math.random() * 255, green: Math.random() * 255, blue: Math.random() * 255},
-            velocity: VELOCITY,
-            angularVelocity: Vec3.multiply(Math.random(), ANGULAR_VELOCITY),
-            damping: DAMPING,
-            angularDamping: ANGULAR_DAMPING,
-            gravity: GRAVITY,
-            collisionsWillMove: true,
-            lifetime: LIFETIME,
-            script: Script.resolvePath("tribbleEntity.js")
+        var i, numToCreate = RATE_PER_SECOND * (SCRIPT_INTERVAL / 1000.0);
+        var parameters = JSON.stringify({
+            moveTimeout: MOVE_TIMEOUT,
+            moveRate: MOVE_RATE,
+            editTimeout: EDIT_TIMEOUT,
+            editRate: EDIT_RATE,
+            debug: {flow: false, send: false, receive: false}
         });
+        for (i = 0; (i < numToCreate) && (totalCreated < NUMBER_TO_CREATE); i++) {
+            Entities.addEntity({
+                userData: parameters,
+                type: TYPE,
+                name: "tribble-" + totalCreated,
+                position: Vec3.sum(center, randomVector({ x: RANGE, y: RANGE, z: RANGE })),
+                dimensions: {x: SIZE, y: SIZE, z: SIZE},
+                color: {red: Math.random() * 255, green: Math.random() * 255, blue: Math.random() * 255},
+                velocity: VELOCITY,
+                angularVelocity: Vec3.multiply(Math.random(), ANGULAR_VELOCITY),
+                damping: DAMPING,
+                angularDamping: ANGULAR_DAMPING,
+                gravity: GRAVITY,
+                collisionsWillMove: true,
+                lifetime: LIFETIME,
+                script: Script.resolvePath("tribbleEntity.js")
+            });
 
-        totalCreated++;
-    }
-}, SCRIPT_INTERVAL);
-
+            totalCreated++;
+        }
+    }, SCRIPT_INTERVAL);
+}