diff --git a/README b/README
index b32734e..55b1208 100644
--- a/README
+++ b/README
@@ -105,9 +105,10 @@
 == History ==
 
 '''1.2 (in Mercurial)'''
+ * Add 'parse()' method which return Events to support low level YAML processing
  * Add 'compose' methods which return Nodes
- * Rename LineBreak.LINUX to LineBreak.UNIX
- * Refactor: rename enums in DumperOptions to make the names consistent
+ * Rename `LineBreak`.LINUX to `LineBreak`.UNIX
+ * Refactor: rename enums in `DumperOptions` to make the names consistent
  * Add possibility to parse all scalars as Strings
  * Respect `DumperOptions` with a custom Representer
  * Represent TAB as '\t' instead of '(9' in an error message
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ba95b2f..2caf7dd 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -5,6 +5,9 @@
 	</properties>
 	<body>
 	    <release version="1.2-SNAPSHOT" date="in Mercurial" description="development">
+            <action dev="py4fun" type="add">
+                Add 'Yaml.parse()' method which return Events to support low level YAML processing (2009-04-20)
+            </action>
             <action dev="py4fun" type="add" due-to="Bob Jalex" issue="5">
                 Introduce LineBreak.getPlatformLineBreak (2009-04-18)
             </action>
diff --git a/src/main/java/org/yaml/snakeyaml/Loader.java b/src/main/java/org/yaml/snakeyaml/Loader.java
index c66475d..bbfd9d7 100644
--- a/src/main/java/org/yaml/snakeyaml/Loader.java
+++ b/src/main/java/org/yaml/snakeyaml/Loader.java
@@ -9,7 +9,9 @@
 import org.yaml.snakeyaml.constructor.BaseConstructor;
 import org.yaml.snakeyaml.constructor.Constructor;
 import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.events.Event;
 import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.parser.Parser;
 import org.yaml.snakeyaml.parser.ParserImpl;
 import org.yaml.snakeyaml.reader.Reader;
 import org.yaml.snakeyaml.resolver.Resolver;
@@ -137,4 +139,41 @@
             throw new YAMLException("Loader cannot be shared.");
         }
     }
+
+    /**
+     * Parse a YAML stream and produce parsing events.
+     * 
+     * @param yaml
+     *            - YAML document(s)
+     * @return parsed events
+     */
+    public Iterable<Event> parse(java.io.Reader yaml) {
+        final Parser parser = new ParserImpl(new Reader(yaml));
+        Iterator<Event> result = new Iterator<Event>() {
+            public boolean hasNext() {
+                return parser.peekEvent() != null;
+            }
+
+            public Event next() {
+                return parser.getEvent();
+            }
+
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+        return new EventIterable(result);
+    }
+
+    private class EventIterable implements Iterable<Event> {
+        private Iterator<Event> iterator;
+
+        public EventIterable(Iterator<Event> iterator) {
+            this.iterator = iterator;
+        }
+
+        public Iterator<Event> iterator() {
+            return iterator;
+        }
+    }
 }
diff --git a/src/main/java/org/yaml/snakeyaml/Yaml.java b/src/main/java/org/yaml/snakeyaml/Yaml.java
index 4e21736..4275936 100644
--- a/src/main/java/org/yaml/snakeyaml/Yaml.java
+++ b/src/main/java/org/yaml/snakeyaml/Yaml.java
@@ -12,6 +12,7 @@
 import java.util.List;
 import java.util.regex.Pattern;
 
+import org.yaml.snakeyaml.events.Event;
 import org.yaml.snakeyaml.nodes.Node;
 import org.yaml.snakeyaml.reader.UnicodeReader;
 import org.yaml.snakeyaml.resolver.Resolver;
@@ -308,4 +309,15 @@
     public void setName(String name) {
         this.name = name;
     }
+
+    /**
+     * Parse a YAML stream and produce parsing events.
+     * 
+     * @param yaml
+     *            - YAML document(s)
+     * @return parsed events
+     */
+    public Iterable<Event> parse(java.io.Reader yaml) {
+        return loader.parse(yaml);
+    }
 }
