diff --git a/lexer.mll b/lexer.mll
index a04b19fa32040c9a9730af410f58ab26fe1b87c6..c82a71d206c5963fd8b74569d5a8896ddafa37d5 100644
--- a/lexer.mll
+++ b/lexer.mll
@@ -81,8 +81,6 @@ let X = ['x' 'X']
 let Y = ['y' 'Y']
 let Z = ['z' 'Z']
 
-let uagent = ('-' ("webkit" | "moz"  | "ms" | "o") '-')?
-
 
 rule token = parse
   | "\r\n" | '\r' | '\n'  { new_line lexbuf; S }
@@ -105,8 +103,9 @@ rule token = parse
   | "@charset "                   { CHARSET_SYM }
   | '@' F O N T '-' F A C E       { FONT_FACE_SYM }
   | '@' N A M E S P A C E         { NAMESPACE_SYM }
-  | '@' uagent K E Y F R A M E S  { KEYFRAMES_SYM }
   | '@' S U P P O R T S           { SUPPORTS_SYM }
+  | '@' (('-' ident '-')? as prefix) K E Y F R A M E S
+  { KEYFRAMES_SYM (String.lowercase prefix) }
 
   | (s | comment)* s comment* A N D comment* s (s | comment)*
   { advance_pos lexbuf; WS_AND }
diff --git a/parser.mly b/parser.mly
index f4dc10fec959e35e3e26d79e76b7c4cf85899dc7..3dac561b11e0a2085ef5f17ef355ca86b3410dc1 100644
--- a/parser.mly
+++ b/parser.mly
@@ -41,10 +41,10 @@
 
 (* Tokens *)
 %token S CDO CDC IMPORT_SYM PAGE_SYM MEDIA_SYM CHARSET_SYM FONT_FACE_SYM
-%token NAMESPACE_SYM KEYFRAMES_SYM SUPPORTS_SYM IMPORTANT_SYM
+%token NAMESPACE_SYM SUPPORTS_SYM IMPORTANT_SYM
 %token <float> PERCENTAGE NUMBER
 %token <float * string> UNIT_VALUE
-%token <string> COMBINATOR RELATION STRING IDENT HASH URI FUNCTION
+%token <string> KEYFRAMES_SYM COMBINATOR RELATION STRING IDENT HASH URI FUNCTION
 %token LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK SEMICOL COLON COMMA DOT PLUS
 %token MINUS SLASH STAR ONLY AND (*OR*) NOT FROM TO EOF
 %token WS_AND WS_OR
@@ -141,8 +141,8 @@ descriptor_declaration:
   { (name, value) }
 
 keyframes_rule:
-  | KEYFRAMES_SYM S* id=IDENT S* LBRACE S* rules=keyframe_ruleset* RBRACE S*
-  { Keyframes (id, rules) }
+  | pre=KEYFRAMES_SYM S* id=IDENT S* LBRACE S* rules=keyframe_ruleset* RBRACE S*
+  { Keyframes (pre, id, rules) }
 keyframe_ruleset:
   | selector=keyframe_selector S* decls=decls_block
   { (selector, decls) }
diff --git a/stringify.ml b/stringify.ml
index afbafbccdf4a24db6f85c567413307595b024b43..53e224036dbc963ee072da450e1616342ec24c38 100644
--- a/stringify.ml
+++ b/stringify.ml
@@ -110,11 +110,12 @@ let rec string_of_statement = function
     "@namespace " ^ string_of_expr uri ^ ";"
   | Namespace (Some prefix, uri) ->
     "@namespace " ^ prefix ^ " " ^ string_of_expr uri ^ ";"
-  | Keyframes (id, rules) ->
+  | Keyframes (prefix, id, rules) ->
     let string_of_keyframe_ruleset (expr, decls) =
       string_of_expr expr ^ block (cat "\n" string_of_declaration decls)
     in
-    "@keyframes " ^ id ^ block (cat "\n\n" string_of_keyframe_ruleset rules)
+    "@" ^ prefix ^ "keyframes " ^ id ^
+    block (cat "\n\n" string_of_keyframe_ruleset rules)
   | Supports (condition, statements) ->
     "@supports " ^ stringify_condition " " condition ^
     block (cat "\n\n" string_of_statement statements)
@@ -165,7 +166,8 @@ let rec minify_statement = function
   | Import (target, []) ->
     "@import " ^ string_of_expr target ^ ";"
   | Import (target, queries) ->
-    "@import " ^ string_of_expr target ^ " " ^ cat "," string_of_media_query queries ^ ";"
+    "@import " ^ string_of_expr target ^ " " ^
+    cat "," string_of_media_query queries ^ ";"
   | Page (None, decls) ->
     "@page{" ^ cat ";" minify_declaration decls ^ "}"
   | Page (Some pseudo, decls) ->
@@ -175,11 +177,12 @@ let rec minify_statement = function
       name ^ ":" ^ string_of_expr value
     in
     "@font-face{" ^ cat ";" minify_descriptor_declaration decls ^ "}"
-  | Keyframes (id, rules) ->
+  | Keyframes (prefix, id, rules) ->
     let minify_keyframe_ruleset (expr, decls) =
       minify_expr expr ^ "{" ^ cat ";" minify_declaration decls ^ "}"
     in
-    "@keyframes " ^ id ^ "{" ^ cat "" minify_keyframe_ruleset rules ^ "}"
+    "@" ^ prefix ^ "keyframes " ^ id ^
+    "{" ^ cat "" minify_keyframe_ruleset rules ^ "}"
   | Supports (condition, statements) ->
     "@supports " ^ stringify_condition "" condition ^
     "{" ^ cat "" minify_statement statements ^ "}"
diff --git a/types.ml b/types.ml
index a21758936ff441f1f6175df93a75a211a73aac1c..d50b4844a09dd7d00094343c65293eb95084c74d 100644
--- a/types.ml
+++ b/types.ml
@@ -46,8 +46,8 @@ type statement =
   (* @font-face { <declarations> } *)
   | Namespace of string option * expr
   (* @namespace [<prefix>] "<uri>"; *)
-  | Keyframes of string * keyframe_ruleset list
-  (* @keyframes <id> { <rulesets> } *)
+  | Keyframes of string * string * keyframe_ruleset list
+  (* @[-<prefix>-]keyframes <id> { <rulesets> } *)
   | Supports of condition * statement list
   (* @supports <condition> { <rulesets> } *)
 
diff --git a/util.ml b/util.ml
index 34f7fe84a2466d9b0dcaff83a3a311248568e6ba..4b81a810885950cb51c52e7dafc3910e2547a8b3 100644
--- a/util.ml
+++ b/util.ml
@@ -203,9 +203,9 @@ let transform_stylesheet f stylesheet =
     | Namespace (prefix, uri) ->
       let uri = expect_expr uri in
       f (Statement (Namespace (prefix, uri)))
-    | Keyframes (id, rules) ->
+    | Keyframes (prefix, id, rules) ->
       let rules = trav_all_keyframe_ruleset rules in
-      f (Statement (Keyframes (id, rules)))
+      f (Statement (Keyframes (prefix, id, rules)))
     | Supports (condition, statements) ->
       let condition = expect_condition condition in
       let statements = trav_all_statement statements in