diff --git a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Demo.java b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Demo.java
new file mode 100644
index 0000000000000000000000000000000000000000..75a7cfab5210a08bc6e4cf532ae5dc7ad04e85ea
--- /dev/null
+++ b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Demo.java
@@ -0,0 +1,54 @@
+package edu.unl.cse.soft160.project_plan;
+
+public class Demo {
+	public static void main(String... arguments) {
+		Team alpha = new Team("Team Alpha");
+		alpha.addMember(TeamMemberRole.TEAM_LEAD, "Eve", "eve@example.com");
+		alpha.addMember(TeamMemberRole.CODING_LEAD, "Carol", "carol@example.com");
+		alpha.addMember(TeamMemberRole.UX_LEAD, "Bob", "bob@example.com");
+		alpha.addMember(TeamMemberRole.VERIFICATION_LEAD, "Alice", "alice@example.com");
+		for (String name : new String[] { "Alice", "Bob", "Carol", "Dan", "Eve" }) {
+			System.out.print("Email for " + name + ": ");
+			try {
+				System.out.println(alpha.getEmail(name));
+			} catch (IllegalArgumentException exception) {
+				System.out.println(exception.getMessage());
+			}
+		}
+		System.out.println();
+		Project bravo = new Project("Bravo", alpha);
+		Task gatherRequirements = new Task("Gather Requirements");
+		Task implementLogic = new Task("Implement Logic");
+		Task implementBackend = new Task("Implement Backend");
+		Task implementUI = new Task("Implement UI");
+		Task verify = new Task("Verify");
+		verify.addPredecessor(implementLogic);
+		verify.addPredecessor(implementBackend);
+		verify.addPredecessor(implementUI);
+		implementLogic.addPredecessor(gatherRequirements);
+		implementBackend.addPredecessor(gatherRequirements);
+		implementUI.addPredecessor(gatherRequirements);
+		bravo.addTask(gatherRequirements);
+		bravo.addTask(implementLogic);
+		bravo.addTask(implementBackend);
+		bravo.addTask(implementUI);
+		bravo.addTask(verify);
+		System.out.println(bravo);
+		System.out.println();
+		gatherRequirements.complete();
+		System.out.println(bravo);
+		System.out.println();
+		implementLogic.complete();
+		System.out.println(bravo);
+		System.out.println();
+		implementBackend.complete();
+		System.out.println(bravo);
+		System.out.println();
+		implementUI.complete();
+		System.out.println(bravo);
+		System.out.println();
+		verify.complete();
+		System.out.println(bravo);
+		System.out.println();
+	}
+}
diff --git a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Project.java b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Project.java
new file mode 100644
index 0000000000000000000000000000000000000000..93c772c6c058e4f38e4401542f0cb91e19b2fdaf
--- /dev/null
+++ b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Project.java
@@ -0,0 +1,41 @@
+package edu.unl.cse.soft160.project_plan;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class Project {
+	private String name;
+	private Team team;
+	private Set<Task> tasks;
+
+	public Project(String name, Team team) {
+		this.name = name;
+		this.team = team;
+		tasks = new HashSet<Task>();
+	}
+
+	public void addTask(Task task) {
+		tasks.add(task);
+	}
+
+	public Set<Task> getTasks(TaskStatus status) {
+		Set<Task> result = new HashSet<Task>();
+		for (Task task : tasks) {
+			if (task.getStatus() == status) {
+				result.add(task);
+			}
+		}
+		return result;
+	}
+
+	public String toString() {
+		String result = "Project " + name + " (assigned to " + team + "):\n";
+		for (TaskStatus status : TaskStatus.values()) {
+			result += " " + status + ":\n";
+			for (Task task : getTasks(status)) {
+				result += "  " + task + "\n";
+			}
+		}
+		return result + "End Project";
+	}
+}
diff --git a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Task.java b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Task.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4f6e63af5ab98028fef8856e3bd0d6977f49cc2
--- /dev/null
+++ b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Task.java
@@ -0,0 +1,25 @@
+package edu.unl.cse.soft160.project_plan;
+
+public class Task {
+	public Task(String name) {
+		// TODO: replace stub
+	}
+
+	public void addPredecessor(Task other) {
+		// TODO: replace stub
+	}
+
+	public TaskStatus getStatus() {
+		// TODO: replace stub
+		return TaskStatus.BLOCKED;
+	}
+
+	public void complete() {
+		// TODO: replace stub
+	}
+
+	public String toString() {
+		// TODO: replace stub
+		return "〈Placeholder〉";
+	}
+}
diff --git a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/TaskStatus.java b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/TaskStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..17e060ea18d4de5dd3755ed28ed519001d67b2ef
--- /dev/null
+++ b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/TaskStatus.java
@@ -0,0 +1,5 @@
+package edu.unl.cse.soft160.project_plan;
+
+public enum TaskStatus {
+	READY, BLOCKED, COMPLETED,
+}
diff --git a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Team.java b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Team.java
index cbcbe262b7adc621329bd0e8fdbb5b48d6538e39..3fbf5cef9b39c25fbc8e4c4654963e528b90f07a 100644
--- a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Team.java
+++ b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/Team.java
@@ -6,23 +6,34 @@ public class Team {
 	private String teamLeadEmail;
 	private String codingLeadName;
 	private String codingLeadEmail;
-	private String userExperienceLeadName;
-	private String userExperienceLeadEmail;
+	private String UXLeadName;
+	private String UXLeadEmail;
 	private String verificationLeadName;
 	private String verificationLeadEmail;
 
-	public Team(String teamName, String teamLeadName, String teamLeadEmail, String codingLeadName,
-			String codingLeadEmail, String userExperienceLeadName, String userExperienceLeadEmail,
-			String verificationLeadName, String verificationLeadEmail) {
+	public Team(String teamName) {
 		this.teamName = teamName;
-		this.teamLeadName = teamLeadName;
-		this.teamLeadEmail = teamLeadEmail;
-		this.codingLeadName = codingLeadName;
-		this.codingLeadEmail = codingLeadEmail;
-		this.userExperienceLeadName = userExperienceLeadName;
-		this.userExperienceLeadEmail = userExperienceLeadEmail;
-		this.verificationLeadName = verificationLeadName;
-		this.verificationLeadEmail = verificationLeadEmail;
+	}
+
+	public void addMember(TeamMemberRole role, String name, String email) {
+		switch (role) {
+		case TEAM_LEAD:
+			teamLeadName = name;
+			teamLeadEmail = email;
+			break;
+		case CODING_LEAD:
+			codingLeadName = name;
+			codingLeadEmail = email;
+			break;
+		case UX_LEAD:
+			UXLeadName = name;
+			UXLeadEmail = email;
+			break;
+		case VERIFICATION_LEAD:
+			verificationLeadName = name;
+			verificationLeadEmail = email;
+			break;
+		}
 	}
 
 	public String getEmail(String name) {
@@ -32,8 +43,8 @@ public class Team {
 		if (name.equals(codingLeadName)) {
 			return codingLeadEmail;
 		}
-		if (name.equals(userExperienceLeadName)) {
-			return userExperienceLeadEmail;
+		if (name.equals(UXLeadName)) {
+			return UXLeadEmail;
 		}
 		if (name.equals(verificationLeadName)) {
 			return verificationLeadEmail;
diff --git a/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/TeamMemberRole.java b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/TeamMemberRole.java
new file mode 100644
index 0000000000000000000000000000000000000000..13b359015a136b015403fb119be729ac636e2907
--- /dev/null
+++ b/project_plan/src/main/java/edu/unl/cse/soft160/project_plan/TeamMemberRole.java
@@ -0,0 +1,5 @@
+package edu.unl.cse.soft160.project_plan;
+
+public enum TeamMemberRole {
+	TEAM_LEAD, CODING_LEAD, UX_LEAD, VERIFICATION_LEAD,
+}