diff --git a/gn/effects_imagefilters.gni b/gn/effects_imagefilters.gni
index d541aa0..223dc34 100644
--- a/gn/effects_imagefilters.gni
+++ b/gn/effects_imagefilters.gni
@@ -26,10 +26,9 @@
   "$_src/effects/imagefilters/SkMergeImageFilter.cpp",
   "$_src/effects/imagefilters/SkMorphologyImageFilter.cpp",
   "$_src/effects/imagefilters/SkOffsetImageFilter.cpp",
-  "$_src/effects/imagefilters/SkPaintImageFilter.cpp",
-  "$_src/effects/imagefilters/SkPaintImageFilter.h",
   "$_src/effects/imagefilters/SkPictureImageFilter.cpp",
   "$_src/effects/imagefilters/SkPictureImageFilter.h",
+  "$_src/effects/imagefilters/SkShaderImageFilter.cpp",
   "$_src/effects/imagefilters/SkTileImageFilter.cpp",
   "$_src/effects/imagefilters/SkTileImageFilter.h",
 ]
diff --git a/src/core/SkImageFilter_Base.h b/src/core/SkImageFilter_Base.h
index 4ad3760..ca74e63 100644
--- a/src/core/SkImageFilter_Base.h
+++ b/src/core/SkImageFilter_Base.h
@@ -498,5 +498,6 @@
 void SkRegisterMergeImageFilterFlattenable();
 void SkRegisterMorphologyImageFilterFlattenables();
 void SkRegisterOffsetImageFilterFlattenable();
+void SkRegisterShaderImageFilterFlattenable();
 
 #endif // SkImageFilter_Base_DEFINED
diff --git a/src/effects/imagefilters/SkImageFilters.cpp b/src/effects/imagefilters/SkImageFilters.cpp
index 6e1c091..e078251 100644
--- a/src/effects/imagefilters/SkImageFilters.cpp
+++ b/src/effects/imagefilters/SkImageFilters.cpp
@@ -9,7 +9,6 @@
 
 #include "include/core/SkPaint.h"
 
-#include "src/effects/imagefilters/SkPaintImageFilter.h"
 #include "src/effects/imagefilters/SkPictureImageFilter.h"
 #include "src/effects/imagefilters/SkTileImageFilter.h"
 
@@ -18,7 +17,6 @@
 #include "src/core/SkMatrixImageFilter.h"
 
 void SkImageFilters::RegisterFlattenables() {
-    SkPaintImageFilter::RegisterFlattenables();
     SkPictureImageFilter::RegisterFlattenables();
     SkTileImageFilter::RegisterFlattenables();
 }
@@ -39,36 +37,10 @@
 }
 #endif
 
-
-sk_sp<SkImageFilter> SkImageFilters::Paint(const SkPaint& paint, const CropRect& cropRect) {
-    return SkPaintImageFilter::Make(paint, cropRect);
-}
-
 sk_sp<SkImageFilter> SkImageFilters::Picture(sk_sp<SkPicture> pic, const SkRect& targetRect) {
     return SkPictureImageFilter::Make(std::move(pic), targetRect);
 }
 
