diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp
index 6f31e7a..e4ac6b9 100644
--- a/lib/Analysis/BasicStore.cpp
+++ b/lib/Analysis/BasicStore.cpp
@@ -79,7 +79,8 @@
                                 const CompoundLiteralExpr* CL);
   SVal getLValueIvar(const GRState* St, const ObjCIvarDecl* D, SVal Base);
   SVal getLValueField(const GRState* St, SVal Base, const FieldDecl* D);  
-  SVal getLValueElement(const GRState* St, SVal Base, SVal Offset);
+  SVal getLValueElement(const GRState* St, QualType elementType,
+                        SVal Base, SVal Offset);
 
   /// ArrayToPointer - Used by GRExprEngine::VistCast to handle implicit
   ///  conversions between arrays and pointers.
@@ -193,8 +194,9 @@
   return Loc::MakeVal(MRMgr.getFieldRegion(D, BaseR));
 }
 
-SVal BasicStoreManager::getLValueElement(const GRState* St, SVal Base,
-                                         SVal Offset) {
+SVal BasicStoreManager::getLValueElement(const GRState* St,
+                                         QualType elementType,
+                                         SVal Base, SVal Offset) {
 
   if (Base.isUnknownOrUndef())
     return Base;
@@ -246,7 +248,8 @@
   }
   
   if (BaseR)  
-    return Loc::MakeVal(MRMgr.getElementRegion(UnknownVal(), BaseR));
+    return Loc::MakeVal(MRMgr.getElementRegion(elementType, UnknownVal(),
+                                               BaseR));
   else
     return UnknownVal();
 }
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index 096ccdd..0fabd35 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -1011,7 +1011,8 @@
       
     for (NodeSet::iterator I2=Tmp2.begin(), E2=Tmp2.end(); I2!=E2; ++I2) {
       const GRState* state = GetState(*I2);
-      SVal V = StateMgr.GetLValue(state, GetSVal(state, Base),
+      SVal V = StateMgr.GetLValue(state, A->getType(),
+                                  GetSVal(state, Base),
                                   GetSVal(state, Idx));
 
       if (asLValue)
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index 81855ba..78cd814 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -96,15 +96,17 @@
   SymbolicRegion::ProfileRegion(ID, sym);
 }
 
-void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx, 
+void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
+                                  QualType ElementType, SVal Idx, 
                                   const MemRegion* superRegion) {
   ID.AddInteger(MemRegion::ElementRegionKind);
+  ID.Add(ElementType);
   ID.AddPointer(superRegion);
   Idx.Profile(ID);
 }
 
 void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
-  ElementRegion::ProfileRegion(ID, Index, superRegion);
+  ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
 }
 
 void CodeTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const void* data,
@@ -122,18 +124,6 @@
 // getLValueType() and getRValueType()
 //===----------------------------------------------------------------------===//
 
-QualType ElementRegion::getRValueType(ASTContext& C) const {
-  // Strip off typedefs from the ArrayRegion's RvalueType.
-  QualType T = getArrayRegion()->getRValueType(C)->getDesugaredType();
-
-  if (ArrayType* AT = dyn_cast<ArrayType>(T.getTypePtr()))
-    return AT->getElementType();
-
-  // If the RValueType of the array region isn't an ArrayType, then essentially
-  // the element's  
-  return T;
-}
-
 QualType StringRegion::getRValueType(ASTContext& C) const {
   return Str->getType();
 }
@@ -313,10 +303,11 @@
 }
 
 ElementRegion*
-MemRegionManager::getElementRegion(SVal Idx, const TypedRegion* superRegion){
+MemRegionManager::getElementRegion(QualType elementType, SVal Idx,
+                                   const TypedRegion* superRegion){
 
   llvm::FoldingSetNodeID ID;
-  ElementRegion::ProfileRegion(ID, Idx, superRegion);
+  ElementRegion::ProfileRegion(ID, elementType, Idx, superRegion);
 
   void* InsertPos;
   MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
@@ -324,7 +315,7 @@
 
   if (!R) {
     R = (ElementRegion*) A.Allocate<ElementRegion>();
-    new (R) ElementRegion(Idx, superRegion);
+    new (R) ElementRegion(elementType, Idx, superRegion);
     Regions.InsertNode(R, InsertPos);
   }
 
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp
index 8f573c3..700174a 100644
--- a/lib/Analysis/RegionStore.cpp
+++ b/lib/Analysis/RegionStore.cpp
@@ -186,7 +186,8 @@
   
   SVal getLValueFieldOrIvar(const GRState* St, SVal Base, const Decl* D);
 
-  SVal getLValueElement(const GRState* St, SVal Base, SVal Offset);
+  SVal getLValueElement(const GRState* St, QualType elementType,
+                        SVal Base, SVal Offset);
 
   SVal getSizeInElements(const GRState* St, const MemRegion* R);
 
@@ -383,7 +384,8 @@
   return loc::MemRegionVal(MRMgr.getFieldRegion(cast<FieldDecl>(D), BaseR));
 }
 
-SVal RegionStoreManager::getLValueElement(const GRState* St, 
+SVal RegionStoreManager::getLValueElement(const GRState* St,
+                                          QualType elementType,
                                           SVal Base, SVal Offset) {
 
   // If the base is an unknown or undefined value, just return it back.
@@ -430,7 +432,8 @@
         Offset = NonLoc::MakeVal(getBasicVals(), Tmp);
       }
     }
-    return loc::MemRegionVal(MRMgr.getElementRegion(Offset, BaseRegion));
+    return loc::MemRegionVal(MRMgr.getElementRegion(elementType, Offset,
+                                                    BaseRegion));
   }
   
   SVal BaseIdx = ElemR->getIndex();
