           (deferred:nextc it
             (lambda ()
               (with-current-buffer buffer
-                (ycmd-notify-file-ready-to-parse)))))))))
+                (let ((tick (buffer-chars-modified-tick)))
+                  (unless (equal tick ycmd--last-modified-tick)
+                    (setq ycmd--last-modified-tick tick)
+                    (ycmd-notify-file-ready-to-parse)))))))))))
 
 (defun ycmd--on-save ()
   "Function to run when the buffer has been saved."

    (ycmd--notify-server "BufferUnload"))
  (ycmd--teardown))

(defun ycmd--teardown ()
  "Teardown ycmd in current buffer."
  (ycmd--kill-timer ycmd--notification-timer)
  (setq ycmd--last-status-change 'unparsed)
  (setq ycmd--deferred-parse nil)
  (run-hooks 'ycmd-after-teardown-hook))


      (message "Native filetype completion not supported for current file, \
cannot send parse request")
    (when (ycmd-is-server-alive?)
      (deferred:$
        (deferred:next
          (lambda ()
            (message "Parsing buffer...")
            (ycmd--reset-parse-status)
            (ycmd--conditional-parse)))
        (deferred:nextc it
          (lambda () (message "Parsing buffer done")))))))
