diff --git a/AST/Stmt.cpp b/AST/Stmt.cpp
index e8ecd0c..1738f95 100644
--- a/AST/Stmt.cpp
+++ b/AST/Stmt.cpp
@@ -193,3 +193,15 @@
 Stmt::child_iterator AsmStmt::child_begin() { return child_iterator(); }
 Stmt::child_iterator AsmStmt::child_end() { return child_iterator(); }
 
+// ObjcAtCatchStmt
+Stmt::child_iterator ObjcAtCatchStmt::child_begin() { return &AtCatchStmt; }
+Stmt::child_iterator ObjcAtCatchStmt::child_end() { return &AtCatchStmt+1; }
+
+// ObjcAtFinallyStmt
+Stmt::child_iterator ObjcAtFinallyStmt::child_begin() { return &AtFinallyStmt; }
+Stmt::child_iterator ObjcAtFinallyStmt::child_end() { return &AtFinallyStmt+1; }
+
+// ObjcAtTryStmt
+Stmt::child_iterator ObjcAtTryStmt::child_begin() { return &SubStmts[0]; }
+Stmt::child_iterator ObjcAtTryStmt::child_end()   { return &SubStmts[0]+1; }
+
diff --git a/AST/StmtPrinter.cpp b/AST/StmtPrinter.cpp
index ac6da06..0953891 100644
--- a/AST/StmtPrinter.cpp
+++ b/AST/StmtPrinter.cpp
@@ -321,6 +321,18 @@
   Indent() << "asm (/*todo*/);\n";
 }
 
+void StmtPrinter::VisitObjcAtTryStmt(ObjcAtTryStmt *Node) {
+  Indent() << "@try { /* todo */ }\n";
+}
+
+void StmtPrinter::VisitObjcAtFinallyStmt(ObjcAtFinallyStmt *Node) {
+  Indent() << "@finally { /* todo */ } \n";
+}
+
+void StmtPrinter::VisitObjcAtCatchStmt (ObjcAtCatchStmt *Node) {
+  Indent() << "@catch (...) { /* todo */ } \n";
+}
+
 //===----------------------------------------------------------------------===//
 //  Expr printing methods.
 //===----------------------------------------------------------------------===//
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 69124f2..765422a 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -1046,12 +1046,12 @@
 ///     parameter-declaration
 ///     '...' [OBJC2]
 ///
-Parser::DeclTy *Parser::ParseObjCTryStmt(SourceLocation atLoc) {
+Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
   bool catch_or_finally_seen = false;
   ConsumeToken(); // consume try
   if (Tok.isNot(tok::l_brace)) {
     Diag (Tok, diag::err_expected_lbrace);
-    return 0;
+    return true;
   }
   StmtResult TryBody = ParseCompoundStatementBody();
   while (Tok.is(tok::at)) {
@@ -1071,11 +1071,11 @@
         else
           ConsumeToken(); // consume '...'
         ConsumeParen();
-        StmtResult CatchMody = ParseCompoundStatementBody();
+        StmtResult CatchBody = ParseCompoundStatementBody();
       }
       else {
         Diag(catchLoc, diag::err_expected_lparen_after, "@catch clause");
-        return 0;
+        return true;
       }
       catch_or_finally_seen = true;
     }
@@ -1088,7 +1088,7 @@
   }
   if (!catch_or_finally_seen)
     Diag(atLoc, diag::err_missing_catch_finally);
-  return 0;
+  return true;
 }
 
 ///   objc-method-def: objc-method-proto ';'[opt] '{' body '}'
diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h
index fa0dc9d..580b3d6 100644
--- a/include/clang/AST/Stmt.h
+++ b/include/clang/AST/Stmt.h
@@ -657,7 +657,95 @@
   virtual child_iterator child_begin();
   virtual child_iterator child_end();
 };
