diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index 05debe3..d05a307 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -316,16 +316,9 @@
         }
         Out << " )";
       }
-      
-      ObjCPropertyDecl::propdecl_iterator
-        I = PDecl->propdecl_begin(), E = PDecl->propdecl_end();
-      
       Out << ' ' << PDecl->getType().getAsString()
-          << ' ' << (*I)->getName();
-    
-      for (++I; I != E; ++I)
-        Out << ", " << (*I)->getName();
-
+          << ' ' << PDecl->getName();
+      
       Out << ";\n";
     }
   }
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index 951b43d..bed6ac5 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -27,7 +27,6 @@
 class ObjCProtocolDecl;
 class ObjCCategoryDecl;
 class ObjCPropertyDecl;
-class FieldDeclarator;
 
 /// ObjCMethodDecl - Represents an instance or class method declaration.
 /// ObjC methods can be declared within 4 contexts: class interfaces,
@@ -940,8 +939,12 @@
   static bool classof(const ObjCCompatibleAliasDecl *D) { return true; }
   
 };
-  
-class ObjCPropertyDecl : public Decl {
+
+/// ObjCPropertyDecl - Represents one property declaration in an interface.
+/// For example:
+/// @property (assign, readwrite) int MyProperty;
+///
+class ObjCPropertyDecl : public NamedDecl {
 public:
   enum PropertyAttributeKind {
     OBJC_PR_noattr    = 0x00, 
@@ -956,31 +959,18 @@
   };
 private:
   QualType DeclType;
-  // List of property name declarations
-  NamedDecl **PropertyDecls;
-  unsigned NumPropertyDecls;
   unsigned PropertyAttributes : 8;
   
   IdentifierInfo *GetterName;    // getter name of NULL if no getter
   IdentifierInfo *SetterName;    // setter name of NULL if no setter
   
-  ObjCPropertyDecl(SourceLocation L, QualType T)
-    : Decl(ObjCProperty, L), DeclType(T),
-      PropertyDecls(0), NumPropertyDecls(0),
+  ObjCPropertyDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
+    : NamedDecl(ObjCProperty, L, Id), DeclType(T),
       PropertyAttributes(OBJC_PR_noattr), GetterName(0), SetterName(0) {}
 public:
-  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, QualType T);
+  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, 
+                                  IdentifierInfo *Id, QualType T);
   QualType getType() const { return DeclType; }
-  typedef NamedDecl * const *propdecl_iterator;
-  propdecl_iterator propdecl_begin() const { return PropertyDecls; }
-  propdecl_iterator propdecl_end() const {
-    return PropertyDecls+NumPropertyDecls; 
-  }
-  unsigned propdecl_size() const { return NumPropertyDecls; }
-  bool propdecl_empty() const { return NumPropertyDecls == 0; }
-  NamedDecl **getPropertyDecls() { return PropertyDecls; }
-  void setNumPropertyDecls(unsigned num) { NumPropertyDecls = num; }
-  void setPropertyDecls(NamedDecl **Nd) { PropertyDecls = Nd; }
   PropertyAttributeKind getPropertyAttributes() const {
     return PropertyAttributeKind(PropertyAttributes);
   }
diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h
index 8d2c62b..217d8b1 100644
--- a/include/clang/Parse/Action.h
+++ b/include/clang/Parse/Action.h
@@ -657,10 +657,9 @@
     unsigned pNum = 0) {
     return;
   }
-  // ActOnAddObjCProperties - called to build one property AST
-  virtual DeclTy *ActOnAddObjCProperties (Scope *S, SourceLocation AtLoc,
-    FieldDeclarator *PropertyDeclarators, unsigned NumPropertyDeclarators, 
-    ObjCDeclSpec &ODS) {
+  // ActOnProperty - called to build one property AST
+  virtual DeclTy *ActOnProperty (Scope *S, SourceLocation AtLoc,
+                                 FieldDeclarator &FD, ObjCDeclSpec &ODS) {
     return 0;
   }
                                      
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h
index 34addc0..84fe49a 100644
--- a/include/clang/Parse/Parser.h
+++ b/include/clang/Parse/Parser.h
@@ -323,7 +323,6 @@
                               DeclTy *classDecl,
             tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
   void ParseObjCPropertyAttribute(ObjCDeclSpec &DS);
-  DeclTy *ParseObjCPropertyDecl(DeclTy *interfaceDecl, SourceLocation AtLoc);
   
   DeclTy *ParseObjCMethodDefinition();
   
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index 6e348ca..7a99f0f 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -111,9 +111,10 @@
 
 ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C,
                                            SourceLocation L,
+                                           IdentifierInfo *Id,
                                            QualType T) {
   void *Mem = C.getAllocator().Allocate<ObjCPropertyDecl>();
-  return new (Mem) ObjCPropertyDecl(L, T);
+  return new (Mem) ObjCPropertyDecl(L, Id, T);
 }
 
 //===----------------------------------------------------------------------===//
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index cc57bdc..ec40e36 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -248,7 +248,32 @@
         if (contextKey != tok::objc_protocol)
           Diag(AtLoc, diag::err_objc_protocol_optional);
       } else if (ocKind == tok::objc_property) {
-        allProperties.push_back(ParseObjCPropertyDecl(interfaceDecl, AtLoc));
+        ObjCDeclSpec OCDS;
+        ConsumeToken(); // the "property" identifier
+        // Parse property attribute list, if any. 
+        if (Tok.is(tok::l_paren)) {
+          // property has attribute list.
+          ParseObjCPropertyAttribute(OCDS);
+        }
+        // Parse all the comma separated declarators.
+        DeclSpec DS;
+        llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
+        ParseStructDeclaration(DS, FieldDeclarators);
+        
+        if (Tok.is(tok::semi)) 
+          ConsumeToken();
+        else {
+          Diag(Tok, diag::err_expected_semi_decl_list);
+          SkipUntil(tok::r_brace, true, true);
+        }
+        // Convert them all to property declarations.
+        for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) {
+          FieldDeclarator &FD = FieldDeclarators[i];
+          // Install the property declarator into interfaceDecl.
+          DeclTy *Property = Actions.ActOnProperty(CurScope,
+                               DS.getSourceRange().getBegin(), FD, OCDS);
+          allProperties.push_back(Property);
+        }
         continue;
       } else {
         Diag(Tok, diag::err_objc_illegal_interface_qual);
@@ -370,39 +395,6 @@
   }
 }
 
