diff --git a/include/clang/Analysis/PathSensitive/GRState.h b/include/clang/Analysis/PathSensitive/GRState.h
index 265d028..5d91b2f 100644
--- a/include/clang/Analysis/PathSensitive/GRState.h
+++ b/include/clang/Analysis/PathSensitive/GRState.h
@@ -327,8 +327,8 @@
 
   typedef StoreManager::DeadSymbolsTy DeadSymbolsTy;
 
-  const GRState* AddDecl(const GRState* St, const VarDecl* VD, Expr* Ex, 
-                         unsigned Count);
+  const GRState* BindDecl(const GRState* St, const VarDecl* VD, Expr* Ex, 
+                          unsigned Count);
   
   /// BindCompoundLiteral - Return the state that has the bindings currently
   ///  in 'state' plus the bindings for the CompoundLiteral.  'R' is the region
diff --git a/include/clang/Analysis/PathSensitive/Store.h b/include/clang/Analysis/PathSensitive/Store.h
index 41464c1..4c08fe6 100644
--- a/include/clang/Analysis/PathSensitive/Store.h
+++ b/include/clang/Analysis/PathSensitive/Store.h
@@ -87,10 +87,10 @@
                      llvm::SmallVectorImpl<const MemRegion*>& RegionRoots,
                      LiveSymbolsTy& LSymbols, DeadSymbolsTy& DSymbols) = 0;
 
-  virtual Store AddDecl(Store store,
-                        const VarDecl* VD, Expr* Ex, 
-                        SVal InitVal = UndefinedVal(), 
-                        unsigned Count = 0) = 0;
+  virtual Store BindDecl(Store store,
+                         const VarDecl* VD, Expr* Ex, 
+                         SVal InitVal = UndefinedVal(), 
+                         unsigned Count = 0) = 0;
 
   virtual void print(Store store, std::ostream& Out,
                      const char* nl, const char *sep) = 0;
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp
index 05c8523..de5ff30 100644
--- a/lib/Analysis/BasicStore.cpp
+++ b/lib/Analysis/BasicStore.cpp
@@ -74,8 +74,8 @@
 
   void iterBindings(Store store, BindingsHandler& f);
 
-  Store AddDecl(Store store, const VarDecl* VD, Expr* Ex,
-                SVal InitVal = UndefinedVal(), unsigned Count = 0);
+  Store BindDecl(Store store, const VarDecl* VD, Expr* Ex,
+                 SVal InitVal = UndefinedVal(), unsigned Count = 0);
 
   static inline VarBindingsTy GetVarBindings(Store store) {
     return VarBindingsTy(static_cast<const VarBindingsTy::TreeTy*>(store));
@@ -351,10 +351,8 @@
   return St;
 }
 
-Store BasicStoreManager::AddDecl(Store store,
-                                 const VarDecl* VD, Expr* Ex,
-                                 SVal InitVal, unsigned Count) {
-  
+Store BasicStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex,
+                                  SVal InitVal, unsigned Count) {
   BasicValueFactory& BasicVals = StateMgr.getBasicVals();
   SymbolManager& SymMgr = StateMgr.getSymbolManager();
   
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index bbeebd6..a930333 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -1608,7 +1608,7 @@
   
   for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
     const GRState* St = GetState(*I);
-    St = StateMgr.AddDecl(St, VD, Ex, Builder->getCurrentBlockCount());
+    St = StateMgr.BindDecl(St, VD, Ex, Builder->getCurrentBlockCount());
     MakeNode(Dst, DS, *I, St);
   }
 }
diff --git a/lib/Analysis/GRState.cpp b/lib/Analysis/GRState.cpp
index 03b7247..f598ec4 100644
--- a/lib/Analysis/GRState.cpp
+++ b/lib/Analysis/GRState.cpp
@@ -73,16 +73,15 @@
   return getPersistentState(NewSt);    
 }
 
-const GRState* GRStateManager::AddDecl(const GRState* St, const VarDecl* VD, 
-                                       Expr* Ex, unsigned Count) {
+const GRState* GRStateManager::BindDecl(const GRState* St, const VarDecl* VD, 
+                                        Expr* Ex, unsigned Count) {
   Store OldStore = St->getStore();
   Store NewStore;
 
   if (Ex)
-    NewStore = StoreMgr->AddDecl(OldStore, VD, Ex, 
-                              GetSVal(St, Ex), Count);
+    NewStore = StoreMgr->BindDecl(OldStore, VD, Ex, GetSVal(St, Ex), Count);
   else
-    NewStore = StoreMgr->AddDecl(OldStore, VD, Ex);
+    NewStore = StoreMgr->BindDecl(OldStore, VD, Ex);
                               
   if (NewStore == OldStore)
     return St;
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp
index 1c73cea..d5fb4d2 100644
--- a/lib/Analysis/RegionStore.cpp
+++ b/lib/Analysis/RegionStore.cpp
@@ -93,8 +93,8 @@
     return store;
   }
 
-  Store AddDecl(Store store, const VarDecl* VD, Expr* Ex, SVal InitVal, 
-                unsigned Count);
+  Store BindDecl(Store store, const VarDecl* VD, Expr* Ex, SVal InitVal, 
+                 unsigned Count);
 
   static inline RegionBindingsTy GetRegionBindings(Store store) {
    return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store));
@@ -292,9 +292,8 @@
   return St;
 }
 
-Store RegionStoreManager::AddDecl(Store store,
-                                  const VarDecl* VD, Expr* Ex,
-                                  SVal InitVal, unsigned Count) {
+Store RegionStoreManager::BindDecl(Store store, const VarDecl* VD, Expr* Ex,
+                                   SVal InitVal, unsigned Count) {
   BasicValueFactory& BasicVals = StateMgr.getBasicVals();
   SymbolManager& SymMgr = StateMgr.getSymbolManager();
 
