diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index 2a1044c..606e852 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -38,6 +38,8 @@
                   unsigned &Idx)
       : Reader(Reader), Record(Record), Idx(Idx) { }
 
+    CXXBaseSpecifier *ReadCXXBaseSpecifier();
+
     void VisitDecl(Decl *D);
     void VisitTranslationUnitDecl(TranslationUnitDecl *TU);
     void VisitNamedDecl(NamedDecl *ND);
@@ -550,9 +552,38 @@
   D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
 }
 
+CXXBaseSpecifier *PCHDeclReader::ReadCXXBaseSpecifier() {
+  bool isVirtual = static_cast<bool>(Record[Idx++]);
+  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
+  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
+  QualType T = Reader.GetType(Record[Idx++]);
+  SourceRange Range = Reader.ReadSourceRange(Record, Idx);
+  return new (*Reader.getContext())
+    CXXBaseSpecifier(Range, isVirtual, isBaseOfClass, AS, T);
+}
+
 void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
   // assert(false && "cannot read CXXRecordDecl");
   VisitRecordDecl(D);
+
+  // FIXME: this is far from complete
+
+  if (D->isDefinition()) {
+    D->setDefinition(false); // make peace with an assertion
+    D->startDefinition();
+
+    unsigned NumBases = Record[Idx++];
+
+    llvm::SmallVector<CXXBaseSpecifier*, 4> Bases;
+    Bases.reserve(NumBases);
+    for (unsigned I = 0; I != NumBases; ++I)
+      Bases.push_back(ReadCXXBaseSpecifier());
+    D->setBases(Bases.begin(), NumBases);
+
+    // FIXME: there's a lot of stuff we do here that's kindof sketchy
+    // if we're leaving the context incomplete.
+    D->completeDefinition();
+  }
 }
 
 void PCHDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) {
diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp
index 42756c3..d0a01f0 100644
--- a/lib/Frontend/PCHWriterDecl.cpp
+++ b/lib/Frontend/PCHWriterDecl.cpp
@@ -105,6 +105,8 @@
     void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
     void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
     void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
+
+    void WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base);
   };
 }
 
@@ -559,9 +561,24 @@
   Code = pch::DECL_UNRESOLVED_USING_TYPENAME;
 }
 
+void PCHDeclWriter::WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base) {
+  Record.push_back(Base->isVirtual());
+  Record.push_back(Base->isBaseOfClass());
+  Record.push_back(Base->getAccessSpecifierAsWritten());
+  Writer.AddTypeRef(Base->getType(), Record);
+  Writer.AddSourceRange(Base->getSourceRange(), Record);
+}
+
 void PCHDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
   // assert(false && "cannot write CXXRecordDecl");
   VisitRecordDecl(D);
+  if (D->isDefinition()) {
+    unsigned NumBases = D->getNumBases();
+    Record.push_back(NumBases);
+    for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
+           E = D->bases_end(); I != E; ++I)
+      WriteCXXBaseSpecifier(&*I);
+  }
   Code = pch::DECL_CXX_RECORD;
 }
 
