diff --git a/.gitignore b/.gitignore
index ff96dc53d3fffe2582853ee0c18a82dff9706204..6dd547343daa34feb66dd0003aeb75b9d4a82875 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@
 .DS_Store
 Thumbs.db
 /locale
+/resources/email_templates/email-test.html
\ No newline at end of file
diff --git a/bin/dbwriter b/bin/dbwriter
index 1ff1cf5872e2c6c52f7f73c223f9090d988ff168..5b7ed61dcd9f8e8fc5ffa24782da661ad15ad60c 100755
--- a/bin/dbwriter
+++ b/bin/dbwriter
@@ -16,7 +16,20 @@ db = require('../lib/db.js'),
 config = require('../lib/configuration.js'),
 heartbeat = require('../lib/heartbeat.js'),
 logger = require('../lib/logging.js').logger,
-shutdown = require('../lib/shutdown');
+shutdown = require('../lib/shutdown'),
+cachify = require('connect-cachify'),
+assets = require('../lib/static_resources').all;
+
+// dbwriter needs cachify to properly render emails with cachified URLs,
+// but it serves no cachified content, so it's not necc to register it as
+// a handler of any sort.
+cachify.setup(
+  assets(config.get('supported_languages')),
+  {
+    prefix: config.get('cachify_prefix'),
+    production: config.get('use_minified_resources'),
+    root: path.join(__dirname, "..", "resources", "static")
+  });
 
 var app = undefined;
 
diff --git a/lib/email.js b/lib/email.js
index 13d24ffbb45147cbf63c130d6dc1d111d9e5b897..31615a2fbe8061e0d72e11ded137b2edcc06e2bb 100644
--- a/lib/email.js
+++ b/lib/email.js
@@ -28,35 +28,41 @@ if (smtp_params && smtp_params.host) {
   }
 }
 
-const TEMPLATE_PATH = path.join(__dirname, "static", "email_templates");
+const TEMPLATE_PATH = path.join(__dirname, "..", "resources", "email_templates");
 
-// the underbar decorator to allow getext to extract strings 
+// the underbar decorator to allow getext to extract strings
 function _(str) { return str; }
 
 // a map of all the different emails we send
 const templates = {
   "new": {
     landing: 'verify_email_address',
-    subject: _("Confirm email address for Persona"), 
+    subject: _("Confirm email address for Persona"),
     template: fs.readFileSync(path.join(TEMPLATE_PATH, 'new.ejs')),
+    templateHTML: fs.readFileSync(path.join(TEMPLATE_PATH, 'new.html.ejs'))
   },
   "reset": {
     landing: 'reset_password',
     subject: _("Reset Persona password"), 
     template: fs.readFileSync(path.join(TEMPLATE_PATH, 'reset.ejs')),
+    templateHTML: fs.readFileSync(path.join(TEMPLATE_PATH, 'reset.html.ejs'))
   },
   "confirm": {
     landing: 'confirm',
     subject: _("Confirm email address for Persona"), 
     template: fs.readFileSync(path.join(TEMPLATE_PATH, 'confirm.ejs')),
+    templateHTML: fs.readFileSync(path.join(TEMPLATE_PATH, 'confirm.html.ejs'))
   }
 };
 
 // now turn file contents into compiled templates
 Object.keys(templates).forEach(function(type) {
   templates[type].template = ejs.compile(templates[type].template.toString());
+  if (templates[type].templateHTML) {
+    templates[type].templateHTML = ejs.compile(templates[type].templateHTML.toString());
+  }
 });
-    
+
 
 var interceptor = undefined;
 
