diff --git a/demos/server/Makefile b/demos/server/Makefile
index a293e57..a853f6a 100644
--- a/demos/server/Makefile
+++ b/demos/server/Makefile
@@ -1,6 +1,5 @@
 .PHONY: init
 init:
-	if [ ! -e sheetjs.xlsx ]; then ln -s ../../sheetjs.xlsx; fi
 	mkdir -p node_modules
 	cd node_modules; if [ ! -e xlsx ]; then ln -s ../../../ xlsx; fi; cd -
 
@@ -12,10 +11,6 @@ request: init ## request demo
 express: init ## express demo
 	node express.js
 
-.PHONY: micro
-micro: init ## micro demo
-	micro -p 7262 micro.js
-
 .PHONY: koa
 koa: init ## koa demo
 	node koa.js
diff --git a/demos/server/README.md b/demos/server/README.md
index 99308bf..a23e545 100644
--- a/demos/server/README.md
+++ b/demos/server/README.md
@@ -8,6 +8,38 @@ demo shows a few different strategies applied to different server frameworks.
 NOTE: these examples merely demonstrate the core concepts and do not include
 appropriate error checking or other production-level features.
 
+
+### Express Setup
+
+The following commands are required in order to test the [Express](https://github.com/expressjs/express) demo:
+
+```bash
+npm install express printj xlsx express-formidable
+node express.js
+```
+
+### Koa Setup
+
+The following commands are required in order to test the [Koa](https://github.com/koajs/koa) demo:
+
+```bash
+npm install koa printj formidable xlsx
+node koa.js
+``` 
+
+### Hapi Setup
+
+**Note: Hapi demo as written only works with Hapi version 16 and below.**
+
+The following commands are required in order to test the [Hapi](https://github.com/hapijs/hapi) demo:
+
+```bash
+npm install hapi@16.x printj tiny-worker xlsx
+node hapi.js
+``` 
+
+
+
 ### Node Buffer
 
 The `read` and `write` functions can handle `Buffer` data with `type:"buffer"`.
@@ -64,12 +96,12 @@ expected to handle:
 Testing with cURL is straightforward:
 
 ```bash
-# upload test.xls and update data
-curl -X POST -F "data=@test.xls" http://localhost:7262/
+# upload sheetjs.csv and update data
+curl -X POST -F "data=@sheetjs.csv" http://localhost:7262/
 # download data in SYLK format
 curl -X GET http://localhost:7262/?t=slk
-# read sheetjs.xlsx from the server directory
-curl -X POST http://localhost:7262/?f=sheetjs.xlsx
+# read sheetjs.csv from the server directory
+curl -X POST http://localhost:7262/?f=sheetjs.csv
 # write sheetjs.xlsb in the XLSB format
 curl -X GET http://localhost:7262/?f=sheetjs.xlsb
 ```
@@ -108,17 +140,6 @@ The main server script is `koa.js` and the worker script is `koasub.js`.  State
 is maintained in the worker script.
 
 
-## command-line utility with micro
-
-The npm module ships with the `xlsx` command line tool. For global installs, the
-script `bin/xlsx.njs` is added to a directory in `PATH`. For local installs, the
-appropriate script or symbolic link is set up in `node_modules/.bin/`.
-
-The `--arrays` option directs `xlsx` to generate an array of arrays that can be
-parsed by the server.  To generate files, the `json2csv` module exports the JS
-array of arrays to a CSV, the server writes the file, and the `xlsx` command is
-used to generate files of different formats.
-
 
 ## tiny-worker with hapi
 
@@ -132,12 +153,12 @@ Note: due to an issue with hapi payload parsing, the route `POST /file` is used
 to handle the case of reading from file, so the cURL test is:
 
 ```bash
-# upload test.xls and update data
-curl -X POST -F "data=@test.xls" http://localhost:7262/
+# upload sheetjs.csv and update data
+curl -X POST -F "data=@sheetjs.csv" http://localhost:7262/
 # download data in SYLK format
 curl -X GET http://localhost:7262/?t=slk
-# read sheetjs.xlsx from the server directory
-curl -X POST http://localhost:7262/file?f=sheetjs.xlsx
+# read sheetjs.csv from the server directory
+curl -X POST http://localhost:7262/file?f=sheetjs.csv
 # write sheetjs.xlsb in the XLSB format
 curl -X GET http://localhost:7262/?f=sheetjs.xlsb
 ```
diff --git a/demos/server/micro.js b/demos/server/micro.js
deleted file mode 100644
index 8163247..0000000
--- a/demos/server/micro.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */
-var fs = require('fs');
-var URL = require('url');
-var child_process = require('child_process');
-var micro = require('micro'), formidable = require('formidable');
-var logit = require('./_logit'), cors = require('./_cors');
-var json2csv = require('json2csv');
-var data = "a,b,c\n1,2,3".split("\n").map(function(x) { return x.split(","); });
-var xlsx = '../../bin/xlsx.njs';
-
-function get_data(req, res, type) {
-	var file = "_tmp." + type;
-
-	/* prepare CSV */
-	var csv = json2csv({data:data, hasCSVColumnTitle:false});
-
-	/* write it to a temp file */
-	fs.writeFile('tmp.csv', csv, function(err1) {
-
-		/* call xlsx to read the csv and write to another temp file */
-		child_process.exec(xlsx+' tmp.csv -o '+ file, function(err, stdout, stderr){
-			cors(req, res);
-			/* read the new file and send it to the client */
-			micro.send(res, 200, fs.readFileSync(file));
-		});
-	});
-}
-
-function get_file(req, res, file) {
-	var csv = json2csv({data:data, hasCSVColumnTitle:false});
-	fs.writeFile('tmp.csv', csv, function(err1) {
-		/* write to specified file */
-		child_process.exec(xlsx+' tmp.csv -o '+file, function(err, stdout, stderr) {
-			cors(req, res);
-			micro.send(res, 200, "wrote to " + file + "\n");
-		});
-	});
-}
-
-function post_data(req, res) {
-	var form = new formidable.IncomingForm();
-	form.on('file', function(field, file) {
-		/* file.path is the location of the file in the system */
-		child_process.exec(xlsx+' --arrays ' + file.path, post_cb(req, res));
-	});
-	form.parse(req);
-}
-
-function post_file(req, res, file) {
-	child_process.exec(xlsx+' --arrays ' + file, post_cb(req, res));
-}
-
-function post_cb(req, res) {
-	return function(err, stdout, stderr) {
-		cors(req, res);
-		/* xlsx --arrays writes JSON to stdout, so parse and assign to data var */
-		data = JSON.parse(stdout);
-		console.log(data);
-		return micro.send(res, 200, "ok\n");
-	};
-}
-
-function get(req, res) {
-	var url = URL.parse(req.url, true);
-	if(url.pathname.length > 1) micro.send(res, 404, "File not found");
-	else if(url.query.t) get_data(req, res, url.query.t);
-	else if(url.query.f) get_file(req, res, url.query.f);
-	else micro.send(res, 403, "Forbidden\n");
-}
-
-function post(req, res) {
-	var url = URL.parse(req.url, true);
-	if(url.pathname.length > 1) micro.send(res, 404, "File not found");
-	else if(url.query.f) post_file(req, res, url.query.f);
-	else post_data(req, res);
-}
-
-module.exports = function(req, res) {
-	logit(req, res);
-	switch(req.method) {
-		case 'GET': return get(req, res);
-		case 'POST': return post(req, res);
-	}
-	return micro.send(res, 501, "Unsupported method " + req.method + "\n");
-};
diff --git a/demos/server/node.js b/demos/server/nodejs.js
similarity index 100%
rename from demos/server/node.js
rename to demos/server/nodejs.js
diff --git a/demos/server/sheetjs.csv b/demos/server/sheetjs.csv
new file mode 100644
index 0000000..eddbf8a
--- /dev/null
+++ b/demos/server/sheetjs.csv
@@ -0,0 +1,19 @@
+Text,Number,Rich,Span
+This is Bold,123,This is Bold,This is Bold
+This is Italic,234,This is Italic,This is Italic
+This is Underline,345,This is Underline,This is Underline
+This is Stricken,456,This is Stricken,This is Stricken
+This is 18 px,567,This is 18 px,This is 18 px
+This is superscript,678,This is superscript,This is superscript
+This is subscript,789,This is subscript,This is subscript
+This is red,135,This is red,This is red
+This is green,246,This is green,This is green
+This is Times,357,This is Times,This is Times
+This is BIU,159,This is 01324576 yes,This is BIU
+BG Green,255,White on Blue,Green on Black
+Standard Newline,W S,"BR
+New  line","Pre
+New line"
+Height,100,px (not pt),yeah
+Top Left,80,Middle Center,Bottom Right
+Top Right,60,Bottom Center,Bottom Left