diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009, Arjun Guha, Claudiu Saftoiu, and Spiridon Eliopoulos
+Copyright (c) 2007--2011, Brown University and Claudiu Saftoiu
 All Rights Reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/WebBits.cabal b/WebBits.cabal
--- a/WebBits.cabal
+++ b/WebBits.cabal
@@ -1,20 +1,28 @@
 Name:           WebBits
-Version:        2.0
-Cabal-Version:	>= 1.2.3
-Copyright:      Copyright (c) 2007-2009 Arjun Guha, Claudiu Saftoiu, 
-                and Spiridon Eliopoulos
+Version:        2.2
+Cabal-Version:	>= 1.6
+Copyright:      Copyright (c) 2007-2011 Brown University, Claudiu Saftoiu,  Arjun Guha, Spiridon Eliopoulos, Copyright (c) 2012 Arjun Guha and Andrey Chudnov
 License:        BSD3
 License-file:   LICENSE
-Author:         Arjun Guha, Claudiu Saftoiu, and Spiridon Eliopoulos
-Maintainer:     Arjun Guha <arjun@cs.brown.edu>
-Homepage:       http://www.cs.brown.edu/research/plt/
+Author:         Arjun Guha, Claudiu Saftoiu, Spiridon Eliopoulos and Andrey Chudnov
+Maintainer:     Andrey Chudnov <oss@chudnov.com>
+Homepage:       http://github.com/brownplt/webbits
+Bug-reports:    http://github.com/brownplt/webbits/issues
 Stability:      provisional
+Tested-with:    GHC==7.0.4, GHC==7.4.1
 Category:       Language
 Build-Type:     Custom
 Synopsis:       JavaScript analysis tools
-Description:
+Description:    WebBits is a collection of libraries for working with JavaScript, contains a parser, a pretty-printer and a lexical environment analyser. The original author of the package is the PLT group of Brown University (http:\/\/www.cs.brown.edu\/research\/plt\/). Changes since version 2.1: the syntax of the try-catch-finally statement has been changed in accordance to the ECMAScript specification -- now it only has at most one catch clause. The original test-suite needs updating to support the current test system: patches are welcome.
 
-	WebBits is a collection of libraries for working with JavaScript.
+Source-repository head
+   type: git
+   location: git://github.com/brownplt/webbits.git
+
+Source-repository this
+   type: git
+   location: git://github.com/brownplt/webbits.git
+   tag: WebBits-2.2
  
 Library
   Hs-Source-Dirs:
@@ -22,14 +30,14 @@
   Build-Depends:
     base >= 4 && < 5,
     mtl >= 1.1.0.1,
-    parsec < 3.0.0,
+    parsec < 3.2.0,
     pretty >= 0.1,
     containers >= 0.1,
     syb >= 0.1
   ghc-options:
     -fwarn-incomplete-patterns
   Extensions:     
-    Generics DeriveDataTypeable
+    DeriveDataTypeable
   Exposed-Modules:
     BrownPLT.JavaScript 
     BrownPLT.JavaScript.Lexer 
diff --git a/src/BrownPLT/JavaScript/Environment.hs b/src/BrownPLT/JavaScript/Environment.hs
--- a/src/BrownPLT/JavaScript/Environment.hs
+++ b/src/BrownPLT/JavaScript/Environment.hs
@@ -114,8 +114,8 @@
   ForInStmt _ fii e s -> unions [forInInit fii, expr e, stmt s]
   ForStmt _ fi  me1 me2 s -> 
     unions [forInit fi, maybe empty expr me1, maybe empty expr me2, stmt s]
-  TryStmt _ s catches ms ->
-    unions [stmt s, unions $ map catchClause catches, maybe empty stmt ms]
+  TryStmt _ s catch ms ->
+    unions [stmt s, maybe empty catchClause catch, maybe empty stmt ms]
   ThrowStmt _ e -> expr e
   ReturnStmt _ me -> maybe empty expr me
   WithStmt _ e s -> unions [expr e, stmt s]
diff --git a/src/BrownPLT/JavaScript/Lexer.hs b/src/BrownPLT/JavaScript/Lexer.hs
--- a/src/BrownPLT/JavaScript/Lexer.hs
+++ b/src/BrownPLT/JavaScript/Lexer.hs
@@ -34,6 +34,7 @@
                  "[", "]", "{", "}", "(", ")","</","instanceof"]
                  True -- case-sensitive
             
+lex :: T.TokenParser st
 lex = T.makeTokenParser javascriptDef
 
 -- everything but commaSep and semiSep
diff --git a/src/BrownPLT/JavaScript/Parser.hs b/src/BrownPLT/JavaScript/Parser.hs
--- a/src/BrownPLT/JavaScript/Parser.hs
+++ b/src/BrownPLT/JavaScript/Parser.hs
@@ -35,6 +35,7 @@
 type StatementParser state = CharParser state ParsedStatement
 type ExpressionParser state = CharParser state ParsedExpression
 
+identifier :: CharParser st (Id SourcePos)
 identifier =
   liftM2 Id getPosition Lexer.identifier
 
@@ -197,10 +198,10 @@
     in do reserved "try"
           pos <- getPosition
           guarded <- parseStatement
-          catches <- many parseCatchClause
+          catch <- optionMaybe parseCatchClause
           finally <- (reserved "finally" >> liftM Just parseStatement) 
                       <|> (return Nothing)
-          return (TryStmt pos guarded catches finally)
+          return (TryStmt pos guarded catch finally)
 
 parseThrowStmt:: StatementParser st
 parseThrowStmt = do
