diff --git a/ChangeLog b/ChangeLog
index 60212ef343312713106fd6a818415770303d20a2..6a1c5b73632341a8a196deb6d35fe652308cd812 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -60,6 +60,11 @@ Cvs code -
   do_replace()
 	- If we manage to make it in somehow with VIEW_MODE on, abort
 	  nicely (fixes BUG #59).
+- utils.c
+  strcasestr()
+	- Replaced by mutt's mutt_stristr function, because the thought
+	  of dynamically allocating memory and copying each line in a file
+	  to do a search or replace was causing me to lose sleep.
 - winio.c:
   actual_x()
 	- Remove inline from function decl (Albert Chin).
diff --git a/utils.c b/utils.c
index a88eb3efdaff14a597fd9c4a9b5741d6eef12202..6927333a043594f29fccbe7a7720bc75e9a393c2 100644
--- a/utils.c
+++ b/utils.c
@@ -48,37 +48,27 @@ void lowercase(char *src)
 }
 
 
-/* I can't believe I have to write this function */
+/* This is now mutt's version (called mutt_stristr) because it doesn't
+   Use memory allocation to do a simple search (yuck). */
+
 char *strcasestr(char *haystack, char *needle)
 {
-    char *localneedle, *localhaystack, *found, *tmp, *tmp2;
-
-    /* Make a copy of the search string and search space */
-    localneedle = nmalloc(strlen(needle) + 2);
-    localhaystack = nmalloc(strlen(haystack) + 2);
-
-    strcpy(localneedle, needle);
-    strcpy(localhaystack, haystack);
-
-    /* Make them lowercase */
-    lowercase(localneedle);
-    lowercase(localhaystack);
+    const char *p, *q;
 
-    /* Look for the lowercased substring in the lowercased search space -
-       return NULL if we didn't find anything */
-    if ((found = strstr(localhaystack, localneedle)) == NULL) {
-	free(localneedle);
-	free(localhaystack);
+    if (!haystack)
 	return NULL;
+    if (!needle)  
+	return (haystack);
+    
+    while (*(p = haystack))
+    {
+	for (q = needle; *p && *q && tolower (*p) == tolower (*q); p++, q++)
+	    ;
+	if (!*q)
+	    return (haystack);
+        haystack++;
     }
-    /* Else return the pointer to the same place in the real search space */
-    tmp2 = haystack;
-    for (tmp = localhaystack; tmp != found; tmp++)
-	tmp2++;
-
-    free(localneedle);
-    free(localhaystack);
-    return tmp2;
+    return NULL;
 }
 
 char *strstrwrapper(char *haystack, char *needle)