diff --git a/src/test/java/org/yaml/snakeyaml/YamlComposeTest.java b/src/test/java/org/yaml/snakeyaml/YamlComposeTest.java
new file mode 100644
index 0000000..0683711
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/YamlComposeTest.java
@@ -0,0 +1,89 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.nodes.MappingNode;
+import org.yaml.snakeyaml.nodes.Node;
+import org.yaml.snakeyaml.nodes.NodeId;
+
+public class YamlComposeTest extends TestCase {
+
+    public void testComposeFromString() {
+        Yaml yaml = new Yaml();
+        MappingNode node = (MappingNode) yaml.compose("abc: 56");
+        assertEquals("abc", node.getValue().get(0)[0].getValue());
+        assertEquals("56", node.getValue().get(0)[1].getValue());
+    }
+
+    public void testComposeFromString2() {
+        try {
+            Yaml yaml = new Yaml();
+            yaml.compose("abc: 56\n---\n123\n---\n456");
+            fail("YAML contans more then one ducument.");
+        } catch (Exception e) {
+            assertEquals("expected a single document in the stream; but found another document", e
+                    .getMessage());
+        }
+    }
+
+    public void testComposeFromReader() {
+        Yaml yaml = new Yaml();
+        MappingNode node = (MappingNode) yaml.compose(new StringReader("abc: 56"));
+        assertEquals("abc", node.getValue().get(0)[0].getValue());
+        assertEquals("56", node.getValue().get(0)[1].getValue());
+    }
+
+    public void testComposeFromInputStream() {
+        Yaml yaml = new Yaml();
+        MappingNode node = (MappingNode) yaml
+                .compose(new ByteArrayInputStream("abc: 56".getBytes()));
+        assertEquals("abc", node.getValue().get(0)[0].getValue());
+        assertEquals("56", node.getValue().get(0)[1].getValue());
+    }
+
+    public void testComposeAllFromString() {
+        Yaml yaml = new Yaml();
+        boolean first = true;
+        for (Node node : yaml.composeAll("abc: 56\n---\n123\n---\n456")) {
+            if (first) {
+                assertEquals(NodeId.mapping, node.getNodeId());
+            } else {
+                assertEquals(NodeId.scalar, node.getNodeId());
+            }
+            first = false;
+        }
+    }
+
+    public void testComposeAllFromReader() {
+        Yaml yaml = new Yaml();
+        boolean first = true;
+        for (Node node : yaml.composeAll(new StringReader("abc: 56\n---\n123\n---\n456"))) {
+            if (first) {
+                assertEquals(NodeId.mapping, node.getNodeId());
+            } else {
+                assertEquals(NodeId.scalar, node.getNodeId());
+            }
+            first = false;
+        }
+    }
+
+    public void testComposeAllFromInputStream() {
+        Yaml yaml = new Yaml();
+        boolean first = true;
+        for (Node node : yaml.composeAll(new ByteArrayInputStream("abc: 56\n---\n123\n---\n456"
+                .getBytes()))) {
+            if (first) {
+                assertEquals(NodeId.mapping, node.getNodeId());
+            } else {
+                assertEquals(NodeId.scalar, node.getNodeId());
+            }
+            first = false;
+        }
+    }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/YamlParseTest.java b/src/test/java/org/yaml/snakeyaml/YamlParseTest.java
new file mode 100644
index 0000000..441ab4c
--- /dev/null
+++ b/src/test/java/org/yaml/snakeyaml/YamlParseTest.java
@@ -0,0 +1,45 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
+package org.yaml.snakeyaml;
+
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.events.Event;
+import org.yaml.snakeyaml.events.StreamEndEvent;
+import org.yaml.snakeyaml.events.StreamStartEvent;
+
+public class YamlParseTest extends TestCase {
+
+    public void testParse() {
+        Yaml yaml = new Yaml();
+        Event e = null;
+        int counter = 0;
+        for (Event event : yaml.parse(new StringReader("abc: 56"))) {
+            if (e == null) {
+                assertTrue(event instanceof StreamStartEvent);
+            }
+            e = event;
+            counter++;
+        }
+        assertTrue(e instanceof StreamEndEvent);
+        assertEquals(8, counter);
+    }
+
+    public void testParseManyDocuments() {
+        Yaml yaml = new Yaml();
+        Event e = null;
+        int counter = 0;
+        for (Event event : yaml.parse(new StringReader("abc: 56\n---\n4\n---\nqwe\n"))) {
+            if (e == null) {
+                assertTrue(event instanceof StreamStartEvent);
+            }
+            e = event;
+            counter++;
+        }
+        assertTrue(e instanceof StreamEndEvent);
+        assertEquals(14, counter);
+    }
+}
diff --git a/src/test/java/org/yaml/snakeyaml/YamlTest.java b/src/test/java/org/yaml/snakeyaml/YamlTest.java
index 070e349..686b8fb 100644
--- a/src/test/java/org/yaml/snakeyaml/YamlTest.java
+++ b/src/test/java/org/yaml/snakeyaml/YamlTest.java
@@ -1,14 +1,10 @@
+/*
+ * See LICENSE file in distribution for copyright and licensing information.
+ */
 package org.yaml.snakeyaml;
 
-import java.io.ByteArrayInputStream;
-import java.io.StringReader;
-
 import junit.framework.TestCase;
 
-import org.yaml.snakeyaml.nodes.MappingNode;
-import org.yaml.snakeyaml.nodes.Node;
-import org.yaml.snakeyaml.nodes.NodeId;
-
 public class YamlTest extends TestCase {
 
     public void testSetNoName() {
@@ -22,77 +18,4 @@
         assertEquals("REST", yaml.getName());
         assertEquals("REST", yaml.toString());
     }
-
-    public void testComposeFromString() {
-        Yaml yaml = new Yaml();
-        MappingNode node = (MappingNode) yaml.compose("abc: 56");
-        assertEquals("abc", node.getValue().get(0)[0].getValue());
-        assertEquals("56", node.getValue().get(0)[1].getValue());
-    }
-
-    public void testComposeFromString2() {
-        try {
-            Yaml yaml = new Yaml();
-            yaml.compose("abc: 56\n---\n123\n---\n456");
-            fail("YAML contans more then one ducument.");
-        } catch (Exception e) {
-            assertEquals("expected a single document in the stream; but found another document", e
-                    .getMessage());
-        }
-    }
-
-    public void testComposeFromReader() {
-        Yaml yaml = new Yaml();
-        MappingNode node = (MappingNode) yaml.compose(new StringReader("abc: 56"));
-        assertEquals("abc", node.getValue().get(0)[0].getValue());
-        assertEquals("56", node.getValue().get(0)[1].getValue());
-    }
-
-    public void testComposeFromInputStream() {
-        Yaml yaml = new Yaml();
-        MappingNode node = (MappingNode) yaml
-                .compose(new ByteArrayInputStream("abc: 56".getBytes()));
-        assertEquals("abc", node.getValue().get(0)[0].getValue());
-        assertEquals("56", node.getValue().get(0)[1].getValue());
-    }
-
-    public void testComposeAllFromString() {
-        Yaml yaml = new Yaml();
-        boolean first = true;
-        for (Node node : yaml.composeAll("abc: 56\n---\n123\n---\n456")) {
-            if (first) {
-                assertEquals(NodeId.mapping, node.getNodeId());
-            } else {
-                assertEquals(NodeId.scalar, node.getNodeId());
-            }
-            first = false;
-        }
-    }
-
-    public void testComposeAllFromReader() {
-        Yaml yaml = new Yaml();
-        boolean first = true;
-        for (Node node : yaml.composeAll(new StringReader("abc: 56\n---\n123\n---\n456"))) {
-            if (first) {
-                assertEquals(NodeId.mapping, node.getNodeId());
-            } else {
-                assertEquals(NodeId.scalar, node.getNodeId());
-            }
-            first = false;
-        }
-    }
-
-    public void testComposeAllFromInputStream() {
-        Yaml yaml = new Yaml();
-        boolean first = true;
-        for (Node node : yaml.composeAll(new ByteArrayInputStream("abc: 56\n---\n123\n---\n456"
-                .getBytes()))) {
-            if (first) {
-                assertEquals(NodeId.mapping, node.getNodeId());
-            } else {
-                assertEquals(NodeId.scalar, node.getNodeId());
-            }
-            first = false;
-        }
-    }
 }
