diff --git a/lib/Analysis/Environment.cpp b/lib/Analysis/Environment.cpp
index b5e5e21..0effe3a 100644
--- a/lib/Analysis/Environment.cpp
+++ b/lib/Analysis/Environment.cpp
@@ -89,8 +89,8 @@
   }
 }
 
-Environment EnvironmentManager::SetSVal(const Environment& Env, Expr* E, SVal V,
-                                        bool isBlkExpr, bool Invalidate) {  
+Environment EnvironmentManager::BindExpr(const Environment& Env, Expr* E,SVal V,
+                                         bool isBlkExpr, bool Invalidate) {  
   assert (E);
   
   if (V.isUnknown()) {    
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index e59374b..0090075 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -303,7 +303,7 @@
       }
       else if (B->getOpcode() == BinaryOperator::Comma) {
         const GRState* St = GetState(Pred);
-        MakeNode(Dst, B, Pred, SetSVal(St, B, GetSVal(St, B->getRHS())));
+        MakeNode(Dst, B, Pred, BindExpr(St, B, GetSVal(St, B->getRHS())));
         break;
       }
       
@@ -390,7 +390,7 @@
       assert (!SE->getSubStmt()->body_empty());
       
       if (Expr* LastExpr = dyn_cast<Expr>(*SE->getSubStmt()->body_rbegin()))
-        MakeNode(Dst, SE, Pred, SetSVal(St, SE, GetSVal(St, LastExpr)));
+        MakeNode(Dst, SE, Pred, BindExpr(St, SE, GetSVal(St, LastExpr)));
       else
         Dst.Add(Pred);
       
@@ -456,7 +456,7 @@
     case Stmt::StringLiteralClass: {
       const GRState* St = GetState(Pred);
       SVal V = StateMgr.GetLValue(St, cast<StringLiteral>(Ex));
-      MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+      MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
       return;
     }
       
@@ -513,7 +513,7 @@
                  (Op == BinaryOperator::LOr && !branchTaken)  
                ? B->getRHS() : B->getLHS();
         
-      return SetBlkExprSVal(St, B, UndefinedVal(Ex));
+      return BindBlkExpr(St, B, UndefinedVal(Ex));
     }
       
     case Stmt::ConditionalOperatorClass: { // ?:
@@ -530,7 +530,7 @@
       else
         Ex = C->getRHS();
       
-      return SetBlkExprSVal(St, C, UndefinedVal(Ex));
+      return BindBlkExpr(St, C, UndefinedVal(Ex));
     }
       
     case Stmt::ChooseExprClass: { // ?:
@@ -538,7 +538,7 @@
       ChooseExpr* C = cast<ChooseExpr>(Terminator);
       
       Expr* Ex = branchTaken ? C->getLHS() : C->getRHS();      
-      return SetBlkExprSVal(St, C, UndefinedVal(Ex));
+      return BindBlkExpr(St, C, UndefinedVal(Ex));
     }
   }
 }
@@ -664,7 +664,7 @@
   X = GetBlkExprSVal(St, SE);
   
   // Make sure that we invalidate the previous binding.
-  MakeNode(Dst, Ex, Pred, StateMgr.SetSVal(St, Ex, X, true, true));
+  MakeNode(Dst, Ex, Pred, StateMgr.BindExpr(St, Ex, X, true, true));
 }
 
 /// ProcessSwitch - Called by GRCoreEngine.  Used to generate successor
@@ -796,7 +796,7 @@
     // Handle undefined values.
     
     if (X.isUndef()) {
-      MakeNode(Dst, B, Pred, SetBlkExprSVal(St, B, X));
+      MakeNode(Dst, B, Pred, BindBlkExpr(St, B, X));
       return;
     }
     
@@ -812,14 +812,14 @@
     
     if (isFeasible)
       MakeNode(Dst, B, Pred,
-               SetBlkExprSVal(NewState, B, MakeConstantVal(1U, B)));
+               BindBlkExpr(NewState, B, MakeConstantVal(1U, B)));
       
     isFeasible = false;
     NewState = Assume(St, X, false, isFeasible);
     
     if (isFeasible)
       MakeNode(Dst, B, Pred,
-               SetBlkExprSVal(NewState, B, MakeConstantVal(0U, B)));
+               BindBlkExpr(NewState, B, MakeConstantVal(0U, B)));
   }
   else {
     // We took the LHS expression.  Depending on whether we are '&&' or
@@ -827,7 +827,7 @@
     // the short-circuiting.
     
     X = MakeConstantVal( B->getOpcode() == BinaryOperator::LAnd ? 0U : 1U, B);
-    MakeNode(Dst, B, Pred, SetBlkExprSVal(St, B, X));
+    MakeNode(Dst, B, Pred, BindBlkExpr(St, B, X));
   }
 }
  