-///   Main routine to parse property declaration.
-///
-///   @property property-attr-decl[opt] property-component-decl ';'
-///
-Parser::DeclTy *Parser::ParseObjCPropertyDecl(DeclTy *interfaceDecl, 
-                                              SourceLocation AtLoc) {
-  assert(Tok.isObjCAtKeyword(tok::objc_property) &&
-         "ParseObjCPropertyDecl(): Expected @property");
-  ObjCDeclSpec OCDS;
-  ConsumeToken(); // the "property" identifier
-  // Parse property attribute list, if any. 
-  if (Tok.is(tok::l_paren)) {
-    // property has attribute list.
-    ParseObjCPropertyAttribute(OCDS);
-  }
-  // Parse declaration portion of @property.
-  llvm::SmallVector<DeclTy*, 8> PropertyDecls;
-  
-  // Parse all the comma separated declarators.
-  DeclSpec DS;
-  llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
-  ParseStructDeclaration(DS, FieldDeclarators);
-    
-  if (Tok.is(tok::semi)) 
-    ConsumeToken();
-  else {
-    Diag(Tok, diag::err_expected_semi_decl_list);
-    SkipUntil(tok::r_brace, true, true);
-  }
-  return Actions.ActOnAddObjCProperties(CurScope, AtLoc, &FieldDeclarators[0],
-                                        FieldDeclarators.size(), OCDS);
-}
-
 ///   objc-method-proto:
 ///     objc-instance-method objc-method-decl objc-method-attributes[opt] 
 ///     objc-class-method objc-method-decl objc-method-attributes[opt]
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 7b30573..50842f7 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -655,10 +655,8 @@
                       DeclTy **allMethods = 0, unsigned allNum = 0,
                       DeclTy **allProperties = 0, unsigned pNum = 0);
   
-  virtual DeclTy *ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc, 
-                                         FieldDeclarator *allProperties,
-                                         unsigned NumProperties,
-                                         ObjCDeclSpec &ODS);  
+  virtual DeclTy *ActOnProperty(Scope *S, SourceLocation AtLoc,
+                                FieldDeclarator &FD, ObjCDeclSpec &ODS);  
   virtual DeclTy *ActOnMethodDeclaration(
     SourceLocation BeginLoc, // location of the + or -.
     SourceLocation EndLoc,   // location of the ; or {.
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index 7eb132e..bf9af85 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -886,13 +886,12 @@
   return ObjCMethod;
 }
 
-Sema::DeclTy *Sema::ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc, 
-                                           FieldDeclarator *propertyDeclarators,
-                                           unsigned NumPropertyDeclarators, 
-                                           ObjCDeclSpec &ODS) {
-  FieldDeclarator &FD = propertyDeclarators[0];
+Sema::DeclTy *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc, 
+                                  FieldDeclarator &FD,
+                                  ObjCDeclSpec &ODS) {
   QualType T = GetTypeForDeclarator(FD.D, S);
-  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc, T);
+  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc, 
+                                                     FD.D.getIdentifier(), T);
   
   if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readonly)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
@@ -922,16 +921,6 @@
   if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nonatomic)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
   
-  if (NumPropertyDeclarators != 0) {
-    NamedDecl **propertyName = new NamedDecl*[NumPropertyDeclarators];
-    PDecl->setPropertyDecls(propertyName);
-    PDecl->setNumPropertyDecls(NumPropertyDeclarators);
-    for (unsigned i = 0; i < NumPropertyDeclarators; i++) {
-      Declarator &D = propertyDeclarators[i].D;
-      propertyName[i] = new NamedDecl(Decl::ObjCProperty, 
-                                      D.getIdentifierLoc(), D.getIdentifier());
-    }
-  }
   return PDecl;
 }
 
