diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c
index cad81abbe866b1d0044e85df7bde6cb402a3a5ca..5d15d39ac0cc0f09a6c83a3b0c74bab474153230 100644
--- a/servers/slapd/backover.c
+++ b/servers/slapd/backover.c
@@ -1159,38 +1159,32 @@ overlay_insert( BackendDB *be, slap_overinst *on2, slap_overinst ***prev,
 		on2->on_next = oi->oi_list;
 		oi->oi_list = on2;
 	} else {
-		int i;
-		slap_overinst *on, *otmp1 = NULL, *otmp2;
+		int i, novs;
+		slap_overinst *on, **prev;
 
 		/* Since the list is in reverse order and is singly linked,
-		 * we reverse it to find the idx insertion point. Adding
-		 * on overlay at a specific point should be a pretty
+		 * we have to count the overlays and then insert backwards.
+		 * Adding on overlay at a specific point should be a pretty
 		 * infrequent occurrence.
 		 */
-		for ( on = oi->oi_list; on; on=otmp2 ) {
-			otmp2 = on->on_next;
-			on->on_next = otmp1;
-			otmp1 = on;
-		}
-		oi->oi_list = NULL;
+		novs = 0;
+		for ( on = oi->oi_list; on; on=on->on_next )
+			novs++;
+
+		if (idx > novs)
+			idx = 0;
+		else
+			idx = novs - idx;
+
 		/* advance to insertion point */
-		for ( i=0, on = otmp1; i<idx; i++ ) {
-			otmp1 = on->on_next;
-			on->on_next = oi->oi_list;
-			oi->oi_list = on;
+		prev = &oi->oi_list;
+		for ( i=0; i<idx; i++ ) {
+			on = *prev;
+			prev = &on->on_next;
 		}
 		/* insert */
-		on2->on_next = oi->oi_list;
-		oi->oi_list = on2;
-		if ( otmp1 ) {
-			*prev = &otmp1->on_next;
-			/* replace remainder of list */
-			for ( on=otmp1; on; on=otmp1 ) {
-				otmp1 = on->on_next;
-				on->on_next = oi->oi_list;
-				oi->oi_list = on;
-			}
-		}
+		on2->on_next = *prev;
+		*prev = on2;
 	}
 }