diff --git a/ftyperc b/ftyperc
index 9d85be2..700b472 100644
--- a/ftyperc
+++ b/ftyperc
@@ -866,6 +866,15 @@
*.erb
-syntax erb
- .html.erb
+ ERB within HTML
*.html.erb
-syntax htmlerb
+
+ Haml
+*.haml
+-syntax haml
+-istep 2
+-indentc 32
+-autoindent
+-smarthome
+-smartbacks
diff --git a/haml.jsf b/haml.jsf
new file mode 100644
index 0000000..96ee0c1
--- /dev/null
+++ b/haml.jsf
@@ -0,0 +1,115 @@
+# JOE syntax highlight file for Haml
+
+=Idle
+=Comment green
+=Constant cyan
+=Escape bold cyan
+=Bad bold red
+=Brace magenta
+
+=Tag fg_310
+=Class yellow
+=Id green
+=Doctype bold magenta
+=Filter blue
+
+:line_start Idle
+ * idle noeat
+ # eat indent
+ " " line_start
+ "\\" escape_first recolor=-1
+ "!" doctype1
+ "%" tag recolor=-1
+ # implicit
+ ".#" after_tag noeat
+ "/" html_comment recolor=-1
+ ":" filter recolor=-1
+
+:escape_first Constant
+ * idle
+
+:idle Constant
+ * idle
+ "\n" line_start
+ "=~-" ruby_call noeat
+ "&!" maybe_esc_ruby_call
+ "#" maybe_subst
+ "\\" maybe_subst_escape
+
+:doctype1 Idle
+ * idle recolor=-2
+ "=" esc_ruby_call recolor=-2
+ "!" doctype2
+
+:doctype2 Idle
+ * idle recolor=-3
+ "!" doctype3 recolor=-3
+
+:doctype3 Doctype
+ * doctype3
+ "\n" line_start
+
+:tag Tag
+ * idle noeat
+ "a-zA-Z0-9_-" tag
+ ".#{(/" after_tag noeat
+
+:after_tag Idle
+ * idle noeat
+ "." class recolor=-1
+ "#" id recolor=-1
+ "{" attrA
+ "(" attrB
+ "/" tag_close recolor=-1
+
+:class Class
+ * after_tag noeat
+ "a-zA-Z0-9_-" class
+
+:id Id
+ * after_tag noeat
+ "a-zA-Z0-9_-" id
+
+:attrA Idle
+ * attrA
+ "}" after_tag
+
+:attrB Idle
+ * attrB
+ ")" after_tag
+
+:tag_close Tag
+ * idle noeat
+
+:html_comment Comment
+ * html_comment
+ "\n" line_start
+
+:ruby_call Idle
+ * line_start call=ruby.ruby(haml)
+
+:maybe_esc_ruby_call Constant
+ * idle
+ "=" esc_ruby_call recolor=-2
+
+:esc_ruby_call Idle
+ * line_start call=ruby.ruby(haml)
+ "=" esc_ruby_call2
+
+:esc_ruby_call2 Idle
+ * line_start call=ruby.ruby(haml)
+
+:maybe_subst Constant
+ * idle
+ "{" subst recolor=-2
+
+:subst Escape
+ * subst
+ "}" idle
+
+:maybe_subst_escape Constant
+ * idle
+
+:filter Filter
+ * idle
+ "a-zA-Z0-9_" filter
diff --git a/ruby.jsf b/ruby.jsf
index 2b671e0..4b78454 100644
--- a/ruby.jsf
+++ b/ruby.jsf
@@ -40,7 +40,11 @@
:rest Idle
* rest
"#" line_comment recolor=-1
+.ifdef haml
+ "\n" NULL return
+.else
"\n" idle
+.endif
"{}" brace recolor=-1
"0" first_digit recolor=-1
"1-9" decimal recolor=-1
@@ -183,7 +187,11 @@ done
.endif
# might be TODO label
"BFHNTX" line_comment noeat call=.comment_todo()
+.ifdef haml
+ "\n" NULL return
+.else
"\n" idle
+.endif
:line_comment_maybe_erb_end Comment
">" NULL recolor=-2 return