@@ -847,7 +847,7 @@
     SVal V = StateMgr.GetLValue(St, VD);
 
     if (asLValue)
-      MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+      MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
     else
       EvalLoad(Dst, Ex, Pred, St, V);
     return;
@@ -857,7 +857,7 @@
 
     BasicValueFactory& BasicVals = StateMgr.getBasicVals();
     SVal V = nonloc::ConcreteInt(BasicVals.getValue(ED->getInitVal()));
-    MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+    MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
     return;
 
   } else if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D)) {
@@ -866,7 +866,7 @@
     // FIXME: Does this need to be revised?  We were getting cases in
     //  real code that did this.
     SVal V = loc::FuncVal(FD);
-    MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
+    MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, V));
     return;
   }
   
@@ -892,7 +892,7 @@
       SVal V = StateMgr.GetLValue(St, GetSVal(St, Base), GetSVal(St, Idx));
 
       if (asLValue)
-        MakeNode(Dst, A, *I2, SetSVal(St, A, V));
+        MakeNode(Dst, A, *I2, BindExpr(St, A, V));
       else
         EvalLoad(Dst, A, *I2, St, V);
     }
@@ -919,7 +919,7 @@
     SVal L = StateMgr.GetLValue(St, GetSVal(St, Base), M->getMemberDecl());
 
     if (asLValue)
-      MakeNode(Dst, M, *I, SetSVal(St, M, L));
+      MakeNode(Dst, M, *I, BindExpr(St, M, L));
     else
       EvalLoad(Dst, M, *I, St, L);
   }
@@ -981,11 +981,11 @@
     MakeNode(Dst, Ex, Pred, St, K);
   else if (location.isUnknown()) {
     // This is important.  We must nuke the old binding.
-    MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, UnknownVal()), K);
+    MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, UnknownVal()), K);
   }
   else    
-    MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, GetSVal(St, cast<Loc>(location),
-                                                    Ex->getType())), K);  
+    MakeNode(Dst, Ex, Pred, BindExpr(St, Ex, GetSVal(St, cast<Loc>(location),
+                                                     Ex->getType())), K);  
 }
 
 void GRExprEngine::EvalStore(NodeSet& Dst, Expr* Ex, Expr* StoreE, NodeTy* Pred,
@@ -999,8 +999,8 @@
 }
 
 const GRState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred,
-                                             const GRState* St,
-                                             SVal location, bool isLoad) {
+                                          const GRState* St,
+                                          SVal location, bool isLoad) {
   
   // Check for loads/stores from/to undefined values.  
   if (location.isUndef()) {
@@ -1234,7 +1234,7 @@
             // For __builtin_expect, just return the value of the subexpression.
             assert (CE->arg_begin() != CE->arg_end());            
             SVal X = GetSVal(St, *(CE->arg_begin()));
-            MakeNode(Dst, CE, *DI, SetSVal(St, CE, X));
+            MakeNode(Dst, CE, *DI, BindExpr(St, CE, X));
             continue;            
           }
             
@@ -1299,7 +1299,7 @@
     SVal location = StateMgr.GetLValue(St, Ex->getDecl(), BaseVal);
     
     if (asLValue)
-      MakeNode(Dst, Ex, *I, SetSVal(St, Ex, location));
+      MakeNode(Dst, Ex, *I, BindExpr(St, Ex, location));
     else
       EvalLoad(Dst, Ex, *I, St, location);
   }
@@ -1512,7 +1512,7 @@
     // Undefined?
     
     if (V.isUndef()) {
-      MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+      MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
       continue;
     }
     
@@ -1521,7 +1521,7 @@
     
     if (C.getCanonicalType(T).getUnqualifiedType() == 
         C.getCanonicalType(ExTy).getUnqualifiedType()) {
-      MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+      MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
       continue;
     }
   
@@ -1534,7 +1534,7 @@
       // If not, flag an error.
       
       V = nonloc::LocAsInteger::Make(getBasicVals(), cast<Loc>(V), bits);
