diff --git a/src/glpios03.c b/src/glpios03.c
index 29ea32e..d5d3375 100644
--- a/src/glpios03.c
+++ b/src/glpios03.c
@@ -851,6 +851,7 @@ int ios_driver(glp_tree *T)
 #else
       double ttt = T->tm_beg;
 #endif
+      int root_done = 0;
 #if 0
       ((glp_iocp *)T->parm)->msg_lev = GLP_MSG_DBG;
 #endif
@@ -1014,13 +1015,13 @@ more: /* minor loop starts here */
       if (T->parm->pp_tech == GLP_PP_NONE)
          ;
       else if (T->parm->pp_tech == GLP_PP_ROOT)
-      {  if (T->curr->level == 0)
+      {  if (!root_done)
          {  if (ios_preprocess_node(T, 100))
                goto fath;
          }
       }
       else if (T->parm->pp_tech == GLP_PP_ALL)
-      {  if (ios_preprocess_node(T, T->curr->level == 0 ? 100 : 10))
+      {  if (ios_preprocess_node(T, !root_done ? 100 : 10))
             goto fath;
       }
       else
@@ -1193,7 +1194,7 @@ more: /* minor loop starts here */
          }
       }
       /* try to find solution with the feasibility pump heuristic */
-      if (T->parm->fp_heur)
+      if (T->parm->fp_heur && !root_done)
       {  xassert(T->reason == 0);
          T->reason = GLP_IHEUR;
          ios_feas_pump(T);
@@ -1208,7 +1209,7 @@ more: /* minor loop starts here */
       }
 #if 1 /* 25/V-2013 */
       /* try to find solution with the proximity search heuristic */
-      if (T->parm->ps_heur)
+      if (T->parm->ps_heur && !root_done)
       {  xassert(T->reason == 0);
          T->reason = GLP_IHEUR;
          ios_proxy_heur(T);
@@ -1222,6 +1223,7 @@ more: /* minor loop starts here */
          }
       }
 #endif
+
 #if 1 /* 24/X-2015 */
       /* try to find solution with a simple rounding heuristic */
       if (T->parm->sr_heur)
@@ -1263,14 +1265,14 @@ more: /* minor loop starts here */
             bad_cut = 0;
       }
       old_obj = T->curr->lp_obj;
-      if (bad_cut == 0 || (T->curr->level == 0 && bad_cut <= 3))
+      if (bad_cut == 0 || (!root_done && bad_cut <= 3))
 #endif
       /* try to generate generic cuts with built-in generators
          (as suggested by Prof. Fischetti et al. the built-in cuts are
          not generated at each branching node; an intense attempt of
          generating new cuts is only made at the root node, and then
          a moderate effort is spent after each backtracking step) */
-      if (T->curr->level == 0 || pred_p == 0)
+      if (!root_done || pred_p == 0)
       {  xassert(T->reason == 0);
          T->reason = GLP_ICUTGEN;
          generate_cuts(T);
@@ -1294,8 +1296,10 @@ more: /* minor loop starts here */
       }
       /* no cuts were generated; remove inactive cuts */
       remove_cuts(T);
-      if (T->parm->msg_lev >= GLP_MSG_ALL && T->curr->level == 0)
+      if (T->parm->msg_lev >= GLP_MSG_ALL && !root_done)
          display_cut_info(T);
+      /* the first node will not be treated as root any more*/
+      if(!root_done) root_done = 1;
       /* update history information used on pseudocost branching */
       if (T->pcost != NULL) ios_pcost_update(T);
       /* it's time to perform branching */
