diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index ad2d571..a01d62b 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -523,7 +523,7 @@
 class ObjCClassDecl : public Decl {
   ObjCInterfaceDecl **ForwardDecls;
   unsigned NumForwardDecls;
-public:
+  
   ObjCClassDecl(SourceLocation L, ObjCInterfaceDecl **Elts, unsigned nElts)
     : Decl(ObjCClass, L) { 
     if (nElts) {
@@ -534,6 +534,10 @@
     }
     NumForwardDecls = nElts;
   }
+public:
+  static ObjCClassDecl *Create(ASTContext &C, SourceLocation L,
+                               ObjCInterfaceDecl **Elts, unsigned nElts);
+  
   void setInterfaceDecl(unsigned idx, ObjCInterfaceDecl *OID) {
     assert(idx < NumForwardDecls && "index out of range");
     ForwardDecls[idx] = OID;
@@ -553,7 +557,7 @@
 class ObjCForwardProtocolDecl : public Decl {
   ObjCProtocolDecl **ReferencedProtocols;
   unsigned NumReferencedProtocols;
-public:
+  
   ObjCForwardProtocolDecl(SourceLocation L, 
                           ObjCProtocolDecl **Elts, unsigned nElts)
   : Decl(ObjCForwardProtocol, L) { 
@@ -565,6 +569,11 @@
       ReferencedProtocols = 0;
     }
   }
+public:
+  static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L, 
+                                         ObjCProtocolDecl **Elts, unsigned Num);
+
+  
   void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) {
     assert(idx < NumReferencedProtocols && "index out of range");
     ReferencedProtocols[idx] = OID;
@@ -625,7 +634,7 @@
   
   SourceLocation EndLoc; // marks the '>' or identifier.
   SourceLocation AtEndLoc; // marks the end of the entire interface.
-public:
+  
   ObjCCategoryDecl(SourceLocation L, unsigned numRefProtocol,IdentifierInfo *Id)
     : NamedDecl(ObjCCategory, L, Id),
       ClassInterface(0), ReferencedProtocols(0), NumReferencedProtocols(0),
@@ -639,7 +648,12 @@
       NumReferencedProtocols = numRefProtocol;
     }
   }
+public:
+  
+  static ObjCCategoryDecl *Create(ASTContext &C, SourceLocation L,
+                                  unsigned numRefProtocol, IdentifierInfo *Id);
 
+  
   ObjCInterfaceDecl *getClassInterface() const { return ClassInterface; }
   void setClassInterface(ObjCInterfaceDecl *IDecl) { ClassInterface = IDecl; }
   
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index 62336b6..2ec9395 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -54,6 +54,26 @@
   return new (Mem) ObjCProtocolDecl(L, numRefProtos, Id);
 }
 
+ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, SourceLocation L,
+                                     ObjCInterfaceDecl **Elts, unsigned nElts) {
+  void *Mem = C.getAllocator().Allocate<ObjCClassDecl>();
+  return new (Mem) ObjCClassDecl(L, Elts, nElts);
+}
+
+ObjCForwardProtocolDecl *
+ObjCForwardProtocolDecl::Create(ASTContext &C, SourceLocation L, 
+                                ObjCProtocolDecl **Elts, unsigned NumElts) {
+  void *Mem = C.getAllocator().Allocate<ObjCForwardProtocolDecl>();
+  return new (Mem) ObjCForwardProtocolDecl(L, Elts, NumElts);
+}
+
+ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, SourceLocation L,
+                                           unsigned numRefProtocol, 
+                                           IdentifierInfo *Id) {
+  void *Mem = C.getAllocator().Allocate<ObjCCategoryDecl>();
+  return new (Mem) ObjCCategoryDecl(L, numRefProtocol, Id);
+}
+
 
 //===----------------------------------------------------------------------===//
 // Objective-C Decl Implementation
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index 28a92c7..7bdfd9e 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -268,8 +268,8 @@
     
     Protocols.push_back(PDecl);
   }
-  return new ObjCForwardProtocolDecl(AtProtocolLoc,
-                                     &Protocols[0], Protocols.size());
+  return ObjCForwardProtocolDecl::Create(Context, AtProtocolLoc,
+                                         &Protocols[0], Protocols.size());
 }
 
 Sema::DeclTy *Sema::ActOnStartCategoryInterface(
@@ -280,8 +280,9 @@
                       SourceLocation EndProtoLoc) {
   ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName);
   
-  ObjCCategoryDecl *CDecl = new ObjCCategoryDecl(AtInterfaceLoc, NumProtoRefs,
-                                                 CategoryName);
+  ObjCCategoryDecl *CDecl = 
+    ObjCCategoryDecl::Create(Context, AtInterfaceLoc, NumProtoRefs, 
+                             CategoryName);
   CDecl->setClassInterface(IDecl);
   
   /// Check that class of this category is already completely declared.
@@ -605,7 +606,8 @@
     Interfaces.push_back(IDecl);
   }
   
-  return new ObjCClassDecl(AtClassLoc, &Interfaces[0], Interfaces.size());
+  return ObjCClassDecl::Create(Context, AtClassLoc,
+                               &Interfaces[0], Interfaces.size());
 }
 
 
