diff --git a/src/main/scala/net/ceedubs/ficus/readers/namemappers/HyphenNameMapperNoDigits.scala b/src/main/scala/net/ceedubs/ficus/readers/namemappers/HyphenNameMapperNoDigits.scala
new file mode 100644
index 0000000..2823c61
--- /dev/null
+++ b/src/main/scala/net/ceedubs/ficus/readers/namemappers/HyphenNameMapperNoDigits.scala
@@ -0,0 +1,11 @@
+package net.ceedubs.ficus.readers.namemappers
+
+import net.ceedubs.ficus.readers.NameMapper
+
+object HyphenNameMapperNoDigits extends NameMapper {
+  private lazy val r = "((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))".r
+
+  /** Maps from a camelCasedName to a hyphenated-name
+    */
+  override def map(name: String): String = r.replaceAllIn(name, m => s"-${m.group(1)}").toLowerCase
+}
diff --git a/src/main/scala/net/ceedubs/ficus/readers/namemappers/package.scala b/src/main/scala/net/ceedubs/ficus/readers/namemappers/package.scala
index f1a134c..d740f63 100644
--- a/src/main/scala/net/ceedubs/ficus/readers/namemappers/package.scala
+++ b/src/main/scala/net/ceedubs/ficus/readers/namemappers/package.scala
@@ -2,6 +2,7 @@ package net.ceedubs.ficus.readers
 
 package object namemappers {
   object implicits {
-    implicit val hyphenCase: NameMapper = HyphenNameMapper
+    implicit val hyphenCase: NameMapper         = HyphenNameMapper
+    implicit val hyphenCaseNoDigits: NameMapper = HyphenNameMapperNoDigits
   }
 }
diff --git a/src/test/scala/net/ceedubs/ficus/readers/HyphenNameMapperNoDigitsSpec.scala b/src/test/scala/net/ceedubs/ficus/readers/HyphenNameMapperNoDigitsSpec.scala
new file mode 100644
index 0000000..402bef4
--- /dev/null
+++ b/src/test/scala/net/ceedubs/ficus/readers/HyphenNameMapperNoDigitsSpec.scala
@@ -0,0 +1,35 @@
+package net.ceedubs.ficus.readers
+
+import net.ceedubs.ficus.Spec
+import net.ceedubs.ficus.readers.namemappers.{HyphenNameMapper, HyphenNameMapperNoDigits}
+import org.scalacheck.Arbitrary
+import org.scalacheck.Gen._
+import org.specs2.matcher.DataTables
+
+class HyphenNameMapperNoDigitsSpec extends Spec with DataTables {
+  def is = s2"""
+  A HyphenNameMapper should
+    hyphenate a camelCased name $hyphenateCorrectly
+    hyphenate a camelCased name containing digits without hyphen before digit $hyphenateWithDigits
+  """
+
+  def nonemptyStringListGen = nonEmptyListOf(alphaStr.suchThat(_.length > 1).map(_.toLowerCase))
+
+  implicit def nonemptyStringList = Arbitrary(nonemptyStringListGen)
+
+  def hyphenateCorrectly = prop { foos: List[String] =>
+    val camelCased = (foos.head +: foos.tail.map(_.capitalize)).mkString
+    val hyphenated = foos.mkString("-").toLowerCase
+
+    HyphenNameMapper.map(camelCased) must_== hyphenated
+  }
+
+  def hyphenateWithDigits =
+    "camelCased" || "hyphenated" |>
+      "camelCasedName67" !! "camel-cased-name67" |
+      "1144StartsWithA32422" !! "1144-starts-with-a32422" |
+      "get13HTML42Snippets" !! "get13-html42-snippets" |
+      "thisOneIs13InThe43Middle" !! "this-one-is13-in-the43-middle" | { (camelCased, hyphenated) =>
+        HyphenNameMapperNoDigits.map(camelCased) must_== hyphenated
+      }
+}