diff --git a/language-webidl.cabal b/language-webidl.cabal
--- a/language-webidl.cabal
+++ b/language-webidl.cabal
@@ -1,10 +1,9 @@
 name:               language-webidl
-version:            0.1.3.1
+version:            0.1.4.0
 synopsis:           Parser and Pretty Printer for WebIDL
 description:
-    It is intended to replace the old package
-    <https://hackage.haskell.org/package/webidl>.
-    This new package is written with parsec and wl-pprint.
+    Written with parsec and wl-pprint.
+    See <http://www.w3.org/TR/WebIDL/> for reference.
 license:             MIT
 license-file:        LICENSE
 author:              Zhen Zhang <izgzhen@gmail.com>
diff --git a/src/Language/WebIDL/AST.hs b/src/Language/WebIDL/AST.hs
--- a/src/Language/WebIDL/AST.hs
+++ b/src/Language/WebIDL/AST.hs
@@ -16,6 +16,7 @@
                   | DefException (Exception a)
                   | DefEnum (Enum a)
                   | DefTypedef (Typedef a)
+                  | DefCallback (Callback a)
                   | DefImplementsStatement (ImplementsStatement a)
                   deriving (Show, Eq, Functor)
 
@@ -35,6 +36,9 @@
 data Partial a = PartialInterface a Ident [InterfaceMember a]
                | PartialDictionary a Ident [DictionaryMember a]
                deriving (Show, Eq, Functor)
+
+-- | Callback functions
+data Callback a = Callback a Ident ReturnType [Argument a] deriving (Show, Eq, Functor)
 
 -- | @dictionary@
 data Dictionary a = Dictionary a Ident (Maybe Ident) [DictionaryMember a] deriving (Show, Eq, Functor)
diff --git a/src/Language/WebIDL/PPrint.hs b/src/Language/WebIDL/PPrint.hs
--- a/src/Language/WebIDL/PPrint.hs
+++ b/src/Language/WebIDL/PPrint.hs
@@ -23,10 +23,15 @@
     pretty (DefEnum x) = pretty x
     pretty (DefTypedef x) = pretty x
     pretty (DefImplementsStatement x) = pretty x
+    pretty (DefCallback x) = pretty x
 
 instance Pretty (Interface a) where
     pretty (Interface _ extAttrs x mInherit members) =
         prettyExtAttrs extAttrs line <> text "interface" <+> pretty x <+> prettyInherit mInherit <+> scope members <> semi
+
+instance Pretty (Callback a) where
+    pretty (Callback _ f retty args) = text "callback" <+> pretty f <+>
+                                       equals <+> pretty retty <+> prettyParenList args
 
 prettyExtAttrs :: [ExtendedAttribute a] -> Doc -> Doc
 prettyExtAttrs [] _ = empty
diff --git a/src/Language/WebIDL/Parser.hs b/src/Language/WebIDL/Parser.hs
--- a/src/Language/WebIDL/Parser.hs
+++ b/src/Language/WebIDL/Parser.hs
@@ -50,12 +50,19 @@
 
 pDef :: MyParser (Definition Tag)
 pDef = try (DefInterface <$> pInterface)
+   <|> DefCallback <$> pCallback
    <|> DefPartial <$> pPartial
    <|> DefDictionary <$> pDictionary
    <|> DefException <$> pException
    <|> DefEnum <$> pEnum
    <|> DefTypedef <$> pTypedef
    <|> DefImplementsStatement <$> pImplementsStatement
+
+pCallback :: MyParser (Callback Tag)
+pCallback = Callback <$> (string "callback" *> pSpaces *> getTag)
+                     <*> pIdent
+                     <*> (pEq *> pReturnType <* pSpaces)
+                     <*> pParenComma pArg
 
 pExtAttrs :: MyParser [ExtendedAttribute Tag]
 pExtAttrs = try (brackets (pSpaces *> sepBy (pExtAttr <* pSpaces) (char ',' <* pSpaces)))
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -8,7 +8,8 @@
 
 tests :: Test
 tests = TestList [ TestLabel "WebGL" (testIDL "examples/webgl.idl")
-                 , TestLabel "File API" (testIDL "examples/fileapi.idl") ]
+                 , TestLabel "File API" (testIDL "examples/fileapi.idl")
+                 , TestLabel "Callback" (testIDL "examples/callback.idl") ]
 
 testIDL :: FilePath -> Test
 testIDL idlpath = TestCase $ do
