diff --git a/Language/Haskell/GhcMod/Types.hs b/Language/Haskell/GhcMod/Types.hs
--- a/Language/Haskell/GhcMod/Types.hs
+++ b/Language/Haskell/GhcMod/Types.hs
@@ -57,7 +57,11 @@
 
 convert :: ToString a => Options -> a -> String
 convert opt@Options { outputStyle = LispStyle  } x = toLisp  opt x "\n"
-convert opt@Options { outputStyle = PlainStyle } x = toPlain opt x "\n"
+convert opt@Options { outputStyle = PlainStyle } x
+  | str == "\n" = ""
+  | otherwise   = str
+  where
+    str = toPlain opt x "\n"
 
 class ToString a where
     toLisp  :: Options -> a -> Builder
diff --git a/elisp/ghc-check.el b/elisp/ghc-check.el
--- a/elisp/ghc-check.el
+++ b/elisp/ghc-check.el
@@ -80,9 +80,9 @@
 	      (buf ghc-process-original-buffer))
 	  (ghc-check-highlight-original-buffer file buf infos)))
        (t
-	(with-current-buffer ghc-process-original-buffer
+	(ghc-with-current-buffer ghc-process-original-buffer
 	  (remove-overlays (point-min) (point-max) 'ghc-check t))))
-      (with-current-buffer ghc-process-original-buffer
+      (ghc-with-current-buffer ghc-process-original-buffer
 	(let ((len (length infos)))
 	  (if (= len 0)
 	      (setq mode-line-process "")
@@ -91,7 +91,7 @@
 		   (wlen (- len elen)))
 	      (setq mode-line-process (format " %d:%d" elen wlen))))))))
    (t
-    (with-current-buffer ghc-process-original-buffer
+    (ghc-with-current-buffer ghc-process-original-buffer
       (setq mode-line-process " failed")))))
 
 (defun ghc-to-info (errs)
@@ -114,7 +114,7 @@
 	    (ghc-add infos info)))))))
 
 (defun ghc-check-highlight-original-buffer (ofile buf infos)
-  (with-current-buffer buf
+  (ghc-with-current-buffer buf
     (remove-overlays (point-min) (point-max) 'ghc-check t)
     (save-excursion
       (goto-char (point-min))
diff --git a/elisp/ghc-func.el b/elisp/ghc-func.el
--- a/elisp/ghc-func.el
+++ b/elisp/ghc-func.el
@@ -205,4 +205,12 @@
 	expr
       (concat "(" expr ")"))))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defmacro ghc-with-current-buffer (buf &rest body)
+  ;; (declare (indent 1))
+  `(if (buffer-live-p ,buf)
+       (with-current-buffer ,buf
+	 ,@body)))
+
 (provide 'ghc-func)
diff --git a/elisp/ghc-process.el b/elisp/ghc-process.el
--- a/elisp/ghc-process.el
+++ b/elisp/ghc-process.el
@@ -12,7 +12,8 @@
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defvar-local ghc-process-running nil)
+(defvar ghc-process-running nil)
+
 (defvar-local ghc-process-process-name nil)
 (defvar-local ghc-process-original-buffer nil)
 (defvar-local ghc-process-original-file nil)
@@ -29,27 +30,26 @@
 (defun ghc-with-process (cmd callback &optional hook1 hook2)
   (unless ghc-process-process-name
     (setq ghc-process-process-name (ghc-get-project-root)))
-  (when ghc-process-process-name
+  (when (and ghc-process-process-name (not ghc-process-running))
+    (setq ghc-process-running t)
     (if hook1 (funcall hook1))
     (let* ((cbuf (current-buffer))
 	   (name ghc-process-process-name)
 	   (buf (get-buffer-create (concat " ghc-modi:" name)))
 	   (file (buffer-file-name))
 	   (cpro (get-process name)))
-      (with-current-buffer buf
-	(unless ghc-process-running
-	  (setq ghc-process-running t)
-	  (setq ghc-process-original-buffer cbuf)
-	  (setq ghc-process-original-file file)
-	  (setq ghc-process-callback callback)
-	  (setq ghc-process-hook hook2)
-	  (erase-buffer)
-	  (let ((pro (ghc-get-process cpro name buf)))
-	    (process-send-string pro cmd)
-	    (when ghc-debug
-	      (ghc-with-debug-buffer
-	       (insert (format "%% %s" cmd))))
-	    pro))))))
+      (ghc-with-current-buffer buf
+        (setq ghc-process-original-buffer cbuf)
+	(setq ghc-process-original-file file)
+	(setq ghc-process-callback callback)
+	(setq ghc-process-hook hook2)
+	(erase-buffer)
+	(let ((pro (ghc-get-process cpro name buf)))
+	  (process-send-string pro cmd)
+	  (when ghc-debug
+	    (ghc-with-debug-buffer
+	     (insert (format "%% %s" cmd))))
+	  pro)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -65,32 +65,39 @@
 (defun ghc-start-process (name buf)
   (let ((pro (start-file-process name buf ghc-interactive-command "-b" "\n" "-l")))
     (set-process-filter pro 'ghc-process-filter)
+    (set-process-sentinel pro 'ghc-process-sentinel)
     (set-process-query-on-exit-flag pro nil)
     pro))
 
 (defun ghc-process-filter (process string)
-  (with-current-buffer (process-buffer process)
-    (goto-char (point-max))
-    (insert string)
-    (forward-line -1)
-    (cond
-     ((looking-at "^OK$")
-      (if ghc-process-hook (funcall ghc-process-hook))
-      (goto-char (point-min))
-      (funcall ghc-process-callback 'ok)
-      (when ghc-debug
-	(let ((cbuf (current-buffer)))
-	  (ghc-with-debug-buffer
-	   (insert-buffer-substring cbuf))))
-      (setq ghc-process-running nil))
-     ((looking-at "^NG ")
-      (funcall ghc-process-callback 'ng)
-      (when ghc-debug
-	(let ((cbuf (current-buffer)))
-	  (ghc-with-debug-buffer
-	   (insert-buffer-substring cbuf))))
-      (setq ghc-process-running nil)))))
+  (let ((pbuf (process-buffer process)))
+    (if (not (get-buffer pbuf))
+	(setq ghc-process-running nil) ;; just in case
+      (ghc-with-current-buffer (process-buffer process)
+        (goto-char (point-max))
+	(insert string)
+	(forward-line -1)
+	(cond
+	 ((looking-at "^OK$")
+	  (if ghc-process-hook (funcall ghc-process-hook))
+	  (goto-char (point-min))
+	  (funcall ghc-process-callback 'ok)
+	  (when ghc-debug
+	    (let ((cbuf (current-buffer)))
+	      (ghc-with-debug-buffer
+	       (insert-buffer-substring cbuf))))
+	  (setq ghc-process-running nil))
+	 ((looking-at "^NG ")
+	  (funcall ghc-process-callback 'ng)
+	  (when ghc-debug
+	    (let ((cbuf (current-buffer)))
+	      (ghc-with-debug-buffer
+	       (insert-buffer-substring cbuf))))
+	  (setq ghc-process-running nil)))))))
 
+(defun ghc-process-sentinel (process event)
+  (setq ghc-process-running nil))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defvar ghc-process-rendezvous nil)
@@ -98,21 +105,21 @@
 (defvar ghc-process-results nil)
 
 (defun ghc-sync-process (cmd &optional n hook)
-  (setq ghc-process-rendezvous nil)
-  (setq ghc-process-results nil)
-  (setq ghc-process-num-of-results (or n 1))
-  (let ((pro (ghc-with-process cmd 'ghc-process-callback nil hook)))
-    (condition-case nil
-	(while (null ghc-process-rendezvous)
-	  ;; 0.1 is too fast for Emacs 24.4.
-	  ;; (sit-for 0.1 t) may get stuck when tooltip is displayed.
-	  (sit-for 0.1)
-	  ;; (discard-input) avoids getting stuck.
-	  (discard-input))
-      (quit
-       (with-current-buffer (process-buffer pro)
-	 (setq ghc-process-running nil)))))
-  ghc-process-results)
+  (unless ghc-process-running
+    (setq ghc-process-rendezvous nil)
+    (setq ghc-process-results nil)
+    (setq ghc-process-num-of-results (or n 1))
+    (let ((pro (ghc-with-process cmd 'ghc-process-callback nil hook)))
+      (condition-case nil
+	  (while (null ghc-process-rendezvous)
+	    ;; 0.01 is too fast for Emacs 24.4.
+	    ;; (sit-for 0.1 t) may get stuck when tooltip is displayed.
+	    (sit-for 0.1)
+	    ;; (discard-input) avoids getting stuck.
+	    (discard-input))
+	(quit
+	 (setq ghc-process-running nil))))
+    ghc-process-results))
 
 (defun ghc-process-callback (status)
   (cond
diff --git a/elisp/ghc.el b/elisp/ghc.el
--- a/elisp/ghc.el
+++ b/elisp/ghc.el
@@ -20,7 +20,15 @@
 
 ;;; Code:
 
-(defconst ghc-version "4.1.0")
+;; defvar-local was introduced in 24.3
+(let* ((major 24)
+       (minor 3))
+  (if (or (< emacs-major-version major)
+	  (and (= emacs-major-version major)
+	       (< emacs-minor-version minor)))
+      (error "ghc-mod requires at least Emacs %d.%d" major minor)))
+
+(defconst ghc-version "4.1.1")
 
 ;; (eval-when-compile
 ;;  (require 'haskell-mode))
diff --git a/ghc-mod.cabal b/ghc-mod.cabal
--- a/ghc-mod.cabal
+++ b/ghc-mod.cabal
@@ -1,5 +1,5 @@
 Name:                   ghc-mod
-Version:                4.1.0
+Version:                4.1.1
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
diff --git a/test/CheckSpec.hs b/test/CheckSpec.hs
--- a/test/CheckSpec.hs
+++ b/test/CheckSpec.hs
@@ -34,3 +34,10 @@
                 cradle <- findCradleWithoutSandbox
                 res <- checkSyntax defaultOptions cradle ["Baz.hs"]
                 res `shouldSatisfy` ("Baz.hs:5:1:Warning:" `isPrefixOf`)
+
+        context "without errors" $ do
+            it "doesn't output empty line" $ do
+                withDirectory_ "test/data/ghc-mod-check/Data" $ do
+                    cradle <- findCradleWithoutSandbox
+                    res <- checkSyntax defaultOptions cradle ["Foo.hs"]
+                    res `shouldBe` ""
diff --git a/test/LintSpec.hs b/test/LintSpec.hs
--- a/test/LintSpec.hs
+++ b/test/LintSpec.hs
@@ -10,3 +10,7 @@
             res <- lintSyntax defaultOptions "test/data/hlint.hs"
             res `shouldBe` "test/data/hlint.hs:4:8: Error: Redundant do\NULFound:\NUL  do putStrLn \"Hello, world!\"\NULWhy not:\NUL  putStrLn \"Hello, world!\"\n"
 
+        context "without suggestions" $ do
+            it "doesn't output empty line" $ do
+                res <- lintSyntax defaultOptions "test/data/ghc-mod-check/Data/Foo.hs"
+                res `shouldBe` ""
