diff --git a/modules/svg/include/SkSVGFe.h b/modules/svg/include/SkSVGFe.h
index 155634b..ac4d8c4 100644
--- a/modules/svg/include/SkSVGFe.h
+++ b/modules/svg/include/SkSVGFe.h
@@ -21,7 +21,7 @@
         return node->tag() == SkSVGTag::kFeTurbulence || node->tag() == SkSVGTag::kFeColorMatrix ||
                node->tag() == SkSVGTag::kFeComposite || node->tag() == SkSVGTag::kFeFlood ||
                node->tag() == SkSVGTag::kFeGaussianBlur || node->tag() == SkSVGTag::kFeOffset ||
-               node->tag() == SkSVGTag::kFeBlend;
+               node->tag() == SkSVGTag::kFeBlend || node->tag() == SkSVGTag::kFeMorphology;
     }
 
     sk_sp<SkImageFilter> makeImageFilter(const SkSVGRenderContext& ctx,
diff --git a/modules/svg/include/SkSVGFeMorphology.h b/modules/svg/include/SkSVGFeMorphology.h
new file mode 100644
index 0000000..172460f
--- /dev/null
+++ b/modules/svg/include/SkSVGFeMorphology.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkSVGFeMorphology_DEFINED
+#define SkSVGFeMorphology_DEFINED
+
+#include "modules/svg/include/SkSVGFe.h"
+#include "modules/svg/include/SkSVGTypes.h"
+
+class SkSVGFeMorphology : public SkSVGFe {
+public:
+    struct Radius {
+        SkSVGNumberType fX;
+        SkSVGNumberType fY;
+    };
+
+    enum class Operator {
+        kErode,
+        kDilate,
+    };
+
+    static sk_sp<SkSVGFeMorphology> Make() {
+        return sk_sp<SkSVGFeMorphology>(new SkSVGFeMorphology());
+    }
+
+    SVG_ATTR(Operator, Operator, Operator::kErode)
+    SVG_ATTR(Radius  , Radius  , Radius({0, 0}))
+
+protected:
+    sk_sp<SkImageFilter> onMakeImageFilter(const SkSVGRenderContext&,
+                                           const SkSVGFilterContext&) const override;
+
+    std::vector<SkSVGFeInputType> getInputs() const override { return {this->getIn()}; }
+
+    bool parseAndSetAttribute(const char*, const char*) override;
+
+private:
+    SkSVGFeMorphology() : INHERITED(SkSVGTag::kFeMorphology) {}
+
+    using INHERITED = SkSVGFe;
+};
+
+#endif  // SkSVGFeMorphology_DEFINED
diff --git a/modules/svg/include/SkSVGNode.h b/modules/svg/include/SkSVGNode.h
index 28b21c3..71c161f 100644
--- a/modules/svg/include/SkSVGNode.h
+++ b/modules/svg/include/SkSVGNode.h
@@ -30,6 +30,7 @@
     kFeComposite,
     kFeFlood,
     kFeGaussianBlur,
+    kFeMorphology,
     kFeOffset,
     kFeTurbulence,
     kFilter,
diff --git a/modules/svg/src/SkSVGDOM.cpp b/modules/svg/src/SkSVGDOM.cpp
index e20fdde..989f865 100644
--- a/modules/svg/src/SkSVGDOM.cpp
+++ b/modules/svg/src/SkSVGDOM.cpp
@@ -21,6 +21,7 @@
 #include "modules/svg/include/SkSVGFeComposite.h"
 #include "modules/svg/include/SkSVGFeFlood.h"
 #include "modules/svg/include/SkSVGFeGaussianBlur.h"
+#include "modules/svg/include/SkSVGFeMorphology.h"
 #include "modules/svg/include/SkSVGFeOffset.h"
 #include "modules/svg/include/SkSVGFeTurbulence.h"
 #include "modules/svg/include/SkSVGFilter.h"
@@ -266,7 +267,8 @@
     { "feComposite"   , []() -> sk_sp<SkSVGNode> { return SkSVGFeComposite::Make();    }},
     { "feFlood"       , []() -> sk_sp<SkSVGNode> { return SkSVGFeFlood::Make();        }},
     { "feGaussianBlur", []() -> sk_sp<SkSVGNode> { return SkSVGFeGaussianBlur::Make(); }},
-    { "feOffset"      , []() -> sk_sp<SkSVGNode> { return SkSVGFeOffset::Make();   }},
+    { "feMorphology"  , []() -> sk_sp<SkSVGNode> { return SkSVGFeMorphology::Make();   }},
+    { "feOffset"      , []() -> sk_sp<SkSVGNode> { return SkSVGFeOffset::Make();       }},
     { "feTurbulence"  , []() -> sk_sp<SkSVGNode> { return SkSVGFeTurbulence::Make();   }},
     { "filter"        , []() -> sk_sp<SkSVGNode> { return SkSVGFilter::Make();         }},
     { "g"             , []() -> sk_sp<SkSVGNode> { return SkSVGG::Make();              }},
diff --git a/modules/svg/src/SkSVGFeMorphology.cpp b/modules/svg/src/SkSVGFeMorphology.cpp
new file mode 100644
index 0000000..2489a5b
--- /dev/null
+++ b/modules/svg/src/SkSVGFeMorphology.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "include/effects/SkImageFilters.h"
+#include "modules/svg/include/SkSVGAttributeParser.h"
+#include "modules/svg/include/SkSVGFeMorphology.h"
+#include "modules/svg/include/SkSVGFilterContext.h"
+#include "modules/svg/include/SkSVGRenderContext.h"
+#include "modules/svg/include/SkSVGValue.h"
+
+bool SkSVGFeMorphology::parseAndSetAttribute(const char* name, const char* value) {
+    return INHERITED::parseAndSetAttribute(name, value) ||
+           this->setOperator(SkSVGAttributeParser::parse<SkSVGFeMorphology::Operator>(
+                   "operator", name, value)) ||
+           this->setRadius(SkSVGAttributeParser::parse<SkSVGFeMorphology::Radius>(
+                   "radius", name, value));
+}
+
+sk_sp<SkImageFilter> SkSVGFeMorphology::onMakeImageFilter(const SkSVGRenderContext& ctx,
+                                                          const SkSVGFilterContext& fctx) const {
+    const SkRect cropRect = this->resolveFilterSubregion(ctx, fctx);
+    const SkSVGColorspace colorspace = this->resolveColorspace(ctx);
+    sk_sp<SkImageFilter> input = fctx.resolveInput(ctx, this->getIn(), colorspace);
+
+    SkScalar rx = fRadius.fX;
+    SkScalar ry = fRadius.fY;
+    if (fctx.primitiveUnits().type() == SkSVGObjectBoundingBoxUnits::Type::kObjectBoundingBox) {
+        SkASSERT(ctx.node());
+        const SkRect objBounds = ctx.node()->objectBoundingBox(ctx);
+        rx *= objBounds.width();
+        ry *= objBounds.height();
+    }
+
+    switch (fOperator) {
+        case Operator::kErode:
+            return SkImageFilters::Erode(rx, ry, input, cropRect);
+        case Operator::kDilate:
+            return SkImageFilters::Dilate(rx, ry, input, cropRect);
+    }
+
+    SkUNREACHABLE;
+}
+
+template <>
+bool SkSVGAttributeParser::parse<SkSVGFeMorphology::Operator>(SkSVGFeMorphology::Operator* op) {
+    static constexpr std::tuple<const char*, SkSVGFeMorphology::Operator> gMap[] = {
+            { "dilate", SkSVGFeMorphology::Operator::kDilate },
+            { "erode" , SkSVGFeMorphology::Operator::kErode  },
+    };
+
+    return this->parseEnumMap(gMap, op) && this->parseEOSToken();
+}
+
+template <>
+bool SkSVGAttributeParser::parse<SkSVGFeMorphology::Radius>(SkSVGFeMorphology::Radius* radius) {
+    std::vector<SkSVGNumberType> values;
+    if (!this->parse(&values)) {
+        return false;
+    }
+
+    radius->fX = values[0];
+    radius->fY = values.size() > 1 ? values[1] : values[0];
+    return true;
+}
diff --git a/modules/svg/svg.gni b/modules/svg/svg.gni
index a2fbea4..b9b7a84 100644
--- a/modules/svg/svg.gni
+++ b/modules/svg/svg.gni
@@ -22,6 +22,7 @@
   "$_include/SkSVGFeComposite.h",
   "$_include/SkSVGFeFlood.h",
   "$_include/SkSVGFeGaussianBlur.h",
+  "$_include/SkSVGFeMorphology.h",
   "$_include/SkSVGFeOffset.h",
   "$_include/SkSVGFeTurbulence.h",
   "$_include/SkSVGFilter.h",
@@ -64,6 +65,7 @@
   "$_src/SkSVGFeComposite.cpp",
   "$_src/SkSVGFeFlood.cpp",
   "$_src/SkSVGFeGaussianBlur.cpp",
+  "$_src/SkSVGFeMorphology.cpp",
   "$_src/SkSVGFeOffset.cpp",
   "$_src/SkSVGFeTurbulence.cpp",
   "$_src/SkSVGFilter.cpp",
