diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index 89a09a9..8b39cb9 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -1,4 +1,4 @@
-;;; ob-clojure.el --- Babel Functions for Clojure    -*- lexical-binding: t; -*-
+;;; ob-clojure.el --- org-babel functions for clojure evaluation
 
 ;; Copyright (C) 2009-2016 Free Software Foundation, Inc.
 
@@ -55,6 +55,7 @@
 
 (defvar org-babel-default-header-args:clojure '())
 (defvar org-babel-header-args:clojure '((package . :any)))
+(defvar org-babel-clojure-nrepl-timeout 10)
 
 (defcustom org-babel-clojure-backend
   (cond ((featurep 'cider) 'cider)
@@ -67,7 +68,7 @@
 
 (defun org-babel-expand-body:clojure (body params)
   "Expand BODY according to PARAMS, return the expanded body."
-  (let* ((vars (org-babel--get-vars params))
+  (let* ((vars (mapcar #'cdr (org-babel-get-header params :var)))
 	 (result-params (cdr (assoc :result-params params)))
 	 (print-level nil) (print-length nil)
 	 (body (org-babel-trim
@@ -86,33 +87,82 @@
 
 (defun org-babel-execute:clojure (body params)
   "Execute a block of Clojure code with Babel."
-  (let ((expanded (org-babel-expand-body:clojure body params))
-	result)
+  (lexical-let* ((expanded (org-babel-expand-body:clojure body params))
+                 ; name of the buffer that will receive the asyn output
+                 (sbuffer "*Clojure Sub Buffer*")
+                 ; determine if the :async option is specified for this block
+                 (async (if (assoc :async params) t nil))
+                 ; generate the full response from the REPL
+                 (response (cons 'dict nil))
+                 ; keep track of the status of the output in async mode
+                 status
+                 ; result to return to Babel
+                 result)
     (case org-babel-clojure-backend
       (cider
        (require 'cider)
        (let ((result-params (cdr (assoc :result-params params))))
-	 (setq result
-	       (nrepl-dict-get
-		(nrepl-sync-request:eval
-		 expanded (cider-current-connection) (cider-current-session))
-		(if (or (member "output" result-params)
-			(member "pp" result-params))
-		    "out"
-		  "value")))))
+         ; Check if the user want to run code asynchronously
+         (when async
+           ; Create a new window with the async output buffer
+           (switch-to-buffer-other-window sbuffer)
+
+           ; Run the Clojure code asynchronously in nREPL
+           (nrepl-request:eval
+            expanded 
+            (lambda (resp) 
+              (when (member "out" resp)
+                ; Print the output of the nREPL in the asyn output buffer
+                (princ (nrepl-dict-get resp "out") (get-buffer sbuffer)))
+              (nrepl--merge response resp)
+              ; Update the status of the nREPL output session
+              (setq status (nrepl-dict-get response "status")))
+            (cider-current-connection) 
+            (cider-current-session))
+           
+           ; Wait until the nREPL code finished to be processed
+           (while (not (member "done" status))
+             (nrepl-dict-put response "status" (remove "need-input" status))
+             (accept-process-output nil 0.01)
+             (redisplay))
+
+           ; Delete the async buffer & window when the processing is finalized
+           (let ((wins (get-buffer-window-list sbuffer nil t)))
+             (dolist (win wins)
+               (delete-window win))
+             (kill-buffer sbuffer))
+             
+           ; Put the output or the value in the result section of the code block
+           (setq result (nrepl-dict-get response 
+                                        (if (or (member "output" result-params)
+                                                (member "pp" result-params))
+                                            "out"
+                                          "value"))))
+         ; Check if user want to run code synchronously
+         (when (not async)
+           (setq result
+                 (nrepl-dict-get
+                  (let ((nrepl-sync-request-timeout 
+                         org-babel-clojure-nrepl-timeout))
+                    (nrepl-sync-request:eval
+                     expanded (cider-current-connection) (cider-current-session)))
+                  (if (or (member "output" result-params)
+                          (member "pp" result-params))
+                      "out"
+                    "value"))))))
       (slime
        (require 'slime)
        (with-temp-buffer
-	 (insert expanded)
-	 (setq result
-	       (slime-eval
-		`(swank:eval-and-grab-output
-		  ,(buffer-substring-no-properties (point-min) (point-max)))
-		(cdr (assoc :package params)))))))
+         (insert expanded)
+         (setq result
+               (slime-eval
+                `(swank:eval-and-grab-output
+                  ,(buffer-substring-no-properties (point-min) (point-max)))
+                (cdr (assoc :package params)))))))
     (org-babel-result-cond (cdr (assoc :result-params params))
       result
       (condition-case nil (org-babel-script-escape result)
-	(error result)))))
+        (error result)))))
 
 (provide 'ob-clojure)
 

warning: LF will be replaced by CRLF in lisp/ob-clojure.el.
The file will have its original line endings in your working directory.
