diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 60fa59e..7fefb99 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -206,13 +206,12 @@ make_list = stringfilter(make_list)
 
 def slugify(value):
     """
-    Normalizes string, converts to lowercase, removes non-alpha characters,
-    and converts spaces to hyphens.
+    Converts to lowercase, removes non-word characters (alphanumerics and
+    underscores) and converts spaces to hyphens. Also strips leading and
+    trailing whitespace.
     """
-    import unicodedata
-    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
-    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
-    return mark_safe(re.sub('[-\s]+', '-', value))
+    from django.utils.text import slugify
+    return slugify(value)
 slugify.is_safe = True
 slugify = stringfilter(slugify)
 
@@ -441,13 +440,8 @@ safeseq.is_safe = True
 
 def removetags(value, tags):
     """Removes a space separated list of [X]HTML tags from the output."""
-    tags = [re.escape(tag) for tag in tags.split()]
-    tags_re = u'(%s)' % u'|'.join(tags)
-    starttag_re = re.compile(ur'<%s(/?>|(\s+[^>]*>))' % tags_re, re.U)
-    endtag_re = re.compile(u'</%s>' % tags_re)
-    value = starttag_re.sub(u'', value)
-    value = endtag_re.sub(u'', value)
-    return value
+    from django.utils.html import remove_tags
+    return remove_tags(value, tags)
 removetags.is_safe = True
 removetags = stringfilter(removetags)
 
diff --git a/django/utils/html.py b/django/utils/html.py
index 7fda015..5f90c67 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -84,6 +84,17 @@ def strip_tags(value):
     return re.sub(r'<[^>]*?>', '', force_unicode(value))
 strip_tags = allow_lazy(strip_tags)
 
+def remove_tags(html, tags):
+    """Returns the given HTML with given tags removed."""
+    tags = [re.escape(tag) for tag in tags.split()]
+    tags_re = u'(%s)' % u'|'.join(tags)
+    starttag_re = re.compile(ur'<%s(/?>|(\s+[^>]*>))' % tags_re, re.U)
+    endtag_re = re.compile(u'</%s>' % tags_re)
+    html = starttag_re.sub(u'', html)
+    html = endtag_re.sub(u'', html)
+    return html
+remove_tags = allow_lazy(remove_tags, unicode)
+
 def strip_spaces_between_tags(value):
     """Returns the given HTML with spaces between tags removed."""
     return re.sub(r'>\s+<', '><', force_unicode(value))
diff --git a/django/utils/text.py b/django/utils/text.py
index 00c999c..3134928 100644
--- a/django/utils/text.py
+++ b/django/utils/text.py
@@ -1,7 +1,11 @@
 import re
+import unicodedata
+
 from django.utils.encoding import force_unicode
 from django.utils.functional import allow_lazy
 from django.utils.translation import ugettext_lazy, ugettext as _
+from django.utils.safestring import mark_safe
+
 from htmlentitydefs import name2codepoint
 
 # Capitalizes the first letter of a string.
@@ -283,3 +287,14 @@ def unescape_string_literal(s):
     quote = s[0]
     return s[1:-1].replace(r'\%s' % quote, quote).replace(r'\\', '\\')
 unescape_string_literal = allow_lazy(unescape_string_literal)
+
+def slugify(value):
+    """
+    Converts to lowercase, removes non-word characters (alphanumerics and
+    underscores) and converts spaces to hyphens. Also strips leading and
+    trailing whitespace.
+    """
+    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
+    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
+    return mark_safe(re.sub('[-\s]+', '-', value))
+slugify = allow_lazy(slugify, unicode)
diff --git a/tests/regressiontests/utils/html.py b/tests/regressiontests/utils/html.py
index d8b9bde..805835d 100644
--- a/tests/regressiontests/utils/html.py
+++ b/tests/regressiontests/utils/html.py
@@ -133,3 +133,12 @@ class TestUtilsHtml(unittest.TestCase):
         )
         for value, output in items:
             self.check_output(f, value, output)
+
+    def test_remove_tags(self):
+        f = html.remove_tags
+        items = (
+            ("<b><i>Yes</i></b>", "b i", "Yes"),
+            ("<a>x</a> <p><b>y</b></p>", "a b", "x <p>y</p>"),
+        )
+        for value, tags, output in items:
+            self.assertEquals(f(value, tags), output)
diff --git a/tests/regressiontests/utils/text.py b/tests/regressiontests/utils/text.py
index f565d87..8ca9dca 100644
--- a/tests/regressiontests/utils/text.py
+++ b/tests/regressiontests/utils/text.py
@@ -38,3 +38,11 @@ class TestUtilsText(unittest.TestCase):
         self.assertEqual(text.wrap(long_word, 20), long_word)
         self.assertEqual(text.wrap('a %s word' % long_word, 10),
                          u'a\n%s\nword' % long_word)
+
+    def test_slugify(self):
+        items = (
+            (u'Hello, World!', 'hello-world'),
+            (u'spam & eggs', 'spam-eggs'),
+        )
+        for value, output in items:
+            self.assertEqual(text.slugify(value), output)
