diff --git a/contrib/ChangeLog b/contrib/ChangeLog
index 048dfa3..b844834 100644
--- a/contrib/ChangeLog
+++ b/contrib/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-11  Luís Oliveira  <loliveira@common-lisp.net>
+
+	* slime-fancy-trace.el: New contrib.
+	* slime-parse.el (slime-trace-query): moved to slime-fancy-trace.
+	* slime-fancy.el: load slime-fancy-trace.
+
 2013-02-13  Helmut Eller  <heller@common-lisp.net>
 
 	* swank-kawa.scm (listener-loop): Use close-port instead of
diff --git a/contrib/slime-fancy-trace.el b/contrib/slime-fancy-trace.el
new file mode 100644
index 0000000..92fda21
--- /dev/null
+++ b/contrib/slime-fancy-trace.el
@@ -0,0 +1,66 @@
+
+(define-slime-contrib slime-fancy-trace
+  "Enhanced version of slime-trace capable of tracing local functions,
+methods, setf functions, and other entities supported by specific
+swank:swank-toggle-trace backends. Invoke via C-u C-t."
+  (:authors "Matthias Koeppe  <mkoeppe@mail.math.uni-magdeburg.de>"
+            "Tobias C. Rittweiler <tcr@freebits.de>")
+  (:license "GPL")
+  (:slime-dependencies slime-parse))
+
+(defun slime-trace-query (spec)
+  "Ask the user which function to trace; SPEC is the default.
+The result is a string."
+  (cond ((null spec)
+         (slime-read-from-minibuffer "(Un)trace: "))
+        ((stringp spec)
+         (slime-read-from-minibuffer "(Un)trace: " spec))
+        ((symbolp spec)    ; `slime-extract-context' can return symbols.
+         (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec)))
+        (t
+         (destructure-case spec
+           ((setf n)
+            (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec)))
+           ((:defun n)
+            (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string n)))
+           ((:defgeneric n)
+            (let* ((name (prin1-to-string n))
+                   (answer (slime-read-from-minibuffer "(Un)trace: " name)))
+              (cond ((and (string= name answer)
+                          (y-or-n-p (concat "(Un)trace also all "
+                                            "methods implementing "
+                                            name "? ")))
+                     (prin1-to-string `(:defgeneric ,n)))
+                    (t
+                     answer))))
+           ((:defmethod &rest _)
+            (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec)))
+           ((:call caller callee)
+            (let* ((callerstr (prin1-to-string caller))
+                   (calleestr (prin1-to-string callee))
+                   (answer (slime-read-from-minibuffer "(Un)trace: "
+                                                       calleestr)))
+              (cond ((and (string= calleestr answer)
+                          (y-or-n-p (concat "(Un)trace only when " calleestr
+                                            " is called by " callerstr "? ")))
+                     (prin1-to-string `(:call ,caller ,callee)))
+                    (t
+                     answer))))
+           (((:labels :flet) &rest _)
+            (slime-read-from-minibuffer "(Un)trace local function: "
+                                        (prin1-to-string spec)))
+           (t (error "Don't know how to trace the spec %S" spec))))))
+
+(defun slime-toggle-fancy-trace (&optional using-context-p)
+  "Toggle trace."
+  (interactive "P")
+  (let* ((spec (if using-context-p
+                   (slime-extract-context)
+                   (slime-symbol-at-point)))
+         (spec (slime-trace-query spec)))
+    (message "%s" (slime-eval `(swank:swank-toggle-trace ,spec)))))
+
+;; override slime-toggle-trace-fdefinition
+(define-key slime-prefix-map "\C-t" 'slime-toggle-fancy-trace)
+
+(provide 'slime-fancy-trace)
diff --git a/contrib/slime-fancy.el b/contrib/slime-fancy.el
index b0e29b9..e7e5a22 100644
--- a/contrib/slime-fancy.el
+++ b/contrib/slime-fancy.el
@@ -9,6 +9,7 @@
                        slime-c-p-c
                        slime-editing-commands
                        slime-fancy-inspector
+                       slime-fancy-trace
                        slime-fuzzy
                        slime-presentations
                        slime-scratch
diff --git a/contrib/slime-parse.el b/contrib/slime-parse.el
index 2344007..fc78964 100644
--- a/contrib/slime-parse.el
+++ b/contrib/slime-parse.el
@@ -154,49 +154,6 @@ that the character is not escaped."
       (slime-check-buffer-form result-form))
     ))
 
-(defun slime-trace-query (spec)
-  "Ask the user which function to trace; SPEC is the default.
-The result is a string."
-  (cond ((null spec)
-         (slime-read-from-minibuffer "(Un)trace: "))
-        ((stringp spec)
-         (slime-read-from-minibuffer "(Un)trace: " spec))
-        ((symbolp spec)    ; `slime-extract-context' can return symbols.
-         (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec)))
-        (t
-         (destructure-case spec
-           ((setf n)
-            (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec)))
-           ((:defun n)
-            (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string n)))
-           ((:defgeneric n)
-            (let* ((name (prin1-to-string n))
-                   (answer (slime-read-from-minibuffer "(Un)trace: " name)))
-              (cond ((and (string= name answer)
-                          (y-or-n-p (concat "(Un)trace also all " 
-                                            "methods implementing " 
-                                            name "? ")))
-                     (prin1-to-string `(:defgeneric ,n)))
-                    (t
-                     answer))))
-           ((:defmethod &rest _)
-            (slime-read-from-minibuffer "(Un)trace: " (prin1-to-string spec)))
-           ((:call caller callee)
-            (let* ((callerstr (prin1-to-string caller))
-                   (calleestr (prin1-to-string callee))
-                   (answer (slime-read-from-minibuffer "(Un)trace: " 
-                                                       calleestr)))
-              (cond ((and (string= calleestr answer)
-                          (y-or-n-p (concat "(Un)trace only when " calleestr
-                                            " is called by " callerstr "? ")))
-                     (prin1-to-string `(:call ,caller ,callee)))
-                    (t
-                     answer))))
-           (((:labels :flet) &rest _)
-            (slime-read-from-minibuffer "(Un)trace local function: "
-                                        (prin1-to-string spec)))
-           (t (error "Don't know how to trace the spec %S" spec))))))
-
 (defun slime-extract-context ()
   "Parse the context for the symbol at point.  
 Nil is returned if there's no symbol at point.  Otherwise we detect
