diff --git a/phonebook/.gitattributes b/phonebook/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..00a51aff5e5a83d6313f3bd15fadc601a205b66f
--- /dev/null
+++ b/phonebook/.gitattributes
@@ -0,0 +1,6 @@
+#
+# https://help.github.com/articles/dealing-with-line-endings/
+#
+# These are explicitly windows files and should use crlf
+*.bat           text eol=crlf
+
diff --git a/phonebook/.gitignore b/phonebook/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f198ec547b9190a094cdd1e56458a0ed7b8c23c8
--- /dev/null
+++ b/phonebook/.gitignore
@@ -0,0 +1,216 @@
+# Created by https://www.gitignore.io/api/java,gradle,eclipse,intellij,visualstudiocode
+# Edit at https://www.gitignore.io/?templates=java,gradle,eclipse,intellij,visualstudiocode
+
+### Eclipse ###
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# CDT- autotools
+.autotools
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Annotation Processing
+.apt_generated/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
+### Eclipse Patch ###
+# Eclipse Core
+.project
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# Annotation Processing
+.apt_generated
+
+.sts4-cache/
+
+### Intellij ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator/
+
+### Java ###
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+
+### Gradle ###
+.gradle
+build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+# Cache of project
+.gradletasknamecache
+
+# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
+# gradle/wrapper/gradle-wrapper.properties
+
+### Gradle Patch ###
+**/build/
+
+# End of https://www.gitignore.io/api/java,gradle,eclipse,intellij,visualstudiocode
\ No newline at end of file
diff --git a/phonebook/bin/main/io/fp/phonebook/App.class b/phonebook/bin/main/io/fp/phonebook/App.class
deleted file mode 100644
index de2da0176f6859bc578771cb4631221f04a705d8..0000000000000000000000000000000000000000
Binary files a/phonebook/bin/main/io/fp/phonebook/App.class and /dev/null differ
diff --git a/phonebook/bin/main/io/fp/phonebook/PhoneBook.class b/phonebook/bin/main/io/fp/phonebook/PhoneBook.class
deleted file mode 100644
index e6b23d6e2d1991ad97666ad9f2a07a484d690d3c..0000000000000000000000000000000000000000
Binary files a/phonebook/bin/main/io/fp/phonebook/PhoneBook.class and /dev/null differ
diff --git a/phonebook/bin/main/io/fp/phonebook/PhoneBookException.class b/phonebook/bin/main/io/fp/phonebook/PhoneBookException.class
deleted file mode 100644
index 6a792f5fd24fd3c2853dd0181f1871ce266831cf..0000000000000000000000000000000000000000
Binary files a/phonebook/bin/main/io/fp/phonebook/PhoneBookException.class and /dev/null differ
diff --git a/phonebook/bin/test/io/fp/phonebook/PhoneBookTest.class b/phonebook/bin/test/io/fp/phonebook/PhoneBookTest.class
deleted file mode 100644
index 2e78c5b0846fab5a3a0f567131f9b08b0e2984d5..0000000000000000000000000000000000000000
Binary files a/phonebook/bin/test/io/fp/phonebook/PhoneBookTest.class and /dev/null differ
diff --git a/phonebook/build.gradle b/phonebook/build.gradle
index 037b0dcbbfcadee2ed538f42e89693b81dd390fc..214ea8ead3ad540e622efeeada4c170ea8c66362 100644
--- a/phonebook/build.gradle
+++ b/phonebook/build.gradle
@@ -3,14 +3,14 @@
  *
  * This generated file contains a sample Java project to get you started.
  * For more details take a look at the Java Quickstart chapter in the Gradle
- * User Manual available at https://docs.gradle.org/5.6.1/userguide/tutorial_java_projects.html
+ * User Manual available at https://docs.gradle.org/6.3/userguide/tutorial_java_projects.html
  */
 
 plugins {
     // Apply the java plugin to add support for Java
     id 'java'
 
-    // Apply the application plugin to add support for building a CLI application
+    // Apply the application plugin to add support for building a CLI application.
     id 'application'
 }
 
