diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 0e53a14..3a45825 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,5 +1,6 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
+    <option name="ENABLE_SECOND_REFORMAT" value="true" />
     <JavaCodeStyleSettings>
       <option name="DO_NOT_WRAP_AFTER_SINGLE_ANNOTATION" value="true" />
       <option name="ANNOTATION_PARAMETER_WRAP" value="1" />
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 601ecd9..5e186a4 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -2,6 +2,7 @@
   <profile version="1.0">
     <option name="myName" value="Project Default" />
     <inspection_tool class="DeprecatedCallableAddReplaceWith" enabled="false" level="INFO" enabled_by_default="false" />
+    <inspection_tool class="EnhancedSwitchMigration" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="EqualsReplaceableByObjectsCall" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
     <inspection_tool class="ForCanBeForeach" enabled="false" level="WARNING" enabled_by_default="false">
       <option name="REPORT_INDEXED_LOOP" value="false" />
diff --git a/issue-repro-compose/src/main/java/com/airbnb/lottie/issues/compose/ComposeIssueReproActivity.kt b/issue-repro-compose/src/main/java/com/airbnb/lottie/issues/compose/ComposeIssueReproActivity.kt
index abf6dc2..f4f7b01 100755
--- a/issue-repro-compose/src/main/java/com/airbnb/lottie/issues/compose/ComposeIssueReproActivity.kt
+++ b/issue-repro-compose/src/main/java/com/airbnb/lottie/issues/compose/ComposeIssueReproActivity.kt
@@ -21,7 +21,7 @@
 
     @Composable
     fun Content() {
-        val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.heart))
+        val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.color))
         val progress by animateLottieCompositionAsState(composition, iterations = LottieConstants.IterateForever)
         LottieAnimation(composition, { progress })
     }
