 		}
 		node.place = pos.move(dx: getDoubleValue(element, attribute: "x") ?? 0, dy: getDoubleValue(element, attribute: "y") ?? 0)
 		node.opacity = opacity
-		if let shape = node as? Shape {
-			if let color = fill {
-				shape.fill = color
-			}
+        let maskString = element.attributes["mask"] ?? ""
+		return parseUseNode(node: node, fill: fill, stroke: stroke, mask: maskString)
+	}
+    
+    fileprivate func parseUseNode(node: Node, fill: Fill?, stroke: Stroke?, mask: String) -> Node {
+        if let shape = node as? Shape {
+            if let color = fill {
+                shape.fill = color
+            }
             if let line = stroke {
                 shape.stroke = line
             }
             if let maskIdenitifierMatcher = SVGParserRegexHelper.getMaskIdenitifierMatcher() {
-                let maskString = element.attributes["mask"] ?? ""
-                let fullRange = NSMakeRange(0, maskString.characters.count)
-                if let match = maskIdenitifierMatcher.firstMatch(in: maskString, options: .reportCompletion, range: fullRange), let maskReferenceNode = self.defMasks[(maskString as NSString).substring(with: match.rangeAt(1))] {
+                let fullRange = NSMakeRange(0, mask.characters.count)
+                if let match = maskIdenitifierMatcher.firstMatch(in: mask, options: .reportCompletion, range: fullRange), let maskReferenceNode = self.defMasks[(mask as NSString).substring(with: match.rangeAt(1))] {
                     shape.clip = maskReferenceNode.form
                     shape.fill = .none
                 }
             }
-			return shape
-		}
-		if let text = node as? Text {
-			if let color = fill {
-				text.fill = color
-			}
-			return text
-		}
-		return node
-	}
+            return shape
+        }
+        if let text = node as? Text {
+            if let color = fill {
+                text.fill = color
+            }
+            return text
+        }
+        if let group = node as? Group {
+            group.contents.forEach { node in
+                parseUseNode(node: node, fill: fill, stroke: stroke, mask: mask)
+            }
+            return group
+        }
+        return node
+    }
     
     fileprivate func parseMask(_ mask: XMLIndexer) -> Shape? {
         guard let element = mask.element else {

				groupNodes.append(node)
			}
		}
		return Group(contents: groupNodes, place: position)
	}

	fileprivate func getPosition(_ element: XMLElement) -> Transform {
		guard let transformAttribute = element.attributes["transform"] else {

	}

	fileprivate func getStrokeWidth(_ styleParts: [String: String]) -> Double {
		if let strokeWidth = styleParts["stroke-width"] {
            let characterSet = NSCharacterSet.decimalDigits.union(NSCharacterSet.punctuationCharacters).inverted
            let digitsArray = strokeWidth.components(separatedBy: characterSet)
            let digits = digitsArray.joined(separator: "")
            if let value = NumberFormatter().number(from: digits) {
                return value.doubleValue
            }
		}
        return 0
	}

	fileprivate func getStrokeCap(_ styleParts: [String: String]) -> LineCap {
