=== modified file 'django/template/defaultfilters.py'
--- django/template/defaultfilters.py	2007-09-05 20:01:24 +0000
+++ django/template/defaultfilters.py	2007-09-13 16:38:44 +0000
@@ -172,6 +172,17 @@
     return truncate_html_words(value, length)
 truncatewords_html = stringfilter(truncatewords_html)
 
+def uncapfirst(value):
+    "Uncapitalizes the first character of the value"
+    if len(value) > 1:
+        if value[1].islower():
+            return value[0].lower() + value[1:]
+        else:
+            return value
+    else:
+        return value.lower()
+uncapfirst = stringfilter(uncapfirst)
+
 def upper(value):
     "Converts a string into all uppercase"
     return value.upper()
@@ -649,6 +660,7 @@
 register.filter(title)
 register.filter(truncatewords)
 register.filter(truncatewords_html)
+register.filter(uncapfirst)
 register.filter(unordered_list)
 register.filter(upper)
 register.filter(urlencode)

=== modified file 'django/utils/text.py'
--- django/utils/text.py	2007-08-17 15:05:54 +0000
+++ django/utils/text.py	2007-09-13 16:38:44 +0000
@@ -8,6 +8,18 @@
 capfirst = lambda x: x and force_unicode(x)[0].upper() + force_unicode(x)[1:]
 capfirst = allow_lazy(capfirst, unicode)
 
+# Uncapitalizes the first letter of a string.
+def uncapfirst(x):
+    x = force_unicode(x)
+    if len(x) > 1:
+        if x[1].islower():
+            return x[0].lower() + x[1:]
+        else:
+            return x
+    else:
+        return x.lower()
+uncapfirst = allow_lazy(uncapfirst, unicode)
+
 def wrap(text, width):
     """
     A word-wrap function that preserves existing line breaks and most spaces in