-
+  
+/// ObjcAtCatchStmt - This represents objective-c's @catch statement.
+class ObjcAtCatchStmt : public Stmt {
+private:
+  // Points to next @catch statement, or null
+  ObjcAtCatchStmt *NextAtCatchStmt;
+  ScopedDecl *AtCatchDeclarator;
+  Stmt *AtCatchStmt;
+  
+  SourceLocation AtCatchLoc, RParenLoc;
+public:
+  ObjcAtCatchStmt(SourceLocation atCatchLoc, SourceLocation rparenloc,
+                  ScopedDecl *atCatchDeclarator, Stmt *atCatchStmt)
+  : Stmt(ObjcAtCatchStmtClass), NextAtCatchStmt(0), 
+    AtCatchDeclarator(atCatchDeclarator), AtCatchStmt(atCatchStmt), 
+    AtCatchLoc(atCatchLoc), RParenLoc(rparenloc) {}
+  
+  virtual SourceRange getSourceRange() const { 
+    return SourceRange(AtCatchLoc, AtCatchStmt->getLocEnd()); 
+  }
+   
+  static bool classof(const Stmt *T) {
+    return T->getStmtClass() == ObjcAtCatchStmtClass;
+  }
+  static bool classof(const ObjcAtCatchStmt *) { return true; }
+  
+  virtual child_iterator child_begin();
+  virtual child_iterator child_end();
+                  
+};
+  
+/// ObjcAtFinallyStmt - This represent objective-c's @finally Statement 
+class ObjcAtFinallyStmt : public Stmt {
+  private:
+    Stmt *AtFinallyStmt;
+    SourceLocation AtFinallyLoc;
+    
+  public:
+    ObjcAtFinallyStmt(SourceLocation atFinallyLoc, Stmt *atFinallyStmt)
+    : Stmt(ObjcAtFinallyStmtClass), 
+      AtFinallyStmt(atFinallyStmt), AtFinallyLoc(atFinallyLoc) {}
+    
+    virtual SourceRange getSourceRange() const { 
+      return SourceRange(AtFinallyLoc, AtFinallyStmt->getLocEnd()); 
+    }
+    
+    static bool classof(const Stmt *T) {
+      return T->getStmtClass() == ObjcAtFinallyStmtClass;
+    }
+    static bool classof(const ObjcAtFinallyStmt *) { return true; }
+    
+    virtual child_iterator child_begin();
+    virtual child_iterator child_end();
+    
+};
+  
+/// ObjcAtTryStmt - This represent objective-c's over-all 
+/// @try ... @catch ... @finally statement.
+class ObjcAtTryStmt : public Stmt {
+private:
+  enum { TRY, CATCH, FINALLY, END_TRY };
+  Stmt* SubStmts[END_TRY]; 
+  
+  SourceLocation AtTryLoc;
+      
+public:
+  ObjcAtTryStmt(SourceLocation atTryLoc, Stmt *atTryStmt, 
+                ObjcAtCatchStmt *atCatchStmt, 
+                ObjcAtFinallyStmt *atFinallyStmt)
+  : Stmt(ObjcAtTryStmtClass), AtTryLoc(atTryLoc) {
+      SubStmts[TRY] = atTryStmt;
+      SubStmts[CATCH] = atCatchStmt;
+      SubStmts[FINALLY] = atFinallyStmt;
+      SubStmts[END_TRY] = NULL;
+    }
+    
+  virtual SourceRange getSourceRange() const { 
+    return SourceRange(AtTryLoc, SubStmts[TRY]->getLocEnd()); 
+  }
+    
+  static bool classof(const Stmt *T) {
+    return T->getStmtClass() == ObjcAtTryStmtClass;
+  }
+  static bool classof(const ObjcAtTryStmt *) { return true; }
+    
+  virtual child_iterator child_begin();
+  virtual child_iterator child_end();
+    
+};
 
 }  // end namespace clang
 
diff --git a/include/clang/AST/StmtNodes.def b/include/clang/AST/StmtNodes.def
index 469f0a8..b94e6c3 100644
--- a/include/clang/AST/StmtNodes.def
+++ b/include/clang/AST/StmtNodes.def
@@ -43,7 +43,13 @@
 
 // GNU Stmt Extensions
 STMT(18, AsmStmt         , Stmt)
-LAST_STMT(17)
+
+// Obj-C statements
+STMT(19, ObjcAtTryStmt        , Stmt)
+STMT(20, ObjcAtCatchStmt      , Stmt)
+STMT(21, ObjcAtFinallyStmt    , Stmt)
+
+LAST_STMT(21)
 
 FIRST_EXPR(31)
 // Expressions.
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h
index 1345fe9..aeffdc6 100644
--- a/include/clang/Parse/Parser.h
+++ b/include/clang/Parse/Parser.h
@@ -275,7 +275,6 @@
   DeclTy *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
   DeclTy *ParseObjCPropertySynthesize(SourceLocation atLoc);
   DeclTy *ParseObjCPropertyDynamic(SourceLocation atLoc);
-  DeclTy *ParseObjCTryStmt(SourceLocation atLoc);
   DeclTy *ParseObjCThrowStmt(SourceLocation atLoc);
   
   IdentifierInfo *ParseObjCSelector(SourceLocation &MethodLocation);
@@ -389,6 +388,7 @@
   StmtResult ParseBreakStatement();
   StmtResult ParseReturnStatement();
   StmtResult ParseAsmStatement();
+  StmtResult ParseObjCTryStmt(SourceLocation atLoc);
   void ParseAsmOperandsOpt();
 
   //===--------------------------------------------------------------------===//