-      MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+      MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
       continue;
     }
     
@@ -1543,7 +1543,7 @@
       if (nonloc::LocAsInteger *LV = dyn_cast<nonloc::LocAsInteger>(&V)) {
         // Just unpackage the lval and return it.
         V = LV->getLoc();
-        MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+        MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
         continue;
       }
 
@@ -1552,12 +1552,12 @@
       assert(T->isPointerType() || T->isReferenceType());
 
       V = StateMgr.ArrayToPointer(V);
-      MakeNode(Dst, CastE, N, SetSVal(St, CastE, V));
+      MakeNode(Dst, CastE, N, BindExpr(St, CastE, V));
       continue;
     }
 
     // All other cases.
-    MakeNode(Dst, CastE, N, SetSVal(St, CastE, EvalCast(V, CastE->getType())));
+    MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE->getType())));
   }
 }
 
@@ -1586,7 +1586,7 @@
     assert (!IVals.empty() && "Initializer cannot be empty.");
 
     St = StateMgr.BindCompoundLiteral(St, R, &IVals[0], &IVals[0]+IVals.size());
-    MakeNode(Dst, CL, *I, SetSVal(St, CL, loc::MemRegionVal(R)));
+    MakeNode(Dst, CL, *I, BindExpr(St, CL, loc::MemRegionVal(R)));
   }
 }
 
@@ -1653,7 +1653,7 @@
                                      StateMgr.getBasicVals());
 
     // Make final state and node.
-    state = SetSVal(state, E, V);
+    state = BindExpr(state, E, V);
 
     MakeNode(Dst, E, Pred, state);
     return;
@@ -1672,7 +1672,7 @@
     Visit(Init, Pred, Tmp);
     for (NodeSet::iterator I = Tmp.begin(), EI = Tmp.end(); I != EI; ++I) {
       state = GetState(*I);
-      MakeNode(Dst, E, *I, SetSVal(state, E, GetSVal(state, Init)));
+      MakeNode(Dst, E, *I, BindExpr(state, E, GetSVal(state, Init)));
     }
     return;
   }
@@ -1716,8 +1716,8 @@
     amt = getContext().getTypeAlign(T) / 8;
   
   MakeNode(Dst, Ex, Pred,
-           SetSVal(GetState(Pred), Ex,
-                   NonLoc::MakeVal(getBasicVals(), amt, Ex->getType())));  
+           BindExpr(GetState(Pred), Ex,
+                    NonLoc::MakeVal(getBasicVals(), amt, Ex->getType())));  
 }
 
 
@@ -1741,7 +1741,7 @@
         SVal location = GetSVal(St, Ex);
         
         if (asLValue)
-          MakeNode(Dst, U, *I, SetSVal(St, U, location));
+          MakeNode(Dst, U, *I, BindExpr(St, U, location));
         else
           EvalLoad(Dst, U, *I, St, location);
       } 
@@ -1767,7 +1767,7 @@
         // For all other types, UnaryOperator::Real is an identity operation.
         assert (U->getType() == Ex->getType());
         const GRState* St = GetState(*I);
-        MakeNode(Dst, U, *I, SetSVal(St, U, GetSVal(St, Ex)));
+        MakeNode(Dst, U, *I, BindExpr(St, U, GetSVal(St, Ex)));
       } 
       
       return;
@@ -1791,7 +1791,7 @@
         assert (Ex->getType()->isIntegerType());
         const GRState* St = GetState(*I);
         SVal X = NonLoc::MakeVal(getBasicVals(), 0, Ex->getType());
-        MakeNode(Dst, U, *I, SetSVal(St, U, X));
+        MakeNode(Dst, U, *I, BindExpr(St, U, X));
       }
       
       return;
@@ -1816,7 +1816,7 @@
       
       for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {        
         const GRState* St = GetState(*I);
-        MakeNode(Dst, U, *I, SetSVal(St, U, GetSVal(St, Ex)));
+        MakeNode(Dst, U, *I, BindExpr(St, U, GetSVal(St, Ex)));
       }
       
       return;
@@ -1832,7 +1832,7 @@
       for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {        
         const GRState* St = GetState(*I);
         SVal V = GetSVal(St, Ex);
-        St = SetSVal(St, U, V);
+        St = BindExpr(St, U, V);
         MakeNode(Dst, U, *I, St);
       }
 
