diff --git a/org/w3c/css/css/CssRuleList.java b/org/w3c/css/css/CssRuleList.java
index e74bdc399..c1c2eebdf 100644
--- a/org/w3c/css/css/CssRuleList.java
+++ b/org/w3c/css/css/CssRuleList.java
@@ -5,21 +5,22 @@
 
 package org.w3c.css.css;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.w3c.css.parser.AtRule;
 import org.w3c.css.util.Messages;
 
-import java.util.ArrayList;
-
-public class CssRuleList {
+public class CssRuleList implements ICssStyleRuleOrCssRuleList {
 
     AtRule atRule;
-    ArrayList<CssStyleRule> rulelist;
+    ArrayList<ICssStyleRuleOrCssRuleList> rulelist;
     public String pseudopage;
     String indent;
 
     public CssRuleList() {
         atRule = null;
-        rulelist = new ArrayList<CssStyleRule>();
+        rulelist = new ArrayList<>();
         indent = new String();
     }
 
@@ -28,9 +29,40 @@ public void addStyleRule(CssStyleRule stylerule) {
     }
 
     public ArrayList<CssStyleRule> getStyleRules() {
+        ArrayList<CssStyleRule> r = new ArrayList<>(this.rulelist.size());
+        for(ICssStyleRuleOrCssRuleList u: this.rulelist) {
+        	if (u instanceof CssStyleRule) {
+        		r.add((CssStyleRule) u);
+        	}
+        }
+		return r;
+    }
+
+    public List<ICssStyleRuleOrCssRuleList> getStyleRulesTree() {
         return rulelist;
     }
 
+    public List<CssStyleRule> getStyleRulesAllInTree() {
+        ArrayList<CssStyleRule> r = new ArrayList<>();
+        this.appendStyleRulesTree(r);
+        return r;
+    }
+    
+    protected void appendStyleRulesTree(List<CssStyleRule> r) {
+        for(ICssStyleRuleOrCssRuleList u: this.rulelist) {
+        	if (u instanceof CssStyleRule) {
+        		r.add((CssStyleRule) u);
+        	}else if (u instanceof CssRuleList) {
+        		CssRuleList l = (CssRuleList) u;
+        		l.appendStyleRulesTree(r);
+        	}
+        }
+    }
+
+    /**
+     * This should be rather named setAtRule
+     * @param atRule
+     */
     public void addAtRule(AtRule atRule) {
         this.atRule = atRule;
     }
@@ -64,7 +96,7 @@ public String toString() {
                 ret.append(atRuleString);
                 ret.append(" {\n\n");
             }
-            for (CssStyleRule styleRule : rulelist) {
+            for (ICssStyleRuleOrCssRuleList styleRule : rulelist) {
                 ret.append(styleRule);
             }
             if (atRuleString.length() != 0) {
@@ -74,4 +106,8 @@ public String toString() {
         return ret.toString();
     }
 
+	public void addSubRulelist(CssRuleList rulelist) {
+		this.rulelist.add(rulelist);
+	}
+
 }
diff --git a/org/w3c/css/css/CssStyleRule.java b/org/w3c/css/css/CssStyleRule.java
index bb7981383..0adbe01d1 100644
--- a/org/w3c/css/css/CssStyleRule.java
+++ b/org/w3c/css/css/CssStyleRule.java
@@ -10,7 +10,7 @@
 
 import java.util.ArrayList;
 
-public class CssStyleRule {
+public class CssStyleRule implements ICssStyleRuleOrCssRuleList  {
 
     public CssStyleRule(String indent, String selectors,
                         ArrayList<CssProperty> properties, boolean important) {
diff --git a/org/w3c/css/css/ICssStyleRuleOrCssRuleList.java b/org/w3c/css/css/ICssStyleRuleOrCssRuleList.java
new file mode 100644
index 000000000..fd9900ed0
--- /dev/null
+++ b/org/w3c/css/css/ICssStyleRuleOrCssRuleList.java
@@ -0,0 +1,5 @@
+package org.w3c.css.css;
+
+public interface ICssStyleRuleOrCssRuleList {
+
+}
diff --git a/org/w3c/css/css/StyleSheet.java b/org/w3c/css/css/StyleSheet.java
index 65d3848eb..e2e49670d 100644
--- a/org/w3c/css/css/StyleSheet.java
+++ b/org/w3c/css/css/StyleSheet.java
@@ -21,6 +21,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Stack;
+import java.util.Vector;
 
 /**
  * This class contains a style sheet with all rules, errors and warnings.
@@ -34,7 +37,9 @@ public class StyleSheet {
     private Errors errors;
     private Warnings warnings;
     private String type;
-    private ArrayList<CssRuleList> atRuleList;
+    private ArrayList<CssRuleList> atRuleListFlat = new ArrayList<>();
+    private ArrayList<CssRuleList> atRuleListTree = new ArrayList<>();
+    private Stack<CssRuleList> ruleInsertStack = new Stack<CssRuleList>();
     private boolean doNotAddRule;
     private boolean doNotAddAtRule;
     private static final boolean debug = false;
@@ -48,7 +53,6 @@ public StyleSheet() {
         errors = new Errors();
         warnings = new Warnings();
         cascading = new CssCascadingOrder();
-        atRuleList = new ArrayList<>();
         customProperties = new HashMap<>();
     }
 
@@ -239,14 +243,23 @@ public void addCharSet(String charset) {
     public void newAtRule(AtRule atRule) {
         CssRuleList rulelist = new CssRuleList();
         rulelist.addAtRule(atRule);
-        atRuleList.add(rulelist);
+        
+        atRuleListFlat.add(rulelist);
+        if (! ruleInsertStack.isEmpty()) {
+        	ruleInsertStack.peek().addSubRulelist(rulelist);
+        } else {
+            atRuleListTree.add(rulelist);
+        }
+        ruleInsertStack.add(rulelist);
+        
         indent += "   ";
     }
 
     public void endOfAtRule() {
         if (!doNotAddAtRule) {
-            CssRuleList rulelist = new CssRuleList();
-            atRuleList.add(rulelist); //for the new set of rules
+//            CssRuleList rulelist = new CssRuleList();
+//            atRuleList.add(rulelist); //for the new set of rules
+        	if (! ruleInsertStack.isEmpty()) ruleInsertStack.pop();
         }
         important = false;
         selectortext = "";
@@ -282,13 +295,15 @@ public void endOfRule() {
         if (!doNotAddRule) {
             CssStyleRule stylerule = new CssStyleRule(indent, selectortext,
                     properties, important);
-            if (!atRuleList.isEmpty()) {
-                rulelist = atRuleList.remove(atRuleList.size() - 1);
+            if (!ruleInsertStack.isEmpty()) {
+                rulelist = ruleInsertStack.peek();
             } else {
                 rulelist = new CssRuleList();
+                ruleInsertStack.add(rulelist);
+                atRuleListTree.add(rulelist);
+                atRuleListFlat.add(rulelist);
             }
             rulelist.addStyleRule(stylerule);
-            atRuleList.add(rulelist);
         }
         selectortext = "";
         doNotAddRule = false;
@@ -303,7 +318,10 @@ public void removeThisAtRule() {
     }
 
     public ArrayList<CssRuleList> newGetRules() {
-        return atRuleList;
+        return atRuleListFlat;
+    }
+    public List<CssRuleList> newGetRulesTree() {
+    	return this.atRuleListTree;
     }
 
     String selectortext;
@@ -311,4 +329,5 @@ public ArrayList<CssRuleList> newGetRules() {
     ArrayList<CssProperty> properties;
     String indent = new String();
     public String charset;
+
 }