@@ -376,8 +377,10 @@
   let parseFlags = do
         flags <- many (oneOf "mgi")
         return $ \f -> f ('g' `elem` flags) ('i' `elem` flags) 
-  let parseEscape = char '\\' >> anyChar
-  let parseChar = noneOf "/"
+  let parseEscape :: CharParser st Char
+      parseEscape = char '\\' >> anyChar
+  let parseChar :: CharParser st Char
+      parseChar = noneOf "/"
   let parseRe = (char '/' >> return "") <|> 
                 (do char '\\'
                     ch <- anyChar -- TOOD: too lenient
@@ -542,22 +545,44 @@
 
 exprTable:: [[Operator Char st ParsedExpression]]
 exprTable = 
-  [
-   [makeInfixExpr "*" OpMul, makeInfixExpr "/" OpDiv, makeInfixExpr "%" OpMod],
-   [makeInfixExpr "+" OpAdd, makeInfixExpr "-" OpSub],
-   [makeInfixExpr "<<" OpLShift, makeInfixExpr ">>" OpSpRShift,
-    makeInfixExpr ">>>" OpZfRShift],
-   [makeInfixExpr "<" OpLT, makeInfixExpr "<=" OpLEq, makeInfixExpr ">" OpGT,
-    makeInfixExpr ">=" OpGEq, 
-    makeInfixExpr "instanceof" OpInstanceof, makeInfixExpr "in" OpIn],
-   [makeInfixExpr "&" OpBAnd], 
-   [makeInfixExpr "^" OpBXor], 
-   [makeInfixExpr "|" OpBOr],
-   [makeInfixExpr "&&" OpLAnd],
-   [makeInfixExpr "||" OpLOr],  
-   [makeInfixExpr "==" OpEq, makeInfixExpr "!=" OpNEq,
-    makeInfixExpr "===" OpStrictEq, makeInfixExpr "!==" OpStrictNEq]
+  [ [ makeInfixExpr "==" OpEq
+    , makeInfixExpr "!=" OpNEq
+    , makeInfixExpr "===" OpStrictEq
+    , makeInfixExpr "!==" OpStrictNEq
     ]
+
+  , [ makeInfixExpr "||" OpLOr ]
+
+  , [ makeInfixExpr "&&" OpLAnd ]
+  
+  , [ makeInfixExpr "|" OpBOr ]
+
+  , [ makeInfixExpr "^" OpBXor ]
+
+  , [ makeInfixExpr "&" OpBAnd ]
+
+  , [ makeInfixExpr "<" OpLT
+    , makeInfixExpr "<=" OpLEq
+    , makeInfixExpr ">" OpGT
+    , makeInfixExpr ">=" OpGEq
+    , makeInfixExpr "instanceof" OpInstanceof
+    , makeInfixExpr "in" OpIn
+    ]
+
+  , [ makeInfixExpr "<<" OpLShift
+    , makeInfixExpr ">>" OpSpRShift
+    , makeInfixExpr ">>>" OpZfRShift
+    ]
+
+  , [ makeInfixExpr "+" OpAdd
+    , makeInfixExpr "-" OpSub
+    ]
+
+  , [ makeInfixExpr "*" OpMul
+    , makeInfixExpr "/" OpDiv
+    , makeInfixExpr "%" OpMod
+    ]
+  ]
 
 parseExpression' = 
   buildExpressionParser exprTable parsePrefixedExpr <?> "simple expression"
diff --git a/src/BrownPLT/JavaScript/PrettyPrint.hs b/src/BrownPLT/JavaScript/PrettyPrint.hs
--- a/src/BrownPLT/JavaScript/PrettyPrint.hs
+++ b/src/BrownPLT/JavaScript/PrettyPrint.hs
@@ -57,8 +57,10 @@
   text "default:" $$ (nest 2 (semiSep ss))
 
 
-catchClause :: CatchClause a -> Doc
-catchClause (CatchClause _ id s) = text "catch" <+> (parens.pp) id <+> inBlock s
+catchClause :: Maybe (CatchClause a) -> Doc
+catchClause Nothing = empty
+catchClause (Just (CatchClause _ id s)) = 
+  text "catch" <+> (parens.pp) id <+> inBlock s
 
 
 varDecl :: VarDecl a -> Doc
@@ -93,8 +95,8 @@
     text "for" <+> 
     parens (forInit init <> semi <+> mexpr incr <> semi <+> mexpr test) $$ 
     stmt body
-  TryStmt _ stmt catches finally ->
-    text "try" $$ inBlock stmt $$ (vcat (map catchClause catches)) $$
+  TryStmt _ stmt catch finally ->
+    text "try" $$ inBlock stmt $$ catchClause catch $$
     ppFinally where 
        ppFinally = case finally of
         Nothing -> empty
diff --git a/src/BrownPLT/JavaScript/Syntax.hs b/src/BrownPLT/JavaScript/Syntax.hs
--- a/src/BrownPLT/JavaScript/Syntax.hs
+++ b/src/BrownPLT/JavaScript/Syntax.hs
@@ -121,7 +121,7 @@
               (Maybe (Expression a)) -- test
               (Maybe (Expression a)) -- increment
               (Statement a)          -- body
-  | TryStmt a (Statement a) {-body-} [CatchClause a] {-catches-}
+  | TryStmt a (Statement a) {-body-} (Maybe (CatchClause a))
       (Maybe (Statement a)) {-finally-}
   | ThrowStmt a (Expression a)
   | ReturnStmt a (Maybe (Expression a))
