diff --git a/clang/AST/SemaDecl.cpp b/clang/AST/SemaDecl.cpp
index 7f1d302..39d90b6 100644
--- a/clang/AST/SemaDecl.cpp
+++ b/clang/AST/SemaDecl.cpp
@@ -25,25 +25,48 @@
   return D != 0 && D->getDeclSpec().StorageClassSpec == DeclSpec::SCS_typedef;
 }
 
+void Sema::PopScope(SourceLocation Loc, Scope *S) {
+  for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();
+       I != E; ++I) {
+    IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I);
+    Decl *D = II.getFETokenInfo<Decl>();
+    assert(D && "This decl didn't get pushed??");
+    
+    Decl *Next = D->getNext();
+    
+    // FIXME: Push the decl on the parent function list if in a function.
+    // FIXME: Don't delete the decl when it gets popped!
+    delete D;
+    
+    II.setFETokenInfo(Next);
+  }
+}
+
 Action::DeclTy *
 Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
                       DeclTy *LastInGroup) {
   TypeRef DeclaratorType = GetTypeForDeclarator(D, S);
   
-  // FIXME: Temporary.
-  if (!DeclaratorType.isNull())
-    DeclaratorType.dump();
-    
-  
   IdentifierInfo *II = D.getIdentifier();
-  Decl *PrevDecl = II ? II->getFETokenInfo<Decl>() : 0;
+  Decl *PrevDecl = 0;
+  
+  if (II) {
+    PrevDecl = II->getFETokenInfo<Decl>();
+    
+    // TODO: CHECK FOR CONFLICTS, multiple decls with same name in one scope.
+  }
   
   Decl *New;
-  if (D.isFunctionDeclarator())
+  if (D.getDeclSpec().StorageClassSpec == DeclSpec::SCS_typedef) {
+    New = ParseTypedefDecl(S, D, PrevDecl);
+  } else if (D.isFunctionDeclarator())
     New = new FunctionDecl(II, D, PrevDecl);
   else
     New = new VarDecl(II, D, PrevDecl);
   
+  if (!New) return 0;
+  
+  
   // If this has an identifier, add it to the scope stack.
   if (II) {
     // If PrevDecl includes conflicting name here, emit a diagnostic.
@@ -68,19 +91,10 @@
   return FD;
 }
 
-void Sema::PopScope(SourceLocation Loc, Scope *S) {
-  for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();
-       I != E; ++I) {
-    IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I);
-    Decl *D = II.getFETokenInfo<Decl>();
-    assert(D && "This decl didn't get pushed??");
-    
-    Decl *Next = D->getNext();
-    
-    // FIXME: Push the decl on the parent function list if in a function.
-    delete D;
-    
-    II.setFETokenInfo(Next);
-  }
+
+Decl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, Decl *PrevDecl) {
+  assert(D.getIdentifier());
+  
+  return new TypedefDecl(D.getIdentifier(), D, PrevDecl);
 }
 
