diff --git a/src/libregexp/rregexec.c b/src/libregexp/rregexec.c
index 907ddef..ec7907d 100644
--- a/src/libregexp/rregexec.c
+++ b/src/libregexp/rregexec.c
@@ -9,9 +9,9 @@
  */
 static int
 rregexec1(Reprog *progp,	/* program to run */
-	Rune *bol,	/* string to run machine on */
-	Resub *mp,	/* subexpression elements */
-	int ms,		/* number of elements at mp */
+	Rune *bol,		/* string to run machine on */
+	Resub *mp,		/* subexpression elements */
+	int ms,			/* number of elements at mp */
 	Reljunk *j)
 {
 	int flag=0;
@@ -28,7 +28,7 @@
 	Rune *p;
 
 	match = 0;
-	checkstart = j->starttype;
+	checkstart = j->startchar;
 	if(mp)
 		for(i=0; i<ms; i++) {
 			mp[i].s.rsp = 0;
@@ -46,7 +46,7 @@
 			switch(j->starttype) {
 			case RUNE:
 				p = runestrchr(s, j->startchar);
-				if(p == 0 || (j->reol && p >= j->reol))
+				if(p == 0 || p == j->reol)
 					return match;
 				s = p;
 				break;
@@ -54,7 +54,7 @@
 				if(s == bol)
 					break;
 				p = runestrchr(s, '\n');
-				if(p == 0 || (j->reol && p+1 >= j->reol))
+				if(p == 0 || s == j->reol)
 					return match;
 				s = p+1;
 				break;
@@ -71,16 +71,15 @@
 		nl->inst = 0;
 
 		/* Add first instruction to current list */
-		if(match == 0)
-			_rrenewemptythread(tl, tle, progp->startinst, ms, s);
+		_rrenewemptythread(tl, progp->startinst, ms, s);
 
 		/* Execute machine until current list is empty */
 		for(tlp=tl; tlp->inst; tlp++){
-			for(inst = tlp->inst; ; inst = inst->u2.next){
+			for(inst=tlp->inst; ; inst = inst->u2.next){
 				switch(inst->type){
 				case RUNE:	/* regular character */
 					if(inst->u1.r == r)
-						if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+						if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case LBRA:
@@ -91,11 +90,11 @@
 					continue;
 				case ANY:
 					if(r != '\n')
-						if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+						if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case ANYNL:
-					if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+					if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case BOL:
@@ -110,7 +109,7 @@
 					ep = inst->u1.cp->end;
 					for(rp = inst->u1.cp->spans; rp < ep; rp += 2)
 						if(r >= rp[0] && r <= rp[1]){
-							if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+							if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 								return -1;
 							break;
 						}
@@ -121,12 +120,15 @@
 						if(r >= rp[0] && r <= rp[1])
 							break;
 					if(rp == ep)
-						if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+						if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case OR:
-					/* expanded during renewthread; just a place holder */
-					break;
+					/* evaluate right choice later */
+					if(_renewthread(tl, inst->u1.right, ms, &tlp->se) == tle)
+						return -1;
+					/* efficiency: advance and re-evaluate */
+					continue;
 				case END:	/* Match! */
 					match = 1;
 					tlp->se.m[0].e.rep = s;
@@ -139,7 +141,7 @@
 		}
 		if(s == j->reol)
 			break;
-		checkstart = j->starttype && nl->inst==0;
+		checkstart = j->startchar && nl->inst==0;
 		s++;
 	}while(r);
 	return match;
@@ -153,26 +155,15 @@
 	Reljunk *j
 )
 {
-	int rv;
-	Relist *relist0, *relist1;
+	Relist relist0[5*LISTSIZE], relist1[5*LISTSIZE];
 
-	relist0 = malloc((progp->proglen+1)*sizeof(Relist));
-	if(relist0 == nil)
-		return -1;
-	relist1 = malloc((progp->proglen+1)*sizeof(Relist));
-	if(relist1 == nil){
-		free(relist1);
-		return -1;
-	}
+	/* mark space */
 	j->relist[0] = relist0;
 	j->relist[1] = relist1;
-	j->reliste[0] = relist0 + progp->proglen;
-	j->reliste[1] = relist1 + progp->proglen;
+	j->reliste[0] = relist0 + nelem(relist0) - 2;
+	j->reliste[1] = relist1 + nelem(relist1) - 2;
 
-	rv = rregexec1(progp, bol, mp, ms, j);
-	free(relist0);
-	free(relist1);
-	return rv;
+	return rregexec1(progp, bol, mp, ms, j);
 }
 
 extern int
@@ -208,8 +199,8 @@
 	/* mark space */
 	j.relist[0] = relist0;
 	j.relist[1] = relist1;
-	j.reliste[0] = relist0 + nelem(relist0) - 1;
-	j.reliste[1] = relist1 + nelem(relist1) - 1;
+	j.reliste[0] = relist0 + nelem(relist0) - 2;
+	j.reliste[1] = relist1 + nelem(relist1) - 2;
 
 	rv = rregexec1(progp, bol, mp, ms, &j);
 	if(rv >= 0)
