diff --git a/src/sat/ba_solver.cpp b/src/sat/ba_solver.cpp
index a2058512b..e0c1b1696 100644
--- a/src/sat/ba_solver.cpp
+++ b/src/sat/ba_solver.cpp
@@ -1564,7 +1564,7 @@ namespace sat {
             init_watch(*c, true);
         }
         else {
-            s().set_external(lit.var());
+            if (m_solver) m_solver->set_external(lit.var());
             watch_literal(lit, *c);
             watch_literal(~lit, *c);
         }        
@@ -3243,6 +3243,18 @@ namespace sat {
     extension* ba_solver::copy(solver* s) {
         ba_solver* result = alloc(ba_solver);
         result->set_solver(s);
+        copy_core(result);
+        return result;
+    }
+
+    extension* ba_solver::copy(lookahead* s) {
+        ba_solver* result = alloc(ba_solver);
+        result->set_lookahead(s);
+        copy_core(result);
+        return result;
+    }
+
+    void ba_solver::copy_core(ba_solver* result) {
         literal_vector lits;
         svector<wliteral> wlits;
         for (constraint* cp : m_constraints) {
@@ -3274,8 +3286,6 @@ namespace sat {
                 UNREACHABLE();
             }                
         }
-
-        return result;
     }
 
     void ba_solver::init_use_list(ext_use_list& ul) {
diff --git a/src/sat/ba_solver.h b/src/sat/ba_solver.h
index 360f276f2..3e02d49dc 100644
--- a/src/sat/ba_solver.h
+++ b/src/sat/ba_solver.h
@@ -369,7 +369,7 @@ namespace sat {
         inline watch_list const& get_wlist(literal l) const { return m_lookahead ? m_lookahead->get_wlist(l) : m_solver->get_wlist(l); }
         inline void assign(literal l, justification j) { if (m_lookahead) m_lookahead->assign(l); else m_solver->assign(l, j); }
         inline void set_conflict(justification j, literal l) { if (m_lookahead) m_lookahead->set_conflict(); else m_solver->set_conflict(j, l); }
-        inline config const& get_config() const { return m_solver->get_config(); }
+        inline config const& get_config() const { return m_lookahead ? m_lookahead->get_config() : m_solver->get_config(); }
         inline void drat_add(literal_vector const& c, svector<drat::premise> const& premises) { m_solver->m_drat.add(c, premises); }
 
 
@@ -428,6 +428,7 @@ namespace sat {
         constraint* add_pb_ge(literal l, svector<wliteral> const& wlits, unsigned k, bool learned);
         constraint* add_xor(literal l, literal_vector const& lits, bool learned);
 
+        void copy_core(ba_solver* result);
     public:
         ba_solver();
         virtual ~ba_solver();
@@ -453,6 +454,7 @@ namespace sat {
         virtual std::ostream& display_justification(std::ostream& out, ext_justification_idx idx) const;
         virtual void collect_statistics(statistics& st) const;
         virtual extension* copy(solver* s);
+        virtual extension* copy(lookahead* s);
         virtual void find_mutexes(literal_vector& lits, vector<literal_vector> & mutexes);
         virtual void pop_reinit();
         virtual void gc(); 
diff --git a/src/sat/sat_extension.h b/src/sat/sat_extension.h
index 1f747ae50..c2a9197c1 100644
--- a/src/sat/sat_extension.h
+++ b/src/sat/sat_extension.h
@@ -71,6 +71,7 @@ namespace sat {
         virtual std::ostream& display_justification(std::ostream& out, ext_justification_idx idx) const = 0;
         virtual void collect_statistics(statistics& st) const = 0;
         virtual extension* copy(solver* s) = 0;       
+        virtual extension* copy(lookahead* s) = 0;       
         virtual void find_mutexes(literal_vector& lits, vector<literal_vector> & mutexes) = 0;
         virtual void gc() = 0;
         virtual void pop_reinit() = 0;
diff --git a/src/sat/sat_lookahead.cpp b/src/sat/sat_lookahead.cpp
index d0f4bc7f6..11c946fba 100644
--- a/src/sat/sat_lookahead.cpp
+++ b/src/sat/sat_lookahead.cpp
@@ -988,6 +988,7 @@ namespace sat {
             }
         }
         
+#if 0
         // copy externals:
         for (unsigned idx = 0; idx < m_s.m_watches.size(); ++idx) {
             watch_list const& wl = m_s.m_watches[idx];
@@ -997,6 +998,11 @@ namespace sat {
                 }
             }
         }
+#else
+        if (m_s.m_ext) {
+            m_ext = m_s.m_ext->copy(this);
+        }
+#endif
         propagate();
         m_qhead = m_trail.size();
         TRACE("sat", m_s.display(tout); display(tout););
diff --git a/src/sat/sat_lookahead.h b/src/sat/sat_lookahead.h
index 6ff228427..ce98bcce3 100644
--- a/src/sat/sat_lookahead.h
+++ b/src/sat/sat_lookahead.h
@@ -233,6 +233,7 @@ namespace sat {
         stats                  m_stats;
         model                  m_model; 
         cube_state             m_cube_state;
+        scoped_ptr<extension>   m_ext;
  
         // ---------------------------------------
         // truth values
@@ -605,6 +606,8 @@ namespace sat {
 
         double literal_occs(literal l);
         double literal_big_occs(literal l);
+
+        sat::config const& get_config() const { return m_s.get_config(); }
               
     };
 }