@@ -1860,7 +1860,7 @@
         // V = EvalCast(V, U->getType()); 
         
         if (V.isUnknownOrUndef()) {
-          MakeNode(Dst, U, *I, SetSVal(St, U, V));
+          MakeNode(Dst, U, *I, BindExpr(St, U, V));
           continue;
         }
         
@@ -1871,12 +1871,12 @@
             
           case UnaryOperator::Not:
             // FIXME: Do we need to handle promotions?
-            St = SetSVal(St, U, EvalComplement(cast<NonLoc>(V)));
+            St = BindExpr(St, U, EvalComplement(cast<NonLoc>(V)));
             break;            
             
           case UnaryOperator::Minus:
             // FIXME: Do we need to handle promotions?
-            St = SetSVal(St, U, EvalMinus(U, cast<NonLoc>(V)));
+            St = BindExpr(St, U, EvalMinus(U, cast<NonLoc>(V)));
             break;   
             
           case UnaryOperator::LNot:   
@@ -1889,7 +1889,7 @@
             if (isa<Loc>(V)) {
               loc::ConcreteInt X(getBasicVals().getZeroWithPtrWidth());
               SVal Result = EvalBinOp(BinaryOperator::EQ, cast<Loc>(V), X);
-              St = SetSVal(St, U, Result);
+              St = BindExpr(St, U, Result);
             }
             else {
               nonloc::ConcreteInt X(getBasicVals().getValue(0, Ex->getType()));
@@ -1922,7 +1922,7 @@
       
       uint64_t size = getContext().getTypeAlign(T) / 8;                
       const GRState* St = GetState(Pred);
-      St = SetSVal(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
+      St = BindExpr(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
       
       MakeNode(Dst, U, Pred, St);
       return;
@@ -1939,7 +1939,7 @@
         
       uint64_t size = getContext().getTypeSize(T) / 8;                
       const GRState* St = GetState(Pred);
-      St = SetSVal(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
+      St = BindExpr(St, U, NonLoc::MakeVal(getBasicVals(), size, U->getType()));
         
       MakeNode(Dst, U, Pred, St);
       return;
@@ -1969,7 +1969,7 @@
         
       // Propagate unknown and undefined values.      
       if (V2.isUnknownOrUndef()) {
-        MakeNode(Dst, U, *I2, SetSVal(St, U, V2));
+        MakeNode(Dst, U, *I2, BindExpr(St, U, V2));
         continue;
       }
       
@@ -1979,7 +1979,7 @@
                                                      : BinaryOperator::Sub;
       
       SVal Result = EvalBinOp(Op, V2, MakeConstantVal(1U, U));      
-      St = SetSVal(St, U, U->isPostfix() ? V2 : Result);
+      St = BindExpr(St, U, U->isPostfix() ? V2 : Result);
 
       // Perform the store.      
       EvalStore(Dst, U, *I2, St, V1, Result);
@@ -2031,7 +2031,7 @@
       assert (!isa<NonLoc>(X));  // Should be an Lval, or unknown, undef.
       
       if (isa<Loc>(X))
-        St = SetSVal(St, cast<Loc>(X), UnknownVal());
+        St = BindLoc(St, cast<Loc>(X), UnknownVal());
     }
     
     MakeNode(Dst, A, Pred, St);
@@ -2214,7 +2214,7 @@
           // Simulate the effects of a "store":  bind the value of the RHS
           // to the L-Value represented by the LHS.
           
-          EvalStore(Dst, B, LHS, *I2, SetSVal(St, B, RightV), LeftV, RightV);
+          EvalStore(Dst, B, LHS, *I2, BindExpr(St, B, RightV), LeftV, RightV);
           continue;
         }
           
@@ -2265,7 +2265,7 @@
           
           // Otherwise, create a new node.
           
-          MakeNode(Dst, B, *I2, SetSVal(St, B, Result));
+          MakeNode(Dst, B, *I2, BindExpr(St, B, Result));
           continue;
         }
       }
@@ -2305,13 +2305,13 @@
         
         // Propagate undefined values (left-side).          
         if (V.isUndef()) {
-          EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, V), location, V);
+          EvalStore(Dst, B, LHS, *I3, BindExpr(St, B, V), location, V);
           continue;
         }
         
         // Propagate unknown values (left and right-side).
         if (RightV.isUnknown() || V.isUnknown()) {
-          EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, UnknownVal()), location,
+          EvalStore(Dst, B, LHS, *I3, BindExpr(St, B, UnknownVal()), location,
                     UnknownVal());
           continue;
         }
