Index: /pyyaml/trunk/tests/test_appliance.py
===================================================================
--- /pyyaml/trunk/tests/test_appliance.py	(revision 54)
+++ /pyyaml/trunk/tests/test_appliance.py	(revision 118)
@@ -48,4 +48,5 @@
         #print self.data[self.index:]
         tokens = []
+        tokens.append(StreamStartToken(None, None))
         while True:
             self.find_token()
@@ -207,6 +208,8 @@
         self.events = []
 
-    # stream: document* END
+    # stream: STREAM-START document* STREAM-END
     def parse_stream(self):
+        self.consume_token(StreamStartToken)
+        self.events.append(StreamStartEvent(None, None))
         while not self.test_token(StreamEndToken):
             if self.test_token(DirectiveToken, DocumentStartToken):
@@ -214,4 +217,5 @@
             else:
                 raise Error("document is expected, got "+repr(self.tokens[self.index]))
+        self.consume_token(StreamEndToken)
         self.events.append(StreamEndEvent(None, None))
 
@@ -222,5 +226,7 @@
             self.consume_token(DirectiveToken)
         self.consume_token(DocumentStartToken)
+        self.events.append(DocumentStartEvent(None, None))
         self.parse_node()
+        self.events.append(DocumentEndEvent(None, None))
 
     # node: ALIAS | ANCHOR? TAG? (SCALAR|sequence|mapping)
Index: /pyyaml/trunk/tests/test_structure.py
===================================================================
--- /pyyaml/trunk/tests/test_structure.py	(revision 57)
+++ /pyyaml/trunk/tests/test_structure.py	(revision 118)
@@ -13,5 +13,8 @@
             node1 = []
             while not parser.check(StreamEndEvent):
-                node1.append(self._convert(parser))
+                if not parser.check(StreamStartEvent, DocumentStartEvent, DocumentEndEvent):
+                    node1.append(self._convert(parser))
+                else:
+                    parser.get()
             parser.get()
             if len(node1) == 1:
Index: /pyyaml/trunk/tests/test_tokens.py
===================================================================
--- /pyyaml/trunk/tests/test_tokens.py	(revision 51)
+++ /pyyaml/trunk/tests/test_tokens.py	(revision 118)
@@ -55,5 +55,5 @@
             tokens1 = []
             for token in scanner:
-                if not isinstance(token, StreamEndToken):
+                if not isinstance(token, (StreamStartToken, StreamEndToken)):
                     tokens1.append(token)
             tokens1 = [self.replaces[t.__class__] for t in tokens1]
@@ -78,5 +78,5 @@
                 tokens = []
                 for token in scanner:
-                    if not isinstance(token, StreamEndToken):
+                    if not isinstance(token, (StreamStartToken, StreamEndToken)):
                         tokens.append(token.__class__.__name__)
             except:
Index: /pyyaml/trunk/lib/yaml/tokens.py
===================================================================
--- /pyyaml/trunk/lib/yaml/tokens.py	(revision 116)
+++ /pyyaml/trunk/lib/yaml/tokens.py	(revision 118)
@@ -28,4 +28,7 @@
 class DocumentEndToken(Token):
     id = '<document end>'
+
+class StreamStartToken(Token):
+    id = '<stream start>'
 
 class StreamEndToken(Token):
Index: /pyyaml/trunk/lib/yaml/events.py
===================================================================
--- /pyyaml/trunk/lib/yaml/events.py	(revision 116)
+++ /pyyaml/trunk/lib/yaml/events.py	(revision 118)
@@ -45,4 +45,13 @@
     pass
 
+class DocumentStartEvent(Event):
+    pass
+
+class DocumentEndEvent(Event):
+    pass
+
+class StreamStartEvent(Event):
+    pass
+
 class StreamEndEvent(Event):
     pass
Index: /pyyaml/trunk/lib/yaml/composer.py
===================================================================
--- /pyyaml/trunk/lib/yaml/composer.py	(revision 116)
+++ /pyyaml/trunk/lib/yaml/composer.py	(revision 118)
@@ -16,4 +16,7 @@
         self.complete_anchors = {}
 
+        # Drop the STREAM-START event.
+        self.parser.get()
+
     def check(self):
         # If there are more documents available?
@@ -31,5 +34,14 @@
 
     def compose_document(self):
+
+        # Drop the DOCUMENT-START event.
+        self.parser.get()
+
+        # Compose the root node.
         node = self.compose_node()
