diff --git a/reanimate-svg.cabal b/reanimate-svg.cabal
--- a/reanimate-svg.cabal
+++ b/reanimate-svg.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                reanimate-svg
-version:             0.11.0.0
+version:             0.12.0.0
 synopsis:            SVG file loader and serializer
 description:
   reanimate-svg provides types representing a SVG document,
@@ -63,3 +63,24 @@
                , lens              >= 4.6 && < 5
                , double-conversion >= 2.0.0.0 && < 3.0.0.0
                , hashable          >= 1.3.0.0
+
+test-suite w3c-spec
+  type: exitcode-stdio-1.0
+  main-is: W3C.hs
+  default-language:   Haskell2010
+  other-modules:
+  hs-source-dirs: test
+  ghc-options: -w
+  build-depends:
+    base,
+    directory,
+    filepath,
+    bytestring, process,
+    reanimate-svg,
+    Diff,
+    vector, linear,
+    QuickCheck >= 2.1.0, text,
+    temporary,
+    tasty, tasty-golden, tasty-hunit,
+    tasty-quickcheck, tasty-rerun >= 1.1.17,
+    tasty-expected-failure
diff --git a/src/Graphics/SvgTree.hs b/src/Graphics/SvgTree.hs
--- a/src/Graphics/SvgTree.hs
+++ b/src/Graphics/SvgTree.hs
@@ -4,6 +4,7 @@
   ( -- * Saving/Loading functions
     loadSvgFile,
     parseSvgFile,
+    parseSvg,
     unparse,
     xmlOfDocument,
     xmlOfTree,
@@ -46,6 +47,12 @@
   Maybe Document
 parseSvgFile filename fileContent =
   parseXMLDoc fileContent >>= unparseDocument filename
+
+parseSvg :: T.Text -> Tree
+parseSvg inp =
+  case parseXMLDoc inp of
+    Nothing -> error "Invalid XML"
+    Just xml -> unparse xml
 
 -- | Save a svg Document on a file on disk.
 saveXmlFile :: FilePath -> Document -> IO ()
diff --git a/src/Graphics/SvgTree/Types.hs b/src/Graphics/SvgTree/Types.hs
--- a/src/Graphics/SvgTree/Types.hs
+++ b/src/Graphics/SvgTree/Types.hs
@@ -59,6 +59,135 @@
     , FilterAttributes(..)
     , HasFilterAttributes(..)
     , FilterSource(..)
+
+    , Blend (..)
+    , BlendMode (..)
+    , blendDrawAttributes
+    , blendFilterAttr
+    , blendIn
+    , blendIn2
+    , blendMode
+
+    , ConvolveMatrix (..)
+    , convolveMatrixDrawAttributes
+    , convolveMatrixFilterAttr
+    , convolveMatrixIn
+    , convolveMatrixOrder
+    , convolveMatrixKernelMatrix
+    , convolveMatrixDivisor
+    , convolveMatrixBias
+    , convolveMatrixTargetX
+    , convolveMatrixTargetY
+    , convolveMatrixEdgeMode
+    , convolveMatrixKernelUnitLength
+    , convolveMatrixPreserveAlpha
+
+    , Morphology (..)
+    , OperatorType (..)
+    , NumberOptionalNumber (..)
+    , morphologyDrawAttributes
+    , morphologyFilterAttr
+    , morphologyIn
+    , morphologyOperator
+    , morphologyRadius
+
+    , SpecularLighting (..)
+    , specLightingDrawAttributes
+    , specLightingFilterAttr
+    , specLightingIn
+    , specLightingSurfaceScale
+    , specLightingSpecularConst
+    , specLightingSpecularExp
+    , specLightingKernelUnitLength
+
+    , DiffuseLighting
+    , diffuseLightingDrawAttributes
+    , diffuseLightingFilterAttr
+    , diffuseLightingIn
+    , diffuseLightingSurfaceScale
+    , diffuseLightingDiffuseConst
+    , diffuseLightingKernelUnitLength
+
+    , DropShadow (..)
+    , dropShadowDrawAttributes
+    , dropShadowFilterAttr
+    , dropShadowDx
+    , dropShadowDy
+    , dropShadowStdDeviation
+
+    , Flood (..)
+    , floodDrawAttributes
+    , floodFilterAttr
+    , floodColor
+    , floodOpacity
+
+    , Tile (..)
+    , tileDrawAttributes
+    , tileFilterAttr
+    , tileIn
+
+    , Offset (..)
+    , offsetDrawAttributes
+    , offsetFilterAttr
+    , offsetIn
+    , offsetDX
+    , offsetDY
+
+    , MergeNode (..)
+    , mergeNodeDrawAttributes
+    , mergeNodeIn
+
+    , Merge (..)
+    , mergeDrawAttributes
+    , mergeFilterAttributes
+    , mergeChildren
+
+    , ImageF (..)
+    , imageFDrawAttributes
+    , imageFFilterAttr
+    , imageFHref
+    , imageFAspectRatio
+
+    , ComponentTransfer (..)
+    , compTransferDrawAttributes
+    , compTransferFilterAttr
+    , compTransferChildren
+    , compTransferIn
+
+    , FuncA (..)
+    , FuncType (..)
+    , funcADrawAttributes
+    , funcAType
+    , funcATableValues
+    , funcASlope
+    , funcAIntercept
+    , funcAAmplitude
+    , funcAExponent
+    , FuncR (..)
+    , funcRDrawAttributes
+    , funcRType
+    , funcRTableValues
+    , funcRSlope
+    , funcRIntercept
+    , funcRAmplitude
+    , funcRExponent
+    , FuncG (..)
+    , funcGDrawAttributes
+    , funcGType
+    , funcGTableValues
+    , funcGSlope
+    , funcGIntercept
+    , funcGAmplitude
+    , funcGExponent
+    , FuncB (..)
+    , funcBDrawAttributes
+    , funcBType
+    , funcBTableValues
+    , funcBSlope
+    , funcBIntercept
+    , funcBAmplitude
+    , funcBExponent
+
     , ColorMatrixType(..)
     , colorMatrixDrawAttributes
     , colorMatrixFilterAttr
diff --git a/src/Graphics/SvgTree/Types/Hashable.hs b/src/Graphics/SvgTree/Types/Hashable.hs
--- a/src/Graphics/SvgTree/Types/Hashable.hs
+++ b/src/Graphics/SvgTree/Types/Hashable.hs
@@ -63,6 +63,39 @@
 
 deriving instance Hashable FilterElement
 
+deriving instance Hashable Blend
+deriving instance Hashable BlendMode
+
+deriving instance Hashable ConvolveMatrix
+
+deriving instance Hashable Morphology
+deriving instance Hashable OperatorType
+deriving instance Hashable NumberOptionalNumber
+
+deriving instance Hashable SpecularLighting
+
+deriving instance Hashable DropShadow
+
+deriving instance Hashable DiffuseLighting
+
+deriving instance Hashable Flood
+
+deriving instance Hashable Tile
+
+deriving instance Hashable Offset
+
+deriving instance Hashable Merge
+deriving instance Hashable MergeNode
+
+deriving instance Hashable ImageF
+
+deriving instance Hashable ComponentTransfer
+deriving instance Hashable FuncType
+deriving instance Hashable FuncA
+deriving instance Hashable FuncR
+deriving instance Hashable FuncG
+deriving instance Hashable FuncB
+
 deriving instance Hashable ColorMatrix
 
 deriving instance Hashable FilterSource
diff --git a/src/Graphics/SvgTree/Types/Instances.hs b/src/Graphics/SvgTree/Types/Instances.hs
--- a/src/Graphics/SvgTree/Types/Instances.hs
+++ b/src/Graphics/SvgTree/Types/Instances.hs
@@ -73,6 +73,54 @@
 instance HasDrawAttributes Composite where
   drawAttributes = compositeDrawAttributes
 
+instance HasDrawAttributes Blend where
+  drawAttributes = blendDrawAttributes
+
+instance HasDrawAttributes ConvolveMatrix where
+  drawAttributes = convolveMatrixDrawAttributes
+
+instance HasDrawAttributes Morphology where
+  drawAttributes = morphologyDrawAttributes
+
+instance HasDrawAttributes SpecularLighting where
+  drawAttributes = specLightingDrawAttributes
+
+instance HasDrawAttributes DropShadow where
+  drawAttributes = dropShadowDrawAttributes
+
+instance HasDrawAttributes DiffuseLighting where
+  drawAttributes = diffuseLightingDrawAttributes
+
+instance HasDrawAttributes ComponentTransfer where
+  drawAttributes = compTransferDrawAttributes
+
+instance HasDrawAttributes FuncA where
+  drawAttributes = funcADrawAttributes
+instance HasDrawAttributes FuncR where
+  drawAttributes = funcRDrawAttributes
+instance HasDrawAttributes FuncG where
+  drawAttributes = funcGDrawAttributes
+instance HasDrawAttributes FuncB where
+  drawAttributes = funcBDrawAttributes
+
+instance HasDrawAttributes Flood where
+  drawAttributes = floodDrawAttributes
+
+instance HasDrawAttributes Tile where
+  drawAttributes = tileDrawAttributes
+
+instance HasDrawAttributes Offset where
+  drawAttributes = offsetDrawAttributes
+
+instance HasDrawAttributes Merge where
+  drawAttributes = mergeDrawAttributes
+
+instance HasDrawAttributes ImageF where
+  drawAttributes = imageFDrawAttributes
+
+instance HasDrawAttributes MergeNode where
+  drawAttributes = mergeNodeDrawAttributes
+
 instance HasDrawAttributes ColorMatrix where
   drawAttributes = colorMatrixDrawAttributes
 
@@ -88,9 +136,37 @@
 instance HasDrawAttributes Text where
   drawAttributes = textRoot . spanDrawAttributes
 
+
 instance HasFilterAttributes Filter where
   filterAttributes = filterSelfAttributes
 
+instance HasFilterAttributes Blend where
+  filterAttributes = blendFilterAttr
+
+instance HasFilterAttributes ConvolveMatrix where
+  filterAttributes = convolveMatrixFilterAttr
+
+instance HasFilterAttributes Morphology where
+  filterAttributes = morphologyFilterAttr
+
+instance HasFilterAttributes SpecularLighting where
+  filterAttributes = specLightingFilterAttr
+
+instance HasFilterAttributes DropShadow where
+  filterAttributes = dropShadowFilterAttr
+
+instance HasFilterAttributes DiffuseLighting where
+  filterAttributes = diffuseLightingFilterAttr
+
+instance HasFilterAttributes Flood where
+  filterAttributes = floodFilterAttr
+
+instance HasFilterAttributes Tile where
+  filterAttributes = tileFilterAttr
+
+instance HasFilterAttributes Offset where
+  filterAttributes = offsetFilterAttr
+
 instance HasFilterAttributes Composite where
   filterAttributes = compositeFilterAttr
 
@@ -106,55 +182,66 @@
 instance HasFilterAttributes DisplacementMap where
   filterAttributes = displacementMapFilterAttr
 
+instance HasFilterAttributes Merge where
+  filterAttributes = mergeFilterAttributes
+
+instance HasFilterAttributes ImageF where
+  filterAttributes = imageFFilterAttr
+
+instance HasFilterAttributes ComponentTransfer where
+  filterAttributes = compTransferFilterAttr
+
+
+
 instance HasFilterAttributes FilterElement where
   filterAttributes = lens getter setter
     where
       getter fe = case fe of
-        FEBlend -> defaultSvg
+        FEBlend b -> b ^. filterAttributes
         FEColorMatrix m -> m ^. filterAttributes
-        FEComponentTransfer -> defaultSvg
+        FEComponentTransfer c -> c ^. filterAttributes
         FEComposite c -> c ^. filterAttributes
-        FEConvolveMatrix -> defaultSvg
-        FEDiffuseLighting -> defaultSvg
+        FEConvolveMatrix c -> c ^. filterAttributes
+        FEDiffuseLighting d -> d ^. filterAttributes
         FEDisplacementMap d -> d ^. filterAttributes
-        FEDropShadow -> defaultSvg
-        FEFlood -> defaultSvg
-        FEFuncA -> defaultSvg
-        FEFuncB -> defaultSvg
-        FEFuncG -> defaultSvg
-        FEFuncR -> defaultSvg
+        FEDropShadow d -> d ^. filterAttributes
+        FEFlood f -> f ^. filterAttributes
+        FEFuncA _ -> defaultSvg --FuncA has no filter attributes
+        FEFuncR _ -> defaultSvg --FuncR has no filter attributes
+        FEFuncG _ -> defaultSvg --FuncG has no filter attributes
+        FEFuncB _ -> defaultSvg --FuncB has no filter attributes
         FEGaussianBlur g -> g ^. filterAttributes
-        FEImage -> defaultSvg
-        FEMerge -> defaultSvg
-        FEMergeNode -> defaultSvg
-        FEMorphology -> defaultSvg
-        FEOffset -> defaultSvg
-        FESpecularLighting -> defaultSvg
-        FETile -> defaultSvg
+        FEImage i -> i ^. filterAttributes
+        FEMergeNode _ -> defaultSvg --MergeNode has no filterAttributes!
+        FEMerge m -> m ^. filterAttributes
+        FEMorphology m -> m ^. filterAttributes
+        FEOffset o -> o ^. filterAttributes
+        FESpecularLighting s -> s ^. filterAttributes
+        FETile t -> t ^. filterAttributes
         FETurbulence t -> t ^. filterAttributes
         FENone -> defaultSvg
       setter fe attr = case fe of
-        FEBlend -> fe
+        FEBlend b -> FEBlend $ b & filterAttributes .~ attr
         FEColorMatrix m -> FEColorMatrix $ m & filterAttributes .~ attr
-        FEComponentTransfer -> fe
+        FEComponentTransfer c -> FEComponentTransfer $ c & filterAttributes .~ attr
         FEComposite c -> FEComposite $ c & filterAttributes .~ attr
-        FEConvolveMatrix -> fe
-        FEDiffuseLighting -> fe
+        FEConvolveMatrix c -> FEConvolveMatrix $ c & filterAttributes .~ attr
+        FEDiffuseLighting d -> FEDiffuseLighting $ d & filterAttributes .~ attr
         FEDisplacementMap d -> FEDisplacementMap $ d & filterAttributes .~ attr
-        FEDropShadow -> fe
-        FEFlood -> fe
-        FEFuncA -> fe
-        FEFuncB -> fe
-        FEFuncG -> fe
-        FEFuncR -> fe
+        FEDropShadow d -> FEDropShadow $ d & filterAttributes .~ attr
+        FEFlood f -> FEFlood $ f & filterAttributes .~ attr
+        FEFuncA _ -> fe --FuncA has no filter atributes
+        FEFuncR _ -> fe --FuncR has no filter atributes
+        FEFuncG _ -> fe --FuncG has no filter atributes
+        FEFuncB _ -> fe --FuncB has no filter atributes
         FEGaussianBlur g -> FEGaussianBlur $ g & filterAttributes .~ attr
-        FEImage -> fe
-        FEMerge -> fe
-        FEMergeNode -> fe
-        FEMorphology -> fe
-        FEOffset -> fe
-        FESpecularLighting -> fe
-        FETile -> fe
+        FEImage i -> FEImage $ i & filterAttributes .~ attr
+        FEMerge m -> FEMerge $ m & filterAttributes .~ attr
+        FEMergeNode _ -> fe --MergeNode has no filterAttributes!
+        FEMorphology m -> FEMorphology $ m & filterAttributes .~ attr
+        FEOffset o -> FEOffset $ o & filterAttributes .~ attr
+        FESpecularLighting s -> FESpecularLighting $ s & filterAttributes .~ attr
+        FETile t -> FETile $ t & filterAttributes .~ attr
         FETurbulence t -> FETurbulence $ t & filterAttributes .~ attr
         FENone -> fe
 
diff --git a/src/Graphics/SvgTree/Types/Internal.hs b/src/Graphics/SvgTree/Types/Internal.hs
--- a/src/Graphics/SvgTree/Types/Internal.hs
+++ b/src/Graphics/SvgTree/Types/Internal.hs
@@ -62,6 +62,138 @@
     FilterAttributes (..),
     HasFilterAttributes (..),
     FilterSource (..),
+
+    Blend (..),
+    BlendMode (..),
+    blendDrawAttributes,
+    blendFilterAttr,
+    blendIn,
+    blendIn2,
+    blendMode,
+
+    ConvolveMatrix (..),
+    convolveMatrixDrawAttributes,
+    convolveMatrixFilterAttr,
+    convolveMatrixIn,
+    convolveMatrixOrder,
+    convolveMatrixKernelMatrix,
+    convolveMatrixDivisor,
+    convolveMatrixBias,
+    convolveMatrixTargetX,
+    convolveMatrixTargetY,
+    convolveMatrixEdgeMode,
+    convolveMatrixKernelUnitLength,
+    convolveMatrixPreserveAlpha,
+
+    Morphology (..),
+    OperatorType (..),
+    NumberOptionalNumber (..),
+    morphologyDrawAttributes,
+    morphologyFilterAttr,
+    morphologyIn,
+    morphologyOperator,
+    morphologyRadius,
+
+    SpecularLighting (..),
+    specLightingDrawAttributes,
+    specLightingFilterAttr,
+    specLightingIn,
+    specLightingSurfaceScale,
+    specLightingSpecularConst,
+    specLightingSpecularExp,
+    specLightingKernelUnitLength,
+
+    DropShadow (..),
+    dropShadowDrawAttributes,
+    dropShadowFilterAttr,
+    dropShadowDx,
+    dropShadowDy,
+    dropShadowStdDeviation,
+
+    DiffuseLighting,
+    diffuseLightingDrawAttributes,
+    diffuseLightingFilterAttr,
+    diffuseLightingIn,
+    diffuseLightingSurfaceScale,
+    diffuseLightingDiffuseConst,
+    diffuseLightingKernelUnitLength,
+
+    Tile (..),
+    tileDrawAttributes,
+    tileFilterAttr,
+    tileIn,
+
+    Flood (..),
+    floodDrawAttributes,
+    floodFilterAttr,
+    floodColor,
+    floodOpacity,
+
+    Offset (..),
+    offsetDrawAttributes,
+    offsetFilterAttr,
+    offsetIn,
+    offsetDX,
+    offsetDY,
+
+    Merge (..),
+    mergeDrawAttributes,
+    mergeFilterAttributes,
+    mergeChildren,
+
+    MergeNode (..),
+    mergeNodeDrawAttributes,
+    mergeNodeIn,
+
+    ImageF (..),
+    imageFDrawAttributes,
+    imageFFilterAttr,
+    imageFHref,
+    imageFAspectRatio,
+
+    ComponentTransfer (..),
+    compTransferDrawAttributes,
+    compTransferFilterAttr,
+    compTransferChildren,
+    compTransferIn,
+
+    FuncA (..),
+    FuncType (..),
+    funcADrawAttributes,
+    funcAType,
+    funcATableValues,
+    funcASlope,
+    funcAIntercept,
+    funcAAmplitude,
+    funcAExponent,
+
+    FuncR (..),
+    funcRDrawAttributes,
+    funcRType,
+    funcRTableValues,
+    funcRSlope,
+    funcRIntercept,
+    funcRAmplitude,
+    funcRExponent,
+
+    FuncG (..),
+    funcGDrawAttributes,
+    funcGType,
+    funcGTableValues,
+    funcGSlope,
+    funcGIntercept,
+    funcGAmplitude,
+    funcGExponent,
+
+    FuncB (..),
+    funcBDrawAttributes,
+    funcBType,
+    funcBTableValues,
+    funcBSlope,
+    funcBIntercept,
+    funcBAmplitude,
+    funcBExponent,
+
     ColorMatrixType (..),
     colorMatrixDrawAttributes,
     colorMatrixFilterAttr,
@@ -1104,34 +1236,182 @@
   defaultSvg = NoNode
 
 data FilterElement
-  = FEBlend
-  | FEColorMatrix ColorMatrix
-  | FEComponentTransfer -- Need
-  | FEComposite Composite
-  | FEConvolveMatrix
-  | FEDiffuseLighting
-  | FEDisplacementMap DisplacementMap
-  | FEDropShadow
-  | FEFlood
-  | FEFuncA -- Need
-  | FEFuncB
-  | FEFuncG
-  | FEFuncR
-  | FEGaussianBlur GaussianBlur
-  | FEImage
-  | FEMerge
-  | FEMergeNode
-  | FEMorphology
-  | FEOffset
-  | FESpecularLighting
-  | FETile
-  | FETurbulence Turbulence
+  = FEBlend Blend               -- SVG Basic --DONE
+  | FEColorMatrix ColorMatrix   -- SVG Basic --DONE
+  | FEComponentTransfer ComponentTransfer -- Need -- SVG Basic --DONE --Parser not working
+  | FEComposite Composite       -- SVG Basic --DONE
+  | FEConvolveMatrix ConvolveMatrix          --DONE -- No parser
+  | FEDiffuseLighting DiffuseLighting        --DONE -- No parser
+  | FEDisplacementMap DisplacementMap        --DONE
+  | FEDropShadow DropShadow                  --DONE -- No parser
+  | FEFlood Flood               -- SVG Basic --DONE
+  | FEFuncA FuncA -- Need       -- SVG Basic --DONE
+  | FEFuncB FuncB               -- SVG Basic --DONE
+  | FEFuncG FuncG               -- SVG Basic --DONE
+  | FEFuncR FuncR               -- SVG Basic --DONE
+  | FEGaussianBlur GaussianBlur -- SVG Basic --DONE
+  | FEImage ImageF              -- SVG Basic --DONE --Parser not working
+  | FEMerge Merge               -- SVG Basic --DONE
+  | FEMergeNode MergeNode       -- SVG Basic --DONE
+  | FEMorphology Morphology                  --DONE -- No parser
+  | FEOffset Offset             -- SVG Basic --DONE
+  | FESpecularLighting SpecularLighting      --DONE -- No parser
+  | FETile Tile                 -- SVG Basic --DONE
+  | FETurbulence Turbulence                  --DONE
   | FENone
   deriving (Eq, Show, Generic)
 
 instance WithDefaultSvg FilterElement where
   defaultSvg = FENone
 
+data SpecularLighting = SpecularLighting
+  { _specLightingDrawAttributes :: DrawAttributes,
+    _specLightingFilterAttr :: !FilterAttributes,
+    _specLightingIn :: !(Last FilterSource),
+    _specLightingSurfaceScale :: Double,
+    _specLightingSpecularConst :: Double,
+    _specLightingSpecularExp :: Double,
+    _specLightingKernelUnitLength :: NumberOptionalNumber
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg SpecularLighting where
+  defaultSvg =
+    SpecularLighting
+    { _specLightingDrawAttributes = defaultSvg,
+      _specLightingFilterAttr = defaultSvg,
+      _specLightingIn = Last Nothing,
+      _specLightingSurfaceScale = 1,
+      _specLightingSpecularConst = 1,
+      _specLightingSpecularExp = 1,
+      _specLightingKernelUnitLength = Num1 0
+    }
+
+data ConvolveMatrix = ConvolveMatrix
+  { _convolveMatrixDrawAttributes :: DrawAttributes,
+    _convolveMatrixFilterAttr :: !FilterAttributes,
+    _convolveMatrixIn :: !(Last FilterSource),
+    _convolveMatrixOrder :: NumberOptionalNumber,
+    _convolveMatrixKernelMatrix :: [Double],
+    _convolveMatrixDivisor :: Double,
+    _convolveMatrixBias :: Double,
+    _convolveMatrixTargetX :: Int,
+    _convolveMatrixTargetY :: Int,
+    _convolveMatrixEdgeMode :: EdgeMode,
+    _convolveMatrixKernelUnitLength :: NumberOptionalNumber,
+    _convolveMatrixPreserveAlpha :: Bool
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg ConvolveMatrix where
+  defaultSvg =
+    ConvolveMatrix
+    { _convolveMatrixDrawAttributes = defaultSvg,
+      _convolveMatrixFilterAttr = defaultSvg,
+      _convolveMatrixIn = Last Nothing,
+      _convolveMatrixOrder = Num1 3,
+      _convolveMatrixKernelMatrix = [],
+      _convolveMatrixDivisor = 1,
+      _convolveMatrixBias = 0,
+      _convolveMatrixTargetX = 1,
+      _convolveMatrixTargetY = 1,
+      _convolveMatrixEdgeMode = EdgeDuplicate,
+      _convolveMatrixKernelUnitLength = Num1 0,
+      _convolveMatrixPreserveAlpha = False
+    }
+
+data DiffuseLighting = DiffuseLighting
+  { _diffuseLightingDrawAttributes :: DrawAttributes,
+    _diffuseLightingFilterAttr :: !FilterAttributes,
+    _diffuseLightingIn :: !(Last FilterSource),
+    _diffuseLightingSurfaceScale :: Double,
+    _diffuseLightingDiffuseConst :: Double,
+    _diffuseLightingKernelUnitLength :: NumberOptionalNumber
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg DiffuseLighting where
+  defaultSvg =
+    DiffuseLighting
+    { _diffuseLightingDrawAttributes = defaultSvg,
+      _diffuseLightingFilterAttr = defaultSvg,
+      _diffuseLightingIn = Last Nothing,
+      _diffuseLightingSurfaceScale = 1,
+      _diffuseLightingDiffuseConst = 1,
+      _diffuseLightingKernelUnitLength = Num1 0
+    }
+
+data Morphology = Morphology
+  { _morphologyDrawAttributes :: DrawAttributes,
+    _morphologyFilterAttr :: !FilterAttributes,
+    _morphologyIn :: !(Last FilterSource),
+    _morphologyOperator :: OperatorType,
+    _morphologyRadius :: NumberOptionalNumber
+  }
+  deriving (Eq, Show, Generic)
+
+
+instance WithDefaultSvg Morphology where
+  defaultSvg =
+    Morphology
+    { _morphologyDrawAttributes = defaultSvg,
+      _morphologyFilterAttr = defaultSvg,
+      _morphologyIn = Last Nothing,
+      _morphologyOperator = OperatorOver,
+      _morphologyRadius = Num1 0
+    }
+
+data DropShadow = DropShadow
+  { _dropShadowDrawAttributes :: DrawAttributes,
+    _dropShadowFilterAttr :: !FilterAttributes,
+    _dropShadowDx :: Double,
+    _dropShadowDy :: Double,
+    _dropShadowStdDeviation :: NumberOptionalNumber
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg DropShadow where
+  defaultSvg =
+    DropShadow
+    { _dropShadowDrawAttributes = defaultSvg,
+      _dropShadowFilterAttr = defaultSvg,
+      _dropShadowDx = 2,
+      _dropShadowDy = 2,
+      _dropShadowStdDeviation = Num1 0
+    }
+
+data OperatorType
+  = OperatorOver
+  | OperatorIn
+  | OperatorOut
+  | OperatorAtop
+  | OperatorXor
+  | OperatorLighter
+  | OperatorArithmetic
+  deriving (Eq, Show, Generic)
+
+data NumberOptionalNumber
+  = Num1 Double
+  | Num2 Double Double
+  deriving (Eq, Show, Generic)
+
+data ImageF = ImageF
+  { _imageFDrawAttributes :: DrawAttributes,
+    _imageFFilterAttr :: !FilterAttributes,
+    _imageFHref :: !String,
+    _imageFAspectRatio :: !PreserveAspectRatio
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg ImageF where
+  defaultSvg =
+    ImageF
+      { _imageFDrawAttributes = defaultSvg,
+        _imageFFilterAttr = defaultSvg,
+        _imageFHref = "",
+        _imageFAspectRatio = defaultSvg
+      }
+
 data TransferFunctionType
   = TFIdentity
   | TFTable
@@ -1183,6 +1463,250 @@
         _displacementMapYChannelSelector = ChannelA
       }
 
+data BlendMode
+  = Normal
+  | Multiply
+  | Screen
+  | Overlay
+  | Darken
+  | Lighten
+  | ColorDodge
+  | ColorBurn
+  | HardLight
+  | SoftLight
+  | Difference
+  | Exclusion
+  | Hue
+  | Saturation
+  | Color
+  | Luminosity
+  deriving (Eq, Show, Generic)
+
+data Blend = Blend
+  { _blendDrawAttributes :: !DrawAttributes,
+    _blendFilterAttr :: !FilterAttributes,
+    _blendIn :: !(Last FilterSource),
+    _blendIn2 :: !(Last FilterSource),
+    _blendMode :: !BlendMode
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg Blend where
+  defaultSvg =
+    Blend
+    { _blendDrawAttributes = defaultSvg,
+      _blendFilterAttr = defaultSvg,
+      _blendIn = Last Nothing,
+      _blendIn2 = Last Nothing,
+      _blendMode = Normal
+    }
+
+data Flood = Flood
+  { _floodDrawAttributes :: !DrawAttributes,
+    _floodFilterAttr :: !FilterAttributes,
+    _floodColor :: !PixelRGBA8,
+    _floodOpacity :: !(Maybe Double)
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg Flood where
+  defaultSvg =
+    Flood
+    { _floodDrawAttributes = defaultSvg,
+      _floodFilterAttr = defaultSvg,
+      _floodColor = PixelRGBA8 0 0 0 255,
+      _floodOpacity = Just 1.0
+    }
+
+data Offset = Offset
+  { _offsetDrawAttributes :: !DrawAttributes,
+    _offsetFilterAttr :: !FilterAttributes,
+    _offsetIn :: !(Last FilterSource),
+    _offsetDX :: !Number,
+    _offsetDY :: !Number
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg Offset where
+  defaultSvg =
+    Offset
+    { _offsetDrawAttributes = defaultSvg,
+      _offsetFilterAttr = defaultSvg,
+      _offsetIn = Last Nothing,
+      _offsetDX = Num 0,
+      _offsetDY = Num 0
+    }
+
+data Tile = Tile
+  { _tileDrawAttributes :: !DrawAttributes,
+    _tileFilterAttr :: !FilterAttributes,
+    _tileIn :: !(Last FilterSource)
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg Tile where
+  defaultSvg =
+    Tile
+    { _tileDrawAttributes = defaultSvg,
+      _tileFilterAttr = defaultSvg,
+      _tileIn = Last Nothing
+    }
+
+data Merge = Merge
+  { _mergeDrawAttributes :: !DrawAttributes,
+    _mergeFilterAttributes :: !FilterAttributes,
+    _mergeChildren :: ![FilterElement]
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg Merge where
+  defaultSvg =
+    Merge
+    { _mergeDrawAttributes = defaultSvg,
+      _mergeFilterAttributes = defaultSvg,
+      _mergeChildren = []
+    }
+
+data MergeNode = MergeNode
+  { _mergeNodeDrawAttributes :: !DrawAttributes,
+    --Does not have filter attributes!
+    _mergeNodeIn :: !(Last FilterSource)
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg MergeNode where
+  defaultSvg =
+    MergeNode
+    { _mergeNodeDrawAttributes = defaultSvg,
+      _mergeNodeIn = Last Nothing
+    }
+
+data ComponentTransfer = ComponentTransfer
+  { _compTransferDrawAttributes :: !DrawAttributes,
+    _compTransferFilterAttr :: !FilterAttributes,
+    _compTransferChildren :: ![FilterElement],
+    _compTransferIn :: !(Last FilterSource)
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg ComponentTransfer where
+  defaultSvg =
+    ComponentTransfer
+    { _compTransferDrawAttributes = defaultSvg,
+      _compTransferFilterAttr = defaultSvg,
+      _compTransferChildren = [],
+      _compTransferIn = Last Nothing
+    }
+
+data FuncType
+  = FIdentity
+  | FTable
+  | FDiscrete
+  | FLinear
+  | FGamma
+  deriving (Eq, Show, Generic)
+
+data FuncA = FuncA
+  { _funcADrawAttributes :: !DrawAttributes,
+    --Does not have filter attributes!
+    _funcAType :: !FuncType,
+    _funcATableValues :: ![Number],
+    _funcASlope :: !Number,
+    _funcAIntercept :: !Number,
+    _funcAAmplitude :: !Number,
+    _funcAExponent :: !Number
+    --_funcAOffset :: _ -- This appears in the documentation, but no details are given.
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg FuncA where
+  defaultSvg =
+    FuncA
+    { _funcADrawAttributes = defaultSvg,
+      _funcAType = FIdentity, -- Standard does not define a default value.
+      _funcATableValues = [],
+      _funcASlope = Num 0,
+      _funcAIntercept = Num 0,
+      _funcAAmplitude = Num 1,
+      _funcAExponent = Num 1
+    }
+
+data FuncR = FuncR
+  { _funcRDrawAttributes :: !DrawAttributes,
+    --Does not have filter attributes!
+    _funcRType :: !FuncType,
+    _funcRTableValues :: ![Number],
+    _funcRSlope :: !Number,
+    _funcRIntercept :: !Number,
+    _funcRAmplitude :: !Number,
+    _funcRExponent :: !Number
+    --_funcAOffset :: _ -- This appears in the documentation, but no details are given.
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg FuncR where
+  defaultSvg =
+    FuncR
+    { _funcRDrawAttributes = defaultSvg,
+      _funcRType = FIdentity, -- Standard does not define a default value.
+      _funcRTableValues = [],
+      _funcRSlope = Num 0,
+      _funcRIntercept = Num 0,
+      _funcRAmplitude = Num 1,
+      _funcRExponent = Num 1
+    }
+
+data FuncG = FuncG
+  { _funcGDrawAttributes :: !DrawAttributes,
+    --Does not have filter attributes!
+    _funcGType :: !FuncType,
+    _funcGTableValues :: ![Number],
+    _funcGSlope :: !Number,
+    _funcGIntercept :: !Number,
+    _funcGAmplitude :: !Number,
+    _funcGExponent :: !Number
+    --_funcAOffset :: _ -- This appears in the documentation, but no details are given.
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg FuncG where
+  defaultSvg =
+    FuncG
+    { _funcGDrawAttributes = defaultSvg,
+      _funcGType = FIdentity, -- Standard does not define a default value.
+      _funcGTableValues = [],
+      _funcGSlope = Num 0,
+      _funcGIntercept = Num 0,
+      _funcGAmplitude = Num 1,
+      _funcGExponent = Num 1
+    }
+
+data FuncB = FuncB
+  { _funcBDrawAttributes :: !DrawAttributes,
+    --Does not have filter attributes!
+    _funcBType :: !FuncType,
+    _funcBTableValues :: ![Number],
+    _funcBSlope :: !Number,
+    _funcBIntercept :: !Number,
+    _funcBAmplitude :: !Number,
+    _funcBExponent :: !Number
+    --_funcAOffset :: _ -- This appears in the documentation, but no details are given.
+  }
+  deriving (Eq, Show, Generic)
+
+instance WithDefaultSvg FuncB where
+  defaultSvg =
+    FuncB
+    { _funcBDrawAttributes = defaultSvg,
+      _funcBType = FIdentity, -- Standard does not define a default value.
+      _funcBTableValues = [],
+      _funcBSlope = Num 0,
+      _funcBIntercept = Num 0,
+      _funcBAmplitude = Num 1,
+      _funcBExponent = Num 1
+    }
+
+
 data ColorMatrixType
   = Matrix
   | Saturate
@@ -1757,11 +2281,28 @@
 makeLenses ''RadialGradient
 makeLenses ''Mask
 makeLenses ''ClipPath
+makeLenses ''Blend
+makeLenses ''Flood
+makeLenses ''Tile
+makeLenses ''Offset
 makeLenses ''ColorMatrix
 makeLenses ''Composite
 makeLenses ''GaussianBlur
 makeLenses ''Turbulence
 makeLenses ''DisplacementMap
+makeLenses ''Merge
+makeLenses ''MergeNode
 makeLenses ''Group
+makeLenses ''ImageF
+makeLenses ''ComponentTransfer
+makeLenses ''FuncA
+makeLenses ''FuncR
+makeLenses ''FuncG
+makeLenses ''FuncB
+makeLenses ''Morphology
+makeLenses ''SpecularLighting
+makeLenses ''DropShadow
+makeLenses ''DiffuseLighting
+makeLenses ''ConvolveMatrix
 
 makeClassy ''FilterAttributes
diff --git a/src/Graphics/SvgTree/XmlParser.hs b/src/Graphics/SvgTree/XmlParser.hs
--- a/src/Graphics/SvgTree/XmlParser.hs
+++ b/src/Graphics/SvgTree/XmlParser.hs
@@ -369,6 +369,61 @@
     StrokePaint     -> "StrokePaint"
     SourceRef s     -> s
 
+instance ParseableAttribute FuncType where
+  aparse s = case s of
+    "identity" -> Just FIdentity
+    "table"    -> Just FTable
+    "discrete" -> Just FDiscrete
+    "linear"   -> Just FLinear
+    "gamma"    -> Just FGamma
+    _          -> Nothing
+
+  aserialize v = Just $ case v of
+    FIdentity -> "identity"
+    FTable    -> "table"
+    FDiscrete -> "discrete"
+    FLinear   -> "linear"
+    FGamma    -> "gamma"
+
+instance ParseableAttribute BlendMode where
+  aparse s = case s of
+    "normal"      -> Just Normal
+    "multiply"    -> Just Multiply
+    "screen"      -> Just Screen
+    "overlay"     -> Just Overlay
+    "darken"      -> Just Darken
+    "lighten"     -> Just Lighten
+    "color-dodge" -> Just ColorDodge
+    "color-burn"  -> Just ColorBurn
+    "hard-light"  -> Just HardLight
+    "soft-light"  -> Just SoftLight
+    "difference"  -> Just Difference
+    "exclusion"   -> Just Exclusion
+    "hue"         -> Just Hue
+    "saturation"  -> Just Saturation
+    "color"       -> Just Color
+    "luminosity"  -> Just Luminosity
+    _             -> Nothing
+
+  aserialize v = Just $ case v of
+    Normal     -> "normal"
+    Multiply   -> "multiply"
+    Screen     -> "screen"
+    Overlay    -> "overlay"
+    Darken     -> "darken"
+    Lighten    -> "lighten"
+    ColorDodge -> "color-dodge"
+    ColorBurn  -> "color-burn"
+    HardLight  -> "hard-light"
+    SoftLight  -> "soft-light"
+    Difference -> "difference"
+    Exclusion  -> "exclusion"
+    Hue        -> "hue"
+    Saturation -> "saturation"
+    Color      -> "color"
+    Luminosity -> "luminosity"
+
+
 instance ParseableAttribute ColorMatrixType where
   aparse s = case s of
     "matrix"           -> Just Matrix
@@ -417,6 +472,44 @@
     ChannelB -> "B"
     ChannelA -> "A"
 
+instance ParseableAttribute OperatorType where
+  aparse s = case s of
+    "over"       -> Just OperatorOver
+    "in"         -> Just OperatorIn
+    "out"        -> Just OperatorOut
+    "atop"       -> Just OperatorAtop
+    "xor"        -> Just OperatorXor
+    "lighter"    -> Just OperatorLighter
+    "arithmetic" -> Just OperatorArithmetic
+    _            -> Nothing
+
+  aserialize v = Just $ case v of
+    OperatorOver       -> "over"
+    OperatorIn         -> "in"
+    OperatorOut        -> "out"
+    OperatorAtop       -> "atop"
+    OperatorXor        -> "xor"
+    OperatorLighter    -> "lighter"
+    OperatorArithmetic -> "arithmetic"
+
+instance ParseableAttribute NumberOptionalNumber where
+  aparse s = case s of
+    _  -> Nothing                                        -- TODO
+
+  aserialize v = Just $ case v of
+    Num1 a   -> show a
+    Num2 a b -> show a ++ ", " ++ show b
+
+instance ParseableAttribute Bool where
+  aparse s = case s of
+    "false" -> Just False
+    "true"  -> Just True
+    _       -> Nothing
+
+  aserialize v = Just $ case v of
+    False -> "false"
+    True  -> "true"
+
 instance ParseableAttribute EdgeMode where
   aparse s = case s of
     "duplicate" -> Just EdgeDuplicate
@@ -919,16 +1012,186 @@
   xmlTagName _ = "FilterElement"
   serializeTreeNode fe = flip mergeAttributes <$> genericSerializeNode fe <*>
     case fe of
-      FEColorMatrix m     -> serializeTreeNode m
-      FEComposite c       -> serializeTreeNode c
-      FEGaussianBlur b    -> serializeTreeNode b
-      FETurbulence t      -> serializeTreeNode t
-      FEDisplacementMap d -> serializeTreeNode d
-      _                   -> error $
+      FEBlend b             -> serializeTreeNode b
+      FEColorMatrix m       -> serializeTreeNode m
+      FEComposite c         -> serializeTreeNode c
+      FEGaussianBlur b      -> serializeTreeNode b
+      FETurbulence t        -> serializeTreeNode t
+      FEDisplacementMap d   -> serializeTreeNode d
+      FETile t              -> serializeTreeNode t
+      FEFlood f             -> serializeTreeNode f
+      FEOffset o            -> serializeTreeNode o
+      FEMerge m             -> serializeTreeNode m
+      FEMergeNode n         -> serializeTreeNode n
+      FEImage i             -> serializeTreeNode i
+      FEComponentTransfer f -> serializeTreeNode f
+      FEFuncA f             -> serializeTreeNode f
+      FEFuncR f             -> serializeTreeNode f
+      FEFuncG f             -> serializeTreeNode f
+      FEFuncB f             -> serializeTreeNode f
+      FESpecularLighting s  -> serializeTreeNode s
+      FEConvolveMatrix c    -> serializeTreeNode c
+      FEDiffuseLighting d   -> serializeTreeNode d
+      FEMorphology m        -> serializeTreeNode m
+      FEDropShadow d        -> serializeTreeNode d
+      _                     -> error $
         "Unsupported element: " ++ show fe ++ ". Please submit bug on github."
   attributes =
     [ "result" `parseIn` (filterAttributes . filterResult)]
 
+instance XMLUpdatable ConvolveMatrix where
+  xmlTagName _ = "feConvolveMatrix"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` convolveMatrixIn,
+      "order" `parseIn` convolveMatrixOrder,
+      "kernelMatrix" `parseIn` convolveMatrixKernelMatrix,
+      "divisor" `parseIn` convolveMatrixDivisor,
+      "bias" `parseIn` convolveMatrixBias,
+      "targetX" `parseIn` convolveMatrixTargetX,
+      "targetY" `parseIn` convolveMatrixTargetY,
+      "edgeMode" `parseIn` convolveMatrixEdgeMode,
+      "preserveAlpha" `parseIn` convolveMatrixPreserveAlpha ]
+
+instance XMLUpdatable SpecularLighting where
+  xmlTagName _ = "feSpecularLighting"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` specLightingIn,
+      "surfaceScale" `parseIn` specLightingSurfaceScale,
+      "specularConstant" `parseIn` specLightingSpecularConst,
+      "specularExponent" `parseIn` specLightingSpecularExp,
+      "kernelUnitLength" `parseIn` specLightingKernelUnitLength ]
+
+instance XMLUpdatable DiffuseLighting where
+  xmlTagName _ = "feDiffuseLighting"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` diffuseLightingIn,
+      "surfaceScale" `parseIn` diffuseLightingSurfaceScale,
+      "diffuseConstant" `parseIn` diffuseLightingDiffuseConst,
+      "kernelUnitLength" `parseIn` diffuseLightingKernelUnitLength]
+
+instance XMLUpdatable Morphology where
+  xmlTagName _ = "feMorphology"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` morphologyIn,
+      "operator" `parseIn` morphologyOperator,
+      "radius" `parseIn` morphologyRadius ]
+
+instance XMLUpdatable DropShadow where
+  xmlTagName _ = "feDropShadow"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "dx" `parseIn` dropShadowDx,
+      "dy" `parseIn` dropShadowDy,
+      "stdDeviation" `parseIn` dropShadowStdDeviation ]
+
+instance XMLUpdatable Blend where
+  xmlTagName _ = "feBlend"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` blendIn
+    , "in2" `parseIn` blendIn2
+    , "mode"  `parseIn` blendMode ]
+
+instance XMLUpdatable FuncA where
+  xmlTagName _ = "feFuncA"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "type" `parseIn` funcAType
+    , "tableValues" `parseIn` funcATableValues
+    , "slope" `parseIn` funcASlope
+    , "intercept" `parseIn` funcAIntercept
+    , "ampliture" `parseIn` funcAAmplitude
+    , "exponent" `parseIn` funcAExponent ]
+
+instance XMLUpdatable FuncR where
+  xmlTagName _ = "feFuncR"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "type" `parseIn` funcRType
+    , "tableValues" `parseIn` funcRTableValues
+    , "slope" `parseIn` funcRSlope
+    , "intercept" `parseIn` funcRIntercept
+    , "ampliture" `parseIn` funcRAmplitude
+    , "exponent" `parseIn` funcRExponent ]
+
+instance XMLUpdatable FuncG where
+  xmlTagName _ = "feFuncG"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "type" `parseIn` funcGType
+    , "tableValues" `parseIn` funcGTableValues
+    , "slope" `parseIn` funcGSlope
+    , "intercept" `parseIn` funcGIntercept
+    , "ampliture" `parseIn` funcGAmplitude
+    , "exponent" `parseIn` funcGExponent ]
+
+instance XMLUpdatable FuncB where
+  xmlTagName _ = "feFuncB"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "type" `parseIn` funcBType
+    , "tableValues" `parseIn` funcBTableValues
+    , "slope" `parseIn` funcBSlope
+    , "intercept" `parseIn` funcBIntercept
+    , "ampliture" `parseIn` funcBAmplitude
+    , "exponent" `parseIn` funcBExponent ]
+
+instance XMLUpdatable Flood where
+  xmlTagName _ = "feFlood"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "flood-color" `parseIn` floodColor
+    , "flood-opacity" `parseIn` floodOpacity]
+
+instance XMLUpdatable Tile where
+  xmlTagName _ = "feTile"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` tileIn]
+
+instance XMLUpdatable Offset where
+  xmlTagName _ = "feOffset"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` offsetIn
+    , "dx" `parseIn` offsetDX
+    , "dy" `parseIn` offsetDY ]
+
+instance XMLUpdatable Merge where
+  xmlTagName _ = "feMerge"
+  serializeTreeNode node =
+     updateWithAccessor _mergeChildren node $
+        genericSerializeWithDrawAttr node
+  attributes = []
+
+instance XMLUpdatable ComponentTransfer where
+  xmlTagName _ = "feComponentTransfer"
+  serializeTreeNode node =
+     updateWithAccessor _compTransferChildren node $
+        genericSerializeWithDrawAttr node
+  attributes =
+    [ "in" `parseIn` compTransferIn ]
+
+
+instance XMLUpdatable MergeNode where
+  xmlTagName _ = "feMergeNode"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ "in" `parseIn` mergeNodeIn ]
+
+instance XMLUpdatable ImageF where
+  xmlTagName _ = "feImage"
+  serializeTreeNode = genericSerializeWithDrawAttr
+  attributes =
+    [ --parserSetter "href" imageFHref (Just . dropSharp) Just
+      "href" `parseIn` imageFHref
+    , "preserveAspectRatio" `parseIn` imageFAspectRatio
+    ]
+
 instance XMLUpdatable ColorMatrix where
   xmlTagName _ = "feColorMatrix"
   serializeTreeNode = genericSerializeWithDrawAttr
@@ -1205,8 +1468,51 @@
   unRows e@(nodeName -> "meshrow") = [MeshGradientRow $ parseMeshGradientPatches e]
   unRows _ = []
 
+-- This is to guarantee there will be only "feMergeNode" elements inside any "feMerge" element.
+unparseMergeNode :: X.Element -> FilterElement
+unparseMergeNode e@(nodeName -> "feMergeNode") =
+  FEMergeNode $ xmlUnparseWithDrawAttr e
+unparseMergeNode _ = FENone
+
+-- This is to guarantee there will be only "feFunc_" elements inside any "feComponentTransfer" element.
+unparseFunc :: X.Element -> FilterElement
+unparseFunc e = case nodeName e of
+  "feFuncA" -> FEFuncA $ xmlUnparseWithDrawAttr e
+  "feFuncR" -> FEFuncR $ xmlUnparseWithDrawAttr e
+  "feFuncG" -> FEFuncG $ xmlUnparseWithDrawAttr e
+  "feFuncB" -> FEFuncB $ xmlUnparseWithDrawAttr e
+  _         -> FENone
+
 unparseFE :: X.Element -> FilterElement
-unparseFE _ = FENone
+unparseFE e@(nodeName -> "feMerge") =
+    FEMerge $ xmlUnparseWithDrawAttr e & mergeChildren .~ map unparseMergeNode (elChildren e)
+unparseFE e@(nodeName -> "feComponentTransfer") =
+    FEComponentTransfer $ xmlUnparseWithDrawAttr e & compTransferChildren .~ map unparseFunc (elChildren e)
+unparseFE e = case nodeName e of
+    "feBlend"            -> FEBlend parsed
+    "feColorMatrix"      -> FEColorMatrix parsed
+    "feComposite"        -> FEComposite parsed
+    "feDisplacementMap"  -> FEDisplacementMap parsed
+    "feGaussianBlur"     -> FEGaussianBlur parsed
+    "feTurbulence"       -> FETurbulence parsed
+    "feTile"             -> FETile parsed
+    "feFlood"            -> FEFlood parsed
+    "feOffset"           -> FEOffset parsed
+    "feImage"            -> FEImage parsed
+    "feMergeNode"        -> FEMergeNode parsed -- Potential bug: allow the "feMergeNode" element to appear outside a "feMerge" element.
+    "feFuncA"            -> FEFuncA parsed -- Potential bug: allow the "feFuncA" element to appear outside a "feComponentTransfer" element.
+    "feFuncR"            -> FEFuncR parsed -- Potential bug: allow the "feFuncR" element to appear outside a "feComponentTransfer" element.
+    "feFuncG"            -> FEFuncG parsed -- Potential bug: allow the "feFuncG" element to appear outside a "feComponentTransfer" element.
+    "feFuncB"            -> FEFuncB parsed -- Potential bug: allow the "feFuncB" element to appear outside a "feComponentTransfer" element.
+    "feSpecularLighting" -> FESpecularLighting parsed
+    "feConvolveMatrix"   -> FEConvolveMatrix parsed
+    "feDiffuseLighting"  -> FEDiffuseLighting parsed
+    "feMorphology"       -> FEMorphology parsed
+    "feDropShadow"       -> FEDropShadow parsed
+    _                    -> FENone
+  where
+    parsed :: (WithDefaultSvg a, XMLUpdatable a, HasDrawAttributes a) => a
+    parsed = xmlUnparseWithDrawAttr e
 
 unparse :: X.Element -> Tree
 unparse e@(nodeName -> "pattern") =
diff --git a/test/W3C.hs b/test/W3C.hs
new file mode 100644
--- /dev/null
+++ b/test/W3C.hs
@@ -0,0 +1,85 @@
+module Main (main) where
+
+import           Test.Tasty
+import           Test.Tasty.Ingredients.Rerun (defaultMainWithRerun)
+import           Test.Tasty.ExpectedFailure
+import           Test.Tasty.HUnit
+import qualified Data.ByteString.Char8 as BS
+import Graphics.SvgTree
+import Graphics.SvgTree.Printer
+import System.Process
+import System.Directory
+import System.FilePath
+import Data.List
+import System.Environment
+import Data.Algorithm.Diff
+import Data.Algorithm.DiffOutput
+import Data.Char
+
+main :: IO ()
+main = do
+  args <- getArgs
+  case args of
+    [path] -> do
+      haveFile <- doesFileExist path
+      if haveFile
+        then do
+          raw <- readFile path
+          golden <- sanitizeSvg raw
+          cycled <- sanitizeSvg (cycleSvg golden)
+          if golden == cycled
+            then putStrLn "Good"
+            else do
+              putStrLn "Mismatch!"
+              let d = getGroupedDiff (lines golden) (lines cycled) :: [Diff [String]]
+                  ranges = diffToLineRanges d
+              print (prettyDiffs ranges)
+        else runTestSuite
+    _ -> runTestSuite
+
+runTestSuite :: IO ()
+runTestSuite = do
+  print =<< getCurrentDirectory
+  good <- unitTestFolder "test/good"
+  bad <- unitTestFolder "test/bad"
+  defaultMainWithRerun $ testGroup "tests" [good, expectFail bad]
+
+unitTestFolder :: FilePath -> IO TestTree
+unitTestFolder path = do
+  files <- sort <$> getDirectoryContents path
+  return $ testGroup "animate"
+    [ testSvg fullPath
+    | file <- files
+    , let fullPath = path </> file
+    , takeExtension fullPath == ".svg"
+    ]
+
+testSvg :: FilePath -> TestTree
+testSvg path = testCase (takeBaseName path) $ do
+  raw <- readFile path
+  golden <- prettyPrintSvg =<< sanitizeSvg raw
+  cycled <- prettyPrintSvg (cycleSvg golden)
+  assert (golden == cycled)
+
+-- Sanitize SVG using rsvg-convert
+sanitizeSvg :: String -> IO String
+sanitizeSvg = readProcess "rsvg-convert" ["--format", "png"]
+
+-- Ugly hack to ignore the differences between #FFF and #fff.
+lowerHashValues :: String -> String
+lowerHashValues ('#':more) = '#' : map toLower before ++ lowerHashValues after
+  where
+    (before, after) = splitAt 6 more
+lowerHashValues (c:cs) = c:lowerHashValues cs
+lowerHashValues [] = []
+
+prettyPrintSvg :: String -> IO String
+prettyPrintSvg = fmap lowerHashValues .
+  readProcess "svgo" ["--input=-", "--output=-", "--pretty"
+    , "--enable=sortAttrs,convertColors"
+    , "--disable=cleanupIDs,prefixIds,convertTransform,mergePaths,collapseGroups" ]
+
+-- Parse and print SVG with reanimate-svg library.
+cycleSvg :: String -> String
+cycleSvg = 
+  maybe "Failed to parse" ppDocument . parseSvgFile "input" . BS.pack
