diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,5 +1,10 @@
 -*-change-log-*-
 
+v0.4.2: March 2016
+ * Enhancement: avoiding serializatinon of empty class attribute
+ * Fix: incorrect deserialization of complex CSS
+ * Fix: Really fixing duplicate ID with serialization
+
 v0.4.1: February 2016
  * Fix: fixing duplicate ID with serialization
 
diff --git a/src/Graphics/Svg/CssTypes.hs b/src/Graphics/Svg/CssTypes.hs
--- a/src/Graphics/Svg/CssTypes.hs
+++ b/src/Graphics/Svg/CssTypes.hs
@@ -107,8 +107,10 @@
      where
       ft = TB.fromText
       tserializeDecl d = ft "  " <> tserialize d <> ft ";\n"
-      tselectors =
-          intersperse (ft ",\n") . fmap tserialize $ concat selectors
+      tselector =
+          mconcat . intersperse (ft " ") . fmap tserialize
+      tselectors = 
+          intersperse (ft ",\n") $ fmap tselector selectors
 
 -- | Interface for elements to be matched against
 -- some CssRule.
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
@@ -397,8 +397,9 @@
     updater el str =
       el & attrClass .~ (T.split (== ' ') $ T.pack str)
 
-    serializer a =
-       Just . T.unpack . T.intercalate " " $ a ^. attrClass
+    serializer a = case a ^. attrClass of
+      [] -> Nothing
+      lst -> Just . T.unpack $ T.intercalate " " lst
 
 cssUniqueNumber :: ASetter DrawAttributes DrawAttributes
                    a (Last Number)
@@ -1051,14 +1052,22 @@
     defs = catMaybes [elementRender k e | (k, e) <- M.assocs $ _definitions doc]
 
     elementRender k e = case e of
-        ElementGeometry t -> serializeTreeNode t
-        ElementMarker m -> serializeTreeNode m
-        ElementMask m -> serializeTreeNode m
-        ElementClipPath c -> addId $ serializeTreeNode c
-        ElementPattern p -> addId $ serializeTreeNode p
+        ElementGeometry t -> serialize t
+        ElementMarker m -> serialize m
+        ElementMask m -> serialize m
+        ElementClipPath c -> serialize c
+        ElementPattern p -> serialize p
         ElementLinearGradient lg -> addId $ serializeTreeNode lg
         ElementRadialGradient rg -> addId $ serializeTreeNode rg
-      where addId = fmap $ X.add_attr (attr "id" k)
+      where
+        addId = fmap (X.add_attr $ attr "id" k)
+
+        serialize :: (WithDrawAttributes e, XMLUpdatable e) => e -> Maybe X.Element
+        serialize el = case el^.drawAttr.attrId of
+          Nothing -> addId $ serializeTreeNode el
+          Just _id ->
+            let newNode = el & drawAttr.attrId .~ Just k in
+            serializeTreeNode newNode
 
     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.1
+version:             0.4.2
 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.1
+    Tag:       v0.4.2
 
 library
   hs-source-dirs: src
