           return true
       return false
     ignoreInitial: true
+
   contentWatcher.on 'change', (path) ->
-    return if not contents? or block.contentsLoad or block.contentChange
-    # ignore if we dont have the tree loaded or it's loading
-
-    block.contentChange = true
+
+    # ignore if we dont have the tree loaded or it's still loading
+    return if not contents? or block.contentsLoad
+
+    # also ignore if we are already working on this file
+    # (windows sometimes sends multiple change events for the same file)
+    return if block.files[path] is true
+
+    block.files[path] = true
 
     content = null
     for item in ContentTree.flatten(contents)


  # tasks that will block the request until completed
  block =
    contentChange: false
    contentsLoad: false
    templatesLoad: false
    viewsLoad: false
    localsLoad: false

  isReady = ->
    ### Returns true if we have no running tasks ###

      delete lookup[normalizeUrl(content.url)]
      lookup[normalizeUrl(newContent.url)] = newContent

      delete block.files[path]
      env.emit 'change', content.filename

  # reload entire tree if a file is removed or added
