diff --git a/src/glpapi09.c b/src/glpapi09.c
index 311f44c..709addd 100644
--- a/src/glpapi09.c
+++ b/src/glpapi09.c
@@ -379,10 +379,14 @@ static int preprocess_and_solve_mip(glp_prob *P, const glp_iocp *parm)
          xprintf("Solving LP relaxation...\n");
       glp_init_smcp(&smcp);
       smcp.msg_lev = parm->msg_lev;
+      /* respect time limit */
+      smcp.tm_lim = parm->tm_lim;
       mip->it_cnt = P->it_cnt;
       ret = glp_simplex(mip, &smcp);
       P->it_cnt = mip->it_cnt;
-      if (ret != 0)
+      if (ret == GLP_ETMLIM)
+         goto done;
+      else if (ret != 0)
       {  if (parm->msg_lev >= GLP_MSG_ERR)
             xprintf("glp_intopt: cannot solve LP relaxation\n");
          ret = GLP_EFAIL;
diff --git a/src/glpios01.c b/src/glpios01.c
index d0850c1..f821536 100644
--- a/src/glpios01.c
+++ b/src/glpios01.c
@@ -1447,6 +1447,10 @@ int ios_solve_node(glp_tree *tree)
             xassert(tree != tree);
       }
       parm.meth = GLP_DUALP;
+      /* respect time limit */
+      if (tree->parm->tm_lim < INT_MAX)
+         parm.tm_lim = tree->parm->tm_lim - (glp_time() - tree->tm_beg);
+      if (parm.tm_lim < 0) parm.tm_lim = 0;
       if (tree->parm->msg_lev < GLP_MSG_DBG)
          parm.out_dly = tree->parm->out_dly;
       else
diff --git a/src/glpios03.c b/src/glpios03.c
index f079897..4606918 100644
--- a/src/glpios03.c
+++ b/src/glpios03.c
@@ -1322,7 +1322,9 @@ more: /* minor loop starts here */
       if (T->parm->msg_lev >= GLP_MSG_DBG)
          xprintf("Solving LP relaxation...\n");
       ret = ios_solve_node(T);
-      if (!(ret == 0 || ret == GLP_EOBJLL || ret == GLP_EOBJUL))
+      if (ret == GLP_ETMLIM)
+         goto done;
+      else if (!(ret == 0 || ret == GLP_EOBJLL || ret == GLP_EOBJUL))
       {  if (T->parm->msg_lev >= GLP_MSG_ERR)
             xprintf("ios_driver: unable to solve current LP relaxation;"
                " glp_simplex returned %d\n", ret);
