diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 5987651..101b2e5 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -1242,9 +1242,13 @@
   case Decl::ObjCClass:
   case Decl::ObjCForwardProtocol:
   case Decl::ObjCCategory:
-  case Decl::ObjCInterface:
     break;
-      
+  case Decl::ObjCInterface:
+    // If we already laid out this interface due to an @class, and if we
+    // codegen'd a reference it, update the 'opaque' type to be a real type now.
+    Types.UpdateCompletedType(cast<ObjCInterfaceDecl>(D));
+    break;
+
   case Decl::ObjCProtocol:
     Runtime->GenerateProtocol(cast<ObjCProtocolDecl>(D));
     break;
@@ -1252,7 +1256,6 @@
   case Decl::ObjCCategoryImpl:
     // Categories have properties but don't support synthesize so we
     // can ignore them here.
-
     Runtime->GenerateCategory(cast<ObjCCategoryImplDecl>(D));
     break;
 
diff --git a/lib/CodeGen/CodeGenTypes.cpp b/lib/CodeGen/CodeGenTypes.cpp
index ff4b80f..e13a4bc 100644
--- a/lib/CodeGen/CodeGenTypes.cpp
+++ b/lib/CodeGen/CodeGenTypes.cpp
@@ -197,6 +197,40 @@
   }
 }
 
+void CodeGenTypes::UpdateCompletedType(const ObjCInterfaceDecl *OID) {
+  // Check to see if we have already laid this type out, if not, just return.
+  QualType OIDTy = 
+    Context.getObjCInterfaceType(const_cast<ObjCInterfaceDecl*>(OID));
+  llvm::DenseMap<Type *, llvm::PATypeHolder>::iterator TCI =
+    TypeCache.find(OIDTy.getTypePtr());
+  if (TCI == TypeCache.end()) return;
+
+  // Remember the opaque LLVM type for this interface.
+  llvm::PATypeHolder OpaqueHolder = TCI->second;
+  assert(isa<llvm::OpaqueType>(OpaqueHolder.get()) &&
+         "Updating compilation of an already non-opaque type?");
+  
+  // Remove it from TagDeclTypes so that it will be regenerated.
+  TypeCache.erase(TCI);
+
+  // Update the "shadow" struct that is laid out.
+  // FIXME: REMOVE THIS.
+  const RecordDecl *RD = Context.addRecordToClass(OID);
+  UpdateCompletedType(RD);
+  
+  // Generate the new type.
+  const llvm::Type *NT = ConvertType(OIDTy);
+  assert(!isa<llvm::OpaqueType>(NT) && "Didn't do layout!");
+
+  // FIXME: Remove this check when shadow structs go away.
+  if (isa<llvm::OpaqueType>(OpaqueHolder)) {
+  
+  // Refine the old opaque type to its new definition.
+  cast<llvm::OpaqueType>(OpaqueHolder.get())->refineAbstractTypeTo(NT);
+  }
+}
+
+
 static const llvm::Type* getTypeForFormat(const llvm::fltSemantics &format) {
   if (&format == &llvm::APFloat::IEEEsingle)
     return llvm::Type::FloatTy;
diff --git a/lib/CodeGen/CodeGenTypes.h b/lib/CodeGen/CodeGenTypes.h
index b408ff6..813ff8b 100644
--- a/lib/CodeGen/CodeGenTypes.h
+++ b/lib/CodeGen/CodeGenTypes.h
@@ -161,6 +161,8 @@
   /// UpdateCompletedType - When we find the full definition for a TagDecl,
   /// replace the 'opaque' type we previously made for it if applicable.
   void UpdateCompletedType(const TagDecl *TD);
+  /// Likewise for an ObjC Interface.
+  void UpdateCompletedType(const ObjCInterfaceDecl *OID);
 
   /// getFunctionInfo - Get the CGFunctionInfo for this function signature.
   const CGFunctionInfo &getFunctionInfo(QualType RetTy, 