@@ -94,19 +100,27 @@ function doSend(email_type, email, site, secret, langContext) {
     // log verification email to console separated by whitespace.
     console.log("\nVERIFICATION URL:\n" + public_url + "\n");
   } else {
-    emailer.send_mail({
+    var templateArgs = {
+      link: public_url,
+      site: site,
+      gettext: GETTEXT,
+      format: format
+    };
+
+    var mailOpts = {
       // XXX: Ideally this would be a live email address and a response to these email
       // addresses would go into a ticketing system (lloyd/skinny)
       sender: "Persona <no-reply@persona.org>",
       to: email,
       subject: GETTEXT(email_params.subject),
-      body: email_params.template({
-        link: public_url,
-        site: site,
-        gettext: GETTEXT,
-        format: format
-      })
-    }, function(err, success){
+      text: email_params.template(templateArgs)
+    };
+
+    if (email_params.templateHTML) {
+      mailOpts.html = email_params.templateHTML(templateArgs);
+    }
+
+    emailer.send_mail(mailOpts, function(err, success) {
       if (!success) {
         logger.error("error sending email to: " + email + " - " + err);
       }
diff --git a/package.json b/package.json
index 8c79cee69d1cfc0b31f18819db2833459e945e99..afc01b09cfacc0d52e85e3ab07fa69f9e7369583 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
         "mustache": "0.3.1-dev",
         "jwcrypto": "https://github.com/mozilla/jwcrypto/tarball/2012-07-new-data-formats",
         "mysql": "0.9.5",
-        "nodemailer": "0.1.24",
+        "nodemailer": "0.3.21",
         "mkdirp": "0.3.0",
         "optimist": "0.2.8",
         "postprocess": "0.2.4",
diff --git a/lib/static/email_templates/new.ejs b/resources/email_templates/confirm.ejs
similarity index 100%
rename from lib/static/email_templates/new.ejs
rename to resources/email_templates/confirm.ejs
diff --git a/resources/email_templates/confirm.html.ejs b/resources/email_templates/confirm.html.ejs
new file mode 100644
index 0000000000000000000000000000000000000000..0a6d93edaa5c4e3940eabb3c7933d86f7919730b
--- /dev/null
+++ b/resources/email_templates/confirm.html.ejs
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <title>Persona</title>
+        <style type="text/css">
+            #outlook a{padding:0;} /* Force Outlook to provide a "view in browser" button. */
+            body{width:100% !important;} .ReadMsgBody{width:100%;} .ExternalClass{width:100%;} /* Force Hotmail to display emails at full width */
+            body{-webkit-text-size-adjust:none;} /* Prevent Webkit platforms from changing default text sizes. */
+
+            body{
+              background: #45505b;
+              margin:0;
+              padding:0;
+              width:100% !important;
+              -webkit-text-size-adjust:none;
+              font-family: Helvetica, Arial, sans-serif;
+              font-size: 14px;
+              color: #424f5a;
+            }
+            img{
+              border:0;
+              height:auto;
+              line-height:100%;
+              outline:none;
+              text-decoration:none;
+            }
+            a{
+              color: #3b9bda;
+              text-decoration: none;
+            }
+            a:hover{
+              text-decoration: underline;
+            }
+            p{
+              margin: 0 0 15px;
+              line-height: 1.5;
+            }
+
+            h2{
+              font-size: 18px;
+              margin: 20px 0 15px;
+            }
+
+            p:last-child{
+              margin-bottom: 0;
+            }
+            table td{
+              border-collapse:collapse;
+            }
+        </style>
+  </head>
+  <body style="-webkit-text-size-adjust: none;margin: 0;padding: 0;background-color: #45505b;width: 100% !important;">
+    <center>
+    <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
+      <tr style="margin: 0;
+        padding: 0;
+        height: 100% !important;
+        width: 100% !important; 
+        background: #45505b;
+        -webkit-text-size-adjust:none;
+        font-family: Helvetica, Arial, sans-serif;
+        font-size: 14px;
+        color: #424f5a;">
+        <td align="center" valign="top" style="border-collapse: collapse;">
+          
+
+                <table border="0" cellpadding="0" cellspacing="0" width="90%">
+                  <tr class="spacer">
+                    <td height="30px"></td>
+                  </tr>
+                  <tr>
+                    <td align="left" valign="top" style="border-collapse: collapse;">
+                      <img src="<%= cachify('/pages/i/persona-logo-wordmark.png') %>" alt="Mozilla Persona" />
+                    </td>
+                  </tr>
+                  <tr class="spacer">
+                    <td height="30px"></td>
+                  </tr>
+                </table><!-- #header -->
+                <table id="content" border="0" cellpadding="0" cellspacing="0" width="90%" style="background-color: #fff; border-radius: 3px; margin-bottom: 60px;">
+                  <tr>
+                    <td align="left" valign="top" class="email-content" style="border-collapse: collapse; padding: 30px;">
+                      <p><%= gettext('Thank you for using Persona.') %></p>
+
+                      <p><a href="<%= link %>" style="color: #3b9bda; font-weight: bold;"><%= format(gettext('Click to confirm this email address and automatically sign in to %s'), [site]) %>.</a></p>
+
+                      <p><%= gettext('Note: If you are NOT trying to sign into this website, please ignore this email.') %></p>
+
+                      <p><%= gettext('Thank you,') %><br />
+                      <%= gettext('The Persona team') %></p>
+                    </td>
+                  </tr>
+                </table><!-- #content -->
+              
+
+        </td>
+      </tr>
+    </table><!-- #container table -->
+    </center>
+
+  </body>
+</html>
\ No newline at end of file
diff --git a/lib/static/email_templates/confirm.ejs b/resources/email_templates/new.ejs
similarity index 100%
rename from lib/static/email_templates/confirm.ejs
rename to resources/email_templates/new.ejs
diff --git a/resources/email_templates/new.html.ejs b/resources/email_templates/new.html.ejs
new file mode 100644
index 0000000000000000000000000000000000000000..33f604e48f3d019068479fc441054c0ed63c5588
--- /dev/null
+++ b/resources/email_templates/new.html.ejs
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <title>Persona</title>
+        <style type="text/css">
+            #outlook a{padding:0;} /* Force Outlook to provide a "view in browser" button. */
+            body{width:100% !important;} .ReadMsgBody{width:100%;} .ExternalClass{width:100%;} /* Force Hotmail to display emails at full width */
+            body{-webkit-text-size-adjust:none;} /* Prevent Webkit platforms from changing default text sizes. */
+
+            body{
+              background: #45505b;
+              margin:0;
+              padding:0;
+              width:100% !important;
+              -webkit-text-size-adjust:none;
+              font-family: Helvetica, Arial, sans-serif;
+              font-size: 14px;
+              color: #424f5a;
+            }
+            img{
+              border:0;
+              height:auto;
+              line-height:100%;
+              outline:none;
+              text-decoration:none;
+            }
+            a{
+              color: #3b9bda;
+              text-decoration: none;
+            }
+            a:hover{
+              text-decoration: underline;
+            }
+            p{
+              margin: 0 0 15px;
+              line-height: 1.5;
+            }
+
+            h2{
+              font-size: 18px;
+              margin: 20px 0 15px;
+            }
+
+            p:last-child{
+              margin-bottom: 0;
+            }
+            table td{
+              border-collapse:collapse;
+            }
+        </style>
+  </head>
+  <body style="-webkit-text-size-adjust: none;margin: 0;padding: 0;background-color: #45505b;width: 100% !important;">
+    <center>
+    <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
+      <tr style="margin: 0;
+        padding: 0;
+        height: 100% !important;
+        width: 100% !important; 
+        background: #45505b;
+        -webkit-text-size-adjust:none;
+        font-family: Helvetica, Arial, sans-serif;
+        font-size: 14px;
+        color: #424f5a;">
+        <td align="center" valign="top" style="border-collapse: collapse;">
+          
+
+                <table border="0" cellpadding="0" cellspacing="0" width="90%">
+                  <tr class="spacer">
+                    <td height="30px"></td>
+                  </tr>
+                  <tr>
+                    <td align="left" valign="top" style="border-collapse: collapse;">
+                      <img src="<%= cachify('/pages/i/persona-logo-wordmark.png') %>" alt="Mozilla Persona" />
+                    </td>
+                  </tr>
+                  <tr class="spacer">
+                    <td height="30px"></td>
+                  </tr>
+                </table><!-- #header -->
+                <table border="0" cellpadding="0" cellspacing="0" width="600" style="background-color: #fff; border-radius: 3px; margin-bottom: 60px;">
+                  <tr>
+                    <td align="left" valign="top" class="email-content" style="border-collapse: collapse;  padding: 30px;">
+                        <p><%= gettext('Thank you for using Persona.') %></p>
+
+                      <p><a href="<%= link %>" style="color: #3b9bda; font-weight: bold;"><%= format(gettext('Click to confirm this email address and automatically sign in to %s'), [site]) %>.</a></p>
+
+                      <p><%= gettext('Note: If you are NOT trying to sign into this website, please ignore this email.') %></p>
+
+                      <p><%= gettext('Thank you,') %><br />
+                      <%= gettext('The Persona team') %></p>
+                    </td>
+                  </tr>
+                </table><!-- #content -->
+              
+
+        </td>
+      </tr>
+    </table><!-- #container table -->
+    </center>
+
+  </body>
+</html>
\ No newline at end of file
diff --git a/lib/static/email_templates/reset.ejs b/resources/email_templates/reset.ejs
similarity index 100%
rename from lib/static/email_templates/reset.ejs
rename to resources/email_templates/reset.ejs
diff --git a/resources/email_templates/reset.html.ejs b/resources/email_templates/reset.html.ejs
new file mode 100644
index 0000000000000000000000000000000000000000..c505dcaec2612efc48ec06da130eaa69d1b3b788
--- /dev/null
+++ b/resources/email_templates/reset.html.ejs
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <title>Persona</title>
+        <style type="text/css">
+            #outlook a{padding:0;} /* Force Outlook to provide a "view in browser" button. */
+            body{width:100% !important;} .ReadMsgBody{width:100%;} .ExternalClass{width:100%;} /* Force Hotmail to display emails at full width */
+            body{-webkit-text-size-adjust:none;} /* Prevent Webkit platforms from changing default text sizes. */
+
+            body{
+              background: #45505b;
+              margin:0;
+              padding:0;
+              width:100% !important;
+              -webkit-text-size-adjust:none;
+              font-family: Helvetica, Arial, sans-serif;
+              font-size: 14px;
+              color: #424f5a;
+            }
+            img{
+              border:0;
+              height:auto;
+              line-height:100%;
+              outline:none;
+              text-decoration:none;
+            }
+            a{
+              color: #3b9bda;
+              text-decoration: none;
+            }
+            a:hover{
+              text-decoration: underline;
+            }
+            p{
+              margin: 0 0 15px;
+              line-height: 1.5;
+            }
+
+            h2{
+              font-size: 18px;
+              margin: 20px 0 15px;
+            }
+
+            p:last-child{
+              margin-bottom: 0;
+            }
+            table td{
+              border-collapse:collapse;
+            }
+        </style>
+  </head>
+  <body style="-webkit-text-size-adjust: none;margin: 0;padding: 0;background-color: #45505b;width: 100% !important;">
+    <center>
+    <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
+      <tr style="margin: 0;
+        padding: 0;
+        height: 100% !important;
+        width: 100% !important; 
+        background: #45505b;
+        -webkit-text-size-adjust:none;
+        font-family: Helvetica, Arial, sans-serif;
+        font-size: 14px;
+        color: #424f5a;">
+        <td align="center" valign="top" style="border-collapse: collapse;">
+          
+
+                <table border="0" cellpadding="0" cellspacing="0" width="90%">
+                  <tr class="spacer">
+                    <td height="30px"></td>
+                  </tr>
+                  <tr>
+                    <td align="left" valign="top" style="border-collapse: collapse;">
+                      <img src="<%= cachify('/pages/i/persona-logo-wordmark.png') %>" alt="Mozilla Persona" />
+                    </td>
+                  </tr>
+                  <tr class="spacer">
+                    <td height="30px"></td>
+                  </tr>
+                </table><!-- #header -->
+                <table id="content" border="0" cellpadding="0" cellspacing="0" width="90%" style="background-color: #fff; border-radius: 3px; margin-bottom: 60px;">
+                  <tr>
+                    <td align="left" valign="top" class="email-content" style="border-collapse: collapse; padding: 30px;">
+                      <p><%= gettext('Forgot your password for Persona? It happens to the best of us.') %></p>
+
+                      <p><a href="<%= link %>" style="color: #3b9bda; font-weight: bold;"><%= gettext('Click here to reset your password.') %></a></p>
+
+                      <p><%= gettext('Note: If you did NOT ask to reset your password, please ignore this email.') %></p>
+
+                      <p><%= gettext('Thank you,') %><br />
+                      <%= gettext('The Persona team') %></p>
+                    </td>
+                  </tr>
+                </table><!-- #content -->
+              
+
+        </td>
+      </tr>
+    </table><!-- #container table -->
+    </center>
+
+  </body>
+</html>
\ No newline at end of file