@@ -447,7 +450,7 @@
   // can't we need to put a comment here.  If it can, we should handle it.
   assert(BaseIdxI.getBitWidth() >= OffI.getBitWidth());
 
-  const TypedRegion *ArrayR = ElemR->getArrayRegion();
+  const TypedRegion *ArrayR = cast<TypedRegion>(ElemR->getSuperRegion());
   SVal NewIdx;
   
   if (OffI.isUnsigned() || OffI.getBitWidth() < BaseIdxI.getBitWidth()) {
@@ -465,7 +468,7 @@
   else
     NewIdx = nonloc::ConcreteInt(getBasicVals().getValue(BaseIdxI + OffI));
 
-  return loc::MemRegionVal(MRMgr.getElementRegion(NewIdx, ArrayR));
+  return loc::MemRegionVal(MRMgr.getElementRegion(elementType, NewIdx, ArrayR));
 }
 
 SVal RegionStoreManager::getSizeInElements(const GRState* St,
@@ -568,8 +571,13 @@
   if (!ArrayR)
     return UnknownVal();
   
+  // Strip off typedefs from the ArrayRegion's RvalueType.
+  QualType T = ArrayR->getRValueType(getContext())->getDesugaredType();
+  ArrayType *AT = cast<ArrayType>(T);
+  T = AT->getElementType();
+  
   nonloc::ConcreteInt Idx(getBasicVals().getZeroWithPtrWidth(false));
-  ElementRegion* ER = MRMgr.getElementRegion(Idx, ArrayR);
+  ElementRegion* ER = MRMgr.getElementRegion(T, Idx, ArrayR);
   
   return loc::MemRegionVal(ER);                    
 }
@@ -584,7 +592,6 @@
     return UnknownVal();
 
   const TypedRegion* TR = cast<TypedRegion>(MR);
-
   const ElementRegion* ER = dyn_cast<ElementRegion>(TR);
   
   if (!ER) {
@@ -594,7 +601,7 @@
     // p += 3;
     // Note that p binds to a TypedViewRegion(SymbolicRegion).
     nonloc::ConcreteInt Idx(getBasicVals().getZeroWithPtrWidth(false));
-    ER = MRMgr.getElementRegion(Idx, TR);
+    ER = MRMgr.getElementRegion(TR->getRValueType(getContext()), Idx, TR);
   }
 
   SVal Idx = ER->getIndex();
@@ -613,8 +620,9 @@
     nonloc::ConcreteInt OffConverted(getBasicVals().Convert(Base->getValue(),
                                                            Offset->getValue()));
     SVal NewIdx = Base->EvalBinOp(getBasicVals(), Op, OffConverted);
-    const MemRegion* NewER = MRMgr.getElementRegion(NewIdx, 
-                                                    ER->getArrayRegion());
+    const MemRegion* NewER =
+      MRMgr.getElementRegion(ER->getElementType(), NewIdx, 
+                             cast<TypedRegion>(ER->getSuperRegion()));
     return Loc::MakeVal(NewER);
 
   }
@@ -769,15 +777,15 @@
   ConstantArrayType* CAT = cast<ConstantArrayType>(T.getTypePtr());
 
   llvm::ImmutableList<SVal> ArrayVal = getBasicVals().getEmptySValList();
-
   llvm::APSInt Size(CAT->getSize(), false);
   llvm::APSInt i = getBasicVals().getValue(0, Size.getBitWidth(), 
 					   Size.isUnsigned());
 
   for (; i < Size; ++i) {
     SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
-    ElementRegion* ER = MRMgr.getElementRegion(Idx, R);
-    QualType ETy = ER->getRValueType(getContext());
+    ElementRegion* ER = MRMgr.getElementRegion(R->getRValueType(getContext()),
+                                               Idx, R);
+    QualType ETy = ER->getElementType();
     SVal ElementVal = Retrieve(St, loc::MemRegionVal(ER), ETy);
     ArrayVal = getBasicVals().consVals(ElementVal, ArrayVal);
   }
@@ -1059,7 +1067,9 @@
         break;
 
       SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
-      ElementRegion* ER = MRMgr.getElementRegion(Idx, R);
+      ElementRegion* ER =
+        MRMgr.getElementRegion(cast<ArrayType>(T)->getElementType(),
+                               Idx, R);
 
       SVal V = NonLoc::MakeVal(getBasicVals(), str[j], sizeof(char)*8, true);
       St = Bind(St, loc::MemRegionVal(ER), V);
@@ -1068,9 +1078,7 @@
     return St;
   }
 
-
   nonloc::CompoundVal& CV = cast<nonloc::CompoundVal>(Init);
-
   nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
 
   for (; i < Size; ++i, ++VI) {
@@ -1079,7 +1087,9 @@
       break;
 
     SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
-    ElementRegion* ER = MRMgr.getElementRegion(Idx, R);
+    ElementRegion* ER =
+      MRMgr.getElementRegion(cast<ArrayType>(T)->getElementType(),
+                             Idx, R);
 
     if (CAT->getElementType()->isStructureType())
       St = BindStruct(St, ER, *VI);
