diff --git a/AST/DeclSerialization.cpp b/AST/DeclSerialization.cpp
index 3a326f0..c07edb4 100644
--- a/AST/DeclSerialization.cpp
+++ b/AST/DeclSerialization.cpp
@@ -26,3 +26,120 @@
   assert ("FIXME: not implemented.");
   return NULL;
 }
+
+void NamedDecl::InternalEmit(llvm::Serializer& S) const {
+  S.EmitPtr(Identifier);
+}
+
+void NamedDecl::InternalRead(llvm::Deserializer& D) {
+  D.ReadPtr(Identifier);
+}
+
+void ScopedDecl::InternalEmit(llvm::Serializer& S) const {
+  NamedDecl::InternalEmit(S);
+  S.EmitPtr(Next);
+  S.EmitOwnedPtr<Decl>(NextDeclarator);  
+}
+
+void ScopedDecl::InternalRead(llvm::Deserializer& D) {
+  NamedDecl::InternalRead(D);
+  D.ReadPtr(Next);
+  NextDeclarator = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
+}
+
+void ValueDecl::InternalEmit(llvm::Serializer& S) const {
+  S.Emit(DeclType);
+  ScopedDecl::InternalEmit(S);
+}
+
+void ValueDecl::InternalRead(llvm::Deserializer& D) {
+  D.Read(DeclType);
+  ScopedDecl::InternalRead(D);
+}
+
+void VarDecl::InternalEmit(llvm::Serializer& S) const {
+  S.EmitInt(SClass);
+  S.EmitInt(objcDeclQualifier);
+  VarDecl::InternalEmit(S);
+  S.EmitOwnedPtr(Init);
+}
+
+void VarDecl::InternalRead(llvm::Deserializer& D) {
+  SClass = D.ReadInt();
+  objcDeclQualifier = static_cast<ObjcDeclQualifier>(D.ReadInt());
+  VarDecl::InternalRead(D);
+  D.ReadOwnedPtr(Init);
+}
+
+
+void BlockVarDecl::Emit(llvm::Serializer& S) const {
+  S.Emit(getLocation());  
+  VarDecl::InternalEmit(S);  
+}
+
+BlockVarDecl* BlockVarDecl::Materialize(llvm::Deserializer& D) {
+  SourceLocation L = SourceLocation::ReadVal(D);
+  BlockVarDecl* decl = new BlockVarDecl(L,NULL,QualType(),None,NULL);
+  decl->VarDecl::InternalRead(D);
+  return decl;
+}
+
+void FileVarDecl::Emit(llvm::Serializer& S) const {
+  S.Emit(getLocation());  
+  VarDecl::InternalEmit(S);  
+}
+
+FileVarDecl* FileVarDecl::Materialize(llvm::Deserializer& D) {
+  SourceLocation L = SourceLocation::ReadVal(D);
+  FileVarDecl* decl = new FileVarDecl(L,NULL,QualType(),None,NULL);
+  decl->VarDecl::InternalRead(D);
+  return decl;
+}
+
+void ParmVarDecl::Emit(llvm::Serializer& S) const {
+  S.Emit(getLocation());  
+  VarDecl::InternalEmit(S);  
+}
+
+ParmVarDecl* ParmVarDecl::Materialize(llvm::Deserializer& D) {
+  SourceLocation L = SourceLocation::ReadVal(D);
+  ParmVarDecl* decl = new ParmVarDecl(L,NULL,QualType(),None,NULL);
+  decl->VarDecl::InternalRead(D);
+  return decl;
+}
+
+void FunctionDecl::Emit(llvm::Serializer& S) const {
+  S.Emit(getLocation());
+  S.EmitInt(SClass);
+  S.EmitBool(IsInline);
+  
+  ValueDecl::InternalEmit(S);
+
+  unsigned NumParams = getNumParams();
+  S.EmitInt(NumParams);
+  
+  for (unsigned i = 0 ; i < NumParams; ++i)
+    S.EmitOwnedPtr(ParamInfo[i]);
+  
+  S.EmitOwnedPtr(Body);
+}
+
+FunctionDecl* FunctionDecl::Materialize(llvm::Deserializer& D) {
+  SourceLocation L = SourceLocation::ReadVal(D);
+  StorageClass SClass = static_cast<StorageClass>(D.ReadInt());
+  bool IsInline = D.ReadBool();
+
+  FunctionDecl* decl = new FunctionDecl(L,NULL,QualType(),SClass,IsInline);
+  
+  decl->ValueDecl::InternalRead(D);
+
+  unsigned NumParams = D.ReadInt();
+  decl->ParamInfo = NumParams ? new ParmVarDecl*[NumParams] : NULL;
+  
+  for (unsigned i = 0 ; i < NumParams; ++i)
+    D.ReadOwnedPtr(decl->ParamInfo[i]);
+
+  D.ReadOwnedPtr(decl->Body);
+  
+  return decl;
+}