@@ -22,17 +22,17 @@ repositories {
 
 dependencies {
     // This dependency is used by the application.
-    implementation 'com.google.guava:guava:28.0-jre'
+    implementation 'com.google.guava:guava:28.2-jre'
 
     // Use JUnit Jupiter API for testing.
-    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
+    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
 
     // Use JUnit Jupiter Engine for testing.
-    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
 }
 
 application {
-    // Define the main class for the application
+    // Define the main class for the application.
     mainClassName = 'io.fp.phonebook.App'
 }
 
diff --git a/phonebook/gradle/wrapper/gradle-wrapper.jar b/phonebook/gradle/wrapper/gradle-wrapper.jar
index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..490fda8577df6c95960ba7077c43220e5bb2c0d9 100644
Binary files a/phonebook/gradle/wrapper/gradle-wrapper.jar and b/phonebook/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/phonebook/gradle/wrapper/gradle-wrapper.properties b/phonebook/gradle/wrapper/gradle-wrapper.properties
index 59b5f89288842bf8ef144d802e597dcf482b3d70..a4b4429748d92848a3d820c7b099fbeb941066ae 100644
--- a/phonebook/gradle/wrapper/gradle-wrapper.properties
+++ b/phonebook/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/phonebook/gradlew b/phonebook/gradlew
index 83f2acfdc319a24e8766cca78f32474ad7a22dd6..2fe81a7d95e4f9ad2c9b2a046707d36ceb3980b3 100644
--- a/phonebook/gradlew
+++ b/phonebook/gradlew
@@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
         else
             eval `echo args$i`="\"$arg\""
         fi
-        i=$((i+1))
+        i=`expr $i + 1`
     done
     case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
     esac
 fi
 
@@ -175,14 +175,9 @@ save () {
     for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
     echo " "
 }
-APP_ARGS=$(save "$@")
+APP_ARGS=`save "$@"`
 
 # Collect all arguments for the java command, following the shell quoting and substitution rules
 eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
-  cd "$(dirname "$0")"
-fi
-
 exec "$JAVACMD" "$@"
diff --git a/phonebook/gradlew.bat b/phonebook/gradlew.bat
index 9618d8d9607cd91a0efb866bcac4810064ba6fac..62bd9b9ccefea2b65ae41e5d9a545e2021b90a1d 100644
--- a/phonebook/gradlew.bat
+++ b/phonebook/gradlew.bat
@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 
diff --git a/phonebook/settings.gradle b/phonebook/settings.gradle
index 33974448d524157eb63e8a0482ef297f5d253ef4..43621cc760e4afdf4cb9308dd5ac963f116b471d 100644
--- a/phonebook/settings.gradle
+++ b/phonebook/settings.gradle
@@ -4,7 +4,7 @@
  * The settings file is used to specify which projects to include in your build.
  *
  * Detailed information about configuring a multi-project build in Gradle can be found
- * in the user manual at https://docs.gradle.org/5.6.1/userguide/multi_project_builds.html
+ * in the user manual at https://docs.gradle.org/6.3/userguide/multi_project_builds.html
  */
 
-rootProject.name = 'phonebook'
+rootProject.name = 'campus'
diff --git a/phonebook/src/test/java/io/fp/phonebook/PhoneBookTest.java b/phonebook/src/test/java/io/fp/phonebook/PhoneBookTest.java
deleted file mode 100644
index 2f3bf038a2cf15fd73c90b51ca005b3fec9df8c5..0000000000000000000000000000000000000000
--- a/phonebook/src/test/java/io/fp/phonebook/PhoneBookTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package io.fp.phonebook;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-
-import java.util.Map;
-import java.util.Set;
-
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-public class PhoneBookTest {
-	PhoneBook phoneBook;
-	Integer[] numbers = { 1, 2, 3 };
-
-	@BeforeEach
-	public void setUp() {
-		phoneBook = new PhoneBook();
-	}
-
-	@Test
-	public void testCreateContactArray() {
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person", numbers);
-			for (int i = 0; i < numbers.length; i++) {
-				assertEquals(true, phoneBook.getPhoneNumbers("Person").contains(numbers[i]));
-			}
-			assertEquals(3, phoneBook.getPhoneNumbers("Person").size());
-
-		});
-	}
-
-	@Test
-	public void testCreateContactArrayTwoTimes() throws PhoneBookException {
-		assertThrows(PhoneBookException.class, () -> {
-		phoneBook.createContact("Person", numbers);
-		phoneBook.createContact("Person", numbers);
-		});
-	}
-
-	@Test
-	public void testCreateContactSingleNumber() { 
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person", 1);
-			assertEquals(true, phoneBook.getPhoneNumbers("Person").contains(1));
-			assertEquals(1, phoneBook.getPhoneNumbers("Person").size());
-
-		});
-	}
-	
-	@Test
-	public void testDeleteEntryByPhoneNumber() {
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person1", numbers);
-			phoneBook.createContact("Person2", 4);
-			String deletedPerson = phoneBook.deleteEntryByPhoneNumber(1);
-			assertEquals("Person1", deletedPerson);
-			assertEquals(true, phoneBook.getPhoneNumbers("Person1").contains(2));
-			assertEquals(true, phoneBook.getPhoneNumbers("Person1").contains(3));
-			assertEquals(true, phoneBook.getPhoneNumbers("Person2").contains(4));
-			assertEquals(2, phoneBook.getPhoneNumbers("Person1").size());
-			assertEquals(1, phoneBook.getPhoneNumbers("Person2").size());
-		});
-	}
-
-	@Test
-	public void testDeleteEntriesOfAPerson() {
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person1", numbers);
-			phoneBook.createContact("Person2", 4);
-			Set<Integer> deletedSet = phoneBook.deleteEntriesOfAPerson("Person1");
-
-			for (int i = 0; i < numbers.length; i++) {
-				assertEquals(true, deletedSet.contains(numbers[i]));
-			}
-			assertEquals(true, phoneBook.getPhoneNumbers("Person2").contains(4));
-			assertEquals(1, phoneBook.getPhoneNumbers("Person2").size());
-			assertEquals(0, phoneBook.getPhoneNumbers("Person1").size());
-		});
-	}
-
-	@Test
-	public void testDeleteEntriesOfAPersonUnknownPerson() {
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person1", numbers);
-			Set<Integer> deletedSet = phoneBook.deleteEntriesOfAPerson("Person2");
-			for (int i = 0; i < numbers.length; i++) {
-				assertEquals(true, phoneBook.getPhoneNumbers("Person1").contains(numbers[i]));
-			}
-			assertEquals(3, phoneBook.getPhoneNumbers("Person1").size());
-			assertEquals(0, deletedSet.size());
-		});
-	}
-
-	@Test
-	public void testDeleteEntryByPhoneNumberUnknownNumber() {
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person", numbers);
-			String deletedPerson = phoneBook.deleteEntryByPhoneNumber(4);
-			assertEquals(null, deletedPerson);
-			for (int i = 0; i < numbers.length; i++) {
-				assertEquals(true, phoneBook.getPhoneNumbers("Person").contains(numbers[i]));
-			}
-			assertEquals(3, phoneBook.getPhoneNumbers("Person").size());
-		});
-	}
-
-	@Test
-	public void testGetMap() {
-		assertDoesNotThrow(()-> {
-			phoneBook.createContact("Person", numbers);
-			Map<Integer, String> phoneBookMap = phoneBook.getBook();
-			assertEquals("Person", phoneBookMap.get(1));
-			assertEquals("Person", phoneBookMap.get(2));
-			assertEquals("Person", phoneBookMap.get(3));
-			assertEquals(3, phoneBookMap.size());
-		});
-	}
-
-}
diff --git a/phonebook/src/test/java/io/fp/phonebook/test.keep b/phonebook/src/test/java/io/fp/phonebook/test.keep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391