diff --git a/setup/doctype/email_digest/__init__.py b/setup/doctype/email_digest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/setup/doctype/email_digest/__init__.py
diff --git a/setup/doctype/email_digest/email_digest.coffee b/setup/doctype/email_digest/email_digest.coffee
new file mode 100644
index 0000000..d6f5002
--- /dev/null
+++ b/setup/doctype/email_digest/email_digest.coffee
@@ -0,0 +1,71 @@
+content_items = ['Sales','Expenses','Bank Balance','Activity']
+freq = ['Daily', 'Weekly']
+
+# make a grid with items and columns of checkboxes
+# Parameters:
+# 	label (main heading)
+#	items = [] (rows)
+#	columns = [] (columns of checks)
+
+class CheckGrid
+	constructor: (@parent, @label, @items, @columns) ->
+		@tab = make_table @parent, @items.length + 1, @columns.length + 1, '80%'
+		@checks = {}
+
+		# render heads
+		for i in [0..@columns.length-1]
+			$td(@tab, 0, i+1).innerHTML = @columns[i]
+		
+		# render rows
+		for i in [0..@items.length-1]
+			$td(@tab, i+1, 0).innerHTML = @items[i]
+			
+			# render checkboxes for this row
+			@checks[@items[i]] = {}
+			for c in [0..@columns.length-1]
+				check = $a_input $td(@tab, i+1, c+1), 'checkbox'
+				
+				# tag keys to checkbox
+				check.item = @items[i]
+				check.column = @columns[c]
+				
+				# add in my checks
+				@checks[@items[i]][@columns[c]] = check
+	
+	# get the values of the checkbox in a double dict
+	get: =>
+		val = {}
+		for item in keys @checks
+			for column in keys @checks[item]
+				check = @checks[item][column]
+				if not val[check.item]
+					val[check.item] = {}
+				val[check.item][check.column] = if check.checked then 1 else 0
+		val
+	
+	# set the values of the grid
+	set: (val) =>
+		for item in keys @checks
+			for column in keys @checks[item]
+				check = @checks[item][column] 
+				check.checked = val[check.item][check.row]
+
+# attach it to onload
+cx = cur_frm.cscript
+cx.onload = (doc, dt, dn) ->
+
+	# make the content grid
+	cx.content_grid = new CheckGrid cur_frm.fields_dict.Body.wrapper, 'Email Settings',
+		content_items, freq
+
+	# make the email grid
+	cx.email_grid = new CheckGrid cur_frm.fields_dict.Body.wrapper, 'Send To',
+		['test1@erpnext', 'test2@erpnext'], freq
+
+# update the data before sending
+cx.validate = (doc, dt, dn) ->
+	doc.content_config = JSON.stringify cx.content_grid.get()
+	doc.email_config = JSON.stringify cx.email_grid.get()
+
+	
+		
\ No newline at end of file
diff --git a/setup/doctype/email_digest/email_digest.js b/setup/doctype/email_digest/email_digest.js
new file mode 100644
index 0000000..77d11e6
--- /dev/null
+++ b/setup/doctype/email_digest/email_digest.js
@@ -0,0 +1,80 @@
+(function() {
+  var CheckGrid, content_items, cx, freq;
+  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+  content_items = ['Sales', 'Expenses', 'Bank Balance', 'Activity'];
+  freq = ['Daily', 'Weekly'];
+  CheckGrid = (function() {
+    function CheckGrid(parent, label, items, columns) {
+      var c, check, i, _ref, _ref2, _ref3;
+      this.parent = parent;
+      this.label = label;
+      this.items = items;
+      this.columns = columns;
+      this.set = __bind(this.set, this);
+      this.get = __bind(this.get, this);
+      this.tab = make_table(this.parent, this.items.length + 1, this.columns.length + 1, '80%');
+      this.checks = {};
+      for (i = 0, _ref = this.columns.length - 1; 0 <= _ref ? i <= _ref : i >= _ref; 0 <= _ref ? i++ : i--) {
+        $td(this.tab, 0, i + 1).innerHTML = this.columns[i];
+      }
+      for (i = 0, _ref2 = this.items.length - 1; 0 <= _ref2 ? i <= _ref2 : i >= _ref2; 0 <= _ref2 ? i++ : i--) {
+        $td(this.tab, i + 1, 0).innerHTML = this.items[i];
+        this.checks[this.items[i]] = {};
+        for (c = 0, _ref3 = this.columns.length - 1; 0 <= _ref3 ? c <= _ref3 : c >= _ref3; 0 <= _ref3 ? c++ : c--) {
+          check = $a_input($td(this.tab, i + 1, c + 1), 'checkbox');
+          check.item = this.items[i];
+          check.column = this.columns[c];
+          this.checks[this.items[i]][this.columns[c]] = check;
+        }
+      }
+    }
+    CheckGrid.prototype.get = function() {
+      var check, column, item, val, _i, _j, _len, _len2, _ref, _ref2;
+      val = {};
+      _ref = keys(this.checks);
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        item = _ref[_i];
+        _ref2 = keys(this.checks[item]);
+        for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+          column = _ref2[_j];
+          check = this.checks[item][column];
+          if (!val[check.item]) {
+            val[check.item] = {};
+          }
+          val[check.item][check.column] = check.checked ? 1 : 0;
+        }
+      }
+      return val;
+    };
+    CheckGrid.prototype.set = function(val) {
+      var check, column, item, _i, _len, _ref, _results;
+      _ref = keys(this.checks);
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        item = _ref[_i];
+        _results.push((function() {
+          var _j, _len2, _ref2, _results2;
+          _ref2 = keys(this.checks[item]);
+          _results2 = [];
+          for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
+            column = _ref2[_j];
+            check = this.checks[item][column];
+            _results2.push(check.checked = val[check.item][check.row]);
+          }
+          return _results2;
+        }).call(this));
+      }
+      return _results;
+    };
+    return CheckGrid;
+  })();
+  cx = cur_frm.cscript;
+  cx.onload = function(doc, dt, dn) {
+    cx.content_grid = new CheckGrid(cur_frm.fields_dict.Body.wrapper, 'Email Settings', content_items, freq);
+    return cx.email_grid = new CheckGrid(cur_frm.fields_dict.Body.wrapper, 'Send To', ['test1@erpnext', 'test2@erpnext'], freq);
+  };
+  cx.validate = function(doc, dt, dn) {
+    doc.content_config = JSON.stringify(cx.content_grid.get());
+    return doc.email_config = JSON.stringify(cx.email_grid.get());
+  };
+}).call(this);
diff --git a/setup/doctype/email_digest/email_digest.txt b/setup/doctype/email_digest/email_digest.txt
new file mode 100644
index 0000000..4258f84
--- /dev/null
+++ b/setup/doctype/email_digest/email_digest.txt
@@ -0,0 +1,87 @@
+# DocType, Email Digest
+[
+
+	# These values are common in all dictionaries
+	{
+		'creation': '2011-07-27 14:23:09',
+		'docstatus': 0,
+		'modified': '2011-07-27 15:22:11',
+		'modified_by': 'Administrator',
+		'owner': 'Administrator'
+	},
+
+	# These values are common for all DocType
+	{
+		'_last_update': '1311759390',
+		'colour': 'White:FFF',
+		'doctype': 'DocType',
+		'issingle': 1,
+		'module': 'Setup',
+		'name': '__common__',
+		'section_style': 'Simple',
+		'show_in_menu': 0,
+		'version': 3
+	},
+
+	# These values are common for all DocField
+	{
+		'doctype': 'DocField',
+		'name': '__common__',
+		'parent': 'Email Digest',
+		'parentfield': 'fields',
+		'parenttype': 'DocType',
+		'permlevel': 0
+	},
+
+	# These values are common for all DocPerm
+	{
+		'create': 1,
+		'doctype': 'DocPerm',
+		'idx': 1,
+		'name': '__common__',
+		'parent': 'Email Digest',
+		'parentfield': 'permissions',
+		'parenttype': 'DocType',
+		'permlevel': 0,
+		'read': 1,
+		'role': 'Administrator',
+		'write': 1
+	},
+
+	# DocType, Email Digest
+	{
+		'doctype': 'DocType',
+		'name': 'Email Digest'
+	},
+
+	# DocPerm
+	{
+		'doctype': 'DocPerm'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldtype': 'HTML',
+		'idx': 1,
+		'label': 'Body'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'content_config',
+		'fieldtype': 'Text',
+		'idx': 2,
+		'label': 'Content Config'
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'email_config',
+		'fieldtype': 'Text',
+		'idx': 3,
+		'label': 'Email Config'
+	}
+]
\ No newline at end of file
