diff --git a/ChangeLog b/ChangeLog
index f18ac0c70f..0ff5a2f0fd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+Tue Apr 27 08:15:13 2004  why the lucky stiff  <why@ruby-lang.org>
+
+	* lib/yaml/rubytypes.rb: passing Range tests.
+
+	* ext/syck/syck.h: version 0.44.
+
+	* ext/syck/gram.c: transfers no longer open an indentation.
+	  fixed transfers which precede blocks.
+
+	* ext/syck/token.c: ditto.
+
+	* ext/syck/syck.c: fixed segfault if an anchor has been released already.
+
+	* ext/syck/node.c (syck_free_members): organized order of free'd nodes.
+
+	* ext/syck/rubyext.c (syck_emitter_write_m): test for proper string with
+	  StringValue.
+
 Mon Apr 26 23:56:54 2004  Daniel Kelley  <news-1082945587@dkelley.gmp.san-jose.ca.us>
 
 	* README.EXT, README.EXT.ja: fixed wrong function signature.
diff --git a/ext/syck/gram.c b/ext/syck/gram.c
index 1fa724e010..4e8020bd16 100644
--- a/ext/syck/gram.c
+++ b/ext/syck/gram.c
@@ -250,7 +250,7 @@ union yyalloc
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  43
-#define YYLAST   436
+#define YYLAST   486
 
 /* YYNTOKENS -- Number of terminals. */
 #define YYNTOKENS  23
