diff --git a/libyaml/api.c b/libyaml/api.c
--- a/libyaml/api.c
+++ b/libyaml/api.c
@@ -1367,8 +1367,9 @@
     struct {
         yaml_error_type_t error;
     } context;
-    yaml_node_pair_t pair = { key, value };
 
+    yaml_node_pair_t pair;
+
     assert(document);       /* Non-NULL document is required. */
     assert(mapping > 0
             && document->nodes.start + mapping <= document->nodes.top);
@@ -1379,6 +1380,9 @@
                             /* Valid key id is required. */
     assert(value > 0 && document->nodes.start + value <= document->nodes.top);
                             /* Valid value id is required. */
+
+    pair.key = key;
+    pair.value = value;
 
     if (!PUSH(&context,
                 document->nodes.start[mapping-1].data.mapping.pairs, pair))
diff --git a/libyaml/emitter.c b/libyaml/emitter.c
--- a/libyaml/emitter.c
+++ b/libyaml/emitter.c
@@ -1154,7 +1154,7 @@
             break;
 
         case YAML_MAPPING_START_EVENT:
-            if (!yaml_emitter_check_empty_sequence(emitter))
+            if (!yaml_emitter_check_empty_mapping(emitter))
                 return 0;
             length += emitter->anchor_data.anchor_length
                 + emitter->tag_data.handle_length
@@ -1349,11 +1349,16 @@
 yaml_emitter_analyze_tag_directive(yaml_emitter_t *emitter,
         yaml_tag_directive_t tag_directive)
 {
-    yaml_string_t handle = STRING(tag_directive.handle,
-            strlen((char *)tag_directive.handle));
-    yaml_string_t prefix = STRING(tag_directive.prefix,
-            strlen((char *)tag_directive.prefix));
+    yaml_string_t handle;
+    yaml_string_t prefix;
+    size_t handle_length;
+    size_t prefix_length;
 
+    handle_length = strlen((char *)tag_directive.handle);
+    prefix_length = strlen((char *)tag_directive.prefix);
+    STRING_ASSIGN(handle, tag_directive.handle, handle_length);
+    STRING_ASSIGN(prefix, tag_directive.prefix, prefix_length);
+
     if (handle.start == handle.end) {
         return yaml_emitter_set_emitter_error(emitter,
                 "tag handle must not be empty");
@@ -1395,7 +1400,11 @@
 yaml_emitter_analyze_anchor(yaml_emitter_t *emitter,
         yaml_char_t *anchor, int alias)
 {
-    yaml_string_t string = STRING(anchor, strlen((char *)anchor));
+    size_t anchor_length;
+    yaml_string_t string;
+    
+    anchor_length = strlen((char *)anchor);
+    STRING_ASSIGN(string, anchor, anchor_length);
 
     if (string.start == string.end) {
         return yaml_emitter_set_emitter_error(emitter, alias ?
@@ -1427,9 +1436,13 @@
 yaml_emitter_analyze_tag(yaml_emitter_t *emitter,
         yaml_char_t *tag)
 {
-    yaml_string_t string = STRING(tag, strlen((char *)tag));
+    size_t tag_length;
+    yaml_string_t string;
     yaml_tag_directive_t *tag_directive;
 
+    tag_length = strlen((char *)tag);
+    STRING_ASSIGN(string, tag, tag_length);
+
     if (string.start == string.end) {
         return yaml_emitter_set_emitter_error(emitter,
                 "tag value must not be empty");
@@ -1466,7 +1479,7 @@
 yaml_emitter_analyze_scalar(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
 
     int block_indicators = 0;
     int flow_indicators = 0;
@@ -1485,6 +1498,8 @@
     int previous_space = 0;
     int previous_break = 0;
 
+    STRING_ASSIGN(string, value, length);
+
     emitter->scalar_data.value = value;
     emitter->scalar_data.length = length;
 
@@ -1772,8 +1787,12 @@
         char *indicator, int need_whitespace,
         int is_whitespace, int is_indention)
 {
-    yaml_string_t string = STRING((yaml_char_t *)indicator, strlen(indicator));
+    size_t indicator_length;
+    yaml_string_t string;
 
+    indicator_length = strlen(indicator);
+    STRING_ASSIGN(string, (yaml_char_t *)indicator, indicator_length);
+
     if (need_whitespace && !emitter->whitespace) {
         if (!PUT(emitter, ' ')) return 0;
     }
@@ -1793,7 +1812,8 @@
 yaml_emitter_write_anchor(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
+    STRING_ASSIGN(string, value, length);
 
     while (string.pointer != string.end) {
         if (!WRITE(emitter, string)) return 0;
@@ -1809,7 +1829,8 @@
 yaml_emitter_write_tag_handle(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
+    STRING_ASSIGN(string, value, length);
 
     if (!emitter->whitespace) {
         if (!PUT(emitter, ' ')) return 0;
@@ -1830,7 +1851,8 @@
         yaml_char_t *value, size_t length,
         int need_whitespace)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
+    STRING_ASSIGN(string, value, length);
 
     if (need_whitespace && !emitter->whitespace) {
         if (!PUT(emitter, ' ')) return 0;
@@ -1876,10 +1898,12 @@
 yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length, int allow_breaks)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
     int spaces = 0;
     int breaks = 0;
 
+    STRING_ASSIGN(string, value, length);
+
     if (!emitter->whitespace) {
         if (!PUT(emitter, ' ')) return 0;
     }
@@ -1934,10 +1958,12 @@
 yaml_emitter_write_single_quoted_scalar(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length, int allow_breaks)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
     int spaces = 0;
     int breaks = 0;
 
+    STRING_ASSIGN(string, value, length);
+
     if (!yaml_emitter_write_indicator(emitter, "'", 1, 0, 0))
         return 0;
 
@@ -1995,9 +2021,11 @@
 yaml_emitter_write_double_quoted_scalar(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length, int allow_breaks)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
     int spaces = 0;
 
+    STRING_ASSIGN(string, value, length);
+
     if (!yaml_emitter_write_indicator(emitter, "\"", 1, 0, 0))
         return 0;
 
@@ -2207,9 +2235,11 @@
 yaml_emitter_write_literal_scalar(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
     int breaks = 1;
 
+    STRING_ASSIGN(string, value, length);
+
     if (!yaml_emitter_write_indicator(emitter, "|", 1, 0, 0))
         return 0;
     if (!yaml_emitter_write_block_scalar_hints(emitter, string))
@@ -2244,9 +2274,11 @@
 yaml_emitter_write_folded_scalar(yaml_emitter_t *emitter,
         yaml_char_t *value, size_t length)
 {
-    yaml_string_t string = STRING(value, length);
+    yaml_string_t string;
     int breaks = 1;
     int leading_spaces = 1;
+
+    STRING_ASSIGN(string, value, length);
 
     if (!yaml_emitter_write_indicator(emitter, ">", 1, 0, 0))
         return 0;
diff --git a/libyaml/loader.c b/libyaml/loader.c
--- a/libyaml/loader.c
+++ b/libyaml/loader.c
@@ -225,11 +225,13 @@
 yaml_parser_register_anchor(yaml_parser_t *parser,
         int index, yaml_char_t *anchor)
 {
-    yaml_alias_data_t data = { anchor, index, { 0, 0, 0 } };
+    yaml_alias_data_t data;
     yaml_alias_data_t *alias_data;
 
     if (!anchor) return 1;
 
+    data.anchor = anchor;
+    data.index = index;
     data.mark = parser->document->nodes.start[index-1].start_mark;
 
     for (alias_data = parser->aliases.start;
diff --git a/libyaml/parser.c b/libyaml/parser.c
--- a/libyaml/parser.c
+++ b/libyaml/parser.c
@@ -1280,10 +1280,10 @@
         }
 
         else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
-            yaml_tag_directive_t value = {
-                token->data.tag_directive.handle,
-                token->data.tag_directive.prefix
-            };
+            yaml_tag_directive_t value;
+            value.handle = token->data.tag_directive.handle;
+            value.prefix = token->data.tag_directive.prefix;
+
             if (!yaml_parser_append_tag_directive(parser, value, 0,
                         token->start_mark))
                 goto error;
diff --git a/libyaml/reader.c b/libyaml/reader.c
--- a/libyaml/reader.c
+++ b/libyaml/reader.c
@@ -120,7 +120,7 @@
 
     if (!parser->read_handler(parser->read_handler_data, parser->raw_buffer.last,
                 parser->raw_buffer.end - parser->raw_buffer.last, &size_read)) {
-        return yaml_parser_set_reader_error(parser, "Input error",
+        return yaml_parser_set_reader_error(parser, "input error",
                 parser->offset, -1);
     }
     parser->raw_buffer.last += size_read;
@@ -141,6 +141,8 @@
 YAML_DECLARE(int)
 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
 {
+    int first = 1;
+
     assert(parser->read_handler);   /* Read handler must be set. */
 
     /* If the EOF flag is set and the raw buffer is empty, do nothing. */
@@ -178,9 +180,12 @@
 
     while (parser->unread < length)
     {
-        /* Fill the raw buffer. */
+        /* Fill the raw buffer if necessary. */
 
-        if (!yaml_parser_update_raw_buffer(parser)) return 0;
+        if (!first || parser->raw_buffer.pointer == parser->raw_buffer.last) {
+            if (!yaml_parser_update_raw_buffer(parser)) return 0;
+        }
+        first = 0;
 
         /* Decode the raw buffer. */
 
@@ -232,7 +237,7 @@
 
                     if (!width)
                         return yaml_parser_set_reader_error(parser,
-                                "Invalid leading UTF-8 octet",
+                                "invalid leading UTF-8 octet",
                                 parser->offset, octet);
 
                     /* Check if the raw buffer contains an incomplete character. */
@@ -240,7 +245,7 @@
                     if (width > raw_unread) {
                         if (parser->eof) {
                             return yaml_parser_set_reader_error(parser,
-                                    "Incomplete UTF-8 octet sequence",
+                                    "incomplete UTF-8 octet sequence",
                                     parser->offset, -1);
                         }
                         incomplete = 1;
@@ -264,7 +269,7 @@
 
                         if ((octet & 0xC0) != 0x80)
                             return yaml_parser_set_reader_error(parser,
-                                    "Invalid trailing UTF-8 octet",
+                                    "invalid trailing UTF-8 octet",
                                     parser->offset+k, octet);
 
                         /* Decode the octet. */
@@ -279,14 +284,14 @@
                             (width == 3 && value >= 0x800) ||
                             (width == 4 && value >= 0x10000)))
                         return yaml_parser_set_reader_error(parser,
-                                "Invalid length of a UTF-8 sequence",
+                                "invalid length of a UTF-8 sequence",
                                 parser->offset, -1);
 
                     /* Check the range of the value. */
 
                     if ((value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF)
                         return yaml_parser_set_reader_error(parser,
-                                "Invalid Unicode character",
+                                "invalid Unicode character",
                                 parser->offset, value);
 
                     break;
@@ -328,7 +333,7 @@
                     if (raw_unread < 2) {
                         if (parser->eof) {
                             return yaml_parser_set_reader_error(parser,
-                                    "Incomplete UTF-16 character",
+                                    "incomplete UTF-16 character",
                                     parser->offset, -1);
                         }
                         incomplete = 1;
@@ -344,7 +349,7 @@
 
                     if ((value & 0xFC00) == 0xDC00)
                         return yaml_parser_set_reader_error(parser,
-                                "Unexpected low surrogate area",
+                                "unexpected low surrogate area",
                                 parser->offset, value);
 
                     /* Check for a high surrogate area. */
@@ -358,7 +363,7 @@
                         if (raw_unread < 4) {
                             if (parser->eof) {
                                 return yaml_parser_set_reader_error(parser,
-                                        "Incomplete UTF-16 surrogate pair",
+                                        "incomplete UTF-16 surrogate pair",
                                         parser->offset, -1);
                             }
                             incomplete = 1;
@@ -374,7 +379,7 @@
 
                         if ((value2 & 0xFC00) != 0xDC00)
                             return yaml_parser_set_reader_error(parser,
-                                    "Expected low surrogate area",
+                                    "expected low surrogate area",
                                     parser->offset+2, value2);
 
                         /* Generate the value of the surrogate pair. */
@@ -409,7 +414,7 @@
                         || (value >= 0xE000 && value <= 0xFFFD)
                         || (value >= 0x10000 && value <= 0x10FFFF)))
                 return yaml_parser_set_reader_error(parser,
-                        "Control characters are not allowed",
+                        "control characters are not allowed",
                         parser->offset, value);
 
             /* Move the raw pointers. */
diff --git a/libyaml/scanner.c b/libyaml/scanner.c
--- a/libyaml/scanner.c
+++ b/libyaml/scanner.c
@@ -1118,9 +1118,11 @@
 
     if (parser->simple_key_allowed)
     {
-        yaml_simple_key_t simple_key = { 1, required,
-            parser->tokens_parsed + parser->tokens.tail - parser->tokens.head,
-            { 0, 0, 0 } };
+        yaml_simple_key_t simple_key;
+        simple_key.possible = 1;
+        simple_key.required = required;
+        simple_key.token_number = 
+            parser->tokens_parsed + (parser->tokens.tail - parser->tokens.head);
         simple_key.mark = parser->mark;
 
         if (!yaml_parser_remove_simple_key(parser)) return 0;
diff --git a/libyaml/writer.c b/libyaml/writer.c
--- a/libyaml/writer.c
+++ b/libyaml/writer.c
@@ -58,7 +58,7 @@
             return 1;
         }
         else {
-            return yaml_emitter_set_writer_error(emitter, "Write error");
+            return yaml_emitter_set_writer_error(emitter, "write error");
         }
     }
 
@@ -135,7 +135,7 @@
         return 1;
     }
     else {
-        return yaml_emitter_set_writer_error(emitter, "Write error");
+        return yaml_emitter_set_writer_error(emitter, "write error");
     }
 }
 
diff --git a/libyaml/yaml.h b/libyaml/yaml.h
--- a/libyaml/yaml.h
+++ b/libyaml/yaml.h
@@ -26,9 +26,7 @@
 
 /** The public API declaration. */
 
-#define YAML_DECLARE_STATIC
-
-#ifdef WIN32
+#ifdef _WIN32
 #   if defined(YAML_DECLARE_STATIC)
 #       define  YAML_DECLARE(type)  type
 #   elif defined(YAML_DECLARE_EXPORT)
diff --git a/libyaml/yaml_private.h b/libyaml/yaml_private.h
--- a/libyaml/yaml_private.h
+++ b/libyaml/yaml_private.h
@@ -113,6 +113,11 @@
 
 #define STRING(string,length)   { (string), (string)+(length), (string) }
 
+#define STRING_ASSIGN(value,string,length)                                      \
+    ((value).start = (string),                                                  \
+     (value).end = (string)+(length),                                           \
+     (value).pointer = (string))
+
 #define STRING_INIT(context,string,size)                                        \
     (((string).start = yaml_malloc(size)) ?                                     \
         ((string).pointer = (string).start,                                     \
@@ -633,7 +638,7 @@
      (node).data.mapping.pairs.top = (node_pairs_start),                        \
      (node).data.mapping.style = (node_style))
 
-#define YAML_VERSION_STRING "0.1.2"
+#define YAML_VERSION_STRING "0.1.4"
 #define YAML_VERSION_MAJOR 0
 #define YAML_VERSION_MINOR 1
-#define YAML_VERSION_PATCH 2
+#define YAML_VERSION_PATCH 4
diff --git a/yaml.cabal b/yaml.cabal
--- a/yaml.cabal
+++ b/yaml.cabal
@@ -1,5 +1,5 @@
 name:            yaml
-version:         0.8.5.4
+version:         0.8.6
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>, Anton Ageev <antage@gmail.com>,Kirill Simonov 
