diff --git a/lib/index.js b/lib/index.js
index dd0e1a8e9234ec8d37746967e5be467fd9a44ae5..0c0b473c780c31e63bd041d0e66183f10a98d6f4 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -29,8 +29,18 @@ var Worker = (function () {
 		});
 
 		this.child.on("message", function (msg) {
-			if (_this.onmessage) {
-				_this.onmessage.call(_this, JSON.parse(msg));
+			var message = JSON.parse(msg);
+			var error = undefined;
+
+			if (!message.error && _this.onmessage) {
+				_this.onmessage.call(_this, message);
+			}
+
+			if (message.error && _this.onerror) {
+				error = new Error(message.error);
+				error.stack = message.stack;
+
+				_this.onerror.call(_this, error);
 			}
 		});
 
diff --git a/lib/worker.js b/lib/worker.js
index c1cf153c7a9f0441cb1bde6c56c0f074420c2c10..71addb117b8fb17d08d530a8e22d9b1a228616ea 100644
--- a/lib/worker.js
+++ b/lib/worker.js
@@ -33,7 +33,9 @@ process.once("message", function (obj) {
 			process.send(JSON.stringify({ data: msg }));
 		},
 		onmessage: void 0,
-		onerror: void 0,
+		onerror: function onerror(err) {
+			process.send(JSON.stringify({ error: err.message, stack: err.stack }));
+		},
 		addEventListener: function addEventListener(event, fn) {
 			if (events.test(event)) {
 				global["on" + event] = global.self["on" + event] = fn;
@@ -66,7 +68,11 @@ process.once("message", function (obj) {
 	});
 
 	process.on("message", function (msg) {
-		(global.onmessage || global.self.onmessage || noop)(JSON.parse(msg));
+		try {
+			(global.onmessage || global.self.onmessage || noop)(JSON.parse(msg));
+		} catch (err) {
+			(global.onerror || global.self.onerror || noop)(err);
+		}
 	});
 
 	process.on("error", function (err) {
diff --git a/package.json b/package.json
index 5e83914b49238824161885c1116cf622f6207206..9ecc360b02070d202dc563312cd0f99ee2a5dec1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "tiny-worker",
-  "version": "1.1.6",
+  "version": "1.1.7",
   "description": "Tiny WebWorker for Server",
   "main": "lib/index.js",
   "scripts": {
diff --git a/src/index.js b/src/index.js
index e5328367c8992e030bff0d7108061e470b4892ff..dd53ae5e330d682d1b1ea0b69e68f2d1eb384048 100644
--- a/src/index.js
+++ b/src/index.js
@@ -19,8 +19,18 @@ class Worker {
 		});
 
 		this.child.on("message", msg => {
-			if (this.onmessage) {
-				this.onmessage.call(this, JSON.parse(msg));
+			const message = JSON.parse(msg);
+			let error;
+
+			if (!message.error && this.onmessage) {
+				this.onmessage.call(this, message);
+			}
+
+			if (message.error && this.onerror) {
+				error = new Error(message.error);
+				error.stack = message.stack;
+
+				this.onerror.call(this, error);
 			}
 		});
 
diff --git a/src/worker.js b/src/worker.js
index bba70e55b1116a1b8e4d3e7b0b980bec92968899..0219f9927c74d03178ef8e281a39fd01804b33f7 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -21,7 +21,7 @@ function toFunction (arg) {
 
 // Bootstraps the Worker
 process.once("message", obj => {
-	let exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8");
+	const exp = obj.isfn ? toFunction(obj.input) : fs.readFileSync(obj.input, "utf8");
 
 	global.self = {
 		close: () => {
@@ -31,7 +31,9 @@ process.once("message", obj => {
 			process.send(JSON.stringify({data: msg}));
 		},
 		onmessage: void 0,
-		onerror: void 0,
+		onerror: err => {
+			process.send(JSON.stringify({error: err.message, stack: err.stack}));
+		},
 		addEventListener: (event, fn) => {
 			if (events.test(event)) {
 				global["on" + event] = global.self["on" + event] = fn;
@@ -60,7 +62,11 @@ process.once("message", obj => {
 	});
 
 	process.on("message", msg => {
-		(global.onmessage || global.self.onmessage || noop)(JSON.parse(msg));
+		try {
+			(global.onmessage || global.self.onmessage || noop)(JSON.parse(msg));
+		} catch (err) {
+			(global.onerror || global.self.onerror || noop)(err);
+		}
 	});
 
 	process.on("error", err => {
diff --git a/test/worker_test.js b/test/worker_test.js
index b793bc603cfd41d6f103f5aff9d0059e0e0190f8..7a8346f81f265d1b9f598197756ff50338a02fb5 100644
--- a/test/worker_test.js
+++ b/test/worker_test.js
@@ -53,6 +53,36 @@ exports["inline script"] = {
 	}
 };
 
+exports["inline script - error"] = {
+	setUp: function (done) {
+		this.worker = new Worker(function () {
+			self.onmessage = function (ev) {
+				throw new Error(ev.data);
+			};
+		});
+		this.msg = "Something went wrong";
+		this.response = "";
+
+		done();
+	},
+	test: function (test) {
+		var self = this;
+
+		test.expect(3);
+		test.notEqual(this.msg, this.response, "Should not match");
+
+		this.worker.onerror = function (err) {
+			self.response = err.message;
+			self.worker.terminate();
+			test.equal(self.msg, self.response, "Should be a match");
+			test.notEqual(err.stack, undefined, "Should not be a match");
+			test.done();
+		};
+
+		this.worker.postMessage(this.msg);
+	}
+};
+
 exports["inline script - require"] = {
 	setUp: function (done) {
 		this.worker = new Worker(function () {