@@ -259,7 +259,7 @@ union yyalloc
 /* YYNRULES -- Number of rules. */
 #define YYNRULES  75
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  128
+#define YYNSTATES  132
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -306,8 +306,8 @@ static const unsigned char yytranslate[] =
 static const unsigned char yyprhs[] =
 {
        0,     0,     3,     5,     8,     9,    11,    13,    15,    19,
-      21,    24,    28,    32,    34,    37,    38,    40,    43,    45,
-      47,    49,    52,    55,    58,    61,    64,    66,    68,    70,
+      21,    24,    28,    30,    33,    34,    36,    39,    41,    43,
+      45,    48,    51,    54,    57,    60,    62,    64,    66,    70,
       73,    76,    78,    80,    82,    84,    86,    90,    93,    95,
       99,   102,   106,   109,   113,   116,   118,   122,   125,   129,
      132,   134,   138,   140,   142,   146,   150,   154,   157,   161,
@@ -320,11 +320,11 @@ static const yysigned_char yyrhs[] =
 {
       24,     0,    -1,    26,    -1,    11,    28,    -1,    -1,    33,
       -1,    27,    -1,    34,    -1,    29,    26,    32,    -1,    34,
-      -1,     3,    27,    -1,    29,    33,    32,    -1,    29,    27,
-      32,    -1,    25,    -1,    29,    30,    -1,    -1,    12,    -1,
-      29,    13,    -1,    14,    -1,    13,    -1,    14,    -1,    31,
-      32,    -1,     5,    33,    -1,     6,    33,    -1,     7,    33,
-      -1,     3,    33,    -1,     4,    -1,     8,    -1,     9,    -1,
+      -1,     3,    27,    -1,    29,    27,    32,    -1,    25,    -1,
+      29,    30,    -1,    -1,    12,    -1,    29,    13,    -1,    14,
+      -1,    13,    -1,    14,    -1,    31,    32,    -1,     5,    33,
+      -1,     6,    33,    -1,     7,    33,    -1,     3,    33,    -1,
+       4,    -1,     8,    -1,     9,    -1,    29,    33,    32,    -1,
        5,    34,    -1,     6,    34,    -1,    10,    -1,    35,    -1,
       39,    -1,    42,    -1,    48,    -1,    29,    37,    30,    -1,
       15,    28,    -1,    38,    -1,     5,    31,    37,    -1,     5,
@@ -346,13 +346,13 @@ static const yysigned_char yyrhs[] =
 static const unsigned short yyrline[] =
 {
        0,    54,    54,    58,    62,    68,    69,    72,    73,    79,
-      80,    89,    93,    99,   100,   105,   115,   116,   119,   122,
-     125,   126,   134,   139,   144,   152,   156,   164,   177,   184,
+      80,    89,    95,    96,   101,   111,   112,   115,   118,   121,
+     122,   130,   135,   140,   148,   152,   160,   173,   174,   184,
      189,   194,   195,   196,   197,   198,   204,   210,   216,   217,
      222,   227,   232,   237,   241,   247,   251,   256,   265,   269,
      275,   279,   286,   287,   293,   298,   305,   310,   315,   320,
-     325,   329,   335,   350,   351,   369,   370,   382,   389,   398,
-     406,   410,   416,   417,   425,   432
+     325,   329,   335,   350,   351,   369,   370,   382,   390,   399,
+     407,   411,   417,   418,   427,   434
 };
 #endif
 
@@ -390,8 +390,8 @@ static const unsigned short yytoknum[] =
 static const unsigned char yyr1[] =
 {
        0,    23,    24,    24,    24,    25,    25,    26,    26,    27,
-      27,    27,    27,    28,    28,    28,    29,    29,    30,    31,
-      32,    32,    33,    33,    33,    33,    33,    33,    33,    34,
+      27,    27,    28,    28,    28,    29,    29,    30,    31,    32,
+      32,    33,    33,    33,    33,    33,    33,    33,    33,    34,
       34,    34,    34,    34,    34,    34,    35,    36,    37,    37,
       37,    37,    37,    37,    37,    38,    38,    38,    39,    39,
       40,    40,    41,    41,    42,    42,    43,    43,    43,    43,
@@ -403,8 +403,8 @@ static const unsigned char yyr1[] =
 static const unsigned char yyr2[] =
 {
        0,     2,     1,     2,     0,     1,     1,     1,     3,     1,
-       2,     3,     3,     1,     2,     0,     1,     2,     1,     1,
-       1,     2,     2,     2,     2,     2,     1,     1,     1,     2,
+       2,     3,     1,     2,     0,     1,     2,     1,     1,     1,
+       2,     2,     2,     2,     2,     1,     1,     1,     3,     2,
        2,     1,     1,     1,     1,     1,     3,     2,     1,     3,
        2,     3,     2,     3,     2,     1,     3,     2,     3,     2,
        1,     3,     1,     1,     3,     3,     3,     2,     3,     2,
@@ -417,55 +417,57 @@ static const unsigned char yyr2[] =
    means the default is an error.  */
 static const unsigned char yydefact[] =
 {
-       4,     0,     0,    31,    15,    16,     0,     0,     0,     2,
+       4,     0,     0,    31,    14,    15,     0,     0,     0,     2,
        0,     7,    32,    33,    34,    35,     0,    29,    30,     0,
-      26,     0,     0,     0,    27,    28,    13,     6,     3,     0,
+      25,     0,     0,     0,    26,    27,    12,     6,     3,     0,
        5,     9,    49,    52,     0,     0,    50,    53,    71,    74,
-      75,     0,    72,     1,     0,     0,     0,    17,    15,     0,
-       0,     0,    45,     0,    38,     0,    63,    65,     0,     0,
-       0,    10,    25,     0,    22,    23,     0,     0,    24,     0,
-      18,     0,    14,     0,    15,    48,     0,    70,     0,    19,
-       0,    44,    61,     0,    40,    57,     0,    42,    59,    37,
-       0,    20,     0,     8,    15,    36,    47,    54,    55,    68,
-      12,    11,    69,    51,    73,     0,     0,     0,    43,    60,
-      39,    56,    41,    58,     0,    21,    62,    46,    66,    67,
-       0,     0,     0,    15,     0,     0,     0,    64
+      75,     0,    72,     1,     0,     0,     0,    16,    14,     0,
+       0,     0,     0,    45,     0,    38,     0,    63,    65,     0,
+       0,     0,     0,    10,    24,     0,     0,    21,    22,     0,
+       0,    23,     0,    17,     0,    13,     0,    14,    48,     0,
+      70,     0,    18,     0,    44,    61,     0,    40,    57,     0,
+      42,    59,    37,     0,    19,     0,     8,    14,    36,    47,
+      54,    55,    68,     0,    11,    28,    69,    51,    73,     0,
+       0,     0,    43,    60,    39,    56,    41,    58,     0,    20,
+      62,    46,    66,    67,     0,     0,     0,    14,     0,     0,
+       0,    64
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const yysigned_char yydefgoto[] =
 {
-      -1,     8,    26,     9,    27,    28,    34,    72,    92,    93,
-      30,    31,    12,    52,    53,    54,    13,    35,    36,    14,
-      55,    56,    57,    58,    37,    15,    41,    42
+      -1,     8,    26,    50,    27,    28,    62,    75,    95,   105,
+      30,    31,    12,    53,    54,    55,    13,    35,    36,    14,
+      56,    57,    58,    59,    37,    15,    41,    42
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -77
+#define YYPACT_NINF -79
 static const short yypact[] =
 {
-     103,   155,   155,   -77,   367,   -77,   350,   298,    14,   -77,
-     198,   -77,   -77,   -77,   -77,   -77,   238,   -77,   -77,   367,
-     -77,   384,   384,   427,   -77,   -77,   -77,   -77,   -77,   174,
-     -77,   -77,   -77,     8,   218,   -13,   -77,   -77,   -77,     8,
-     -77,     7,   -77,   -77,   401,   316,   316,   -77,   367,   367,
-      20,    28,   -77,    -7,    30,    -7,   -77,   -77,    25,   401,
-     401,   -77,   -77,   427,   -77,   -77,   427,   427,   -77,   333,
-     -77,    20,   -77,   111,   367,   -77,   367,   -77,   367,   -77,
-     258,   -77,   -77,   258,   -77,   -77,   258,   -77,   -77,   -77,
-      30,   -77,    20,   -77,   367,   -77,    32,   -77,   -77,   278,
-     -77,   -77,   -77,   -77,   -77,   414,   414,   414,   -77,    30,
-     -77,    30,   -77,    30,    37,   -77,   -77,   -77,   -77,   -77,
-      85,    85,    85,   367,   113,   113,   113,   -77
+     412,   420,   420,   -79,   385,   -79,   368,   316,    12,   -79,
+     256,   -79,   -79,   -79,   -79,   -79,   152,   -79,   -79,   385,
+     -79,   402,   402,   474,   -79,   -79,   -79,   -79,   -79,   236,
+     -79,   -79,   -79,    14,   276,    22,   -79,   -79,   -79,    14,
+     -79,    -4,   -79,   -79,   437,   334,   334,   -79,   385,   385,
+      62,   256,    23,   -79,     4,    11,     4,   -79,   -79,    85,
+     437,   437,   463,   -79,   -79,   474,   152,   -79,   -79,   474,
+     474,   -79,   351,   -79,    62,   -79,   127,   385,   -79,   385,
+     -79,   385,   -79,   201,   -79,   -79,   201,   -79,   -79,   201,
+     -79,   -79,   -79,    11,   -79,    62,   -79,   385,   -79,    39,
+     -79,   -79,   296,    62,   -79,   -79,   -79,   -79,   -79,   450,
+     450,   450,   -79,    11,   -79,    11,   -79,    11,    44,   -79,
+     -79,   -79,   -79,   -79,    32,    32,    32,   385,    65,    65,
+      65,   -79
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short yypgoto[] =
+static const yysigned_char yypgoto[] =
 {
-     -77,   -77,    92,    57,    -3,   -45,     0,    -1,    27,   -60,
-      -4,   154,   -77,   -76,    24,   -77,   -77,   -77,     1,   -77,
-      -9,   -77,   -24,   -22,     2,   -77,   -77,    11
+     -79,   -79,     8,    64,    -6,   -45,     0,   -23,    73,   -30,
+      40,    93,   -79,   -44,   108,   -79,   -79,   -79,   -12,   -79,
+     -19,   -79,   -29,   -78,     2,   -79,   -79,     7
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -475,98 +477,108 @@ static const short yypgoto[] =
 #define YYTABLE_NINF -1
 static const unsigned char yytable[] =
 {
-      10,    16,    16,    89,    29,    75,    51,    70,    76,    40,
-      10,   100,    51,   101,    43,    62,    61,    64,    65,    68,
-     117,    16,    16,   118,    74,    73,    71,    77,    78,   102,
-      73,    71,   115,    79,    91,    82,    85,    88,    79,    70,
-      62,    64,    65,    79,    94,    16,    16,    48,    29,   116,
-      85,    88,    95,   123,    97,    64,    65,    98,   109,    62,
-      82,   111,    64,    65,   113,    62,    61,    50,    81,    84,
-      87,    80,    83,    86,    29,   119,    51,   103,   127,    51,
-      40,    96,    51,    84,    87,    99,    83,    86,   124,   104,
-     125,   126,     0,    81,    29,    51,    80,     0,    33,    39,
-      48,    62,    64,    65,   108,     0,     0,   110,     1,     2,
-     112,     0,     0,     3,     4,     5,   124,   114,   125,   126,
-       6,     0,     7,    29,    79,    91,    79,    94,    48,    81,
-      84,    87,   120,   121,   122,     0,    99,     0,    99,     0,
-      99,    90,     0,     0,   108,   110,   112,     0,    81,    84,
-      87,   120,   121,   122,    11,    17,    18,     0,     0,     0,
-       1,     2,     0,     0,    11,     3,     0,     5,    33,     0,
-      39,     0,     6,     0,     7,    17,    18,    69,    20,    45,
-      46,    23,    24,    25,     3,     0,     5,    47,    70,    48,
-       0,     6,     0,     7,     0,     0,    49,     0,     0,    17,
-      18,    44,    20,    45,    46,    23,    24,    25,     3,     0,
-       5,    47,     0,    48,     0,     6,     0,     7,     0,     0,
-      49,    69,    20,    45,    46,    23,    24,    25,     3,     0,
-       5,    47,     0,    48,     0,     6,     0,     7,     0,     0,
-      49,    44,    20,    59,    60,    23,    24,    25,     0,     0,
-       0,    47,     0,    48,     0,     0,     0,     0,     0,     0,
-      49,   105,    20,   106,   107,    23,    24,    25,     0,     0,
-       0,     0,     0,    48,     0,     0,     0,     0,     0,     0,
-      49,    63,    20,    66,    67,    23,    24,    25,     0,     0,
-       0,     0,     0,    48,     0,     0,     0,     0,     0,     0,
-      49,    19,    20,    21,    22,    23,    24,    25,     3,     0,
-       5,     0,     0,     0,     0,     6,     0,     7,    38,    44,
-      20,    45,    46,    23,    24,    25,     3,     0,     5,    79,
-       0,    48,     0,     6,     0,     7,    69,    20,    45,    46,
-      23,    24,    25,     3,     0,     5,    79,     0,    48,     0,
-       6,     0,     7,    19,    20,    21,    22,    23,    24,    25,
-       3,     0,     5,     0,     0,     0,     0,     6,    32,     7,
-      19,    20,    21,    22,    23,    24,    25,     3,     0,     5,
-       0,     0,     0,     0,     6,     0,     7,    63,    20,    21,
-      22,    23,    24,    25,     3,     0,     5,     0,     0,     0,
-       0,     6,     0,     7,    44,    20,    59,    60,    23,    24,
-      25,     0,     0,     0,    79,     0,    48,   105,    20,   106,
-     107,    23,    24,    25,     0,     0,     0,    79,     0,    48,
-      63,    20,    66,    67,    23,    24,    25
+      10,    16,    16,    92,    29,   113,    34,    34,   115,    40,
+      51,   117,    43,    63,    33,    39,    80,    81,    73,    34,
+      96,    66,    66,    74,    82,    85,    88,    91,    74,    34,
+      77,    98,   106,   100,    34,   128,   101,   129,   130,    97,
+      78,    88,    91,    79,   104,    66,    66,    48,    29,    34,
+      52,    51,   120,    85,    48,   121,    52,    93,   122,    64,
+     127,    67,    68,    71,     9,   119,    63,   107,   128,    76,
+     129,   130,    34,   123,    76,    82,    94,    29,    82,    34,
+      48,    34,   131,    40,    64,    67,    68,    33,   108,    39,
+       0,    76,     0,    11,    17,    18,     0,    29,    82,    73,
+      67,    68,   103,    11,     0,    64,    76,     0,     0,    67,
+      68,     0,    64,     0,    17,    18,     0,    83,    86,    89,
+       0,     0,     0,    52,     0,     0,    52,    29,    99,    52,
+       0,     0,   102,    86,    89,     0,     0,     0,    17,    18,
+      82,    94,    52,    97,    11,    83,     0,     0,     0,    64,
+      67,    68,    84,    87,    90,    44,    20,    60,    61,    23,
+      24,    25,     0,     0,     5,    47,   118,    48,    87,    90,
+       0,     0,     0,     0,    49,     0,     0,     0,     0,     0,
+      84,     0,   124,   125,   126,     0,   102,     0,   102,     0,
+     102,   112,     0,     0,   114,     0,     0,   116,     0,     0,
+       0,   124,   125,   126,   109,    20,   110,   111,    23,    24,
+      25,     0,     0,     5,     0,     0,    48,    84,    87,    90,
+       0,     0,     0,    49,     0,     0,     0,     0,     0,     0,
+       0,     0,   112,   114,   116,     0,    84,    87,    90,    72,
+      20,    45,    46,    23,    24,    25,     3,     0,     5,    47,
+      73,    48,     0,     6,     0,     7,     0,     0,    49,    44,
+      20,    45,    46,    23,    24,    25,     3,     0,     5,    47,
+       0,    48,     0,     6,     0,     7,     0,     0,    49,    72,
+      20,    45,    46,    23,    24,    25,     3,     0,     5,    47,
+       0,    48,     0,     6,     0,     7,     0,     0,    49,    65,
+      20,    69,    70,    23,    24,    25,     0,     0,     5,     0,
+       0,    48,     0,     0,     0,     0,     0,     0,    49,    19,
+      20,    21,    22,    23,    24,    25,     3,     0,     5,     0,
+       0,     0,     0,     6,     0,     7,    38,    44,    20,    45,
+      46,    23,    24,    25,     3,     0,     5,    82,     0,    48,
+       0,     6,     0,     7,    72,    20,    45,    46,    23,    24,
+      25,     3,     0,     5,    82,     0,    48,     0,     6,     0,
+       7,    19,    20,    21,    22,    23,    24,    25,     3,     0,
+       5,     0,     0,     0,     0,     6,    32,     7,    19,    20,
+      21,    22,    23,    24,    25,     3,     0,     5,     0,     0,
+       0,     0,     6,     0,     7,    65,    20,    21,    22,    23,
+      24,    25,     3,     0,     5,     0,     0,     1,     2,     6,
+       0,     7,     3,     4,     5,     1,     2,     0,     0,     6,
+       3,     7,     5,     0,     0,     0,     0,     6,     0,     7,
+      44,    20,    60,    61,    23,    24,    25,     0,     0,     5,
+      82,     0,    48,   109,    20,   110,   111,    23,    24,    25,
+       0,     0,     5,    82,     0,    48,    65,    20,    69,    70,
+      23,    24,    25,     0,     0,     5,    47,    65,    20,    69,
+      70,    23,    24,    25,     0,     0,     5
 };
 
-static const yysigned_char yycheck[] =
+static const short yycheck[] =
 {
-       0,     1,     2,    48,     4,    18,    10,    14,    21,     7,
-      10,    71,    16,    73,     0,    19,    19,    21,    22,    23,
-      96,    21,    22,    99,    16,    29,    29,    20,    21,    74,
-      34,    34,    92,    13,    14,    44,    45,    46,    13,    14,
-      44,    45,    46,    13,    16,    45,    46,    15,    48,    94,
-      59,    60,    53,    16,    55,    59,    60,    58,    80,    63,
-      69,    83,    66,    67,    86,    69,    69,    10,    44,    45,
-      46,    44,    45,    46,    74,    99,    80,    76,   123,    83,
-      78,    54,    86,    59,    60,    58,    59,    60,     3,    78,
-       5,     6,    -1,    69,    94,    99,    69,    -1,     6,     7,
-      15,   105,   106,   107,    80,    -1,    -1,    83,     5,     6,
-      86,    -1,    -1,    10,    11,    12,     3,    90,     5,     6,
-      17,    -1,    19,   123,    13,    14,    13,    16,    15,   105,
-     106,   107,   105,   106,   107,    -1,   109,    -1,   111,    -1,
-     113,    49,    -1,    -1,   120,   121,   122,    -1,   124,   125,
-     126,   124,   125,   126,     0,     1,     2,    -1,    -1,    -1,
-       5,     6,    -1,    -1,    10,    10,    -1,    12,    76,    -1,
-      78,    -1,    17,    -1,    19,    21,    22,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    13,    14,    15,
-      -1,    17,    -1,    19,    -1,    -1,    22,    -1,    -1,    45,
-      46,     3,     4,     5,     6,     7,     8,     9,    10,    -1,
-      12,    13,    -1,    15,    -1,    17,    -1,    19,    -1,    -1,
-      22,     3,     4,     5,     6,     7,     8,     9,    10,    -1,
-      12,    13,    -1,    15,    -1,    17,    -1,    19,    -1,    -1,
-      22,     3,     4,     5,     6,     7,     8,     9,    -1,    -1,
-      -1,    13,    -1,    15,    -1,    -1,    -1,    -1,    -1,    -1,
-      22,     3,     4,     5,     6,     7,     8,     9,    -1,    -1,
-      -1,    -1,    -1,    15,    -1,    -1,    -1,    -1,    -1,    -1,
-      22,     3,     4,     5,     6,     7,     8,     9,    -1,    -1,
-      -1,    -1,    -1,    15,    -1,    -1,    -1,    -1,    -1,    -1,
-      22,     3,     4,     5,     6,     7,     8,     9,    10,    -1,
-      12,    -1,    -1,    -1,    -1,    17,    -1,    19,    20,     3,
+       0,     1,     2,    48,     4,    83,     6,     7,    86,     7,
+      10,    89,     0,    19,     6,     7,    20,    21,    14,    19,
+      50,    21,    22,    29,    13,    44,    45,    46,    34,    29,
+      16,    54,    77,    56,    34,     3,    59,     5,     6,    16,
+      18,    60,    61,    21,    74,    45,    46,    15,    48,    49,
+      10,    51,    97,    72,    15,    99,    16,    49,   102,    19,
+      16,    21,    22,    23,     0,    95,    72,    79,     3,    29,
+       5,     6,    72,   102,    34,    13,    14,    77,    13,    79,
+      15,    81,   127,    81,    44,    45,    46,    79,    81,    81,
+      -1,    51,    -1,     0,     1,     2,    -1,    97,    13,    14,
+      60,    61,    62,    10,    -1,    65,    66,    -1,    -1,    69,
+      70,    -1,    72,    -1,    21,    22,    -1,    44,    45,    46,
+      -1,    -1,    -1,    83,    -1,    -1,    86,   127,    55,    89,
+      -1,    -1,    59,    60,    61,    -1,    -1,    -1,    45,    46,
+      13,    14,   102,    16,    51,    72,    -1,    -1,    -1,   109,
+     110,   111,    44,    45,    46,     3,     4,     5,     6,     7,
+       8,     9,    -1,    -1,    12,    13,    93,    15,    60,    61,
+      -1,    -1,    -1,    -1,    22,    -1,    -1,    -1,    -1,    -1,
+      72,    -1,   109,   110,   111,    -1,   113,    -1,   115,    -1,
+     117,    83,    -1,    -1,    86,    -1,    -1,    89,    -1,    -1,
+      -1,   128,   129,   130,     3,     4,     5,     6,     7,     8,
+       9,    -1,    -1,    12,    -1,    -1,    15,   109,   110,   111,
+      -1,    -1,    -1,    22,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   124,   125,   126,    -1,   128,   129,   130,     3,
        4,     5,     6,     7,     8,     9,    10,    -1,    12,    13,
-      -1,    15,    -1,    17,    -1,    19,     3,     4,     5,     6,
-       7,     8,     9,    10,    -1,    12,    13,    -1,    15,    -1,
-      17,    -1,    19,     3,     4,     5,     6,     7,     8,     9,
-      10,    -1,    12,    -1,    -1,    -1,    -1,    17,    18,    19,
-       3,     4,     5,     6,     7,     8,     9,    10,    -1,    12,
-      -1,    -1,    -1,    -1,    17,    -1,    19,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    -1,    -1,    -1,
+      14,    15,    -1,    17,    -1,    19,    -1,    -1,    22,     3,
+       4,     5,     6,     7,     8,     9,    10,    -1,    12,    13,
+      -1,    15,    -1,    17,    -1,    19,    -1,    -1,    22,     3,
+       4,     5,     6,     7,     8,     9,    10,    -1,    12,    13,
+      -1,    15,    -1,    17,    -1,    19,    -1,    -1,    22,     3,
+       4,     5,     6,     7,     8,     9,    -1,    -1,    12,    -1,
+      -1,    15,    -1,    -1,    -1,    -1,    -1,    -1,    22,     3,
+       4,     5,     6,     7,     8,     9,    10,    -1,    12,    -1,
+      -1,    -1,    -1,    17,    -1,    19,    20,     3,     4,     5,
+       6,     7,     8,     9,    10,    -1,    12,    13,    -1,    15,
       -1,    17,    -1,    19,     3,     4,     5,     6,     7,     8,
-       9,    -1,    -1,    -1,    13,    -1,    15,     3,     4,     5,
-       6,     7,     8,     9,    -1,    -1,    -1,    13,    -1,    15,
-       3,     4,     5,     6,     7,     8,     9
+       9,    10,    -1,    12,    13,    -1,    15,    -1,    17,    -1,
+      19,     3,     4,     5,     6,     7,     8,     9,    10,    -1,
+      12,    -1,    -1,    -1,    -1,    17,    18,    19,     3,     4,
+       5,     6,     7,     8,     9,    10,    -1,    12,    -1,    -1,
+      -1,    -1,    17,    -1,    19,     3,     4,     5,     6,     7,
+       8,     9,    10,    -1,    12,    -1,    -1,     5,     6,    17,
+      -1,    19,    10,    11,    12,     5,     6,    -1,    -1,    17,
+      10,    19,    12,    -1,    -1,    -1,    -1,    17,    -1,    19,
+       3,     4,     5,     6,     7,     8,     9,    -1,    -1,    12,
+      13,    -1,    15,     3,     4,     5,     6,     7,     8,     9,
+      -1,    -1,    12,    13,    -1,    15,     3,     4,     5,     6,
+       7,     8,     9,    -1,    -1,    12,    13,     3,     4,     5,
+       6,     7,     8,     9,    -1,    -1,    12
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -578,14 +590,15 @@ static const unsigned char yystos[] =
        4,     5,     6,     7,     8,     9,    25,    27,    28,    29,
       33,    34,    18,    25,    29,    40,    41,    47,    20,    25,
       47,    49,    50,     0,     3,     5,     6,    13,    15,    22,
-      26,    33,    36,    37,    38,    43,    44,    45,    46,     5,
-       6,    27,    33,     3,    33,    33,     5,     6,    33,     3,
-      14,    27,    30,    33,    16,    18,    21,    20,    21,    13,
-      31,    37,    43,    31,    37,    43,    31,    37,    43,    28,
-      25,    14,    31,    32,    16,    30,    31,    30,    30,    31,
-      32,    32,    28,    41,    50,     3,     5,     6,    37,    46,
-      37,    46,    37,    46,    31,    32,    28,    36,    36,    45,
-      31,    31,    31,    16,     3,     5,     6,    28
+      26,    29,    33,    36,    37,    38,    43,    44,    45,    46,
+       5,     6,    29,    27,    33,     3,    29,    33,    33,     5,
+       6,    33,     3,    14,    27,    30,    33,    16,    18,    21,
+      20,    21,    13,    31,    37,    43,    31,    37,    43,    31,
+      37,    43,    28,    25,    14,    31,    32,    16,    30,    31,
+      30,    30,    31,    33,    32,    32,    28,    41,    50,     3,
+       5,     6,    37,    46,    37,    46,    37,    46,    31,    32,
+      28,    36,    36,    45,    31,    31,    31,    16,     3,     5,
+       6,    28
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -1186,47 +1199,40 @@ yyreduce:
         }
     break;
 
-  case 12:
-#line 94 "gram.y"
+  case 13:
+#line 97 "gram.y"
     {
-           yyval.nodeData = yyvsp[-1].nodeData;
-        }
+                    NULL_NODE( parser, n );
+                    yyval.nodeData = n;
+                }
     break;
 
   case 14:
-#line 101 "gram.y"
+#line 102 "gram.y"
     {
                     NULL_NODE( parser, n );
                     yyval.nodeData = n;
                 }
     break;
 
-  case 15:
-#line 106 "gram.y"
-    {
-                    NULL_NODE( parser, n );
-                    yyval.nodeData = n;
-                }
-    break;
-
-  case 22:
-#line 135 "gram.y"
+  case 21:
+#line 131 "gram.y"
     { 
                syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
                yyval.nodeData = yyvsp[0].nodeData;
             }
     break;
 
-  case 23:
-#line 140 "gram.y"
+  case 22:
+#line 136 "gram.y"
     { 
                syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
                yyval.nodeData = yyvsp[0].nodeData;
             }
     break;
 
-  case 24:
-#line 145 "gram.y"
+  case 23:
+#line 141 "gram.y"
     { 
                if ( ((SyckParser *)parser)->implicit_typing == 1 )
                {
@@ -1236,15 +1242,15 @@ yyreduce:
             }
     break;
 
-  case 25:
-#line 153 "gram.y"
+  case 24:
+#line 149 "gram.y"
     { 
                yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
             }
     break;
 
-  case 26:
-#line 157 "gram.y"
+  case 25:
+#line 153 "gram.y"
     {
                /*
                 * _Aliases_: The anchor symbol table is scanned for the anchor name.
@@ -1254,8 +1260,8 @@ yyreduce:
             }
     break;
 
-  case 27:
-#line 165 "gram.y"
+  case 26:
+#line 161 "gram.y"
     { 
                SyckNode *n = yyvsp[0].nodeData;
                if ( ((SyckParser *)parser)->taguri_expansion == 1 )
@@ -1270,6 +1276,13 @@ yyreduce:
             }
     break;
 
+  case 28:
+#line 175 "gram.y"
+    {
+               yyval.nodeData = yyvsp[-1].nodeData;
+            }
+    break;
+
   case 29:
 #line 185 "gram.y"
     { 
@@ -1498,19 +1511,20 @@ yyreduce:
                     apply_seq_in_map( (SyckParser *)parser, yyvsp[-2].nodeData );
                     syck_map_update( yyvsp[-2].nodeData, yyvsp[0].nodeData );
                     syck_free_node( yyvsp[0].nodeData );
+                    yyvsp[0].nodeData = NULL;
                     yyval.nodeData = yyvsp[-2].nodeData;
                 }
     break;
 
   case 68:
-#line 390 "gram.y"
+#line 391 "gram.y"
     { 
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
   case 69:
-#line 399 "gram.y"
+#line 400 "gram.y"
     {
                     yyval.nodeData = syck_new_map( 
                         syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-2].nodeData ), 
@@ -1519,30 +1533,31 @@ yyreduce:
     break;
 
   case 70:
-#line 407 "gram.y"
+#line 408 "gram.y"
     {
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
   case 71:
-#line 411 "gram.y"
+#line 412 "gram.y"
     {
                     yyval.nodeData = syck_alloc_map();
                 }
     break;
 
   case 73:
-#line 418 "gram.y"
+#line 419 "gram.y"
     {
                     syck_map_update( yyvsp[-2].nodeData, yyvsp[0].nodeData );
                     syck_free_node( yyvsp[0].nodeData );
+                    yyvsp[0].nodeData = NULL;
                     yyval.nodeData = yyvsp[-2].nodeData;
 				}
     break;
 
   case 74:
-#line 426 "gram.y"
+#line 428 "gram.y"
     {
                     NULL_NODE( parser, n );
                     yyval.nodeData = syck_new_map( 
@@ -1555,7 +1570,7 @@ yyreduce:
     }
 
 /* Line 1016 of /usr/local/share/bison/yacc.c.  */
-#line 1559 "y.tab.c"
+#line 1574 "y.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -1774,7 +1789,7 @@ yyreturn:
 }
 
 
-#line 435 "gram.y"
+#line 437 "gram.y"
 
 
 void
diff --git a/ext/syck/node.c b/ext/syck/node.c
index f999700554..99bb07bc74 100644
--- a/ext/syck/node.c
+++ b/ext/syck/node.c
@@ -297,27 +297,38 @@ syck_seq_read( SyckNode *seq, long idx )
 void
 syck_free_members( SyckNode *n )
 {
+    if ( n == NULL ) return;
+
     switch ( n->kind  )
     {
         case syck_str_kind:
-            if ( n->data.str->ptr != NULL ) 
+            if ( n->data.str != NULL ) 
             {
                 S_FREE( n->data.str->ptr );
                 n->data.str->ptr = NULL;
                 n->data.str->len = 0;
                 S_FREE( n->data.str );
+                n->data.str = NULL;
             }
         break;
 
         case syck_seq_kind:
-            S_FREE( n->data.list->items );
-            S_FREE( n->data.list );
+            if ( n->data.list != NULL )
+            {
+                S_FREE( n->data.list->items );
+                S_FREE( n->data.list );
+                n->data.list = NULL;
+            }
         break;
 
         case syck_map_kind:
-            S_FREE( n->data.pairs->keys );
-            S_FREE( n->data.pairs->values );
-            S_FREE( n->data.pairs );
+            if ( n->data.pairs != NULL )
+            {
+                S_FREE( n->data.pairs->keys );
+                S_FREE( n->data.pairs->values );
+                S_FREE( n->data.pairs );
+                n->data.pairs = NULL;
+            }
         break;
     }
 }
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 7e6d0e637e..29ddccbbd9 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -1337,6 +1337,7 @@ syck_emitter_write_m( self, str )
     SyckEmitter *emitter;
 
     Data_Get_Struct(self, SyckEmitter, emitter);
+    StringValue(str);
     syck_emitter_write( emitter, RSTRING(str)->ptr, RSTRING(str)->len );
     return self;
 }
@@ -1351,6 +1352,7 @@ syck_emitter_simple_write( self, str )
     SyckEmitter *emitter;
 
     Data_Get_Struct(self, SyckEmitter, emitter);
+    StringValue(str);
     syck_emitter_simple( emitter, RSTRING(str)->ptr, RSTRING(str)->len );
     return self;
 }
diff --git a/ext/syck/syck.c b/ext/syck/syck.c
index ec4e7a1efd..72a883df74 100644
--- a/ext/syck/syck.c
+++ b/ext/syck/syck.c
@@ -198,7 +198,8 @@ syck_lookup_sym( SyckParser *p, SYMID id, char **data )
 int
 syck_st_free_nodes( char *key, SyckNode *n, char *arg )
 {
-    syck_free_node( n );
+    if ( n != (void *)1 ) syck_free_node( n );
+    n = NULL;
     return ST_CONTINUE;
 }
 
diff --git a/ext/syck/syck.h b/ext/syck/syck.h
index c2ef061abd..60c06c0cb8 100644
--- a/ext/syck/syck.h
+++ b/ext/syck/syck.h
@@ -13,7 +13,7 @@
 #define SYCK_YAML_MAJOR 1
 #define SYCK_YAML_MINOR 0
 
-#define SYCK_VERSION    "0.43"
+#define SYCK_VERSION    "0.44"
 #define YAML_DOMAIN     "yaml.org,2002"
 
 #include <stdio.h>
diff --git a/ext/syck/token.c b/ext/syck/token.c
index f9e0601e52..56f5daf338 100644
--- a/ext/syck/token.c
+++ b/ext/syck/token.c
@@ -205,6 +205,7 @@ SyckParser *syck_parser_ptr = NULL;
  * Accessory funcs later in this file.
  */
 void eat_comments( SyckParser * );
+char escape_seq( char );
 int is_newline( char *ptr );
 int sycklex_yaml_utf8( YYSTYPE *, SyckParser * );
 int sycklex_bytecode_utf8( YYSTYPE *, SyckParser * );
@@ -256,7 +257,7 @@ sycklex_yaml_utf8( YYSTYPE *sycklval, SyckParser *parser )
         return t;
     }
 
-#line 274
+#line 276
 
 
     if ( YYLINEPTR != YYCURSOR )
@@ -293,7 +294,7 @@ yy2:	yyaccept = 0;
 	default:	goto yy3;
 	}
 yy3:
-#line 333
+#line 335
 	{   YYPOS(0);
                         goto Document; 
                     }
@@ -305,13 +306,13 @@ yy4:	yyaccept = 0;
 	}
 yy5:	yych = *++YYCURSOR;
 yy6:
-#line 315
+#line 317
 	{   eat_comments( parser ); 
                         goto Header;
                     }
 yy7:	yych = *++YYCURSOR;
 yy8:
-#line 319
+#line 321
 	{   SyckLevel *lvl = CURRENT_LEVEL();
                         ENSURE_YAML_IEND(lvl, -1);
                         YYPOS(0);
@@ -321,7 +322,7 @@ yy9:	yyaccept = 1;
 	yych = *(YYMARKER = ++YYCURSOR);
 	goto yy18;
 yy10:
-#line 325
+#line 327
 	{   GOBBLE_UP_YAML_INDENT( doc_level, YYTOKEN );
                         goto Header; 
                     }
@@ -333,7 +334,7 @@ yy11:	yych = *++YYCURSOR;
 yy12:	yych = *++YYCURSOR;
 	goto yy16;
 yy13:
-#line 329
+#line 331
 	{   doc_level = YYCURSOR - YYLINEPTR;
                         goto Header;
                     }
@@ -381,7 +382,7 @@ yy22:	yych = *++YYCURSOR;
 	}
 yy23:	yych = *++YYCURSOR;
 yy24:
-#line 301
+#line 303
 	{   SyckLevel *lvl = CURRENT_LEVEL();
                         if ( lvl->status == syck_lvl_header )
                         {
@@ -421,7 +422,7 @@ yy29:	yych = *++YYCURSOR;
 	}
 yy30:	yych = *++YYCURSOR;
 yy31:
-#line 287
+#line 289
 	{   SyckLevel *lvl = CURRENT_LEVEL();
                         if ( lvl->status == syck_lvl_header )
                         {
@@ -448,7 +449,7 @@ yy34:	yych = *++YYCURSOR;
 	default:	goto yy20;
 	}
 }
-#line 337
+#line 339
 
 
 Document:
@@ -491,7 +492,7 @@ yy37:	yyaccept = 0;
 	yych = *(YYMARKER = ++YYCURSOR);
 	goto yy90;
 yy38:
-#line 351
+#line 353
 	{   /* Isolate spaces */
                         int indt_len;
                         GOBBLE_UP_YAML_INDENT( indt_len, YYTOKEN );
@@ -525,7 +526,7 @@ yy40:
                     }
 yy41:	yych = *++YYCURSOR;
 yy42:
-#line 373
+#line 375
 	{   ENSURE_YAML_IOPEN(lvl, doc_level, 1);
                         lvl = CURRENT_LEVEL();
                         ADD_LEVEL(lvl->spaces + 1, syck_lvl_inline);
@@ -533,7 +534,7 @@ yy42:
                     }
 yy43:	yych = *++YYCURSOR;
 yy44:
-#line 379
+#line 381
 	{   POP_LEVEL();
                         return YYTOKEN[0]; 
                     }
@@ -683,9 +684,8 @@ yy48:	yych = *++YYCURSOR;
 	}
 yy49:	yych = *++YYCURSOR;
 yy50:
-#line 418
-	{   ENSURE_YAML_IOPEN(lvl, doc_level, 1);
-                        goto TransferMethod; }
+#line 419
+	{   goto TransferMethod; }
 yy51:	yych = *++YYCURSOR;
 yy52:
 #line 421
@@ -853,7 +853,7 @@ yy74:	switch(yych){
 	default:	goto yy75;
 	}
 yy75:
-#line 413
+#line 414
 	{   ENSURE_YAML_IOPEN(lvl, doc_level, 1);
                         sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 );
                         return YAML_ALIAS;
@@ -925,9 +925,8 @@ yy77:	switch(yych){
 	default:	goto yy78;
 	}
 yy78:
-#line 401
-	{   ENSURE_YAML_IOPEN(lvl, doc_level, 1);
-                        sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 );
+#line 403
+	{   sycklval->name = syck_strndup( YYTOKEN + 1, YYCURSOR - YYTOKEN - 1 );
 
                         /*
                          * Remove previous anchors of the same name.  Since the parser will likely
@@ -939,7 +938,7 @@ yy78:
                     }
 yy79:	yych = *++YYCURSOR;
 yy80:
-#line 387
+#line 389
 	{   ENSURE_YAML_IOPEN(lvl, YYTOKEN - YYLINEPTR, 1);
                         FORCE_NEXT_TOKEN(YAML_IOPEN);
                         if ( is_newline( YYCURSOR ) || is_newline( YYCURSOR - 1 ) )
@@ -967,7 +966,7 @@ yy83:	yych = *++YYCURSOR;
 	}
 yy84:	yych = *++YYCURSOR;
 yy85:
-#line 383
+#line 385
 	{   YYPOS(1); 
                         return YYTOKEN[0]; 
                     }
@@ -1770,7 +1769,7 @@ yy158:	yych = *++YYCURSOR;
 	default:	goto yy159;
 	}
 yy159:
-#line 722
+#line 711
 	{   QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1)); 
                         goto DoubleQuote2; 
                     }
@@ -1780,7 +1779,7 @@ yy160:	yyaccept = 1;
 	case '\n':	goto yy168;
 	case '\r':	goto yy170;
 	case ' ':	goto yy165;
-	case '"':	case '\\':	case 'a':
+	case '"':	case '0':	case '\\':	case 'a':
 	case 'b':	case 'e':
 	case 'f':	case 'n':	case 'r':	case 't':	case 'v':	goto yy172;
 	case 'x':	goto yy171;
@@ -1788,7 +1787,7 @@ yy160:	yyaccept = 1;
 	}
 yy161:	yych = *++YYCURSOR;
 yy162:
-#line 707
+#line 696
 	{   SyckLevel *lvl;
                         SyckNode *n = syck_alloc_str();
                         lvl = CURRENT_LEVEL();
@@ -1823,7 +1822,7 @@ yy167:	YYCURSOR = YYMARKER;
 	}
 yy168:	yych = *++YYCURSOR;
 yy169:
-#line 702
+#line 691
 	{   keep_nl = 0;
                         YYCURSOR--;
                         goto DoubleQuote2; 
@@ -1860,19 +1859,8 @@ yy171:	yych = *++YYCURSOR;
 yy172:	yych = *++YYCURSOR;
 yy173:
 #line 677
-	{  char ch = *( YYCURSOR - 1 );
-                        switch ( ch )
-                        {
-                            case 'a': ch = 7; break;
-                            case 'b': ch = '\010'; break;
-                            case 'e': ch = '\033'; break;
-                            case 'f': ch = '\014'; break;
-                            case 'n': ch = '\n'; break;
-                            case 'r': ch = '\015'; break;
-                            case 't': ch = '\t'; break;
-                            case 'v': ch = '\013'; break;
-                        }
-                        QUOTECAT(qstr, qcapa, qidx, ch);
+	{   char ch = *( YYCURSOR - 1 );
+                        QUOTECAT(qstr, qcapa, qidx, escape_seq( ch ));
                         goto DoubleQuote2; 
                     }
 yy174:	yych = *++YYCURSOR;
@@ -1901,7 +1889,7 @@ yy174:	yych = *++YYCURSOR;
 	}
 yy175:	yych = *++YYCURSOR;
 yy176:
-#line 693
+#line 682
 	{   long ch;
                         char *chr_text = syck_strndup( YYTOKEN, 4 );
                         chr_text[0] = '0';
@@ -1927,7 +1915,7 @@ yy179:	++YYCURSOR;
 	default:	goto yy167;
 	}
 }
-#line 726
+#line 715
 
     }
 
@@ -1962,7 +1950,7 @@ yy182:	YYCURSOR = YYMARKER;
 	}
 yy183:	yych = *++YYCURSOR;
 yy184:
-#line 740
+#line 729
 	{   SyckLevel *lvl;
                         YYCURSOR = YYTOKTMP;
                         if ( YYCURSOR == YYTOKEN + 1 )
@@ -2013,20 +2001,23 @@ yy184:
                         return YAML_TRANSFER; 
                     }
 yy185:	yych = *++YYCURSOR;
-	goto yy196;
+	goto yy198;
 yy186:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy194;
+	case '\n':	goto yy196;
 	default:	goto yy187;
 	}
 yy187:
-#line 802
+#line 796
 	{   QUOTECAT(qstr, qcapa, qidx, *(YYCURSOR - 1)); 
                         goto TransferMethod2;
                     }
 yy188:	yyaccept = 0;
 	yych = *(YYMARKER = ++YYCURSOR);
 	switch(yych){
+	case '"':	case '0':	case '\\':	case 'a':
+	case 'b':	case 'e':
+	case 'f':	case 'n':	case 'r':	case 't':	case 'v':	goto yy191;
 	case 'x':	goto yy190;
 	default:	goto yy187;
 	}
@@ -2053,10 +2044,17 @@ yy190:	yych = *++YYCURSOR;
 	case 'c':
 	case 'd':
 	case 'e':
-	case 'f':	goto yy191;
+	case 'f':	goto yy193;
 	default:	goto yy182;
 	}
 yy191:	yych = *++YYCURSOR;
+yy192:
+#line 782
+	{  char ch = *( YYCURSOR - 1 );
+                        QUOTECAT(qstr, qcapa, qidx, escape_seq( ch ));
+                        goto TransferMethod2;
+                    }
+yy193:	yych = *++YYCURSOR;
 	switch(yych){
 	case '0':
 	case '1':
@@ -2077,12 +2075,12 @@ yy191:	yych = *++YYCURSOR;
 	case 'c':
 	case 'd':
 	case 'e':
-	case 'f':	goto yy192;
+	case 'f':	goto yy194;
 	default:	goto yy182;
 	}
-yy192:	yych = *++YYCURSOR;
-yy193:
-#line 793
+yy194:	yych = *++YYCURSOR;
+yy195:
+#line 787
 	{   long ch;
                         char *chr_text = syck_strndup( YYTOKTMP, 4 );
                         chr_text[0] = '0';
@@ -2091,17 +2089,17 @@ yy193:
                         QUOTECAT(qstr, qcapa, qidx, ch);
                         goto TransferMethod2;
                     }
-yy194:	yych = *++YYCURSOR;
+yy196:	yych = *++YYCURSOR;
 	goto yy184;
-yy195:	++YYCURSOR;
+yy197:	++YYCURSOR;
 	if(YYLIMIT == YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-yy196:	switch(yych){
-	case ' ':	goto yy195;
+yy198:	switch(yych){
+	case ' ':	goto yy197;
 	default:	goto yy184;
 	}
 }
-#line 807
+#line 801
 
     }
 
@@ -2150,23 +2148,24 @@ ScalarBlock2:
 {
 	YYCTYPE yych;
 	unsigned int yyaccept;
-	goto yy197;
-yy198:	++YYCURSOR;
-yy197:
-	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+	goto yy199;
+yy200:	++YYCURSOR;
+yy199:
+	if((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy205;
-	case '\n':	goto yy199;
-	case '\r':	goto yy201;
-	case '#':	goto yy203;
-	default:	goto yy207;
+	case '\000':	goto yy207;
+	case '\n':	goto yy201;
+	case '\r':	goto yy203;
+	case '#':	goto yy205;
+	case '-':	goto yy209;
+	default:	goto yy210;
 	}
-yy199:	yyaccept = 0;
+yy201:	yyaccept = 0;
 	yych = *(YYMARKER = ++YYCURSOR);
-	goto yy209;
-yy200:
-#line 854
+	goto yy220;
+yy202:
+#line 848
 	{   char *pacer;
                         char *tok = YYTOKEN;
                         int indt_len = 0, nl_count = 0, fold_nl = 0, nl_begin = 0;
@@ -2232,19 +2231,19 @@ yy200:
                         }
                         goto ScalarBlock2;
                     }
-yy201:	yych = *++YYCURSOR;
+yy203:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy208;
-	default:	goto yy202;
+	case '\n':	goto yy219;
+	default:	goto yy204;
 	}
-yy202:
-#line 940
+yy204:
+#line 953
 	{   QUOTECAT(qstr, qcapa, qidx, *YYTOKEN);
                         goto ScalarBlock2;
                     }
-yy203:	yych = *++YYCURSOR;
-yy204:
-#line 921
+yy205:	yych = *++YYCURSOR;
+yy206:
+#line 915
 	{   lvl = CURRENT_LEVEL();
                         if ( lvl->status != syck_lvl_block )
                         {
@@ -2257,37 +2256,89 @@ yy204:
                         }
                         goto ScalarBlock2;
                     }
-yy205:	yych = *++YYCURSOR;
-yy206:
-#line 935
+yy207:	yych = *++YYCURSOR;
+yy208:
+#line 929
 	{   YYCURSOR--;
                         POP_LEVEL();
                         RETURN_YAML_BLOCK(); 
                     }
-yy207:	yych = *++YYCURSOR;
-	goto yy202;
-yy208:	yyaccept = 0;
+yy209:	yyaccept = 1;
+	yych = *(YYMARKER = ++YYCURSOR);
+	switch(yych){
+	case '-':	goto yy211;
+	default:	goto yy204;
+	}
+yy210:	yych = *++YYCURSOR;
+	goto yy204;
+yy211:	yych = *++YYCURSOR;
+	switch(yych){
+	case '-':	goto yy213;
+	default:	goto yy212;
+	}
+yy212:	YYCURSOR = YYMARKER;
+	switch(yyaccept){
+	case 0:	goto yy202;
+	case 1:	goto yy204;
+	}
+yy213:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy214;
+	case '\r':	goto yy218;
+	case ' ':	goto yy216;
+	default:	goto yy212;
+	}
+yy214:	yych = *++YYCURSOR;
+yy215:
+#line 934
+	{   if ( YYTOKEN == YYLINEPTR )
+                        {
+                            if ( blockType == BLOCK_FOLD )
+                            {
+                                qidx -= 1;
+                            }
+                            QUOTECAT(qstr, qcapa, qidx, '\n');
+                            POP_LEVEL();
+                            YYCURSOR = YYTOKEN;
+                            RETURN_YAML_BLOCK();
+                        }
+                        else
+                        {
+                            QUOTECAT(qstr, qcapa, qidx, *YYTOKEN);
+                            YYCURSOR = YYTOKEN + 1;
+                            goto ScalarBlock2;
+                        }
+                    }
+yy216:	++YYCURSOR;
+	if(YYLIMIT == YYCURSOR) YYFILL(1);
+	yych = *YYCURSOR;
+yy217:	switch(yych){
+	case ' ':	goto yy216;
+	default:	goto yy215;
+	}
+yy218:	yych = *++YYCURSOR;
+	switch(yych){
+	case '\n':	goto yy214;
+	default:	goto yy212;
+	}
+yy219:	yyaccept = 0;
 	YYMARKER = ++YYCURSOR;
 	if(YYLIMIT == YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-yy209:	switch(yych){
-	case '\n':	case ' ':	goto yy208;
-	case '\r':	goto yy210;
-	default:	goto yy200;
+yy220:	switch(yych){
+	case '\n':	case ' ':	goto yy219;
+	case '\r':	goto yy221;
+	default:	goto yy202;
 	}
-yy210:	++YYCURSOR;
+yy221:	++YYCURSOR;
 	if(YYLIMIT == YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy208;
-	default:	goto yy211;
-	}
-yy211:	YYCURSOR = YYMARKER;
-	switch(yyaccept){
-	case 0:	goto yy200;
+	case '\n':	goto yy219;
+	default:	goto yy212;
 	}
 }
-#line 945
+#line 958
 
     }
 
@@ -2305,65 +2356,83 @@ Comment:
 {
 	YYCTYPE yych;
 	unsigned int yyaccept;
-	goto yy212;
-yy213:	++YYCURSOR;
-yy212:
+	goto yy222;
+yy223:	++YYCURSOR;
+yy222:
 	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy214;
-	case '\n':	goto yy216;
-	case '\r':	goto yy217;
-	default:	goto yy219;
+	case '\000':	goto yy224;
+	case '\n':	goto yy226;
+	case '\r':	goto yy227;
+	default:	goto yy229;
 	}
-yy214:	yych = *++YYCURSOR;
-yy215:
-#line 961
+yy224:	yych = *++YYCURSOR;
+yy225:
+#line 974
 	{   YYCURSOR = YYTOKEN;
                         return;
                     }
-yy216:	yyaccept = 0;
+yy226:	yyaccept = 0;
 	yych = *(YYMARKER = ++YYCURSOR);
-	goto yy221;
-yy217:	yych = *++YYCURSOR;
+	goto yy231;
+yy227:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy220;
-	default:	goto yy218;
+	case '\n':	goto yy230;
+	default:	goto yy228;
 	}
-yy218:
-#line 965
+yy228:
+#line 978
 	{   goto Comment; 
                     }
-yy219:	yych = *++YYCURSOR;
-	goto yy218;
-yy220:	yyaccept = 0;
+yy229:	yych = *++YYCURSOR;
+	goto yy228;
+yy230:	yyaccept = 0;
 	YYMARKER = ++YYCURSOR;
 	if(YYLIMIT == YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-yy221:	switch(yych){
-	case '\n':	goto yy220;
-	case '\r':	goto yy222;
-	default:	goto yy215;
+yy231:	switch(yych){
+	case '\n':	goto yy230;
+	case '\r':	goto yy232;
+	default:	goto yy225;
 	}
-yy222:	++YYCURSOR;
+yy232:	++YYCURSOR;
 	if(YYLIMIT == YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy220;
-	default:	goto yy223;
+	case '\n':	goto yy230;
+	default:	goto yy233;
 	}
-yy223:	YYCURSOR = YYMARKER;
+yy233:	YYCURSOR = YYMARKER;
 	switch(yyaccept){
-	case 0:	goto yy215;
+	case 0:	goto yy225;
 	}
 }
-#line 968
+#line 981
 
 
     }
 
 }
 
+char
+escape_seq( char ch )
+{
+    switch ( ch )
+    {
+        case '0': return '\0';
+        case 'a': return 7;
+        case 'b': return '\010';
+        case 'e': return '\033';
+        case 'f': return '\014';
+        case 'n': return '\n';
+        case 'r': return '\015';
+        case 't': return '\t';
+        case 'v': return '\013';
+        default: return ch;
+    }
+}
+
 int
 is_newline( char *ptr )
 {
diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 61ade3765f..7d36b468d6 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -352,16 +352,20 @@ class Range
     end
 	def to_yaml( opts = {} )
 		YAML::quick_emit( nil, opts ) { |out|
-			out << "!ruby/range " 
-            self.to_s.to_yaml(:Emitter => out)
+			out << "!ruby/range '" 
+            self.begin.to_yaml(:Emitter => out)
+            out << ( self.exclude_end? ? "..." : ".." )
+            self.end.to_yaml(:Emitter => out)
+            out << "'"
 		}
 	end
 end
 
 YAML.add_ruby_type( 'range' ) { |type, val|
-	if String === val and val =~ /^(.*[^.])(\.{2,3})([^.].*)$/
+    inr = '(\w+|[+-]*\d+(?:\.\d+)?|"(?:[^\\"]|\\.)*")'
+	if String === val and val =~ /^#{inr}(\.{2,3})#{inr}$/
         r1, rdots, r2 = $1, $2, $3
-		Range.new( YAML.try_implicit( r1 ), YAML.try_implicit( r2 ), rdots.length == 3 )
+		Range.new( YAML.load( "--- #{r1}" ), YAML.load( "--- #{r2}" ), rdots.length == 3 )
 	elsif Hash === val
 		Range.new( val['begin'], val['end'], val['exclude_end?'] )
 	else