diff --git a/documentation/current/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki b/documentation/current/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki
index 120e22e5..728272ba 100644
--- a/documentation/current/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki
+++ b/documentation/current/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki
@@ -87,6 +87,73 @@ Then, in a feature in which tracing is desired:
+=Using a trace handler=
+
+You can do more complex tracing tasks by using a trace handler. The deferred class TRACE_HANDLER contains a deferred feature trace which you can effect in a descendant of TRACE_HANDLER. Your effective version of trace will be called whenever a trace event occurs. {TRACE_HANDLER}.trace looks like this:
+
+
+ trace (a_type_id: INTEGER; a_c_class_name, a_c_feature_name: POINTER; a_depth: INTEGER; a_is_entering: BOOLEAN)
+ -- Trigger a trace operation from a feature represented by `a_c_feature_name' defined in
+ -- class `a_c_class_name' and applied to an object of type `a_type_id' at a call depth `a_depth'.
+ -- If `a_is_entering' we are entering the routine, otherwise we are exiting it.
+ require
+ a_type_id_non_negative: a_type_id >= 0
+ a_depth_non_negative: a_depth >= 0
+ deferred
+ end
+
+
+You may notice in the specification for trace above that the arguments representing the class and feature names are of type POINTER (versus some variant of STRING).
+
+To make this facility more approachable for common tasks, EiffelBase also contains another class, a deferred descendant of TRACING_HANDLER, called STRING_TRACING_HANDLER in which the trace feature's arguments for class and feature names are strings, and the argument for type is an instance of TYPE rather than an integer type id as in TRACING_HANDLER. {STRING_TRACING_HANDLER}.trace looks like this:
+
+
+ trace (a_type: TYPE [detachable ANY]; a_class_name, a_feature_name: detachable STRING; a_depth: INTEGER; a_is_entering: BOOLEAN)
+ -- Trigger a trace operation from a feature represented by `a_feature_name' defined in
+ -- class `a_class_name' and applied to an object of type `a_type' at a call depth `a_depth'.
+ -- If `a_is_entering' we are entering the routine, otherwise we are exiting it.
+ deferred
+ end
+
+
+Suppose we wanted to write trace long entries in a private log file for the entry and exit of a number of routines during the run of a simple application. We could create a descendant of STRING_TRACING_HANDLER that looks like this:
+
+
+class
+ EXAMPLE_HANDLER
+inherit
+ STRING_TRACING_HANDLER
+
+feature
+
+ trace (a_type: TYPE [ANY]; a_class_name, a_feature_name: STRING_8; a_depth: INTEGER_32; a_is_entering: BOOLEAN)
+ --
+ do
+ trace_log_file.put_string (create {STRING}.make_filled ('>', a_depth))
+ if a_is_entering then
+ trace_log_file.put_string (" Is entering " + "{" + a_class_name + "}." + a_feature_name + "%N")
+ else
+ trace_log_file.put_string (" Is leaving " + "{" + a_class_name + "}." + a_feature_name + "%N")
+ end
+ end
+
+ trace_log_file: PLAIN_TEXT_FILE
+ -- Log file
+ once
+ create Result.make_open_write ("my_log_file.txt")
+ end
+
+ close_log_file
+ -- Close log file
+ do
+ trace_log_file.close
+ end
+end
+
+
+In EXAMPLE_HANDLER the procedure trace is effected to write the desired information to the log_file.
+
+The application using EXAMPLE_HANDLER might look like this: