diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index a6d8ef9..a287e54 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -188,13 +188,34 @@
   // Create the cleaned state.
   
   CleanedState = StateMgr.RemoveDeadBindings(StmtEntryNode->getState(),
-                                             CurrentStmt, Liveness);
+                                             CurrentStmt, Liveness,
+                                             DeadSymbols);
   
-  Builder->SetCleanedState(CleanedState);
+  // Process any special transfer function for dead symbols.
   
-  // Visit the statement.
+  NodeSet Tmp;
   
-  Visit(S, StmtEntryNode, Dst);
+  if (DeadSymbols.empty())
+    Tmp.Add(StmtEntryNode);
+  else {
+    SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+/*      
+    FIXME: Will hook this up next.
+ 
+    TF->EvalDeadSymbols(Tmp, *this, *Builder, StmtEntryNode->getLocation(), Pred,
+                        CleanedState, DeadSymbols);
+*/
+    if (!Builder->BuildSinks && Tmp.empty() && !Builder->HasGeneratedNode)
+      Tmp.Add(StmtEntryNode);
+  }
+      
+  for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
+    // Set the cleaned state.  
+    Builder->SetCleanedState(*I == StmtEntryNode ? CleanedState : (*I)->getState());
+  
+    // Visit the statement.  
+    Visit(S, StmtEntryNode, Dst);
+  }
   
   // If no nodes were generated, generate a new node that has all the
   // dead mappings removed.
diff --git a/lib/Analysis/ValueState.cpp b/lib/Analysis/ValueState.cpp
index 8027ce9..ed6a860 100644
--- a/lib/Analysis/ValueState.cpp
+++ b/lib/Analysis/ValueState.cpp
@@ -32,7 +32,8 @@
 
 ValueState*
 ValueStateManager::RemoveDeadBindings(ValueState* St, Stmt* Loc,
-                                      const LiveVariables& Liveness) {  
+                                      const LiveVariables& Liveness,
+                                      DeadSymbolsTy& DeadSymbols) {  
   
   // This code essentially performs a "mark-and-sweep" of the VariableBindings.
   // The roots are any Block-level exprs and Decls that our liveness algorithm
@@ -133,13 +134,28 @@
       NewSt.VarBindings = Remove(NewSt, I.getKey());
   
   // Remove dead symbols.
-  for (ValueState::ce_iterator I = St->ce_begin(), E=St->ce_end(); I!=E; ++I)
-    if (!MarkedSymbols.count(I.getKey()))
-      NewSt.ConstEq = CEFactory.Remove(NewSt.ConstEq, I.getKey());
   
-  for (ValueState::cne_iterator I = St->cne_begin(), E=St->cne_end(); I!=E; ++I)
-    if (!MarkedSymbols.count(I.getKey()))
-      NewSt.ConstNotEq = CNEFactory.Remove(NewSt.ConstNotEq, I.getKey());
+  DeadSymbols.clear();
+  
+  for (ValueState::ce_iterator I = St->ce_begin(), E=St->ce_end(); I!=E; ++I) {
+
+    SymbolID sym = I.getKey();    
+    
+    if (!MarkedSymbols.count(sym)) {
+      DeadSymbols.insert(sym);
+      NewSt.ConstEq = CEFactory.Remove(NewSt.ConstEq, sym);
+    }
+  }
+  
+  for (ValueState::cne_iterator I = St->cne_begin(), E=St->cne_end(); I!=E;++I){
+    
+    SymbolID sym = I.getKey();
+    
+    if (!MarkedSymbols.count(sym)) {
+      DeadSymbols.insert(sym);
+      NewSt.ConstNotEq = CNEFactory.Remove(NewSt.ConstNotEq, sym);
+    }
+  }
   
   return getPersistentState(NewSt);
 }
