diff --git a/basis/vocabs/refresh/monitor/monitor.factor b/basis/vocabs/refresh/monitor/monitor.factor
index c9b664dc91..b72bae9d89 100644
--- a/basis/vocabs/refresh/monitor/monitor.factor
+++ b/basis/vocabs/refresh/monitor/monitor.factor
@@ -3,7 +3,8 @@
 USING: accessors assocs command-line concurrency.messaging
 continuations init io.backend io.files io.monitors io.pathnames
 kernel namespaces sequences sets splitting threads fry
-tr vocabs vocabs.loader vocabs.refresh vocabs.cache ;
+tr vocabs vocabs.loader vocabs.refresh vocabs.cache
+io.files.links ;
 IN: vocabs.refresh.monitor
 
 TR: convert-separators "/\\" ".." ;
@@ -16,10 +17,15 @@ TR: convert-separators "/\\" ".." ;
 : path>vocab-name ( path -- vocab )
     dup ".factor" tail? [ parent-directory ] when ;
 
+: scrub-links-in-path ( path -- path' )
+    normalize-path path-components "/"
+    [ append-path follow-links ] reduce ;
+
 : chop-vocab-root ( path -- path' )
     "resource:" prepend-path normalize-path
     dup vocab-roots get
-    [ normalize-path ] map
+    [ [ normalize-path ] map ]
+    [ [ scrub-links-in-path ] map ] bi append
     [ head? ] with find nip
     ?head drop ;
 
@@ -29,7 +35,7 @@ TR: convert-separators "/\\" ".." ;
 : monitor-loop ( monitor -- )
     #! On OS X, monitors give us the full path, so we chop it
     #! off if its there.
-    [ next-change path>> path>vocab changed-vocab reset-cache ]
+    [ next-change path>> P path>vocab changed-vocab reset-cache ]
     [ monitor-loop ]
     bi ;