diff --git a/lib/runnable.js b/lib/runnable.js
--- a/lib/runnable.js
+++ b/lib/runnable.js
@@ -160,7 +160,6 @@ Runnable.prototype.globals = function(arr){
 
 Runnable.prototype.run = function(fn){
   var self = this
-    , ms = this.timeout()
     , start = new Date
     , ctx = this.ctx
     , finished
@@ -177,11 +176,13 @@ Runnable.prototype.run = function(fn){
 
   // finished
   function done(err) {
+    var ms = self.timeout();
     if (self.timedOut) return;
     if (finished) return multiple(err);
     self.clearTimeout();
     self.duration = new Date - start;
     finished = true;
+    if (!err && self.duration > ms) err = new Error('timeout of ' + ms + 'ms exceeded');
     fn(err);
   }
 

diff --git a/test/acceptance/failing/timeout.js b/test/acceptance/failing/timeout.js
new file mode 100644
--- /dev/null
+++ b/test/acceptance/failing/timeout.js
@@ -0,0 +1,18 @@
+
+describe('timeout', function(){
+  this.timeout(20);
+
+  it('should be honored with sync suites', function(){
+    sleep(30);
+  });
+
+  it('should be honored with async suites', function(done){
+    sleep(30);
+    done();
+  });
+
+  function sleep(ms){
+    var start = Date.now();
+    while(start + ms > Date.now())continue;
+  }
+});

-t isn't honored for long running sync operations.
I believe the duration should be checked against `_timeout` [here](https://github.com/visionmedia/mocha/blob/master/lib/runnable.js#L183).  Thoughts?
Something like:

``` javascript
if(that._timeout < duration)err = new Error('took too long!');
```

