The primary authors of strace were:

	Paul Kranenburg <pk@cs.few.eur.nl>
	Branko Lankester <branko@hacktic.nl>
	Rick Sladkey <jrs@world.std.com>

These people have contributed to strace.  Some have reported problems, others
have contributed improvements to the documentation, actual code, provided
information, provided resources, or helped to port strace to new systems.
Those contributions are described in the version control logs and ChangeLog-CVS
file.  If your name has been left out, if you'd rather not be listed, or if
you'd prefer a different address be used, please send a note to the
strace-devel@lists.sourceforge.net mailing list.

##<
## There is no need to list here any name that appears as an Author in
## "git log" output.  Those are automatically added when this template
## is used to generate the CREDITS file.
##>
Aaron Ucko                      ucko@vax1.rockhurst.edu
Adrien Kunysz                   adrien@kunysz.be
Anton Blanchard                 anton@samba.org
Arkadiusz Miskiewicz            misiek@pld.org.pl
Bai Weidong                     baiwd@cn.fujitsu.com
Bo Kullmar                      bk@kullmar.se
Cai Fei                         caifei@cn.fujitsu.com
D.J. Barrow                     djbarrow@de.ibm.com
David Mosberger-Tang            davidm@hpl.hp.com
David S. Miller                 davem@caip.rutgers.edu
David Wilder                    wilder@us.ibm.com
David Woodhouse                 dwmw2@redhat.com
Douglas Mencken                 dougmencken@gmail.com
Fernando Luis Vazquez Cao       fernando@oss.ntt.co.jp
Florian Lohoff                  flo@rfc822.org
Gabor Gombas                    gombasg@sztaki.hu
Ganesan Rajagopal               rganesan@myrealbox.com
Gaël Roualland                  gael.roualland@iname.com
Greg Banks                      gbanks@pocketpenguins.com
Henrik Storner                  storner@osiris.ping.dk
Jakub Jelinek                   jj@ultra.linux.cz
Jeff Mahoney                    jeffm@suse.com
Jian Zhen                       zhenjl@gmail.com
Joe Ilacqua                     spike@world.std.com
Johannes Stezenbach             js@sig21.net
Ju"rgen Fluk                    louis@marco.de
Juergen Weigert                 jnweiger@immd4.informatik.uni-erlangen.de
Keith Thompson                  kst@alsys.com
Kyle McMartin                   kyle@mcmartin.ca
Lai JiangShan                   laijs@cn.fujitsu.com
Leonard N. Zubkoff              lnz@dandelion.com
Linus Torvalds                  Linus.Torvalds@cs.helsinki.fi
Lupe Christoph                  lupe@alanya.isar.muc.de
Marty Leisner                   leisner@sdsp.mc.xerox.com
Matt Day                        mday@artisoft.com
Matthias Pfaller                leo@dachau.marco.de
Maxim Shchetynin                maxim@de.ibm.com
Michael E Chastain              mec@duracef.shout.net
Michael Holzheu                 holzheu@de.ibm.com
Michail Litvak                  mci@owl.openwall.com
Mike Stroyan                    mike.stroyan@hp.com
Muttley Meen                    muttley.meen@gmail.com
Nate Eldredge                   nate@cartsys.com
Paul Mundt                      lethal@linux-sh.org
Peter Jones                     pjones@redhat.com
Pádraig Brady                   P@draigBrady.com
Rajeev V. Pillai                rajeevvp@gmail.com
Randolph Chung                  tausq@debian.org
Reuben Sumner                   rasumner@undergrad.math.uwaterloo.ca
Richard Braakman                dark@xs4all.nl
Richard Henderson               richard@twiddle.tamu.edu
Richard Hirst                   rhirst@linuxcare.com
Roland Borde                    bo@uebemc.siemens.de
Sami Farin                      safari@u.safari.iki.fi
Scott Tsai                      scottt958@yahoo.com.tw
Simon Murray                    simon@transitive.com
Solar Designer                  solar@openwall.com
Srinivasa Ds                    srinivasa@in.ibm.com
Steve Bennett                   steveb@workware.net.au
Thanh Ma                        tma@encore.com
Thiemo Seufer                   ths@networkno.de
Thomas Bogendoerfer             tsbogend@bigbug.franken.de
Tim Yamin                       plasmaroo@gentoo.org
Timo Lindfors                   timo.lindfors@iki.fi
Tom Dyas                        tdyas@eden.rutgers.edu
Tommi Rantala                   ext-tommi.1.rantala@nokia.com
Topi Miettinen                  Topi.Miettinen@nic.fi
Xiaoning Ding                   dingxn@gmail.com
Yang Zhiguo                     yzgcsu@cn.fujitsu.com
Zach Brown                      zach.brown@oracle.com
Zhang Le                        zhilg@users.sourceforge.net
Марк Коренберг                  socketpair@gmail.com
