diff --git a/C/c_interface.c b/C/c_interface.c
index 54c6843b3..031258335 100755
--- a/C/c_interface.c
+++ b/C/c_interface.c
@@ -2226,7 +2226,7 @@ X_API char *YAP_CompileClause(Term t) {
   codeaddr = Yap_cclause(t, 0, mod, t);
   if (codeaddr != NULL) {
     t = Deref(ARG1); /* just in case there was an heap overflow */
-    if (!Yap_addclause(t, codeaddr, TRUE, mod, &tn)) {
+    if (!Yap_addclause(t, codeaddr, TermAssertz, mod, &tn)) {
       YAPLeaveCriticalSection();
       return LOCAL_ErrorMessage;
     }
diff --git a/C/cdmgr.c b/C/cdmgr.c
index 6d4f99fff..22ddefdab 100644
--- a/C/cdmgr.c
+++ b/C/cdmgr.c
@@ -1530,7 +1530,7 @@ static Int
   return (TRUE);
 }
 
-bool Yap_multiple(PredEntry *ap, int mode USES_REGS) {
+bool Yap_multiple(PredEntry *ap, Term mode USES_REGS) {
   register consult_obj *fp;
 
   if ((ap->PredFlags & (MultiFileFlag | LogUpdatePredFlag | DynamicPredFlag)) ||
@@ -1604,7 +1604,8 @@ bool Yap_constPred(PredEntry *p) {
   return false;
 }
 
-static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
+bool
+Yap_addclause(Term t, yamop *cp, Term tmode, Term mod, Term *t4ref)
 /*
  *
  mode
@@ -1620,7 +1621,21 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
   arity_t Arity;
   pred_flags_t pflags;
   Term tf;
+  int mode;
 
+  if (tmode == TermConsult) {
+    mode = consult;
+  } else if (tmode == TermReconsult) {
+    mode = consult;
+  } else if (tmode  == TermAsserta) {
+    mode = asserta;
+  } else if (tmode  == TermAssertz) {
+    mode = assertz;
+  } else if (tmode  == TermAssertaStatic) {
+    mode = asserta;
+  } else if (tmode  == TermAssertzStatic) {
+    mode = assertz;
+  }
   if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorAssert)
     tf = ArgOfTerm(1, t);
   else
@@ -1656,7 +1671,7 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
   }
   if (pflags & (SpiedPredFlag | CountPredFlag | ProfiledPredFlag))
     spy_flag = true;
-  if (Yap_discontiguous(p, mode PASS_REGS)) {
+  if (Yap_discontiguous(p, tmode PASS_REGS)) {
     Term disc[3], sc[4];
     if (p->ArityOfPE) {
       disc[0] = MkAtomTerm(NameOfFunctor(p->FunctorOfPred));
@@ -1673,7 +1688,7 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
     sc[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 1), 1, &t);
     sc[1] = MkAtomTerm(AtomWarning);
     Yap_PrintWarning(Yap_MkApplTerm(Yap_MkFunctor(AtomError, 2), 2, sc));
-  } else if (Yap_multiple(p, mode PASS_REGS)) {
+  } else if (Yap_multiple(p, tmode PASS_REGS)) {
     Term disc[4], sc[4];
     if (p->ArityOfPE) {
       disc[0] = MkAtomTerm(NameOfFunctor(p->FunctorOfPred));
@@ -1804,10 +1819,6 @@ static bool addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref)
   return true;
 }
 
-bool Yap_addclause(Term t, yamop *cp, int mode, Term mod, Term *t4ref) {
-  return addclause(t, cp, mode, mod, t4ref);
-}
-
 void Yap_EraseMegaClause(yamop *cl, PredEntry *ap) {
   /* just make it fail */
   cl->opc = Yap_opcode(_op_fail);
@@ -1929,22 +1940,9 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */
   int mode;
 
   if (IsVarTerm(t1) || !IsAtomicTerm(t1))
-    return FALSE;
+    return false;
   if (IsVarTerm(mod) || !IsAtomTerm(mod))
-    return FALSE;
-  if (t1 == TermConsult) {
-    mode = consult;
-  } else if (t1 == TermReconsult) {
-    mode = consult;
-  } else if (t1 == TermAsserta) {
-    mode = asserta;
-  } else if (t1 == TermAssertz) {
-    mode = assertz;
-  } else if (t1 == TermAssertaStatic) {
-    mode = asserta;
-  } else if (t1 == TermAssertzStatic) {
-    mode = assertz;
-  }
+    return false;
   /* separate assert in current file from reconsult
     if (mode == assertz && LOCAL_consult_level && mod == CurrentModule)
       mode = consult;
@@ -1955,7 +1953,7 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */
   t = Deref(ARG1); /* just in case there was an heap overflow */
   if (!LOCAL_ErrorMessage) {
     YAPEnterCriticalSection();
-    addclause(t, code_adr, mode, mod, &ARG5);
+    Yap_addclause(t, code_adr, t1, mod, &ARG5);
     YAPLeaveCriticalSection();
   }
   if (LOCAL_ErrorMessage) {
@@ -4486,8 +4484,7 @@ static bool pred_flag_clause(Functor f, Term mod, const char *name,
   if (LOCAL_ErrorMessage) {
     return false;
   }
-  addclause(tn, code_adr, assertz, mod, NULL);
-  return true;
+  return Yap_addclause(tn, code_adr, TermAssertz, mod, NULL);
 }
 
 struct pred_entry *Yap_MkLogPred(struct pred_entry *pe) {
diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp
index 149f69827..7f0f4715d 100644
--- a/CXX/yapi.cpp
+++ b/CXX/yapi.cpp
@@ -754,7 +754,7 @@ void *YAPPrologPredicate::assertClause( YAPTerm clause, bool last, YAPTerm sourc
       return 0;
   }
   Term *tref = &ntt;
-  if (Yap_addclause(ntt, codeaddr, (last ? 0 : 2), Yap_CurrentModule(), tref)) {
+  if (Yap_addclause(ntt, codeaddr, (last ? TermAssertz : TermAsserta), Yap_CurrentModule(), tref)) {
     RECOVER_MACHINE_REGS();
   }
     return tref;
diff --git a/H/Yapproto.h b/H/Yapproto.h
index c30ec0a18..0be7c53f5 100755
--- a/H/Yapproto.h
+++ b/H/Yapproto.h
@@ -125,7 +125,7 @@ struct pred_entry *Yap_PredForChoicePt(choiceptr bptr, op_numbers *op);
 void Yap_InitCdMgr(void);
 struct pred_entry *Yap_PredFromClause(Term t USES_REGS);
 bool Yap_discontiguous(struct pred_entry *ap, Term mode USES_REGS);
-bool Yap_multiple(struct pred_entry *ap, int mode USES_REGS);
+bool Yap_multiple(struct pred_entry *ap, Term mode USES_REGS);
 void Yap_init_consult(int, const char *);
 void Yap_end_consult(void);
 void Yap_Abolish(struct pred_entry *);
diff --git a/H/clause.h b/H/clause.h
index a72be97d7..db1ede4cd 100644
--- a/H/clause.h
+++ b/H/clause.h
@@ -280,7 +280,7 @@ void Yap_InitComma(void);
 
 /* cdmgr.c */
 void Yap_IPred(PredEntry *, UInt, yamop *);
-bool Yap_addclause(Term, yamop *, int, Term, Term *);
+bool Yap_addclause(Term, yamop *, Term, Term, Term *);
 void Yap_add_logupd_clause(PredEntry *, LogUpdClause *, int);
 void Yap_kill_iblock(ClauseUnion *, ClauseUnion *, PredEntry *);
 void Yap_EraseStaticClause(StaticClause *, PredEntry *, Term);