kqueue: cleanup internal watch before sending remove event

backport 2b02d02c96c179ad7f12c691db4ff4e9a1fb4800
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dacb0e0..c65bb69 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## v0.9.3 / 2014-12-31
+
+* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/go-fsnotify/fsnotify/issues/51)
+
 ## v0.9.2 / 2014-08-17
 
 * [Backport] Fix missing create events on OS X. [#14](https://github.com/go-fsnotify/fsnotify/issues/14) (thanks @zhsso)
diff --git a/fsnotify_bsd.go b/fsnotify_bsd.go
index e4a5e05..daea195 100644
--- a/fsnotify_bsd.go
+++ b/fsnotify_bsd.go
@@ -361,6 +361,13 @@
 				}
 			}
 
+			if fileEvent.IsRename() {
+				w.removeWatch(fileEvent.Name)
+				w.femut.Lock()
+				delete(w.fileExists, fileEvent.Name)
+				w.femut.Unlock()
+			}
+
 			if fileInfo != nil && fileInfo.IsDir() && fileEvent.IsModify() && !fileEvent.IsDelete() {
 				w.sendDirectoryChangeEvents(fileEvent.Name)
 			} else {
@@ -371,12 +378,6 @@
 			// Move to next event
 			events = events[1:]
 
-			if fileEvent.IsRename() {
-				w.removeWatch(fileEvent.Name)
-				w.femut.Lock()
-				delete(w.fileExists, fileEvent.Name)
-				w.femut.Unlock()
-			}
 			if fileEvent.IsDelete() {
 				w.removeWatch(fileEvent.Name)
 				w.femut.Lock()