diff --git a/include/clang/Analysis/PathSensitive/Store.h b/include/clang/Analysis/PathSensitive/Store.h
index 4300954..495244d 100644
--- a/include/clang/Analysis/PathSensitive/Store.h
+++ b/include/clang/Analysis/PathSensitive/Store.h
@@ -39,14 +39,14 @@
   virtual RVal GetRVal(Store St, LVal LV, QualType T = QualType()) = 0;
   virtual Store SetRVal(Store St, LVal LV, RVal V) = 0;
   virtual Store Remove(Store St, LVal LV) = 0;
-  virtual Store getInitialStore(GRStateManager& StateMgr) = 0;
+  virtual Store getInitialStore() = 0;
   
   virtual Store
   RemoveDeadBindings(Store store, Stmt* Loc, const LiveVariables& Live,
                      llvm::SmallVectorImpl<const MemRegion*>& RegionRoots,
                      LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols) = 0;
 
-  virtual Store AddDecl(Store store, GRStateManager& StMgr,
+  virtual Store AddDecl(Store store,
                         const VarDecl* VD, Expr* Ex, 
                         RVal InitVal = UndefinedVal(), unsigned Count = 0) = 0;
 
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp
index 4616143..3be8a11 100644
--- a/lib/Analysis/BasicStore.cpp
+++ b/lib/Analysis/BasicStore.cpp
@@ -25,10 +25,10 @@
   
 class VISIBILITY_HIDDEN BasicStoreManager : public StoreManager {
   VarBindingsTy::Factory VBFactory;
-  GRStateManager& StMgr;
+  GRStateManager& StateMgr;
   
 public:
-  BasicStoreManager(GRStateManager& mgr) : StMgr(mgr) {}
+  BasicStoreManager(GRStateManager& mgr) : StateMgr(mgr) {}
   
   virtual ~BasicStoreManager() {}
 
@@ -36,7 +36,7 @@
   virtual Store SetRVal(Store St, LVal LV, RVal V);  
   virtual Store Remove(Store St, LVal LV);
 
-  virtual Store getInitialStore(GRStateManager& StateMgr);
+  virtual Store getInitialStore();
   
   virtual Store
   RemoveDeadBindings(Store store, Stmt* Loc, const LiveVariables& Live,
@@ -45,7 +45,7 @@
 
   virtual void iterBindings(Store store, BindingsHandler& f);
 
-  virtual Store AddDecl(Store store, GRStateManager& StateMgr,
+  virtual Store AddDecl(Store store,
                         const VarDecl* VD, Expr* Ex, 
                         RVal InitVal = UndefinedVal(), unsigned Count = 0);
 
@@ -164,7 +164,7 @@
   // Iterate over the variable bindings.
   for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I)
     if (Liveness.isLive(Loc, I.getKey())) {
-      RegionRoots.push_back(StMgr.getRegion(I.getKey()));      
+      RegionRoots.push_back(StateMgr.getRegion(I.getKey()));      
       RVal X = I.getData();
       
       for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
@@ -198,7 +198,7 @@
   
   // Remove dead variable bindings.  
   for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
-    const VarRegion* R = cast<VarRegion>(StMgr.getRegion(I.getKey()));
+    const VarRegion* R = cast<VarRegion>(StateMgr.getRegion(I.getKey()));
     
     if (!Marked.count(R)) {
       store = Remove(store, lval::MemRegionVal(R));
@@ -212,7 +212,7 @@
   return store;
 }
 
-Store BasicStoreManager::getInitialStore(GRStateManager& StateMgr) {
+Store BasicStoreManager::getInitialStore() {
   // The LiveVariables information already has a compilation of all VarDecls
   // used in the function.  Iterate through this set, and "symbolicate"
   // any VarDecl whose value originally comes from outside the function.
@@ -240,14 +240,14 @@
                  ? RVal::GetSymbolValue(StateMgr.getSymbolManager(), VD)
                  : UndefinedVal();
 
-        St = SetRVal(St, StMgr.getLVal(VD), X);
+        St = SetRVal(St, StateMgr.getLVal(VD), X);
       }
     }
   }
   return St;
 }
 
-Store BasicStoreManager::AddDecl(Store store, GRStateManager& StateMgr,
+Store BasicStoreManager::AddDecl(Store store,
                                  const VarDecl* VD, Expr* Ex,
                                  RVal InitVal, unsigned Count) {
   
@@ -280,16 +280,16 @@
       if (!Ex) {
         QualType T = VD->getType();
         if (LVal::IsLValType(T))
-          store = SetRVal(store, StMgr.getLVal(VD),
+          store = SetRVal(store, StateMgr.getLVal(VD),
                           lval::ConcreteInt(BasicVals.getValue(0, T)));
         else if (T->isIntegerType())
-          store = SetRVal(store, StMgr.getLVal(VD),
+          store = SetRVal(store, StateMgr.getLVal(VD),
                           nonlval::ConcreteInt(BasicVals.getValue(0, T)));
         else {
           // assert(0 && "ignore other types of variables");
         }
       } else {
-        store = SetRVal(store, StMgr.getLVal(VD), InitVal);
+        store = SetRVal(store, StateMgr.getLVal(VD), InitVal);
       }
     }
   } else {
@@ -307,7 +307,7 @@
           : cast<RVal>(nonlval::SymbolVal(Sym));
       }
 
-      store = SetRVal(store, StMgr.getLVal(VD), V);
+      store = SetRVal(store, StateMgr.getLVal(VD), V);
     }
   }
 
@@ -337,7 +337,7 @@
   
   for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) {
 
-    f.HandleBinding(*this, store, StMgr.getRegion(I.getKey()),I.getData());
+    f.HandleBinding(*this, store, StateMgr.getRegion(I.getKey()),I.getData());
   }
 }
 
diff --git a/lib/Analysis/GRState.cpp b/lib/Analysis/GRState.cpp
index 2f829e6..0b519fc 100644
--- a/lib/Analysis/GRState.cpp
+++ b/lib/Analysis/GRState.cpp
@@ -79,10 +79,10 @@
   Store NewStore;
 
   if (Ex)
-    NewStore = StMgr->AddDecl(OldStore, *this, VD, Ex, 
+    NewStore = StMgr->AddDecl(OldStore, VD, Ex, 
                               GetRVal(St, Ex), Count);
   else
-    NewStore = StMgr->AddDecl(OldStore, *this, VD, Ex);
+    NewStore = StMgr->AddDecl(OldStore, VD, Ex);
                               
   if (NewStore == OldStore)
     return St;
@@ -107,7 +107,7 @@
 const GRState* GRStateManager::getInitialState() {
 
   GRState StateImpl(EnvMgr.getInitialEnvironment(), 
-                    StMgr->getInitialStore(*this),
+                    StMgr->getInitialStore(),
                     GDMFactory.GetEmptyMap());
 
   return getPersistentState(StateImpl);