diff --git a/issue-repro-compose/src/main/res/raw/color.json b/issue-repro-compose/src/main/res/raw/color.json
new file mode 100644
index 0000000..a0c1a15
--- /dev/null
+++ b/issue-repro-compose/src/main/res/raw/color.json
@@ -0,0 +1 @@
+{"v":"5.10.2","fr":60,"ip":0,"op":60,"w":256,"h":256,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[174.203,174.203],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1,0,0,1]},{"t":59,"s":[0.056433867663,0,1,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.102,7.102],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60,"st":0,"ct":1,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index e493288..3edc1d9 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -515,7 +515,7 @@
       return;
     }
     compositionLayer = new CompositionLayer(
-        this, LayerParser.parse(composition), composition.getLayers(), composition);
+        this, null, LayerParser.parse(composition), composition.getLayers(), composition);
     if (outlineMasksAndMattes) {
       compositionLayer.setOutlineMasksAndMattes(true);
     }
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/Content.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/Content.java
index e8801a8..15998c0 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/Content.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/Content.java
@@ -5,5 +5,7 @@
 public interface Content {
   String getName();
 
+  void updateDirtyNodes();
+
   void setContents(List<Content> contentsBefore, List<Content> contentsAfter);
 }
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
index 46732a8..94b274d 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
@@ -31,6 +31,11 @@
 
 public class FillContent
     implements DrawingContent, BaseKeyframeAnimation.AnimationListener, KeyPathElementContent {
+  private static final int DIRTY_FLAG_COLOR = 1;
+  private static final int DIRTY_FLAG_OPACITY = 1 << 1;
+  private static final int DIRTY_FLAG_COLOR_FILTER = 1 << 2;
+  private static final int DIRTY_FLAG_BLUR = 1 << 3;
+  private static final int DIRTY_FLAG_DROP_SHADOW = 1 << 3;
   private final Path path = new Path();
   private final Paint paint = new LPaint(Paint.ANTI_ALIAS_FLAG);
   private final BaseLayer layer;
@@ -46,6 +51,8 @@
 
   @Nullable private DropShadowKeyframeAnimation dropShadowAnimation;
 
+  private int dirtyFlags = 0;
+
   public FillContent(final LottieDrawable lottieDrawable, BaseLayer layer, ShapeFill fill) {
     this.layer = layer;
     name = fill.getName();
@@ -53,7 +60,7 @@
     this.lottieDrawable = lottieDrawable;
     if (layer.getBlurEffect() != null) {
       blurAnimation = layer.getBlurEffect().getBlurriness().createAnimation();
-      blurAnimation.addUpdateListener(this);
+      blurAnimation.addUpdateListener(() -> setDirty(DIRTY_FLAG_BLUR));
       layer.addAnimation(blurAnimation);
     }
     if (layer.getDropShadowEffect() != null) {
@@ -80,6 +87,14 @@
     lottieDrawable.invalidateSelf();
   }
 
+  @Override public void updateDirtyNodes() {
+    if (isDirty(DIRTY_FLAG_COLOR | DIRTY_FLAG_OPACITY)) {
+      int color = ((ColorKeyframeAnimation) this.colorAnimation).getIntValue();
+      int alpha = (int) ((parentAlpha / 255f * opacityAnimation.getValue() / 100f) * 255);
+      paint.setColor((clamp(alpha, 0, 255) << 24) | (color & 0xFFFFFF));
+    }
+  }
+
   @Override public void setContents(List<Content> contentsBefore, List<Content> contentsAfter) {
     for (int i = 0; i < contentsAfter.size(); i++) {
       Content content = contentsAfter.get(i);
@@ -98,9 +113,6 @@
       return;
     }
     L.beginSection("FillContent#draw");
-    int color = ((ColorKeyframeAnimation) this.colorAnimation).getIntValue();
-    int alpha = (int) ((parentAlpha / 255f * opacityAnimation.getValue() / 100f) * 255);
-    paint.setColor((clamp(alpha, 0, 255) << 24) | (color & 0xFFFFFF));
 
     if (colorFilterAnimation != null) {
       paint.setColorFilter(colorFilterAnimation.getValue());
@@ -191,4 +203,13 @@
       dropShadowAnimation.setRadiusCallback((LottieValueCallback<Float>) callback);
     }
   }
+
+  private void setDirty(int flag) {
+    dirtyFlags |= flag;
+    layer.onValueChanged();
+  }
+
+  private boolean isDirty(int flag) {
+    return (dirtyFlags & flag) != 0;
+  }
 }
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java
index 1f54ac0..a37ef4c 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java
@@ -19,7 +19,7 @@
 
   private final String name;
   private final boolean hidden;
-  private final LottieDrawable lottieDrawable;
+  private final BaseLayer layer;
   private final ShapeKeyframeAnimation shapeAnimation;
   @Nullable private List<ShapeModifierContent> shapeModifierContents;
 
@@ -29,19 +29,15 @@
   public ShapeContent(LottieDrawable lottieDrawable, BaseLayer layer, ShapePath shape) {
     name = shape.getName();
     hidden = shape.isHidden();
-    this.lottieDrawable = lottieDrawable;
+    this.layer = layer;
     shapeAnimation = shape.getShapePath().createAnimation();
     layer.addAnimation(shapeAnimation);
     shapeAnimation.addUpdateListener(this);
   }
 
   @Override public void onValueChanged() {
-    invalidate();
-  }
-
-  private void invalidate() {
     isPathValid = false;
-    lottieDrawable.invalidateSelf();
+    layer.onValueChanged();
   }
 
   @Override public void setContents(List<Content> contentsBefore, List<Content> contentsAfter) {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
index 5775c18..582bb3f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
@@ -39,8 +39,7 @@
 import java.util.Collections;
 import java.util.List;
 
-public abstract class BaseLayer
-    implements DrawingContent, BaseKeyframeAnimation.AnimationListener, KeyPathElement {
+public abstract class BaseLayer implements DrawingContent, BaseKeyframeAnimation.AnimationListener, KeyPathElement {
   /**
    * These flags were in Canvas but they were deprecated and removed.
    * TODO: test removing these on older versions of Android.
@@ -50,23 +49,22 @@
   private static final int MATRIX_SAVE_FLAG = 0x01;
   private static final int SAVE_FLAGS = CLIP_SAVE_FLAG | CLIP_TO_LAYER_SAVE_FLAG | MATRIX_SAVE_FLAG;
 
-  @Nullable
-  static BaseLayer forModel(
-      CompositionLayer compositionLayer, Layer layerModel, LottieDrawable drawable, LottieComposition composition) {
+  private static final int DIRTY_FLAG_CHILD_LAYER = 1;
+
+  @Nullable static BaseLayer forModel(CompositionLayer compositionLayer, Layer layerModel, LottieDrawable drawable, LottieComposition composition) {
     switch (layerModel.getLayerType()) {
       case SHAPE:
         return new ShapeLayer(drawable, layerModel, compositionLayer, composition);
       case PRE_COMP:
-        return new CompositionLayer(drawable, layerModel,
-            composition.getPrecomps(layerModel.getRefId()), composition);
+        return new CompositionLayer(drawable, compositionLayer, layerModel, composition.getPrecomps(layerModel.getRefId()), composition);
       case SOLID:
-        return new SolidLayer(drawable, layerModel);
+        return new SolidLayer(drawable, compositionLayer, layerModel);
       case IMAGE:
-        return new ImageLayer(drawable, layerModel);
+        return new ImageLayer(drawable, compositionLayer, layerModel);
       case NULL:
-        return new NullLayer(drawable, layerModel);
+        return new NullLayer(drawable, compositionLayer, layerModel);
       case TEXT:
-        return new TextLayer(drawable, layerModel);
+        return new TextLayer(drawable, compositionLayer, layerModel);
       case UNKNOWN:
       default:
         // Do nothing
@@ -91,19 +89,16 @@
   private final String drawTraceName;
   final Matrix boundsMatrix = new Matrix();
   final LottieDrawable lottieDrawable;
+  @Nullable private final CompositionLayer compositionLayer;
   final Layer layerModel;
-  @Nullable
-  private MaskKeyframeAnimation mask;
-  @Nullable
-  private FloatKeyframeAnimation inOutAnimation;
-  @Nullable
-  private BaseLayer matteLayer;
+  @Nullable private MaskKeyframeAnimation mask;
+  @Nullable private FloatKeyframeAnimation inOutAnimation;
+  @Nullable private BaseLayer matteLayer;
   /**
    * This should only be used by {@link #buildParentLayerListIfNeeded()}
    * to construct the list of parent layers.
    */
-  @Nullable
-  private BaseLayer parentLayer;
+  @Nullable private BaseLayer parentLayer;
   private List<BaseLayer> parentLayers;
 
   private final List<BaseKeyframeAnimation<?, ?>> animations = new ArrayList<>();
@@ -116,8 +111,11 @@
   float blurMaskFilterRadius = 0f;
   @Nullable BlurMaskFilter blurMaskFilter;
 
-  BaseLayer(LottieDrawable lottieDrawable, Layer layerModel) {
+  private int dirtyFlags;
+
+  BaseLayer(LottieDrawable lottieDrawable, CompositionLayer compositionLayer, Layer layerModel) {
     this.lottieDrawable = lottieDrawable;
+    this.compositionLayer = compositionLayer;
     this.layerModel = layerModel;
     drawTraceName = layerModel.getName() + "#draw";
     if (layerModel.getMatteType() == Layer.MatteType.INVERT) {
@@ -157,8 +155,7 @@
     outlineMasksAndMattes = outline;
   }
 
-  @Override
-  public void onValueChanged() {
+  @Override public void onValueChanged() {
     invalidateSelf();
   }
 
@@ -190,8 +187,16 @@
     }
   }
 
-  private void invalidateSelf() {
-    lottieDrawable.invalidateSelf();
+  public boolean isDirty() {
+    return dirtyFlags != 0;
+  }
+
+  public void invalidateSelf() {
+    if (compositionLayer == null) {
+      lottieDrawable.invalidateSelf();
+    } else {
+      compositionLayer.invalidateSelf();
+    }
   }
 
   public void addAnimation(@Nullable BaseKeyframeAnimation<?, ?> newAnimation) {
@@ -205,10 +210,7 @@
     animations.remove(animation);
   }
 
-  @CallSuper
-  @Override
-  public void getBounds(
-      RectF outBounds, Matrix parentMatrix, boolean applyParents) {
+  @CallSuper @Override public void getBounds(RectF outBounds, Matrix parentMatrix, boolean applyParents) {
     rect.set(0, 0, 0, 0);
     buildParentLayerListIfNeeded();
     boundsMatrix.set(parentMatrix);
@@ -226,8 +228,7 @@
     boundsMatrix.preConcat(transform.getMatrix());
   }
 
-  @Override
-  public void draw(Canvas canvas, Matrix parentMatrix, int parentAlpha) {
+  @Override public void draw(Canvas canvas, Matrix parentMatrix, int parentAlpha) {
     L.beginSection(drawTraceName);
     if (!visible || layerModel.isHidden()) {
       L.endSection(drawTraceName);
@@ -338,8 +339,7 @@
   }
 
   private void recordRenderTime(float ms) {
-    lottieDrawable.getComposition()
-        .getPerformanceTracker().recordRenderTime(layerModel.getName(), ms);
+    lottieDrawable.getComposition().getPerformanceTracker().recordRenderTime(layerModel.getName(), ms);
 
   }
 
@@ -391,12 +391,8 @@
           if (i == 0) {
             maskBoundsRect.set(tempMaskBoundsRect);
           } else {
-            maskBoundsRect.set(
-                Math.min(maskBoundsRect.left, tempMaskBoundsRect.left),
-                Math.min(maskBoundsRect.top, tempMaskBoundsRect.top),
-                Math.max(maskBoundsRect.right, tempMaskBoundsRect.right),
-                Math.max(maskBoundsRect.bottom, tempMaskBoundsRect.bottom)
-            );
+            maskBoundsRect.set(Math.min(maskBoundsRect.left, tempMaskBoundsRect.left), Math.min(maskBoundsRect.top, tempMaskBoundsRect.top),
+                Math.max(maskBoundsRect.right, tempMaskBoundsRect.right), Math.max(maskBoundsRect.bottom, tempMaskBoundsRect.bottom));
           }
       }
     }
@@ -496,8 +492,8 @@
     return true;
   }
 
-  private void applyAddMask(Canvas canvas, Matrix matrix,
-      BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
+  private void applyAddMask(Canvas canvas, Matrix matrix, BaseKeyframeAnimation<ShapeData, Path> maskAnimation,
+      BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
     Path maskPath = maskAnimation.getValue();
     path.set(maskPath);
     path.transform(matrix);
@@ -505,8 +501,8 @@
     canvas.drawPath(path, contentPaint);
   }
 
-  private void applyInvertedAddMask(Canvas canvas, Matrix matrix,
-      BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
+  private void applyInvertedAddMask(Canvas canvas, Matrix matrix, BaseKeyframeAnimation<ShapeData, Path> maskAnimation,
+      BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
     Utils.saveLayerCompat(canvas, rect, contentPaint);
     canvas.drawRect(rect, contentPaint);
     Path maskPath = maskAnimation.getValue();
@@ -524,8 +520,8 @@
     canvas.drawPath(path, dstOutPaint);
   }
 
-  private void applyInvertedSubtractMask(Canvas canvas, Matrix matrix,
-      BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
+  private void applyInvertedSubtractMask(Canvas canvas, Matrix matrix, BaseKeyframeAnimation<ShapeData, Path> maskAnimation,
+      BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
     Utils.saveLayerCompat(canvas, rect, dstOutPaint);
     canvas.drawRect(rect, contentPaint);
     dstOutPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
@@ -536,8 +532,8 @@
     canvas.restore();
   }
 
-  private void applyIntersectMask(Canvas canvas, Matrix matrix,
-      BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
+  private void applyIntersectMask(Canvas canvas, Matrix matrix, BaseKeyframeAnimation<ShapeData, Path> maskAnimation,
+      BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
     Utils.saveLayerCompat(canvas, rect, dstInPaint);
     Path maskPath = maskAnimation.getValue();
     path.set(maskPath);
@@ -547,8 +543,8 @@
     canvas.restore();
   }
 
-  private void applyInvertedIntersectMask(Canvas canvas, Matrix matrix,
-      BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
+  private void applyInvertedIntersectMask(Canvas canvas, Matrix matrix, BaseKeyframeAnimation<ShapeData, Path> maskAnimation,
+      BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
     Utils.saveLayerCompat(canvas, rect, dstInPaint);
     canvas.drawRect(rect, contentPaint);
     dstOutPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
@@ -601,6 +597,9 @@
     L.endSection("BaseLayer#setProgress");
   }
 
+  void updateDirtyNodes() {
+  }
+
   private void buildParentLayerListIfNeeded() {
     if (parentLayers != null) {
       return;
@@ -618,13 +617,11 @@
     }
   }
 
-  @Override
-  public String getName() {
+  @Override public String getName() {
     return layerModel.getName();
   }
 
-  @Nullable
-  public BlurEffect getBlurEffect() {
+  @Nullable public BlurEffect getBlurEffect() {
     return layerModel.getBlurEffect();
   }
 
@@ -637,19 +634,15 @@
     return blurMaskFilter;
   }
 
-  @Nullable
-  public DropShadowEffect getDropShadowEffect() {
+  @Nullable public DropShadowEffect getDropShadowEffect() {
     return layerModel.getDropShadowEffect();
   }
 
-  @Override
-  public void setContents(List<Content> contentsBefore, List<Content> contentsAfter) {
+  @Override public void setContents(List<Content> contentsBefore, List<Content> contentsAfter) {
     // Do nothing
   }
 
-  @Override
-  public void resolveKeyPath(
-      KeyPath keyPath, int depth, List<KeyPath> accumulator, KeyPath currentPartialKeyPath) {
+  @Override public void resolveKeyPath(KeyPath keyPath, int depth, List<KeyPath> accumulator, KeyPath currentPartialKeyPath) {
     if (matteLayer != null) {
       KeyPath matteCurrentPartialKeyPath = currentPartialKeyPath.addKey(matteLayer.getName());
       if (keyPath.fullyResolvesTo(matteLayer.getName(), depth)) {
@@ -680,13 +673,10 @@
     }
   }
 
-  void resolveChildKeyPath(
-      KeyPath keyPath, int depth, List<KeyPath> accumulator, KeyPath currentPartialKeyPath) {
+  void resolveChildKeyPath(KeyPath keyPath, int depth, List<KeyPath> accumulator, KeyPath currentPartialKeyPath) {
   }
 
-  @CallSuper
-  @Override
-  public <T> void addValueCallback(T property, @Nullable LottieValueCallback<T> callback) {
+  @CallSuper @Override public <T> void addValueCallback(T property, @Nullable LottieValueCallback<T> callback) {
     transform.applyValueCallback(property, callback);
   }
 }
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java
index 7c923a6..b5dd3c4 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java
@@ -37,9 +37,9 @@
 
   private boolean clipToCompositionBounds = true;
 
-  public CompositionLayer(LottieDrawable lottieDrawable, Layer layerModel, List<Layer> layerModels,
-      LottieComposition composition) {
-    super(lottieDrawable, layerModel);
+  public CompositionLayer(LottieDrawable lottieDrawable, @Nullable CompositionLayer compositionLayer,
+      Layer layerModel, List<Layer> layerModels, LottieComposition composition) {
+    super(lottieDrawable, compositionLayer, layerModel);
 
     AnimatableFloatValue timeRemapping = layerModel.getTimeRemapping();
     if (timeRemapping != null) {
@@ -51,8 +51,7 @@
       this.timeRemapping = null;
     }
 
-    LongSparseArray<BaseLayer> layerMap =
-        new LongSparseArray<>(composition.getLayers().size());
+    LongSparseArray<BaseLayer> layerMap = new LongSparseArray<>(composition.getLayers().size());
 
     BaseLayer mattedLayer = null;
     for (int i = layerModels.size() - 1; i >= 0; i--) {
@@ -166,9 +165,22 @@
     for (int i = layers.size() - 1; i >= 0; i--) {
       layers.get(i).setProgress(progress);
     }
+    updateDirtyNodes();
     L.endSection("CompositionLayer#setProgress");
   }
 
+  @Override
+  public void updateDirtyNodes() {
+    L.beginSection("CompositionLayer#updateDirtyNodes");
+    for (int i = layers.size() - 1; i >= 0; i--) {
+      BaseLayer layer = layers.get(i);
+      if (layer.isDirty()) {
+        layer.updateDirtyNodes();
+      }
+    }
+    L.endSection("CompositionLayer#updateDirtyNodes");
+  }
+
   public float getProgress() {
     return progress;
   }
@@ -210,17 +222,13 @@
     return hasMatte;
   }
 
-  @Override
-  protected void resolveChildKeyPath(KeyPath keyPath, int depth, List<KeyPath> accumulator,
-      KeyPath currentPartialKeyPath) {
+  @Override protected void resolveChildKeyPath(KeyPath keyPath, int depth, List<KeyPath> accumulator, KeyPath currentPartialKeyPath) {
     for (int i = 0; i < layers.size(); i++) {
       layers.get(i).resolveKeyPath(keyPath, depth, accumulator, currentPartialKeyPath);
     }
   }
 
-  @SuppressWarnings("unchecked")
-  @Override
-  public <T> void addValueCallback(T property, @Nullable LottieValueCallback<T> callback) {
+  @SuppressWarnings("unchecked") @Override public <T> void addValueCallback(T property, @Nullable LottieValueCallback<T> callback) {
     super.addValueCallback(property, callback);
 
     if (property == LottieProperty.TIME_REMAP) {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
index 6cd60b6..7d5b7a7 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
@@ -29,8 +29,8 @@
   @Nullable private BaseKeyframeAnimation<ColorFilter, ColorFilter> colorFilterAnimation;
   @Nullable private BaseKeyframeAnimation<Bitmap, Bitmap> imageAnimation;
 
-  ImageLayer(LottieDrawable lottieDrawable, Layer layerModel) {
-    super(lottieDrawable, layerModel);
+  ImageLayer(LottieDrawable lottieDrawable, CompositionLayer compositionLayer, Layer layerModel) {
+    super(lottieDrawable, compositionLayer, layerModel);
     lottieImageAsset = lottieDrawable.getLottieImageAssetForId(layerModel.getRefId());
   }
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/NullLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/NullLayer.java
index 045cabf..3959598 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/NullLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/NullLayer.java
@@ -7,8 +7,8 @@
 import com.airbnb.lottie.LottieDrawable;
 
 public class NullLayer extends BaseLayer {
-  NullLayer(LottieDrawable lottieDrawable, Layer layerModel) {
-    super(lottieDrawable, layerModel);
+  NullLayer(LottieDrawable lottieDrawable, CompositionLayer compositionLayer, Layer layerModel) {
+    super(lottieDrawable, compositionLayer, layerModel);
   }
 
   @Override void drawLayer(Canvas canvas, Matrix parentMatrix, int parentAlpha) {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java
index 3a82138..2866b71 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java
@@ -24,7 +24,7 @@
   private final CompositionLayer compositionLayer;
 
   ShapeLayer(LottieDrawable lottieDrawable, Layer layerModel, CompositionLayer compositionLayer, LottieComposition composition) {
-    super(lottieDrawable, layerModel);
+    super(lottieDrawable, compositionLayer, layerModel);
     this.compositionLayer = compositionLayer;
 
     // Naming this __container allows it to be ignored in KeyPath matching.
@@ -33,6 +33,10 @@
     contentGroup.setContents(Collections.<Content>emptyList(), Collections.<Content>emptyList());
   }
 
+  @Override void updateDirtyNodes() {
+    super.updateDirtyNodes();
+  }
+
   @Override void drawLayer(@NonNull Canvas canvas, Matrix parentMatrix, int parentAlpha) {
     contentGroup.draw(canvas, parentMatrix, parentAlpha);
   }
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
index 993e1b3..36147e3 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
@@ -25,8 +25,8 @@
   private final Layer layerModel;
   @Nullable private BaseKeyframeAnimation<ColorFilter, ColorFilter> colorFilterAnimation;
 
-  SolidLayer(LottieDrawable lottieDrawable, Layer layerModel) {
-    super(lottieDrawable, layerModel);
+  SolidLayer(LottieDrawable lottieDrawable, CompositionLayer compositionLayer, Layer layerModel) {
+    super(lottieDrawable, compositionLayer, layerModel);
     this.layerModel = layerModel;
 
     paint.setAlpha(0);
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java
index 99e9023..eb4f97f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java
@@ -76,8 +76,8 @@
   @Nullable
   private BaseKeyframeAnimation<Typeface, Typeface> typefaceCallbackAnimation;
 
-  TextLayer(LottieDrawable lottieDrawable, Layer layerModel) {
-    super(lottieDrawable, layerModel);
+  TextLayer(LottieDrawable lottieDrawable, CompositionLayer compositionLayer, Layer layerModel) {
+    super(lottieDrawable, compositionLayer, layerModel);
     this.lottieDrawable = lottieDrawable;
     composition = layerModel.getComposition();
     //noinspection ConstantConditions
