diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
 -*-change-log-*-
 
+v0.4.1: February 2016
+ * Fix: fixing duplicate ID with serialization
+
 v0.4: February 2016
  * Breaking change: viewbox types are no longer Int
    but double, sneakingly passed in v0.3.2.2. This
diff --git a/src/Graphics/Svg/XmlParser.hs b/src/Graphics/Svg/XmlParser.hs
--- a/src/Graphics/Svg/XmlParser.hs
+++ b/src/Graphics/Svg/XmlParser.hs
@@ -1050,14 +1050,15 @@
 
     defs = catMaybes [elementRender k e | (k, e) <- M.assocs $ _definitions doc]
 
-    elementRender k e = X.add_attr (attr "id" k) <$> case e of
+    elementRender k e = case e of
         ElementGeometry t -> serializeTreeNode t
         ElementMarker m -> serializeTreeNode m
         ElementMask m -> serializeTreeNode m
-        ElementClipPath c -> serializeTreeNode c
-        ElementPattern p -> serializeTreeNode p
-        ElementLinearGradient lg -> serializeTreeNode lg
-        ElementRadialGradient rg -> serializeTreeNode rg
+        ElementClipPath c -> addId $ serializeTreeNode c
+        ElementPattern p -> addId $ serializeTreeNode p
+        ElementLinearGradient lg -> addId $ serializeTreeNode lg
+        ElementRadialGradient rg -> addId $ serializeTreeNode rg
+      where addId = fmap $ X.add_attr (attr "id" k)
 
     docViewBox = case _viewBox doc of
         Nothing -> []
diff --git a/svg-tree.cabal b/svg-tree.cabal
--- a/svg-tree.cabal
+++ b/svg-tree.cabal
@@ -1,5 +1,5 @@
 name:                svg-tree
-version:             0.4
+version:             0.4.1
 synopsis:            SVG file loader and serializer
 description:
   svg-tree provides types representing a SVG document,
@@ -29,7 +29,7 @@
 Source-Repository this
     Type:      git
     Location:  git://github.com/Twinside/svg-tree.git
-    Tag:       v0.4
+    Tag:       v0.4.1
 
 library
   hs-source-dirs: src