+
+        # Drop the DOCUMENT-END event.
+        self.parser.get()
+
         self.all_anchors = {}
         self.complete_anchors = {}
Index: /pyyaml/trunk/lib/yaml/scanner.py
===================================================================
--- /pyyaml/trunk/lib/yaml/scanner.py	(revision 117)
+++ /pyyaml/trunk/lib/yaml/scanner.py	(revision 118)
@@ -1,8 +1,9 @@
 
 # Scanner produces tokens of the following types:
+# STREAM-START
+# STREAM-END
 # DIRECTIVE(name, value)
 # DOCUMENT-START
 # DOCUMENT-END
-# STREAM-END
 # BLOCK-SEQUENCE-START
 # BLOCK-MAPPING-START
@@ -69,4 +70,7 @@
         self.tokens = []
 
+        # Add the STREAM-START token.
+        self.fetch_stream_start()
+
         # Number of tokens that were emitted through the `get_token` method.
         self.tokens_taken = 0
@@ -369,4 +373,15 @@
     # Fetchers.
 
+    def fetch_stream_start(self):
+        # We always add STREAM-START as the first token and STREAM-END as the
+        # last token.
+
+        # Read the token.
+        mark = self.reader.get_mark()
+        
+        # Add STREAM-END.
+        self.tokens.append(StreamStartToken(mark, mark))
+        
+
     def fetch_stream_end(self):
 
@@ -381,5 +396,5 @@
         mark = self.reader.get_mark()
         
-        # Add END.
+        # Add STREAM-END.
         self.tokens.append(StreamEndToken(mark, mark))
 
Index: /pyyaml/trunk/lib/yaml/parser.py
===================================================================
--- /pyyaml/trunk/lib/yaml/parser.py	(revision 116)
+++ /pyyaml/trunk/lib/yaml/parser.py	(revision 118)
@@ -3,5 +3,5 @@
 #
 # We use the following production rules:
-# stream            ::= implicit_document? explicit_document* STREAM-END
+# stream            ::= STREAM-START implicit_document? explicit_document* STREAM-END
 # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END?
 # implicit_document ::= block_node DOCUMENT-END?
@@ -43,5 +43,5 @@
 
 # FIRST sets:
-# stream: FIRST(block_node) + { DIRECTIVE DOCUMENT-START }
+# stream: { STREAM-START }
 # explicit_document: { DIRECTIVE DOCUMENT-START }
 # implicit_document: FIRST(block_node)
@@ -127,5 +127,9 @@
 
     def parse_stream(self):
-        # implicit_document? explicit_document* STREAM-END
+        # STREAM-START implicit_document? explicit_document* STREAM-END
+
+        # Parse start of stream.
+        token = self.scanner.get()
+        yield StreamStartEvent(token.start_mark, token.end_mark)
 
         # Parse implicit document.
@@ -133,9 +137,20 @@
                 StreamEndToken):
             self.tag_handles = self.DEFAULT_TAGS
+            token = self.scanner.peek()
+            start_mark = end_mark = token.start_mark
+            yield DocumentStartEvent(start_mark, end_mark)
             for event in self.parse_block_node():
                 yield event
+            token = self.scanner.peek()
+            start_mark = end_mark = token.start_mark
+            while self.scanner.check(DocumentEndToken):
+                token = self.scanner.get()
+                end_mark = token.end_mark
+            yield DocumentEndEvent(start_mark, end_mark)
 
         # Parse explicit documents.
         while not self.scanner.check(StreamEndToken):
+            token = self.scanner.peek()
+            start_mark = token.start_mark
             self.process_directives()
             if not self.scanner.check(DocumentStartToken):
@@ -145,4 +160,6 @@
                         self.scanner.peek().start_mark)
             token = self.scanner.get()
+            end_mark = token.end_mark
+            yield DocumentStartEvent(start_mark, end_mark)
             if self.scanner.check(DirectiveToken,
                     DocumentStartToken, DocumentEndToken, StreamEndToken):
@@ -151,6 +168,10 @@
                 for event in self.parse_block_node():
                     yield event
+            token = self.scanner.peek()
+            start_mark = end_mark = token.start_mark
             while self.scanner.check(DocumentEndToken):
-                self.scanner.get()
+                token = self.scanner.get()
+                end_mark = token.end_mark
+            yield DocumentEndEvent(start_mark, end_mark)
 
         # Parse end of stream.
