diff --git a/src/scene.js b/src/scene.js
index <HASH>..<HASH> 100755
--- a/src/scene.js
+++ b/src/scene.js
@@ -542,6 +542,12 @@ export default class Scene {
                 }
             }
 
+            // Skip proxy tiles if new tiles have finished loading this style
+            if (!tile.shouldProxyForStyle(style)) {
+                log('debug', `Scene.renderStyle(): Skip proxy tile for style '${style}' `, tile, tile.proxy_for);
+                continue;
+            }
+
             // Tile-specific state
             this.view.setupTile(tile, program);
 
diff --git a/src/tile.js b/src/tile.js
index <HASH>..<HASH> 100755
--- a/src/tile.js
+++ b/src/tile.js
@@ -487,6 +487,13 @@ export default class Tile {
         }
     }
 
+    // Proxy tiles only need to render a specific style if any of the tiles they are proxying *for*
+    // haven't finished loading that style yet. If all proxied tiles *have* data for that style, then it's
+    // safe to hide the proxy tile's version.
+    shouldProxyForStyle (style) {
+        return !this.proxy_for || this.proxy_for.some(t => t.meshes[style] == null);
+    }
+
     // Update model matrix and tile uniforms
     setupProgram ({ model, model32 }, program) {
         // Tile origin
tiles: skip rendering proxy tile's style if tiles it is proxying for have all finished loading that style