Recorded painted path should not mutate.
diff --git a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java
index e41f742..995bce9 100644
--- a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java
+++ b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java
@@ -161,7 +161,7 @@
 
   @Implementation
   public void drawPath(Path path, Paint paint) {
-    pathPaintEvents.add(new PathPaintHistoryEvent(new Path(path), paint));
+    pathPaintEvents.add(new PathPaintHistoryEvent(new Path(path), new Paint(paint)));
 
     separateLines();
     appendDescription("Path " + shadowOf(path).getPoints().toString());
diff --git a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java
index 5576fae..1f37c18 100644
--- a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java
+++ b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java
@@ -12,6 +12,7 @@
 import org.robolectric.util.ReflectionHelpers.ClassParameter;
 
 import static android.os.Build.VERSION_CODES.N;
+import static org.robolectric.Shadows.shadowOf;
 
 /**
  * Shadow for {@link android.graphics.Paint}.
@@ -44,10 +45,31 @@
 
   public void __constructor__(int flags) {
     this.flags = flags;
-    antiAlias = (flags & Paint.ANTI_ALIAS_FLAG) == Paint.ANTI_ALIAS_FLAG;
     Shadow.invokeConstructor(Paint.class, paint, ClassParameter.from(int.class, flags));
   }
 
+  public void __constructor__(Paint paint) {
+    ShadowPaint other = shadowOf(paint);
+    this.color = other.color;
+    this.style = other.style;
+    this.cap = other.cap;
+    this.join = other.join;
+    this.width = other.width;
+    this.shadowRadius = other.shadowRadius;
+    this.shadowDx = other.shadowDx;
+    this.shadowDy = other.shadowDy;
+    this.shadowColor = other.shadowColor;
+    this.shader = other.shader;
+    this.alpha = other.alpha;
+    this.filter = other.filter;
+    this.antiAlias = other.antiAlias;
+    this.dither = other.dither;
+    this.flags = other.flags;
+    this.pathEffect = other.pathEffect;
+
+    Shadow.invokeConstructor(Paint.class, paint, ClassParameter.from(Paint.class, paint));
+  }
+
   @Implementation(minSdk = N)
   public static long nInit() {
     return 1;
@@ -59,6 +81,11 @@
   }
 
   @Implementation
+  public void setFlags(int flags) {
+    this.flags = flags;
+  }
+
+  @Implementation
   public Shader setShader(Shader shader) {
     this.shader = shader;
     return shader;
@@ -245,7 +272,7 @@
 
   @Implementation
   public void setAntiAlias(boolean antiAlias) {
-    this.antiAlias = antiAlias;
+    this.flags = (flags & ~Paint.ANTI_ALIAS_FLAG) | (antiAlias ? Paint.ANTI_ALIAS_FLAG : 0);
   }
 
   @Implementation
@@ -260,7 +287,7 @@
 
   @Implementation
   public final boolean isAntiAlias() {
-    return antiAlias;
+    return (flags & Paint.ANTI_ALIAS_FLAG) == Paint.ANTI_ALIAS_FLAG;
   }
 
   @Implementation
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
index eb385c9..643f7c8 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
@@ -101,13 +101,21 @@
     path.lineTo(10, 10);
 
     Paint paint = new Paint();
+    paint.setColor(Color.RED);
     paint.setAlpha(7);
     canvas.drawPath(path, paint);
 
+    // changing the values on this Paint shouldn't affect recorded painted path
+    paint.setColor(Color.BLUE);
+    paint.setAlpha(8);
+
     ShadowCanvas shadow = shadowOf(canvas);
     assertThat(shadow.getPathPaintHistoryCount()).isEqualTo(1);
-    assertEquals(shadowOf(shadow.getDrawnPath(0)).getPoints().get(0), new ShadowPath.Point(10, 10, LINE_TO));
-    assertThat(shadow.getDrawnPathPaint(0)).isEqualTo(paint);
+    ShadowPath drawnPath = shadowOf(shadow.getDrawnPath(0));
+    assertEquals(drawnPath.getPoints().get(0), new ShadowPath.Point(10, 10, LINE_TO));
+    Paint drawnPathPaint = shadow.getDrawnPathPaint(0);
+    assertThat(drawnPathPaint.getColor()).isEqualTo(Color.RED);
+    assertThat(drawnPathPaint.getAlpha()).isEqualTo(7);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
index a427c37..e1985b9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
@@ -1,5 +1,6 @@
 package org.robolectric.shadows;
 
+import android.graphics.Color;
 import android.graphics.Paint;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,6 +32,8 @@
     ShadowPaint shadowPaint = shadowOf(paint);
     shadowPaint.setAntiAlias(true);
     assertTrue(paint.isAntiAlias());
+    shadowPaint.setAntiAlias(false);
+    assertFalse(paint.isAntiAlias());
   }
 
   @Test
@@ -43,6 +46,19 @@
   }
 
   @Test
+  public void testCtorWithPaint() {
+    Paint paint = new Paint();
+    paint.setColor(Color.RED);
+    paint.setAlpha(72);
+    paint.setFlags(2345);
+
+    Paint other = new Paint(paint);
+    assertThat(other.getColor()).isEqualTo(Color.RED);
+    assertThat(other.getAlpha()).isEqualTo(72);
+    assertThat(other.getFlags()).isEqualTo(2345);
+  }
+
+  @Test
   public void shouldGetAndSetTextAlignment() throws Exception {
     Paint paint = Shadow.newInstanceOf(Paint.class);
     assertThat(paint.getTextAlign()).isEqualTo(Paint.Align.LEFT);