diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h
index 06805e82d08cc231e5acb321b71c0b568ba8d297..13ced53d218ccff44dba2324d857ee839d0b4a7d 100755
--- a/include/asterisk/utils.h
+++ b/include/asterisk/utils.h
@@ -20,6 +20,7 @@
 #include <arpa/inet.h>	/* we want to override inet_ntoa */
 #include <netdb.h>
 #include <limits.h>
+#include <string.h>
 
 #include "asterisk/lock.h"
 
@@ -135,21 +136,59 @@ struct ast_hostent {
   \param str the input string
   \return a pointer to the first non-whitespace character
  */
+#ifdef LOW_MEMORY
 char *ast_skip_blanks(char *str);
+#else
+static inline char *ast_skip_blanks(char *str)
+{
+	while (*str && *str < 33)
+		str++;
+	return str;
+}
+#endif
 
 /*!
   \brief Trims trailing whitespace characters from a string.
   \param str the input string
   \return a pointer to the NULL following the string
  */
+#ifdef LOW_MEMORY
 char *ast_trim_blanks(char *str);
+#else
+static inline char *ast_trim_blanks(char *str)
+{
+	char *work = str;
+
+	if (work) {
+		work += strlen(work) - 1;
+		/* It's tempting to only want to erase after we exit this loop, 
+		   but since ast_trim_blanks *could* receive a constant string
+		   (which we presumably wouldn't have to touch), we shouldn't
+		   actually set anything unless we must, and it's easier just
+		   to set each position to \0 than to keep track of a variable
+		   for it */
+		while ((work >= str) && *work < 33)
+			*(work--) = '\0';
+	}
+	return str;
+}
+#endif
 
 /*!
   \brief Gets a pointer to first whitespace character in a string.
   \param str the input string
   \return a pointer to the first whitespace character
  */
+#ifdef LOW_MEMORY
 char *ast_skip_nonblanks(char *str);
+#else
+static inline char *ast_skip_nonblanks(char *str)
+{
+	while (*str && *str > 32)
+		str++;
+	return str;
+}
+#endif
   
 /*!
   \brief Strip leading/trailing whitespace from a string.
@@ -160,7 +199,17 @@ char *ast_skip_nonblanks(char *str);
   characters from the input string, and returns a pointer to
   the resulting string. The string is modified in place.
 */
+#ifdef LOW_MEMORY
 char *ast_strip(char *s);
+#else
+static inline char *ast_strip(char *s)
+{
+	s = ast_skip_blanks(s);
+	if (s)
+		ast_trim_blanks(s);
+	return s;
+} 
+#endif
 
 /*!
   \brief Strip leading/trailing whitespace and quotes from a string.
diff --git a/utils.c b/utils.c
index 776853816aa3a9f8a89db6772d750333819d8f96..d8bd34f21bd03985f5fc018a2002909ca3ca627c 100755
--- a/utils.c
+++ b/utils.c
@@ -37,6 +37,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 static char base64[64];
 static char b2a[256];
 
+#ifdef LOW_MEMORY
 char *ast_skip_blanks(char *str)
 {
 	while (*str && *str < 33)
@@ -48,13 +49,18 @@ char *ast_trim_blanks(char *str)
 {
 	char *work = str;
 
-	if (work && !ast_strlen_zero(work)) {
+	if (work) {
 		work += strlen(work) - 1;
-		while ((work >= str) && *work && *work < 33)
-			work--;
-		*(++work) = '\0'; /* terminate string */
+		/* It's tempting to only want to erase after we exit this loop, 
+		   but since ast_trim_blanks *could* receive a constant string
+		   (which we presumably wouldn't have to touch), we shouldn't
+		   actually set anything unless we must, and it's easier just
+		   to set each position to \0 than to keep track of a variable
+		   for it */
+		while ((work >= str) && *work < 33)
+			*(work--) = '\0';
 	}
-	return work;
+	return str;
 }
 
 char *ast_skip_nonblanks(char *str)
@@ -71,6 +77,7 @@ char *ast_strip(char *s)
 		ast_trim_blanks(s);
 	return s;
 } 
+#endif
 
 char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
 {