diff --git a/CHANGELOG.md b/CHANGELOG.md
index b8c2a6d..4d14f0b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.12.1
+
+ * Fix to handling of escapes in strings.
+
 ## 0.12.0+1
 
 * Allow the lastest version of `logging` package.
diff --git a/lib/parser.dart b/lib/parser.dart
index 1ca391c..8692693 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -2363,8 +2363,8 @@
 
     // Note: disable skipping whitespace tokens inside a string.
     // TODO(jmesserly): the layering here feels wrong.
-    var skipWhitespace = tokenizer._skipWhitespace;
-    tokenizer._skipWhitespace = false;
+    var inString = tokenizer._inString;
+    tokenizer._inString = false;
 
     switch (_peek()) {
       case TokenKind.SINGLE_QUOTE:
@@ -2396,7 +2396,7 @@
       stringValue.write(_next().text);
     }
 
-    tokenizer._skipWhitespace = skipWhitespace;
+    tokenizer._inString = inString;
 
     // All characters between quotes is the string.
     if (stopToken != TokenKind.RPAREN) {
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index f5c5210..d423104 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -273,7 +273,7 @@
       // if followed by hexadecimal digits, create the appropriate character.
       // otherwise, include the character in the identifier and don't treat it
       // specially.
-      if (ch == 92 /*\*/) {
+      if (ch == 92 /*\*/ && _inString) {
         int startHex = ++_index;
         eatHexDigits(startHex + 6);
         if (_index != startHex) {
@@ -395,7 +395,7 @@
         return _finishToken(TokenKind.INCOMPLETE_COMMENT);
       } else if (ch == 42 /*'*'*/) {
         if (_maybeEatChar(47 /*'/'*/)) {
-          if (_skipWhitespace) {
+          if (_inString) {
             return next();
           } else {
             return _finishToken(TokenKind.COMMENT);
@@ -405,7 +405,7 @@
         /* Check if close part of Comment Definition --> (CDC). */
         if (_maybeEatChar(TokenChar.MINUS)) {
           if (_maybeEatChar(TokenChar.GREATER)) {
-            if (_skipWhitespace) {
+            if (_inString) {
               return next();
             } else {
               return _finishToken(TokenKind.HTML_COMMENT);
diff --git a/lib/src/tokenizer_base.dart b/lib/src/tokenizer_base.dart
index 8c52fb0..663c987 100644
--- a/lib/src/tokenizer_base.dart
+++ b/lib/src/tokenizer_base.dart
@@ -27,7 +27,7 @@
   final SourceFile _file;
   final String _text;
 
-  bool _skipWhitespace;
+  bool _inString;
 
   /**
    * Changes tokenization when in a pseudo function expression.  If true then
@@ -55,7 +55,7 @@
   int _index = 0;
   int _startIndex = 0;
 
-  TokenizerBase(this._file, this._text, this._skipWhitespace,
+  TokenizerBase(this._file, this._text, this._inString,
       [this._index = 0]);
 
   Token next();
@@ -119,12 +119,12 @@
           ch == TokenChar.RETURN) {
         // do nothing
       } else if (ch == TokenChar.NEWLINE) {
-        if (!_skipWhitespace) {
+        if (!_inString) {
           return _finishToken(TokenKind.WHITESPACE); // note the newline?
         }
       } else {
         _index--;
-        if (_skipWhitespace) {
+        if (_inString) {
           return next();
         } else {
           return _finishToken(TokenKind.WHITESPACE);
@@ -151,7 +151,7 @@
       }
     } while (nesting > 0);
 
-    if (_skipWhitespace) {
+    if (_inString) {
       return next();
     } else {
       return _finishToken(TokenKind.COMMENT);
diff --git a/pubspec.yaml b/pubspec.yaml
index 01051d3..70923da 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.12.0+1
+version: 0.12.1
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://github.com/dart-lang/csslib
diff --git a/test/compiler_test.dart b/test/compiler_test.dart
index 88b7a2d..df5a44a 100644
--- a/test/compiler_test.dart
+++ b/test/compiler_test.dart
@@ -677,6 +677,19 @@
 }''');
 }
 
+void testStringEscape() {
+  var errors = [];
+  var input = r'''a { foo: '{"text" : "a\\\""}' }''';
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  expect(prettyPrint(stylesheet), r'''
+a {
+  foo: '{"text" : "a\\\""}';
+}''');
+}
+
 // TODO(terry): Move to emitter_test.dart when real emitter exist.
 void testEmitter() {
   var errors = [];
@@ -721,6 +734,7 @@
   test('Attributes', testAttribute);
   test('Negation', testNegation);
   test('@host', testHost);
+  test('stringEscape', testStringEscape);
   test('Parse List<int> as input', testArrayOfChars);
   test('Simple Emitter', testEmitter);
 }
