diff --git a/Makefile.in b/Makefile.in
index f3530a64f..2ce7a9de0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -105,8 +105,8 @@ CMD_DOC_SRC := doc_src/count.txt doc_src/dirh.txt doc_src/dirs.txt \
doc_src/fishd.txt doc_src/help.txt doc_src/mimedb.txt \
doc_src/nextd.txt doc_src/open.txt doc_src/popd.txt \
doc_src/prevd.txt doc_src/psub.txt doc_src/pushd.txt \
- doc_src/set_color.txt doc_src/tokenize.txt doc_src/type.txt \
- doc_src/umask.txt doc_src/vared.txt
+ doc_src/set_color.txt doc_src/tokenize.txt doc_src/trap.txt \
+ doc_src/type.txt doc_src/umask.txt doc_src/vared.txt
#
# Files generated by running doxygen on the files in $(CMD_DOC_SRC)
diff --git a/doc_src/trap.txt b/doc_src/trap.txt
new file mode 100644
index 000000000..dd4d2fe81
--- /dev/null
+++ b/doc_src/trap.txt
@@ -0,0 +1,37 @@
+
+\section trap trap - perform an action when the shell recives a signal
+
+\subsection trap-synopsis Synopsis
+trap [OPTIONS] [[ARG] SIGSPEC ... ]
+
+\subsection trap-description Description
+
+Trap is a shellscript wrapper around the fish event delivery
+framework. IT is defined for backwards compatibility reasons. For
+other uses, it is recomended to define a event handler.
+
+- ARG is the command to be executed on signal delivary
+- SIGSPEC is the name of the signal to trap
+- \c -h or \c --help Display help and exit
+- \c -l or \c --list-signals print a list of signal names
+- \c -p or \c --print print all defined signal handlers
+
+If ARG and SIGSPEC are both specified, ARG is the command to be
+executed when the signal specified by SIGSPEC is delivered.
+
+If ARG is absent (and there is a single SIGSPEC) or -, each specified
+signal is reset to its original disposition (the value it had upon
+entrance to the shell). If ARG is the null string the signal
+specified by each SIGSPEC is ignored by the shell and by the commands
+it invokes.
+
+If ARG is not present and -p has been supplied, then the trap commands
+associated with each SIGSPEC are displayed. If no arguments are
+supplied or if only -p is given, trap prints the list of commands
+associated with each signal.
+
+Signal names are case insensitive and the SIG prefix is optional.
+
+The return status is 1 if any SIGSPEC is invalid; otherwise trap
+returns 0.
diff --git a/init/fish_function.fish b/init/fish_function.fish
index 44e5abfc9..c49b17129 100644
--- a/init/fish_function.fish
+++ b/init/fish_function.fish
@@ -545,6 +545,144 @@ function __bold -d "Print argument in bold"
set_color normal
end
+
+function __trap_translate_signal
+ set upper (echo $argv[1]|tr a-z A-Z)
+ if expr $upper : 'SIG.*' >/dev/null
+ echo $upper | cut -c 4-
+ else
+ echo $upper
+ end
+end
+
+function __trap_switch
+
+ switch $argv[1]
+ case EXIT
+ echo --on-exit %self
+
+ case '*'
+ echo --on-signal $argv[1]
+ end
+
+end
+
+function trap -d 'Perform an action when the shell recives a signal'
+
+ set -l mode
+ set -l cmd
+ set -l sig
+ set -l shortopt
+ set -l longopt
+
+ set shortopt -o lph
+ if getopt -T >/dev/null
+ set longopt
+ else
+ set longopt -l print,help,list-signals
+ end
+
+ if not getopt -n type -Q $shortopt $longopt -- $argv
+ return 1
+ end
+
+ set -l tmp (getopt $shortopt $longopt -- $argv)
+
+ eval set opt $tmp
+
+ while count $opt >/dev/null
+ switch $opt[1]
+ case -h --help
+ help trap
+ return 0
+
+ case -p --print
+ set mode print
+
+ case -l --list-signals
+ set mode list
+
+ case --
+ set -e opt[1]
+ break
+
+ end
+ set -e opt[1]
+ end
+
+ if not count $mode >/dev/null
+
+ switch (count $opt)
+
+ case 0
+ set mode print
+
+ case 1
+ set mode clear
+
+ case '*'
+ if test opt[1] = -
+ set -e opt[1]
+ set mode clear
+ else
+ set mode set
+ end
+ end
+ end
+
+ switch $mode
+ case clear
+ for i in $opt
+ set -- sig (__trap_translate_signal $i)
+ if test $sig
+ functions -e __trap_handler_$sig
+ end
+ end
+
+ case set
+ set -l cmd $opt[1]
+ set -e opt[1]
+
+ for i in $opt
+
+ set -l -- sig (__trap_translate_signal $i)
+ set -- sw (__trap_switch $sig)
+
+ if test $sig
+ eval "function __trap_handler_$sig $sw; $cmd; end"
+ else
+ return 1
+ end
+ end
+
+ case print
+ set -l names
+
+ if count $opt >/dev/null
+ set -- names $opt
+ else
+ set -- names (functions -na|grep "^__trap_handler_"|sed -re 's/__trap_handler_//' )
+ end
+
+ for i in $names
+
+ set -- sig (__trap_translate_signal $i)
+
+ if test sig
+ functions __trap_handler_$i
+ else
+ return 1
+ end
+
+ end
+
+ case list
+ kill -l
+
+ end
+
+end
+
function __fish_type_help -d "Help for the type shellscript function"
set bullet \*