anchor.diff:              | Tm_uvar _ ->
                   ret ([{ goal with
                           witness = bnorm goal.context term;
  -                        goal_ty = bnorm goal.context typ }], [])
  +                        goal_ty = 
  +                          //NS: 01/24 ...expensive
  +                          //bnorm goal.context typ
  +                          typ}], [])
               | _ ->
  -                let term = bnorm env term in
  -                let _, _, g_typ = env.type_of (Env.set_expected_typ env typ) term in
  +                //NS:01/24: use the fast path instead
  +                let g_typ =
  +                    FStar.TypeChecker.Env.check_type_of_well_typed_term false env term typ in
  +                // let term = bnorm env term in
  +                // let _, _, g_typ = env.type_of (Env.set_expected_typ env typ) term in
                   bind (goal_from_guard "apply_lemma solved arg" goal.context g_typ goal.opts) (function
                   | None -> ret ([], [])
                   | Some g -> ret ([], [g])
  
positive.code:                 end
              )))))
  
  // The exception is thrown only when the tactic runs, not when it's defined,
  // so we need to do this to catch it
  let try_unif (t : tac<'a>) (t' : tac<'a>) : tac<'a> =
  
negative.code:                             (tts goal.context (U.mk_squash U_zero post))
                              (tts goal.context goal.goal_ty)
      else
  //NS: 01/24 ... looks redundant    
  //        let solution = N.normalize [N.Beta] goal.context (S.mk_Tm_app tm uvs None goal.context.range) in
          bind (add_implicits implicits.implicits) (fun _ ->
          // We solve with (), we don't care about the witness if applying a lemma
          bind (solve goal U.exp_unit) (fun _ ->
  