         }
         if let group = node as? Group {
             var result = indentTextWithOffset(SVGGroupOpenTag, offset)
+            if ([group.place.dx, group.place.dy].map{ Int($0) } != [0, 0]) {
+                if ([group.place.m11, group.place.m12, group.place.m21, group.place.m22].map { Int($0) } == [1, 0, 0, 1]) {
+                    result += " transform=\"translate(\(Int(group.place.dx)),\(Int(group.place.dy)))\""
+                } else {
+                    let matrixArgs = [group.place.m11, group.place.m12, group.place.m21, group.place.m22, group.place.dx, group.place.dy].map{ String($0) }.joined(separator: ",")
+                    result += " transform=\"matrix(\(matrixArgs))\""
+                }
+            }
+            result += SVGGenericEndTag
             for child in group.contentsVar.value {
                 result += serialize(node: child, offset: offset + 1)
             }

    }
    
    fileprivate func serialize(node:Node) -> String {
        var result = [SVGDefaultHeader, "id=\"\(self.id)\"", "width=\"\(self.width)\"", "height=\"\(self.height)\"", SVGGenericEndTag].joined(separator: " ")
        result += serialize(node: node, offset: 1)
        result += indentTextWithOffset(SVGFooter, 0)
        return result
    }
    
    open class func serialize(node: Node, indent: Int = 1) -> String {
        return SVGSerializer(indent:indent).serialize(node: node)
    }
    
}

        self.indent = indent
    }
    
    // header and footer
    fileprivate let SVGDefaultHeader = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\""
    fileprivate static let SVGDefaultId = ""
    fileprivate static let SVGUndefinedSize = -1
    fileprivate let SVGFooter = "</svg>"
    
    // groups
    fileprivate let SVGGroupOpenTag = "<g"
    fileprivate let SVGGroupCloseTag = "</g>"
    
    // shapes
