diff --git a/tiger_only/src/.gitignore b/tiger_only/src/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..711fb3c0e123a2d3685dcbef402b10b959699f80
--- /dev/null
+++ b/tiger_only/src/.gitignore
@@ -0,0 +1 @@
+which
diff --git a/tiger_only/src/which.1 b/tiger_only/src/which.1
new file mode 100644
index 0000000000000000000000000000000000000000..f889e0980141d01801e078841500d52d43dc5aa6
--- /dev/null
+++ b/tiger_only/src/which.1
@@ -0,0 +1,85 @@
+.\" Manpage Copyright (c) 1995, Jordan Hubbard <jkh@FreeBSD.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"      This product includes software developed by the FreeBSD Project
+.\"      its contributors.
+.\" 4. Neither the name of the FreeBSD Project nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+.\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/usr.bin/which/which.1,v 1.25 2005/02/10 16:04:22 ru Exp $
+.\"
+.Dd June 21, 2002
+.Dt WHICH 1
+.Os
+.Sh NAME
+.Nm which
+.Nd "locate a program file in the user's path"
+.Sh SYNOPSIS
+.Nm
+.Op Fl as
+.Ar program ...
+.Sh DESCRIPTION
+The
+.Nm
+utility
+takes a list of command names and searches the path for each executable
+file that would be run had these commands actually been invoked.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl a
+List all instances of executables found (instead of just the first one
+of each).
+.It Fl s
+No output, just return 0 if any of the executables are found, or 1 if
+none are found.
+.El
+.Pp
+Some shells may provide a builtin
+.Nm
+command which is similar or identical to this utility.
+Consult the
+.Xr builtin 1
+manual page.
+.Sh SEE ALSO
+.Xr builtin 1 ,
+.Xr csh 1 ,
+.Xr find 1 ,
+.Xr locate 1 ,
+.Xr whereis 1
+.Sh HISTORY
+The
+.Nm
+command first appeared in
+.Fx 2.1 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+utility was originally written in Perl and was contributed by
+.An Wolfram Schneider Aq wosch@FreeBSD.org .
+The current version of
+.Nm
+was rewritten in C by
+.An Daniel Papasian Aq dpapasia@andrew.cmu.edu .
diff --git a/tiger_only/src/which.c b/tiger_only/src/which.c
new file mode 100644
index 0000000000000000000000000000000000000000..e8ecea297b9740dd47cea6cabf3366ae37260195
--- /dev/null
+++ b/tiger_only/src/which.c
@@ -0,0 +1,146 @@
+/**
+ * Copyright (c) 2000 Dan Papasian.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+__FBSDID("$FreeBSD: src/usr.bin/which/which.c,v 1.6 2005/02/10 16:04:22 ru Exp $");
+
+#include <sys/stat.h>
+#include <sys/param.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static void	 usage(void);
+static int	 print_matches(char *, char *);
+	
+int 	silent;
+int 	allpaths;
+
+int
+main(int argc, char **argv)
+{
+	char *p, *path;
+	ssize_t pathlen;
+	int opt, status;
+
+	status = EXIT_SUCCESS;
+
+	while ((opt = getopt(argc, argv, "as")) != -1) {
+		switch (opt) {
+		case 'a':
+			allpaths = 1;
+			break;
+		case 's':
+			silent = 1;
+			break;
+		default:
+			usage();
+			break;
+		}
+	}
+
+	argv += optind;
+	argc -= optind;
+
+	if (argc == 0)
+		usage();
+
+	if ((p = getenv("PATH")) == NULL)
+		exit(EXIT_FAILURE);
+	pathlen = strlen(p) + 1;
+	path = malloc(pathlen);
+	if (path == NULL)
+		err(EXIT_FAILURE, NULL);
+
+	while (argc > 0) {
+		memcpy(path, p, pathlen);
+	
+		if (strlen(*argv) >= FILENAME_MAX ||
+		    print_matches(path, *argv) == -1)
+			status = EXIT_FAILURE;
+
+		argv++;
+		argc--;
+	}
+
+	exit(status);
+}
+
+static void
+usage(void)
+{
+
+	(void)fprintf(stderr, "usage: which [-as] program ...\n");
+	exit(EXIT_FAILURE);
+}
+
+static int
+is_there(char *candidate)
+{
+	struct stat fin;
+
+	/* XXX work around access(2) false positives for superuser */
+	if (access(candidate, X_OK) == 0 &&
+	    stat(candidate, &fin) == 0 &&
+	    S_ISREG(fin.st_mode) &&
+	    (getuid() != 0 ||
+	    (fin.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0)) {
+		if (!silent)
+			printf("%s\n", candidate);
+		return (1);
+	}
+	return (0);
+}
+
+static int
+print_matches(char *path, char *filename)
+{
+	char candidate[PATH_MAX];
+	const char *d;
+	int found;
+
+	if (strchr(filename, '/') != NULL)
+		return (is_there(filename) ? 0 : -1);
+	found = 0;
+	while ((d = strsep(&path, ":")) != NULL) {
+		if (*d == '\0')
+			d = ".";
+		if (snprintf(candidate, sizeof(candidate), "%s/%s", d,
+		    filename) >= (int)sizeof(candidate))
+			continue;
+		if (is_there(candidate)) {
+			found = 1;
+			if (!allpaths)
+				break;
+		}
+	}
+	return (found ? 0 : -1);
+}
+