diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 502dd3b..eb9add9 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1187,6 +1187,15 @@
   return reinterpret_cast<Stmt**>(&Base)+1;
 }
 
+// ObjCIvarRefExpr
+Stmt::child_iterator ObjCPropertyRefExpr::child_begin() {
+  return reinterpret_cast<Stmt**>(&Base);
+}
+
+Stmt::child_iterator ObjCPropertyRefExpr::child_end() {
+  return reinterpret_cast<Stmt**>(&Base)+1;
+}
+
 // PreDefinedExpr
 Stmt::child_iterator PreDefinedExpr::child_begin() { return child_iterator(); }
 Stmt::child_iterator PreDefinedExpr::child_end() { return child_iterator(); }
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index b55869b..d52f48e 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -484,6 +484,14 @@
   OS << Node->getDecl()->getName();
 }
 
+void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
+  if (Node->getBase()) {
+    PrintExpr(Node->getBase());
+    OS << ".";
+  }
+  // FIXME: OS << Node->getDecl()->getName();
+}
+
 void StmtPrinter::VisitPreDefinedExpr(PreDefinedExpr *Node) {
   switch (Node->getIdentType()) {
     default:
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp
index 1e5229e..25e9514 100644
--- a/lib/AST/StmtSerialization.cpp
+++ b/lib/AST/StmtSerialization.cpp
@@ -988,6 +988,21 @@
   return dr;
 }
 
+void ObjCPropertyRefExpr::EmitImpl(Serializer& S) const {
+  S.Emit(Loc);
+  S.Emit(getType());
+  S.EmitPtr(getDecl());
+}
+  
+ObjCPropertyRefExpr* ObjCPropertyRefExpr::CreateImpl(Deserializer& D, 
+                                                     ASTContext& C) {
+  SourceLocation Loc = SourceLocation::ReadVal(D);
+  QualType T = QualType::ReadVal(D);
+  ObjCPropertyRefExpr* dr = new ObjCPropertyRefExpr(NULL,T,Loc,0);
+  D.ReadPtr(dr->D,false);  
+  return dr;
+}
+
 void ObjCMessageExpr::EmitImpl(Serializer& S) const {
   S.EmitBool(getReceiver() ? true : false);
   S.Emit(getType());
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 04561f5..7f80203 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -605,6 +605,36 @@
     if (ObjCIvarDecl *IV = IFace->lookupInstanceVariable(&Member, clsDeclared))
       return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr, 
                                  OpKind==tok::arrow);
+  } else if (isObjCObjectPointerType(BaseType)) {
+    PointerType *pointerType = static_cast<PointerType*>(BaseType.getTypePtr());
+    BaseType = pointerType->getPointeeType();
+    ObjCInterfaceDecl *IFace;
+    if (isa<ObjCInterfaceType>(BaseType.getCanonicalType()))
+      IFace = dyn_cast<ObjCInterfaceType>(BaseType)->getDecl();
+    else
+      IFace = dyn_cast<ObjCQualifiedInterfaceType>(BaseType)->getDecl();
+    ObjCInterfaceDecl *clsDeclared;
+    if (ObjCIvarDecl *IV = IFace->lookupInstanceVariable(&Member, clsDeclared))
+      return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr, 
+                                 OpKind==tok::arrow);
+    // Check for properties.
+    if (OpKind==tok::period) {
+      // Before we look for explicit property declarations, we check for
+      // nullary methods (which allow '.' notation).
+      Selector Sel = PP.getSelectorTable().getNullarySelector(&Member);
+      ObjCMethodDecl *MD = IFace->lookupInstanceMethod(Sel);
+      if (MD) 
+        return new ObjCPropertyRefExpr(MD, MD->getResultType(), 
+                                       MemberLoc, BaseExpr);
+      // FIXME: Need to deal with setter methods that take 1 argument. E.g.:
+      // @interface NSBundle : NSObject {}
+      // - (NSString *)bundlePath;
+      // - (void)setBundlePath:(NSString *)x;
+      // @end
+      // void someMethod() { frameworkBundle.bundlePath = 0; }
+      //
+      // FIXME: lookup explicit properties...
+    }
   }
   return Diag(OpLoc, diag::err_typecheck_member_reference_structUnion,
               SourceRange(MemberLoc));
