diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/Makefile b/projects/samskivert/src/java/com/samskivert/swing/util/Makefile
new file mode 100644
index 00000000..ab5fa631
--- /dev/null
+++ b/projects/samskivert/src/java/com/samskivert/swing/util/Makefile
@@ -0,0 +1,11 @@
+#
+# $Id: Makefile,v 1.1 2000/12/06 03:25:19 mdb Exp $
+
+ROOT = ../../../..
+
+SRCS = \
+ Task.java \
+ TaskMaster.java \
+ TaskObserver.java \
+
+include $(ROOT)/build/Makefile.java
diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/Task.java b/projects/samskivert/src/java/com/samskivert/swing/util/Task.java
new file mode 100644
index 00000000..bc7a4f89
--- /dev/null
+++ b/projects/samskivert/src/java/com/samskivert/swing/util/Task.java
@@ -0,0 +1,33 @@
+//
+// $Id: Task.java,v 1.1 2000/12/06 03:25:19 mdb Exp $
+
+package com.samskivert.swing.util;
+
+/**
+ * A swing application requests that a task be invoked by the task
+ * master. The task master invokes the task on a separate thread and
+ * informs the swing application when the task has completed via the task
+ * observer interface. It does so in a way that plays nicely with the
+ * swing event dispatch thread (the swing application is notified of the
+ * task's completion on the event dispatch thread so that it can wiggle
+ * its user interface elements to its heart's desire).
+ */
+public interface Task
+{
+ /**
+ * This method is called by the task master to invoke the task. The
+ * task should run to completion and return some value.
+ */
+ public Object invoke ();
+
+ /**
+ * This method is called by the task master when it has received a
+ * request to cancel this task. If the task can be cancelled, abort
+ * should return true and the currently running call to
+ * invoke() should immediately return (the return value
+ * will be ignored). If the task cannot be cancelled, abort should
+ * return false and the task master will simply abandon the task and
+ * the thread on which it is running.
+ */
+ public boolean abort ();
+}
diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java b/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java
new file mode 100644
index 00000000..f2acd1b1
--- /dev/null
+++ b/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java
@@ -0,0 +1,98 @@
+//
+// $Id: TaskMaster.java,v 1.1 2000/12/06 03:25:19 mdb Exp $
+
+package com.samskivert.swing.util;
+
+import java.util.Hashtable;
+import com.samskivert.util.Log;
+
+/**
+ * The task master provides the ability for swing applications to invoke
+ * tasks on another thread and to conveniently receive the results of
+ * those tasks back on the swing event dispatch thread where the swing
+ * application can safely manipulate its user interface in response to the
+ * results of the task.
+ *
+ *
invoke() method.
+ */
+ public void taskCompleted (String name, Object result);
+
+ /**
+ * If the task fails to run to completion and instead throws an
+ * exception, this member function will be called on the supplied
+ * observer.
+ *
+ * @param name The name under which the task was originally invoked.
+ * @param exception The exception thrown by the task during the call
+ * to invoke().
+ */
+ public void taskFailed (String name, Throwable exception);
+}