@@ -2331,7 +2331,7 @@
         // Evaluate operands and promote to result type.                    
         if (RightV.isUndef()) {            
           // Propagate undefined values (right-side).          
-          EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, RightV), location, RightV);
+          EvalStore(Dst,B, LHS, *I3, BindExpr(St, B, RightV), location, RightV);
           continue;
         }
       
@@ -2364,7 +2364,7 @@
                  : cast<SVal>(nonloc::SymbolVal(Sym));            
         }
  
-        EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, Result), location, Result);
+        EvalStore(Dst, B, LHS, *I3, BindExpr(St, B, Result), location, Result);
       }
     }
   }
diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp
index 48b25a7..0b36984 100644
--- a/lib/Analysis/GRSimpleVals.cpp
+++ b/lib/Analysis/GRSimpleVals.cpp
@@ -370,9 +370,9 @@
     SVal V = StateMgr.GetSVal(St, *I);
     
     if (isa<loc::MemRegionVal>(V))
-      St = StateMgr.SetSVal(St, cast<Loc>(V), UnknownVal());
+      St = StateMgr.BindLoc(St, cast<Loc>(V), UnknownVal());
     else if (isa<nonloc::LocAsInteger>(V))
-      St = StateMgr.SetSVal(St, cast<nonloc::LocAsInteger>(V).getLoc(),
+      St = StateMgr.BindLoc(St, cast<nonloc::LocAsInteger>(V).getLoc(),
                             UnknownVal());
     
   }
@@ -389,7 +389,7 @@
              ? cast<SVal>(loc::SymbolVal(Sym)) 
              : cast<SVal>(nonloc::SymbolVal(Sym));
     
-    St = StateMgr.SetSVal(St, CE, X, Eng.getCFG().isBlkExpr(CE), false);
+    St = StateMgr.BindExpr(St, CE, X, Eng.getCFG().isBlkExpr(CE), false);
   }  
     
   Builder.MakeNode(Dst, CE, Pred, St);
@@ -418,7 +418,7 @@
     SVal V = StateMgr.GetSVal(St, *I);
     
     if (isa<Loc>(V))
-      St = StateMgr.SetSVal(St, cast<Loc>(V), UnknownVal());
+      St = StateMgr.BindLoc(St, cast<Loc>(V), UnknownVal());
   }
   
   Builder.MakeNode(Dst, ME, Pred, St);
diff --git a/lib/Analysis/GRState.cpp b/lib/Analysis/GRState.cpp
index f598ec4..ad057c2 100644
--- a/lib/Analysis/GRState.cpp
+++ b/lib/Analysis/GRState.cpp
@@ -59,8 +59,7 @@
                                            LSymbols, DSymbols);
 }
 
-const GRState* GRStateManager::SetSVal(const GRState* St, Loc LV,
-                                             SVal V) {
+const GRState* GRStateManager::BindLoc(const GRState* St, Loc LV, SVal V) {
   
   Store OldStore = St->getStore();
   Store NewStore = StoreMgr->Bind(OldStore, LV, V);
diff --git a/lib/Analysis/GRTransferFuncs.cpp b/lib/Analysis/GRTransferFuncs.cpp
index ede67c5..ca169d5 100644
--- a/lib/Analysis/GRTransferFuncs.cpp
+++ b/lib/Analysis/GRTransferFuncs.cpp
@@ -35,7 +35,7 @@
     Builder.MakeNode(Dst, E, Pred, St);
   else
     Builder.MakeNode(Dst, E, Pred,
-                Eng.getStateManager().SetSVal(St, cast<Loc>(TargetLV), Val));
+                   Eng.getStateManager().BindLoc(St, cast<Loc>(TargetLV), Val));
 }
 
 void GRTransferFuncs::EvalBinOpNN(GRStateSet& OStates,
@@ -44,5 +44,5 @@
                                   BinaryOperator::Opcode Op,
                                   NonLoc L, NonLoc R) {
   
-  OStates.Add(StateMgr.SetSVal(St, Ex, DetermEvalBinOpNN(StateMgr, Op, L, R)));
+  OStates.Add(StateMgr.BindExpr(St, Ex, DetermEvalBinOpNN(StateMgr, Op, L, R)));
 }