-sk_sp<SkImageFilter> SkImageFilters::Shader(sk_sp<SkShader> shader, Dither dither,
-                                            const CropRect& cropRect) {
-    SkPaint paint;
-    paint.setShader(std::move(shader));
-    paint.setDither((bool) dither);
-    return SkPaintImageFilter::Make(paint, cropRect);
-}
-
-#ifdef SK_SUPPORT_LEGACY_IMPLICIT_FILTERQUALITY
-sk_sp<SkImageFilter> SkImageFilters::Shader(sk_sp<SkShader> shader, Dither dither,
-                                            SkFilterQuality filterQuality,
-                                            const CropRect& cropRect) {
-    SkPaint paint;
-    paint.setShader(std::move(shader));
-    paint.setDither((bool) dither);
-    // For SkImage::makeShader() shaders using SkImageShader::kInheritFromPaint sampling options
-    paint.setFilterQuality(filterQuality);
-    return SkPaintImageFilter::Make(paint, cropRect);
-}
-#endif
-
 sk_sp<SkImageFilter> SkImageFilters::Tile(
         const SkRect& src, const SkRect& dst, sk_sp<SkImageFilter> input) {
     return SkTileImageFilter::Make(src, dst, std::move(input));
diff --git a/src/effects/imagefilters/SkPaintImageFilter.cpp b/src/effects/imagefilters/SkPaintImageFilter.cpp
deleted file mode 100644
index 74591d4..0000000
--- a/src/effects/imagefilters/SkPaintImageFilter.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "src/effects/imagefilters/SkPaintImageFilter.h"
-
-#include "include/core/SkCanvas.h"
-#include "include/core/SkPaint.h"
-#include "src/core/SkImageFilter_Base.h"
-#include "src/core/SkReadBuffer.h"
-#include "src/core/SkSpecialImage.h"
-#include "src/core/SkSpecialSurface.h"
-#include "src/core/SkWriteBuffer.h"
-
-namespace {
-
-class SkPaintImageFilterImpl final : public SkImageFilter_Base {
-public:
-    SkPaintImageFilterImpl(const SkPaint& paint, const SkRect* rect)
-            : INHERITED(nullptr, 0, rect)
-            , fPaint(paint) {}
-
-    bool affectsTransparentBlack() const override;
-
-protected:
-    void flatten(SkWriteBuffer&) const override;
-    sk_sp<SkSpecialImage> onFilterImage(const Context&, SkIPoint* offset) const override;
-
-private:
-    friend void SkPaintImageFilter::RegisterFlattenables();
-    SK_FLATTENABLE_HOOKS(SkPaintImageFilterImpl)
-
-    SkPaint fPaint;
-
-    using INHERITED = SkImageFilter_Base;
-};
-
-} // end namespace
-
-sk_sp<SkImageFilter> SkPaintImageFilter::Make(const SkPaint& paint,
-                                              const SkRect* cropRect) {
-    return sk_sp<SkImageFilter>(new SkPaintImageFilterImpl(paint, cropRect));
-}
-
-void SkPaintImageFilter::RegisterFlattenables() {
-    SK_REGISTER_FLATTENABLE(SkPaintImageFilterImpl);
-    // TODO (michaelludwig) - Remove after grace period for SKPs to stop using old name
-    SkFlattenable::Register("SkPaintImageFilter", SkPaintImageFilterImpl::CreateProc);
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-sk_sp<SkFlattenable> SkPaintImageFilterImpl::CreateProc(SkReadBuffer& buffer) {
-    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
-    SkPaint paint;
-    buffer.readPaint(&paint, nullptr);
-    return SkPaintImageFilter::Make(paint, common.cropRect());
-}
-
-void SkPaintImageFilterImpl::flatten(SkWriteBuffer& buffer) const {
-    this->INHERITED::flatten(buffer);
-    buffer.writePaint(fPaint);
-}
-
-sk_sp<SkSpecialImage> SkPaintImageFilterImpl::onFilterImage(const Context& ctx,
-                                                            SkIPoint* offset) const {
-    SkIRect bounds;
-    const SkIRect srcBounds = SkIRect::MakeWH(ctx.sourceImage()->width(),
-                                              ctx.sourceImage()->height());
-    if (!this->applyCropRect(ctx, srcBounds, &bounds)) {
-        return nullptr;
-    }
-
-    sk_sp<SkSpecialSurface> surf(ctx.makeSurface(bounds.size()));
-    if (!surf) {
-        return nullptr;
-    }
-
-    SkCanvas* canvas = surf->getCanvas();
-    SkASSERT(canvas);
-
-    canvas->clear(0x0);
-
-    SkMatrix matrix(ctx.ctm());
-    matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
-    SkRect rect = SkRect::MakeIWH(bounds.width(), bounds.height());
-    SkMatrix inverse;
-    if (matrix.invert(&inverse)) {
-        inverse.mapRect(&rect);
-    }
-    canvas->setMatrix(matrix);
-    if (rect.isFinite()) {
-        canvas->drawRect(rect, fPaint);
-    }
-
-    offset->fX = bounds.fLeft;
-    offset->fY = bounds.fTop;
-    return surf->makeImageSnapshot();
-}
-
-bool SkPaintImageFilterImpl::affectsTransparentBlack() const {
-    return true;
-}
diff --git a/src/effects/imagefilters/SkPaintImageFilter.h b/src/effects/imagefilters/SkPaintImageFilter.h
deleted file mode 100644
index 6e9f381..0000000
--- a/src/effects/imagefilters/SkPaintImageFilter.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkPaintImageFilter_DEFINED
-#define SkPaintImageFilter_DEFINED
-
-#include "include/core/SkImageFilter.h"
-
-class SkPaint;
-
-// DEPRECATED: Use include/effects/SkImageFilters::Paint
-class SK_API SkPaintImageFilter  {
-public:
-    /** Create a new image filter which fills the given rectangle using the
-     *  given paint. If no rectangle is specified, an output is produced with
-     *  the same bounds as the input primitive (even though the input
-     *  primitive's pixels are not used for processing).
-     *  @param paint  Paint to use when filling the rect.
-     *  @param rect   Rectangle of output pixels. If NULL or a given crop edge is
-     *                not specified, the source primitive's bounds are used
-     *                instead.
-     */
-    static sk_sp<SkImageFilter> Make(const SkPaint& paint,
-                                     const SkRect* cropRect = nullptr);
-
-    static void RegisterFlattenables();
-
-private:
-    SkPaintImageFilter() = delete;
-};
-
-#endif
diff --git a/src/effects/imagefilters/SkShaderImageFilter.cpp b/src/effects/imagefilters/SkShaderImageFilter.cpp
new file mode 100644
index 0000000..477c714
--- /dev/null
+++ b/src/effects/imagefilters/SkShaderImageFilter.cpp
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/effects/SkImageFilters.h"
+#include "src/core/SkImageFilter_Base.h"
+#include "src/core/SkReadBuffer.h"
+#include "src/core/SkSpecialImage.h"
+#include "src/core/SkSpecialSurface.h"
+#include "src/core/SkWriteBuffer.h"
+
+namespace {
+
+class SkShaderImageFilter final : public SkImageFilter_Base {
+public:
+    SkShaderImageFilter(const SkPaint& paint, const SkRect* rect)
+            : INHERITED(nullptr, 0, rect)
+            , fPaint(paint) {}
+
+    static sk_sp<SkImageFilter> Make(const SkPaint& paint, const SkRect* rect) {
+        return sk_sp<SkImageFilter>(new SkShaderImageFilter(paint, rect));
+    }
+
+    bool affectsTransparentBlack() const override;
+
+protected:
+    void flatten(SkWriteBuffer&) const override;
+    sk_sp<SkSpecialImage> onFilterImage(const Context&, SkIPoint* offset) const override;
+
+private:
+    friend void ::SkRegisterShaderImageFilterFlattenable();
+    SK_FLATTENABLE_HOOKS(SkShaderImageFilter)
+
+    // This filter only applies the shader and dithering policy of the paint.
+    SkPaint fPaint;
+
+    using INHERITED = SkImageFilter_Base;
+};
+
+} // end namespace
+
+// TODO(michaelludwig) - Remove this deprecated factory once modules/svg is updated
+sk_sp<SkImageFilter> SkImageFilters::Paint(const SkPaint& paint, const CropRect& cropRect) {
+    return SkShaderImageFilter::Make(paint, cropRect);
+}
+
+sk_sp<SkImageFilter> SkImageFilters::Shader(sk_sp<SkShader> shader, Dither dither,
+                                            const CropRect& cropRect) {
+    SkPaint paint;
+    paint.setShader(std::move(shader));
+    paint.setDither((bool) dither);
+    return SkShaderImageFilter::Make(paint, cropRect);
+}
+
+#ifdef SK_SUPPORT_LEGACY_IMPLICIT_FILTERQUALITY
+sk_sp<SkImageFilter> SkImageFilters::Shader(sk_sp<SkShader> shader, Dither dither,
+                                            SkFilterQuality filterQuality,
+                                            const CropRect& cropRect) {
+    SkPaint paint;
+    paint.setShader(std::move(shader));
+    paint.setDither((bool) dither);
+    // For SkImage::makeShader() shaders using SkImageShader::kInheritFromPaint sampling options
+    paint.setFilterQuality(filterQuality);
+    return SkShaderImageFilter::Make(paint, cropRect);
+}
+#endif
+
+void SkRegisterShaderImageFilterFlattenable() {
+    SK_REGISTER_FLATTENABLE(SkShaderImageFilter);
+    // TODO (michaelludwig) - Remove after grace period for SKPs to stop using old name
+    SkFlattenable::Register("SkPaintImageFilter", SkShaderImageFilter::CreateProc);
+    SkFlattenable::Register("SkPaintImageFilterImpl", SkShaderImageFilter::CreateProc);
+}
+
+sk_sp<SkFlattenable> SkShaderImageFilter::CreateProc(SkReadBuffer& buffer) {
+    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
+    SkPaint paint;
+    buffer.readPaint(&paint, nullptr);
+    return SkShaderImageFilter::Make(paint, common.cropRect());
+}
+
+void SkShaderImageFilter::flatten(SkWriteBuffer& buffer) const {
+    this->INHERITED::flatten(buffer);
+    buffer.writePaint(fPaint);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+sk_sp<SkSpecialImage> SkShaderImageFilter::onFilterImage(const Context& ctx,
+                                                         SkIPoint* offset) const {
+    SkIRect bounds;
+    const SkIRect srcBounds = SkIRect::MakeWH(ctx.sourceImage()->width(),
+                                              ctx.sourceImage()->height());
+    if (!this->applyCropRect(ctx, srcBounds, &bounds)) {
+        return nullptr;
+    }
+
+    sk_sp<SkSpecialSurface> surf(ctx.makeSurface(bounds.size()));
+    if (!surf) {
+        return nullptr;
+    }
+
+    SkCanvas* canvas = surf->getCanvas();
+    SkASSERT(canvas);
+
+    canvas->clear(0x0);
+
+    SkMatrix matrix(ctx.ctm());
+    matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
+    SkRect rect = SkRect::MakeIWH(bounds.width(), bounds.height());
+    SkMatrix inverse;
+    if (matrix.invert(&inverse)) {
+        inverse.mapRect(&rect);
+    }
+    canvas->setMatrix(matrix);
+    if (rect.isFinite()) {
+        canvas->drawRect(rect, fPaint);
+    }
+
+    offset->fX = bounds.fLeft;
+    offset->fY = bounds.fTop;
+    return surf->makeImageSnapshot();
+}
+
+bool SkShaderImageFilter::affectsTransparentBlack() const {
+    return true;
+}
diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp
index 5856c0c5..7b4a697 100644
--- a/src/ports/SkGlobalInitialization_default.cpp
+++ b/src/ports/SkGlobalInitialization_default.cpp
@@ -131,6 +131,7 @@
         SkRegisterMergeImageFilterFlattenable();
         SkRegisterMorphologyImageFilterFlattenables();
         SkRegisterOffsetImageFilterFlattenable();
+        SkRegisterShaderImageFilterFlattenable();
         SK_REGISTER_FLATTENABLE(SkLocalMatrixImageFilter);
         SK_REGISTER_FLATTENABLE(SkMatrixImageFilter);
     }
