diff --git a/src/sat/sat_asymm_branch.cpp b/src/sat/sat_asymm_branch.cpp
index 869b4ac4c..8e5e556e3 100644
--- a/src/sat/sat_asymm_branch.cpp
+++ b/src/sat/sat_asymm_branch.cpp
@@ -59,7 +59,7 @@ namespace sat {
         }
     };
 
-    void asymm_branch::process(scc& scc, clause_vector& clauses) {
+    void asymm_branch::process(scc* scc, clause_vector& clauses) {
         int64 limit = -m_asymm_branch_limit;
         std::stable_sort(clauses.begin(), clauses.end(), clause_size_lt());
         m_counter -= clauses.size();
@@ -83,7 +83,7 @@ namespace sat {
                 }
                 s.checkpoint();
                 clause & c = *(*it);
-                if (m_asymm_branch_sampled ? !process_sampled(scc, c) : !process(c)) {
+                if (scc ? !process_sampled(*scc, c) : !process(c)) {
                     continue; // clause was removed
                 }
                 *it2 = *it;
@@ -106,7 +106,7 @@ namespace sat {
         ++m_calls;
         if (m_calls <= m_asymm_branch_delay)
             return;
-        if (!m_asymm_branch && !m_asymm_branch_all)
+        if (!m_asymm_branch && !m_asymm_branch_all && !m_asymm_branch_sampled)
             return;
         s.propagate(false); // must propagate, since it uses s.push()
         if (s.m_inconsistent)
@@ -119,13 +119,18 @@ namespace sat {
         TRACE("asymm_branch_detail", s.display(tout););
         report rpt(*this);
         svector<char> saved_phase(s.m_phase);
+        if (m_asymm_branch) {
+            m_counter  = 0; 
+            process(nullptr, s.m_clauses);
+            m_counter = -m_counter;
+        }
         if (m_asymm_branch_sampled) {
             scc scc(s, m_params);
             while (true) {
                 unsigned elim = m_elim_literals;
                 scc.init_big(true);
-                process(scc, s.m_clauses);
-                process(scc, s.m_learned);
+                process(&scc, s.m_clauses);
+                process(&scc, s.m_learned);
                 s.propagate(false); 
                 if (s.m_inconsistent)
                     break;
@@ -134,12 +139,6 @@ namespace sat {
                     break;
             }
         }
-        else {
-            scc scc(s, m_params);
-            m_counter  = 0; 
-            process(scc, s.m_clauses);
-            m_counter = -m_counter;
-        }
         s.m_phase = saved_phase;
         m_asymm_branch_limit *= 2;
         if (m_asymm_branch_limit > UINT_MAX)
diff --git a/src/sat/sat_asymm_branch.h b/src/sat/sat_asymm_branch.h
index b7e2b0218..4510aaddf 100644
--- a/src/sat/sat_asymm_branch.h
+++ b/src/sat/sat_asymm_branch.h
@@ -41,6 +41,7 @@ namespace sat {
         bool       m_asymm_branch;
         unsigned   m_asymm_branch_delay;
         bool       m_asymm_branch_sampled;
+        bool       m_asymm_branch_propagate;
         bool       m_asymm_branch_all;
         int64      m_asymm_branch_limit;
 
@@ -64,7 +65,7 @@ namespace sat {
 
         bool process_sampled(scc& scc, clause & c);
 
-        void process(scc& scc, clause_vector & c);
+        void process(scc* scc, clause_vector & c);
         
         bool process_all(clause & c);
         
diff --git a/src/sat/sat_config.cpp b/src/sat/sat_config.cpp
index b0797dae9..87d84f133 100644
--- a/src/sat/sat_config.cpp
+++ b/src/sat/sat_config.cpp
@@ -38,8 +38,6 @@ namespace sat {
         m_glue_psm("glue_psm"),
         m_psm_glue("psm_glue") {
         m_num_threads = 1;
-        m_local_search = 0;
-        m_lookahead_search = false;
         m_lookahead_simplify = false;
         m_lookahead_simplify_bca = false;
         m_elim_vars = false;
@@ -92,7 +90,6 @@ namespace sat {
         m_local_search_threads = p.local_search_threads();
         m_lookahead_simplify = p.lookahead_simplify();
         m_lookahead_simplify_bca = p.lookahead_simplify_bca();
-        m_lookahead_search = p.lookahead_search();
         if (p.lookahead_reward() == symbol("heule_schur")) {
             m_lookahead_reward = heule_schur_reward;
         }
@@ -214,7 +211,6 @@ namespace sat {
         else {
             throw sat_param_exception("invalid PB solver: solver, totalizer, circuit, sorting");
         }
-        m_dimacs_inprocess_display  = p.dimacs_inprocess_display();
 
         sat_simplifier_params sp(_p);
         m_elim_vars = sp.elim_vars();
diff --git a/src/sat/sat_config.h b/src/sat/sat_config.h
index 1529466ee..ed7802cef 100644
--- a/src/sat/sat_config.h
+++ b/src/sat/sat_config.h
@@ -89,7 +89,6 @@ namespace sat {
         unsigned           m_num_threads;
         unsigned           m_local_search_threads;
         bool               m_local_search;
-        bool               m_lookahead_search;
         bool               m_lookahead_simplify;
         bool               m_lookahead_simplify_bca;
         cutoff_t           m_lookahead_cube_cutoff;
@@ -124,8 +123,6 @@ namespace sat {
         bool               m_drat_check_unsat;
         bool               m_drat_check_sat;
 
-        bool               m_dimacs_inprocess_display;
-
         symbol             m_always_true;
         symbol             m_always_false;
         symbol             m_caching;
diff --git a/src/sat/sat_elim_eqs.cpp b/src/sat/sat_elim_eqs.cpp
index ea44c870d..d0166b64e 100644
--- a/src/sat/sat_elim_eqs.cpp
+++ b/src/sat/sat_elim_eqs.cpp
@@ -94,10 +94,11 @@ namespace sat {
             if (!c.frozen())
                 m_solver.detach_clause(c);
             // apply substitution
-            for (i = 0; i < sz; i++) {                
-                c[i] = norm(roots, c[i]);
+            for (i = 0; i < sz; i++) {   
+				literal lit = c[i];
+                c[i] = norm(roots, lit);
                 VERIFY(c[i] == norm(roots, c[i]));
-                VERIFY(!m_solver.was_eliminated(c[i].var()));
+				VERIFY(!m_solver.was_eliminated(c[i].var()) || lit == c[i]);
             }
             std::sort(c.begin(), c.end());
             for (literal l : c) VERIFY(l == norm(roots, l));
diff --git a/src/sat/sat_lookahead.cpp b/src/sat/sat_lookahead.cpp
index 3feb9455d..a9ae3b641 100644
--- a/src/sat/sat_lookahead.cpp
+++ b/src/sat/sat_lookahead.cpp
@@ -2408,6 +2408,8 @@ namespace sat {
                         ++disconnected1;
                         uf.merge(u.index(), v.index());
                         uf.merge((~u).index(), (~v).index());
+                        VERIFY(!m_s.was_eliminated(u.var()));
+                        VERIFY(!m_s.was_eliminated(v.var()));
                         m_s.mk_clause(~u, v, true);
                     }
                     else {
diff --git a/src/sat/sat_params.pyg b/src/sat/sat_params.pyg
index 565c6dbcc..0e6823030 100644
--- a/src/sat/sat_params.pyg
+++ b/src/sat/sat_params.pyg
@@ -35,8 +35,8 @@ def_module_params('sat',
                           ('pb.solver', SYMBOL, 'circuit', 'method for handling Pseudo-Boolean constraints: circuit (arithmetical circuit), sorting (sorting circuit), totalizer (use totalizer encoding), solver (use SMT solver)'),
                           ('xor.solver', BOOL, False, 'use xor solver'),
                           ('atmost1_encoding', SYMBOL, 'grouped', 'encoding used for at-most-1 constraints grouped, bimander, ordered'),
-                          ('local_search_threads', UINT, 0, 'number of local search threads to find satisfiable solution'),
                           ('local_search', BOOL, False, 'use local search instead of CDCL'),
+                          ('local_search_threads', UINT, 0, 'number of local search threads to find satisfiable solution'),
                           ('lookahead.cube.cutoff', SYMBOL, 'adaptive', 'cutoff type used to create lookahead cubes: adaptive, fixed_depth, fixed_freevars, psat'),
                           ('lookahead.cube.fraction', DOUBLE, 0.4, 'adaptive fraction to create lookahead cubes. Used when lookahead.cube.cutoff is adaptive'),
                           ('lookahead.cube.depth', UINT, 10, 'cut-off depth to create cubes. Used when lookahead.cube.cutoff is fixed_depth.'),
@@ -49,6 +49,5 @@ def_module_params('sat',
                           ('lookahead_simplify', BOOL, False, 'use lookahead solver during simplification'),
                           ('lookahead_simplify.bca', BOOL, False, 'add learned binary clauses as part of lookahead simplification'),
                           ('lookahead.global_autarky', BOOL, False, 'prefer to branch on variables that occur in clauses that are reduced'),
-                          ('lookahead.reward', SYMBOL, 'march_cu', 'select lookahead heuristic: ternary, heule_schur (Heule Schur), heuleu (Heule Unit), unit, or march_cu'),
-                          ('dimacs.inprocess.display', BOOL, False, 'display SAT instance in DIMACS format if unsolved after inprocess.max inprocessing passes')))
+                          ('lookahead.reward', SYMBOL, 'march_cu', 'select lookahead heuristic: ternary, heule_schur (Heule Schur), heuleu (Heule Unit), unit, or march_cu')))
 
diff --git a/src/sat/sat_scc.cpp b/src/sat/sat_scc.cpp
index 7615a19a3..59c53304d 100644
--- a/src/sat/sat_scc.cpp
+++ b/src/sat/sat_scc.cpp
@@ -303,16 +303,16 @@ namespace sat {
             else {
                 SASSERT(m_left[u.index()] == 0);
                 m_left[u.index()] = ++dfs_num;
-                for (literal v : m_dag[u.index()]) {
-                    if (m_left[v.index()] == 0) {
-                        todo.push_back(pframe(u, v));
-                    }
-                }
                 literal p = todo.back().parent();
                 if (p != null_literal) {
                     m_root[u.index()] = m_root[p.index()];
                     m_parent[u.index()] = p;
                 }
+                for (literal v : m_dag[u.index()]) {
+                    if (m_left[v.index()] == 0) {
+                        todo.push_back(pframe(u, v));
+                    }
+                }
             }
         }
         for (unsigned i = 0; i < num_lits; ++i) {
@@ -339,7 +339,7 @@ namespace sat {
             watch_list::iterator end    = wlist.end();
             for (; it != end; ++it) {
                 watched& w = *it;
-                if (learned ? w.is_binary_learned_clause() : w.is_binary_unblocked_clause()) {
+                if (learned ? w.is_binary_learned_clause() : w.is_binary_clause()) {
                     literal v = w.get_literal();
                     if (reaches(u, v) && u != get_parent(v)) {
                         ++m_num_elim_bin;
diff --git a/src/sat/sat_solver.cpp b/src/sat/sat_solver.cpp
index 5a7e234e9..b3fc95f47 100644
--- a/src/sat/sat_solver.cpp
+++ b/src/sat/sat_solver.cpp
@@ -159,17 +159,20 @@ namespace sat {
                 }
             }
             // copy high quality lemmas
+            unsigned num_learned = 0;
             for (clause* c : src.m_learned) {
                 if (c->glue() <= 2 || (c->size() <= 40 && c->glue() <= 8)) {
                     buffer.reset();
                     for (literal l : *c) buffer.push_back(l);
                     clause* c1 = mk_clause_core(buffer.size(), buffer.c_ptr(), true);
                     if (c1) {
+                        ++num_learned;
                         c1->set_glue(c->glue());
                         c1->set_psm(c->psm());
                     }
                 }
             }
+            IF_VERBOSE(1, verbose_stream() << "(sat.copy :learned " << num_learned << ")\n";);
         }
 
         m_user_scope_literals.reset();
@@ -879,9 +882,6 @@ namespace sat {
         m_stats.m_units = init_trail_size();
         IF_VERBOSE(2, verbose_stream() << "(sat.sat-solver)\n";);
         SASSERT(at_base_lvl());
-        if (m_config.m_lookahead_search && num_lits == 0) {
-            return lookahead_search();
-        }
 
         if (m_config.m_local_search) {
             return do_local_search(num_lits, lits);
@@ -950,12 +950,6 @@ namespace sat {
                 if (m_config.m_inprocess_max <= m_simplifications) {
                     m_reason_unknown = "sat.max.inprocess";
                     IF_VERBOSE(SAT_VB_LVL, verbose_stream() << "(sat \"abort: max-inprocess\")\n";);
-                    if (m_config.m_dimacs_inprocess_display) {
-                        display_dimacs(std::cout);
-                        for (unsigned i = 0; i < num_lits; ++lits) {
-                            std::cout << dimacs_lit(lits[i]) << " 0\n";
-                        }
-                    }
                     return l_undef;
                 }
 
@@ -984,21 +978,6 @@ namespace sat {
         return r;
     }
 
-    lbool solver::lookahead_search() {
-        lookahead lh(*this);
-        lbool r = l_undef;
-        try {
-            r = lh.check();
-            m_model = lh.get_model();
-        }
-        catch (z3_exception&) {
-            lh.collect_statistics(m_aux_stats);
-            throw;
-        }
-        lh.collect_statistics(m_aux_stats);
-        return r;
-    }
-
     lbool solver::check_par(unsigned num_lits, literal const* lits) {
         scoped_ptr_vector<local_search> ls;
         int num_threads = static_cast<int>(m_config.m_num_threads + m_config.m_local_search_threads);
diff --git a/src/sat/sat_solver.h b/src/sat/sat_solver.h
index 602850487..135d9e067 100644
--- a/src/sat/sat_solver.h
+++ b/src/sat/sat_solver.h
@@ -394,7 +394,6 @@ namespace sat {
         void sort_watch_lits();
         void exchange_par();
         lbool check_par(unsigned num_lits, literal const* lits);
-        lbool lookahead_search();
         lbool do_local_search(unsigned num_lits, literal const* lits);
 
         // -----------------------