diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index 6a8fe3c..7270884 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -61,7 +61,7 @@
     isSuperMessage = true;
     Receiver = LoadObjCSelf();
   } else {
-   Receiver = EmitScalarExpr(E->getReceiver());
+    Receiver = EmitScalarExpr(E->getReceiver());
   }
 
   // Process the arguments
@@ -91,12 +91,11 @@
     const char *SuperClass =
       OMD->getClassInterface()->getSuperClass()->getName();
     return Runtime.GenerateMessageSendSuper(Builder, ConvertType(E->getType()),
-                                             Receiver, SuperClass,
+                                             SuperClass,
                                              Receiver, E->getSelector(),
                                              &Args[0], Args.size());
   }
   return Runtime.GenerateMessageSend(Builder, ConvertType(E->getType()),
-                                      LoadObjCSelf(),
                                       Receiver, E->getSelector(),
                                       &Args[0], Args.size());
 }
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index ab896cc..54aca0c 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -93,14 +93,12 @@
   virtual llvm::Constant *GenerateConstantString(const std::string &String);
   virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<> &Builder,
                                            const llvm::Type *ReturnTy,
-                                           llvm::Value *Sender,
                                            llvm::Value *Receiver,
                                            Selector Sel,
                                            llvm::Value** ArgV,
                                            unsigned ArgC);
   virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
                                                 const llvm::Type *ReturnTy,
-                                                llvm::Value *Sender,
                                                 const char *SuperClassName,
                                                 llvm::Value *Receiver,
                                                 Selector Sel,
@@ -265,7 +263,6 @@
 ///should be called.
 llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
                                                  const llvm::Type *ReturnTy,
-                                                 llvm::Value *Sender,
                                                  const char *SuperClassName,
                                                  llvm::Value *Receiver,
                                                  Selector Sel,
@@ -312,7 +309,6 @@
 /// Generate code for a message send expression.  
 llvm::Value *CGObjCGNU::GenerateMessageSend(llvm::IRBuilder<> &Builder,
                                             const llvm::Type *ReturnTy,
-                                            llvm::Value *Sender,
                                             llvm::Value *Receiver,
                                             Selector Sel,
                                             llvm::Value** ArgV,
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index f7fe257..85f9860 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -38,10 +38,10 @@
 public:
   const llvm::Type *LongTy;
 
-  /// ObjectTy - Opaque type for Objective-C objects
-  const llvm::Type *ObjectTy, *ObjectPtrTy;
-  /// SelectorTy - Opaque type for Objective-C selectors
-  const llvm::Type *SelectorTy, *SelectorPtrTy;
+  /// ObjectPtrTy - LLVM type for object handles (typeof(id))
+  const llvm::Type *ObjectPtrTy;
+  /// SelectorTy - LLVM type for selector handles (typeof(SEL))
+  const llvm::Type *SelectorPtrTy;
 
 public:
   ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
@@ -91,7 +91,6 @@
 
   virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<> &Builder,
                                            const llvm::Type *ReturnTy,
-                                           llvm::Value *Sender,
                                            llvm::Value *Receiver,
                                            Selector Sel,
                                            llvm::Value** ArgV,
@@ -99,7 +98,6 @@
 
   virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
                                                 const llvm::Type *ReturnTy,
-                                                llvm::Value *Sender,
                                                 const char *SuperClassName,
                                                 llvm::Value *Receiver,
                                                 Selector Sel,
@@ -247,7 +245,6 @@
 /// which class's method should be called.
 llvm::Value *CGObjCMac::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
                                                  const llvm::Type *ReturnTy,
-                                                 llvm::Value *Sender,
                                                  const char *SuperClassName,
                                                  llvm::Value *Receiver,
                                                  Selector Sel,
@@ -260,24 +257,18 @@
 /// Generate code for a message send expression.  
 llvm::Value *CGObjCMac::GenerateMessageSend(llvm::IRBuilder<> &Builder,
                                             const llvm::Type *ReturnTy,
-                                            llvm::Value *Sender,
                                             llvm::Value *Receiver,
                                             Selector Sel,
                                             llvm::Value** ArgV,
-                                            unsigned ArgC) {  
-  if (!Sender) {
-    llvm::Function *F = ObjCTypes.getMessageSendFn();
-    llvm::Value **Args = new llvm::Value*[ArgC+2];
-    Args[0] = Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy, "tmp");
-    Args[1] = EmitSelector(Builder, Sel);
-    std::copy(ArgV, ArgV+ArgC, Args+2);
-    llvm::CallInst *CI = Builder.CreateCall(F, Args, Args+ArgC+2, "tmp");
-    delete[] Args;
-    return Builder.CreateBitCast(CI, ReturnTy, "tmp");
-  } else {
-    assert(0 && "cannot generate message sends with sender");
-    return 0;
-  }
+                                            unsigned ArgC) {
+  llvm::Function *F = ObjCTypes.getMessageSendFn();
+  llvm::Value **Args = new llvm::Value*[ArgC+2];
+  Args[0] = Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy, "tmp");
+  Args[1] = EmitSelector(Builder, Sel);
+  std::copy(ArgV, ArgV+ArgC, Args+2);
+  llvm::CallInst *CI = Builder.CreateCall(F, Args, Args+ArgC+2, "tmp");
+  delete[] Args;
+  return Builder.CreateBitCast(CI, ReturnTy, "tmp");
 }
 
 llvm::Value *CGObjCMac::GenerateProtocolRef(llvm::IRBuilder<> &Builder, 
@@ -453,14 +444,9 @@
     CFConstantStringClassReference(0),
     MessageSendFn(0),
     LongTy(CGM.getTypes().ConvertType(CGM.getContext().LongTy)),
-    // FIXME: We want the types from the front-end.
-    ObjectTy(llvm::OpaqueType::get()),
-    ObjectPtrTy(llvm::PointerType::getUnqual(ObjectTy)),
-    SelectorTy(llvm::OpaqueType::get()),
-    SelectorPtrTy(llvm::PointerType::getUnqual(SelectorTy))
+    ObjectPtrTy(CGM.getTypes().ConvertType(CGM.getContext().getObjCIdType())),
+    SelectorPtrTy(CGM.getTypes().ConvertType(CGM.getContext().getObjCSelType()))
 {
-  CGM.getModule().addTypeName("struct.__objc_object", ObjectTy);
-  CGM.getModule().addTypeName("struct.__objc_selector", SelectorTy);
 }
 
 ObjCTypesHelper::~ObjCTypesHelper() {
diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h
index d4f7bb0..07301b5 100644
--- a/lib/CodeGen/CGObjCRuntime.h
+++ b/lib/CodeGen/CGObjCRuntime.h
@@ -47,11 +47,6 @@
   /// Generate an Objective-C message send operation
   virtual llvm::Value *GenerateMessageSend(BuilderType &Builder,
                                            const llvm::Type *ReturnTy,
-                                           // FIXME: This should be
-                                           // dropped, it is unused
-                                           // and generates a spurious
-                                           // load.
-                                           llvm::Value *Sender,
                                            llvm::Value *Receiver,
                                            Selector Sel,
                                            llvm::Value** ArgV,
@@ -87,12 +82,6 @@
              const llvm::SmallVectorImpl<std::string> &Protocols) =0;
   virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<true> &Builder,
                                                 const llvm::Type *ReturnTy,
-                                                // FIXME: This should
-                                                // be dropped, it is
-                                                // unused and
-                                                // generates a
-                                                // spurious load.
-                                                llvm::Value *Sender,
                                                 const char *SuperClassName,
                                                 llvm::Value *Receiver,
                                                 Selector Sel,
