diff --git a/.gitignore b/.gitignore
index f239fb82bfa8af164e476fe06644bd4bd18101fa..1016429dfb7a5dc062a4e1b0e0d21e4c87341650 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
 openssl-1.1.0g/*
 .vagrant/*
 cmake*
-CMake*
+CMakeLists.txt
 Vagrantfile
 cmake-build-debug*
 CMakeCache.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 73d299b0af79fff564fbb34a3435ab6892c391d0..7c0f522fae5c966668a50c56ee824104a6f9eb93 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,6 +5,30 @@ set(CMAKE_CXX_STANDARD 11)
 
 add_executable(eecs398_search
         main.cpp
-        ProducerConsumerQueue.cpp
-        ProducerConsumerQueue.h
-        ProducerConsumerQueue_test.cpp Parser.cpp)
+        shared/ProducerConsumerQueue.cpp
+        shared/ProducerConsumerQueue.h
+        shared/ProducerConsumerQueue_test.cpp parser/Parser.h
+        parser/Parser.h
+        util/Tokenizer.h
+        util/stringProcessing.h
+        util/Stemmer.h)
+
+add_executable(StringProcessingTest
+        util/stringProcessing.h
+        util/Stemmer.h
+        util/tests/stringProcessingTest.cpp)
+
+add_executable(TokenizerTest
+        util/Tokenizer.h
+        util/tests/tokenizerTest.cpp)
+
+add_executable(StemmerTest
+        util/Stemmer.h
+        util/tests/stemmerTest.cpp)
+
+add_executable(ParserEndToEndTest
+        parser/Parser.h
+        shared/Document.h
+        shared/url.h
+        parser/tests/parserTest.cpp)
+
diff --git a/cmake-build-debug/CMakeFiles/Makefile.cmake b/cmake-build-debug/CMakeFiles/Makefile.cmake
index 86bad8f3f336e1ec7527b88aa69e66639583146a..ce464ff7cf4eb2968632915d2b08cd28075f155a 100644
--- a/cmake-build-debug/CMakeFiles/Makefile.cmake
+++ b/cmake-build-debug/CMakeFiles/Makefile.cmake
@@ -49,5 +49,9 @@ set(CMAKE_MAKEFILE_PRODUCTS
 
 # Dependency information for all targets:
 set(CMAKE_DEPEND_INFO_FILES
+  "CMakeFiles/StemmerTest.dir/DependInfo.cmake"
+  "CMakeFiles/ParserEndToEndTest.dir/DependInfo.cmake"
+  "CMakeFiles/TokenizerTest.dir/DependInfo.cmake"
+  "CMakeFiles/StringProcessingTest.dir/DependInfo.cmake"
   "CMakeFiles/eecs398_search.dir/DependInfo.cmake"
   )
diff --git a/cmake-build-debug/CMakeFiles/Makefile2 b/cmake-build-debug/CMakeFiles/Makefile2
index a6117048768b44ac670f4253a26a8171b1fd1081..240a1f0622fd032e184ed236d9f66b6ad67b0fcf 100644
--- a/cmake-build-debug/CMakeFiles/Makefile2
+++ b/cmake-build-debug/CMakeFiles/Makefile2
@@ -59,6 +59,154 @@ CMAKE_SOURCE_DIR = /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-s
 # The top-level build directory on which CMake was run.
 CMAKE_BINARY_DIR = /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug
 
+#=============================================================================
+# Target rules for target CMakeFiles/StemmerTest.dir
+
+# All Build rule for target.
+CMakeFiles/StemmerTest.dir/all:
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/depend
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/build
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles --progress-num=3,4 "Built target StemmerTest"
+.PHONY : CMakeFiles/StemmerTest.dir/all
+
+# Include target in all.
+all: CMakeFiles/StemmerTest.dir/all
+
+.PHONY : all
+
+# Build rule for subdir invocation for target.
+CMakeFiles/StemmerTest.dir/rule: cmake_check_build_system
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 2
+	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/StemmerTest.dir/all
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 0
+.PHONY : CMakeFiles/StemmerTest.dir/rule
+
+# Convenience name for target.
+StemmerTest: CMakeFiles/StemmerTest.dir/rule
+
+.PHONY : StemmerTest
+
+# clean rule for target.
+CMakeFiles/StemmerTest.dir/clean:
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/clean
+.PHONY : CMakeFiles/StemmerTest.dir/clean
+
+# clean rule for target.
+clean: CMakeFiles/StemmerTest.dir/clean
+
+.PHONY : clean
+
+#=============================================================================
+# Target rules for target CMakeFiles/ParserEndToEndTest.dir
+
+# All Build rule for target.
+CMakeFiles/ParserEndToEndTest.dir/all:
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/depend
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/build
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles --progress-num=1,2 "Built target ParserEndToEndTest"
+.PHONY : CMakeFiles/ParserEndToEndTest.dir/all
+
+# Include target in all.
+all: CMakeFiles/ParserEndToEndTest.dir/all
+
+.PHONY : all
+
+# Build rule for subdir invocation for target.
+CMakeFiles/ParserEndToEndTest.dir/rule: cmake_check_build_system
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 2
+	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/ParserEndToEndTest.dir/all
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 0
+.PHONY : CMakeFiles/ParserEndToEndTest.dir/rule
+
+# Convenience name for target.
+ParserEndToEndTest: CMakeFiles/ParserEndToEndTest.dir/rule
+
+.PHONY : ParserEndToEndTest
+
+# clean rule for target.
+CMakeFiles/ParserEndToEndTest.dir/clean:
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/clean
+.PHONY : CMakeFiles/ParserEndToEndTest.dir/clean
+
+# clean rule for target.
+clean: CMakeFiles/ParserEndToEndTest.dir/clean
+
+.PHONY : clean
+
+#=============================================================================
+# Target rules for target CMakeFiles/TokenizerTest.dir
+
+# All Build rule for target.
+CMakeFiles/TokenizerTest.dir/all:
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/depend
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/build
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles --progress-num=7,8 "Built target TokenizerTest"
+.PHONY : CMakeFiles/TokenizerTest.dir/all
+
+# Include target in all.
+all: CMakeFiles/TokenizerTest.dir/all
+
+.PHONY : all
+
+# Build rule for subdir invocation for target.
+CMakeFiles/TokenizerTest.dir/rule: cmake_check_build_system
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 2
+	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/TokenizerTest.dir/all
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 0
+.PHONY : CMakeFiles/TokenizerTest.dir/rule
+
+# Convenience name for target.
+TokenizerTest: CMakeFiles/TokenizerTest.dir/rule
+
+.PHONY : TokenizerTest
+
+# clean rule for target.
+CMakeFiles/TokenizerTest.dir/clean:
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/clean
+.PHONY : CMakeFiles/TokenizerTest.dir/clean
+
+# clean rule for target.
+clean: CMakeFiles/TokenizerTest.dir/clean
+
+.PHONY : clean
+
+#=============================================================================
+# Target rules for target CMakeFiles/StringProcessingTest.dir
+
+# All Build rule for target.
+CMakeFiles/StringProcessingTest.dir/all:
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/depend
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/build
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles --progress-num=5,6 "Built target StringProcessingTest"
+.PHONY : CMakeFiles/StringProcessingTest.dir/all
+
+# Include target in all.
+all: CMakeFiles/StringProcessingTest.dir/all
+
+.PHONY : all
+
+# Build rule for subdir invocation for target.
+CMakeFiles/StringProcessingTest.dir/rule: cmake_check_build_system
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 2
+	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/StringProcessingTest.dir/all
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 0
+.PHONY : CMakeFiles/StringProcessingTest.dir/rule
+
+# Convenience name for target.
+StringProcessingTest: CMakeFiles/StringProcessingTest.dir/rule
+
+.PHONY : StringProcessingTest
+
+# clean rule for target.
+CMakeFiles/StringProcessingTest.dir/clean:
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/clean
+.PHONY : CMakeFiles/StringProcessingTest.dir/clean
+
+# clean rule for target.
+clean: CMakeFiles/StringProcessingTest.dir/clean
+
+.PHONY : clean
+
 #=============================================================================
 # Target rules for target CMakeFiles/eecs398_search.dir
 
@@ -66,7 +214,7 @@ CMAKE_BINARY_DIR = /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-s
 CMakeFiles/eecs398_search.dir/all:
 	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/depend
 	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/build
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles --progress-num=1,2,3,4,5 "Built target eecs398_search"
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles --progress-num=9,10,11,12 "Built target eecs398_search"
 .PHONY : CMakeFiles/eecs398_search.dir/all
 
 # Include target in all.
@@ -76,7 +224,7 @@ all: CMakeFiles/eecs398_search.dir/all
 
 # Build rule for subdir invocation for target.
 CMakeFiles/eecs398_search.dir/rule: cmake_check_build_system
-	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 5
+	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 4
 	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/eecs398_search.dir/all
 	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles 0
 .PHONY : CMakeFiles/eecs398_search.dir/rule
diff --git a/cmake-build-debug/CMakeFiles/TargetDirectories.txt b/cmake-build-debug/CMakeFiles/TargetDirectories.txt
index dfe16445afbca0e23aced5e3efedded65e80b5df..9f29707dc5700ee56fb0fd99ccdd3b8ead578f10 100644
--- a/cmake-build-debug/CMakeFiles/TargetDirectories.txt
+++ b/cmake-build-debug/CMakeFiles/TargetDirectories.txt
@@ -1,3 +1,7 @@
-/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/rebuild_cache.dir
 /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/edit_cache.dir
+/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/rebuild_cache.dir
+/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/StemmerTest.dir
+/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/ParserEndToEndTest.dir
+/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/TokenizerTest.dir
+/Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/StringProcessingTest.dir
 /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/eecs398_search.dir
diff --git a/cmake-build-debug/CMakeFiles/eecs398_search.dir/cmake_clean.cmake b/cmake-build-debug/CMakeFiles/eecs398_search.dir/cmake_clean.cmake
index 9af643c224c28396ae58f12ffb536b91db4e51ec..4c6f914276af20042ffdaa869fabe26aab28a3db 100644
--- a/cmake-build-debug/CMakeFiles/eecs398_search.dir/cmake_clean.cmake
+++ b/cmake-build-debug/CMakeFiles/eecs398_search.dir/cmake_clean.cmake
@@ -1,8 +1,7 @@
 file(REMOVE_RECURSE
   "CMakeFiles/eecs398_search.dir/main.cpp.o"
-  "CMakeFiles/eecs398_search.dir/ProducerConsumerQueue.cpp.o"
-  "CMakeFiles/eecs398_search.dir/ProducerConsumerQueue_test.cpp.o"
-  "CMakeFiles/eecs398_search.dir/Parser.cpp.o"
+  "CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue.cpp.o"
+  "CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue_test.cpp.o"
   "eecs398_search.pdb"
   "eecs398_search"
 )
diff --git a/cmake-build-debug/CMakeFiles/eecs398_search.dir/link.txt b/cmake-build-debug/CMakeFiles/eecs398_search.dir/link.txt
index 9b5148766bc602bd1972f70ea569a9ba82aef341..6bb9808030b7b7569094b223bcd66ecacfeaf9c7 100644
--- a/cmake-build-debug/CMakeFiles/eecs398_search.dir/link.txt
+++ b/cmake-build-debug/CMakeFiles/eecs398_search.dir/link.txt
@@ -1 +1 @@
-/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/eecs398_search.dir/main.cpp.o CMakeFiles/eecs398_search.dir/ProducerConsumerQueue.cpp.o CMakeFiles/eecs398_search.dir/ProducerConsumerQueue_test.cpp.o CMakeFiles/eecs398_search.dir/Parser.cpp.o  -o eecs398_search 
+/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/eecs398_search.dir/main.cpp.o CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue.cpp.o CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue_test.cpp.o  -o eecs398_search 
diff --git a/cmake-build-debug/CMakeFiles/eecs398_search.dir/progress.make b/cmake-build-debug/CMakeFiles/eecs398_search.dir/progress.make
index 33e6bffba3730113ad4bec358b7c8a00b5a67431..c31b8d796df5a1e5f4114041afeacd7d92789a2e 100644
--- a/cmake-build-debug/CMakeFiles/eecs398_search.dir/progress.make
+++ b/cmake-build-debug/CMakeFiles/eecs398_search.dir/progress.make
@@ -1,6 +1,5 @@
-CMAKE_PROGRESS_1 = 1
-CMAKE_PROGRESS_2 = 2
-CMAKE_PROGRESS_3 = 3
-CMAKE_PROGRESS_4 = 4
-CMAKE_PROGRESS_5 = 5
+CMAKE_PROGRESS_1 = 9
+CMAKE_PROGRESS_2 = 10
+CMAKE_PROGRESS_3 = 11
+CMAKE_PROGRESS_4 = 12
 
diff --git a/cmake-build-debug/CMakeFiles/progress.marks b/cmake-build-debug/CMakeFiles/progress.marks
index 7ed6ff82de6bcc2a78243fc9c54d3ef5ac14da69..48082f72f087ce7e6fa75b9c41d7387daecd447b 100644
--- a/cmake-build-debug/CMakeFiles/progress.marks
+++ b/cmake-build-debug/CMakeFiles/progress.marks
@@ -1 +1 @@
-5
+12
diff --git a/cmake-build-debug/Makefile b/cmake-build-debug/Makefile
index aad501e3ed90b0be966b0a22be1696150faa2f97..6fff100b8839c953c4dc583679209e189fa5cb8e 100644
--- a/cmake-build-debug/Makefile
+++ b/cmake-build-debug/Makefile
@@ -56,17 +56,6 @@ CMAKE_BINARY_DIR = /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-s
 #=============================================================================
 # Targets provided globally by CMake.
 
-# Special rule for the target rebuild_cache
-rebuild_cache:
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
-	/Applications/CLion.app/Contents/bin/cmake/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : rebuild_cache
-
-# Special rule for the target rebuild_cache
-rebuild_cache/fast: rebuild_cache
-
-.PHONY : rebuild_cache/fast
-
 # Special rule for the target edit_cache
 edit_cache:
 	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
@@ -78,6 +67,17 @@ edit_cache/fast: edit_cache
 
 .PHONY : edit_cache/fast
 
+# Special rule for the target rebuild_cache
+rebuild_cache:
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
+	/Applications/CLion.app/Contents/bin/cmake/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
+.PHONY : rebuild_cache
+
+# Special rule for the target rebuild_cache
+rebuild_cache/fast: rebuild_cache
+
+.PHONY : rebuild_cache/fast
+
 # The main all target
 all: cmake_check_build_system
 	$(CMAKE_COMMAND) -E cmake_progress_start /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles /Users/veronicaday/Desktop/EECS398/eecs_398/project/eecs398-search/cmake-build-debug/CMakeFiles/progress.marks
@@ -110,6 +110,58 @@ depend:
 	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
 .PHONY : depend
 
+#=============================================================================
+# Target rules for targets named StemmerTest
+
+# Build rule for target.
+StemmerTest: cmake_check_build_system
+	$(MAKE) -f CMakeFiles/Makefile2 StemmerTest
+.PHONY : StemmerTest
+
+# fast build rule for target.
+StemmerTest/fast:
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/build
+.PHONY : StemmerTest/fast
+
+#=============================================================================
+# Target rules for targets named ParserEndToEndTest
+
+# Build rule for target.
+ParserEndToEndTest: cmake_check_build_system
+	$(MAKE) -f CMakeFiles/Makefile2 ParserEndToEndTest
+.PHONY : ParserEndToEndTest
+
+# fast build rule for target.
+ParserEndToEndTest/fast:
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/build
+.PHONY : ParserEndToEndTest/fast
+
+#=============================================================================
+# Target rules for targets named TokenizerTest
+
+# Build rule for target.
+TokenizerTest: cmake_check_build_system
+	$(MAKE) -f CMakeFiles/Makefile2 TokenizerTest
+.PHONY : TokenizerTest
+
+# fast build rule for target.
+TokenizerTest/fast:
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/build
+.PHONY : TokenizerTest/fast
+
+#=============================================================================
+# Target rules for targets named StringProcessingTest
+
+# Build rule for target.
+StringProcessingTest: cmake_check_build_system
+	$(MAKE) -f CMakeFiles/Makefile2 StringProcessingTest
+.PHONY : StringProcessingTest
+
+# fast build rule for target.
+StringProcessingTest/fast:
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/build
+.PHONY : StringProcessingTest/fast
+
 #=============================================================================
 # Target rules for targets named eecs398_search
 
@@ -123,113 +175,194 @@ eecs398_search/fast:
 	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/build
 .PHONY : eecs398_search/fast
 
-Parser.o: Parser.cpp.o
+main.o: main.cpp.o
+
+.PHONY : main.o
+
+# target to build an object file
+main.cpp.o:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/main.cpp.o
+.PHONY : main.cpp.o
+
+main.i: main.cpp.i
+
+.PHONY : main.i
+
+# target to preprocess a source file
+main.cpp.i:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/main.cpp.i
+.PHONY : main.cpp.i
+
+main.s: main.cpp.s
+
+.PHONY : main.s
+
+# target to generate assembly for a file
+main.cpp.s:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/main.cpp.s
+.PHONY : main.cpp.s
 
-.PHONY : Parser.o
+parser/tests/parserTest.o: parser/tests/parserTest.cpp.o
+
+.PHONY : parser/tests/parserTest.o
 
 # target to build an object file
-Parser.cpp.o:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/Parser.cpp.o
-.PHONY : Parser.cpp.o
+parser/tests/parserTest.cpp.o:
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/parser/tests/parserTest.cpp.o
+.PHONY : parser/tests/parserTest.cpp.o
 
-Parser.i: Parser.cpp.i
+parser/tests/parserTest.i: parser/tests/parserTest.cpp.i
 
-.PHONY : Parser.i
+.PHONY : parser/tests/parserTest.i
 
 # target to preprocess a source file
-Parser.cpp.i:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/Parser.cpp.i
-.PHONY : Parser.cpp.i
+parser/tests/parserTest.cpp.i:
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/parser/tests/parserTest.cpp.i
+.PHONY : parser/tests/parserTest.cpp.i
 
-Parser.s: Parser.cpp.s
+parser/tests/parserTest.s: parser/tests/parserTest.cpp.s
 
-.PHONY : Parser.s
+.PHONY : parser/tests/parserTest.s
 
 # target to generate assembly for a file
-Parser.cpp.s:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/Parser.cpp.s
-.PHONY : Parser.cpp.s
+parser/tests/parserTest.cpp.s:
+	$(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/parser/tests/parserTest.cpp.s
+.PHONY : parser/tests/parserTest.cpp.s
 
-ProducerConsumerQueue.o: ProducerConsumerQueue.cpp.o
+shared/ProducerConsumerQueue.o: shared/ProducerConsumerQueue.cpp.o
 
-.PHONY : ProducerConsumerQueue.o
+.PHONY : shared/ProducerConsumerQueue.o
 
 # target to build an object file
-ProducerConsumerQueue.cpp.o:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/ProducerConsumerQueue.cpp.o
-.PHONY : ProducerConsumerQueue.cpp.o
+shared/ProducerConsumerQueue.cpp.o:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue.cpp.o
+.PHONY : shared/ProducerConsumerQueue.cpp.o
 
-ProducerConsumerQueue.i: ProducerConsumerQueue.cpp.i
+shared/ProducerConsumerQueue.i: shared/ProducerConsumerQueue.cpp.i
 
-.PHONY : ProducerConsumerQueue.i
+.PHONY : shared/ProducerConsumerQueue.i
 
 # target to preprocess a source file
-ProducerConsumerQueue.cpp.i:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/ProducerConsumerQueue.cpp.i
-.PHONY : ProducerConsumerQueue.cpp.i
+shared/ProducerConsumerQueue.cpp.i:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue.cpp.i
+.PHONY : shared/ProducerConsumerQueue.cpp.i
 
-ProducerConsumerQueue.s: ProducerConsumerQueue.cpp.s
+shared/ProducerConsumerQueue.s: shared/ProducerConsumerQueue.cpp.s
 
-.PHONY : ProducerConsumerQueue.s
+.PHONY : shared/ProducerConsumerQueue.s
 
 # target to generate assembly for a file
-ProducerConsumerQueue.cpp.s:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/ProducerConsumerQueue.cpp.s
-.PHONY : ProducerConsumerQueue.cpp.s
+shared/ProducerConsumerQueue.cpp.s:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue.cpp.s
+.PHONY : shared/ProducerConsumerQueue.cpp.s
 
-ProducerConsumerQueue_test.o: ProducerConsumerQueue_test.cpp.o
+shared/ProducerConsumerQueue_test.o: shared/ProducerConsumerQueue_test.cpp.o
 
-.PHONY : ProducerConsumerQueue_test.o
+.PHONY : shared/ProducerConsumerQueue_test.o
 
 # target to build an object file
-ProducerConsumerQueue_test.cpp.o:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/ProducerConsumerQueue_test.cpp.o
-.PHONY : ProducerConsumerQueue_test.cpp.o
+shared/ProducerConsumerQueue_test.cpp.o:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue_test.cpp.o
+.PHONY : shared/ProducerConsumerQueue_test.cpp.o
 
-ProducerConsumerQueue_test.i: ProducerConsumerQueue_test.cpp.i
+shared/ProducerConsumerQueue_test.i: shared/ProducerConsumerQueue_test.cpp.i
 
-.PHONY : ProducerConsumerQueue_test.i
+.PHONY : shared/ProducerConsumerQueue_test.i
 
 # target to preprocess a source file
-ProducerConsumerQueue_test.cpp.i:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/ProducerConsumerQueue_test.cpp.i
-.PHONY : ProducerConsumerQueue_test.cpp.i
+shared/ProducerConsumerQueue_test.cpp.i:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue_test.cpp.i
+.PHONY : shared/ProducerConsumerQueue_test.cpp.i
 
-ProducerConsumerQueue_test.s: ProducerConsumerQueue_test.cpp.s
+shared/ProducerConsumerQueue_test.s: shared/ProducerConsumerQueue_test.cpp.s
 
-.PHONY : ProducerConsumerQueue_test.s
+.PHONY : shared/ProducerConsumerQueue_test.s
 
 # target to generate assembly for a file
-ProducerConsumerQueue_test.cpp.s:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/ProducerConsumerQueue_test.cpp.s
-.PHONY : ProducerConsumerQueue_test.cpp.s
+shared/ProducerConsumerQueue_test.cpp.s:
+	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/shared/ProducerConsumerQueue_test.cpp.s
+.PHONY : shared/ProducerConsumerQueue_test.cpp.s
 
-main.o: main.cpp.o
+util/tests/stemmerTest.o: util/tests/stemmerTest.cpp.o
 
-.PHONY : main.o
+.PHONY : util/tests/stemmerTest.o
 
 # target to build an object file
-main.cpp.o:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/main.cpp.o
-.PHONY : main.cpp.o
+util/tests/stemmerTest.cpp.o:
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/util/tests/stemmerTest.cpp.o
+.PHONY : util/tests/stemmerTest.cpp.o
 
-main.i: main.cpp.i
+util/tests/stemmerTest.i: util/tests/stemmerTest.cpp.i
 
-.PHONY : main.i
+.PHONY : util/tests/stemmerTest.i
 
 # target to preprocess a source file
-main.cpp.i:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/main.cpp.i
-.PHONY : main.cpp.i
+util/tests/stemmerTest.cpp.i:
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/util/tests/stemmerTest.cpp.i
+.PHONY : util/tests/stemmerTest.cpp.i
 
-main.s: main.cpp.s
+util/tests/stemmerTest.s: util/tests/stemmerTest.cpp.s
 
-.PHONY : main.s
+.PHONY : util/tests/stemmerTest.s
 
 # target to generate assembly for a file
-main.cpp.s:
-	$(MAKE) -f CMakeFiles/eecs398_search.dir/build.make CMakeFiles/eecs398_search.dir/main.cpp.s
-.PHONY : main.cpp.s
+util/tests/stemmerTest.cpp.s:
+	$(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/util/tests/stemmerTest.cpp.s
+.PHONY : util/tests/stemmerTest.cpp.s
+
+util/tests/stringProcessingTest.o: util/tests/stringProcessingTest.cpp.o
+
+.PHONY : util/tests/stringProcessingTest.o
+
+# target to build an object file
+util/tests/stringProcessingTest.cpp.o:
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/util/tests/stringProcessingTest.cpp.o
+.PHONY : util/tests/stringProcessingTest.cpp.o
+
+util/tests/stringProcessingTest.i: util/tests/stringProcessingTest.cpp.i
+
+.PHONY : util/tests/stringProcessingTest.i
+
+# target to preprocess a source file
+util/tests/stringProcessingTest.cpp.i:
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/util/tests/stringProcessingTest.cpp.i
+.PHONY : util/tests/stringProcessingTest.cpp.i
+
+util/tests/stringProcessingTest.s: util/tests/stringProcessingTest.cpp.s
+
+.PHONY : util/tests/stringProcessingTest.s
+
+# target to generate assembly for a file
+util/tests/stringProcessingTest.cpp.s:
+	$(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/util/tests/stringProcessingTest.cpp.s
+.PHONY : util/tests/stringProcessingTest.cpp.s
+
+util/tests/tokenizerTest.o: util/tests/tokenizerTest.cpp.o
+
+.PHONY : util/tests/tokenizerTest.o
+
+# target to build an object file
+util/tests/tokenizerTest.cpp.o:
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/util/tests/tokenizerTest.cpp.o
+.PHONY : util/tests/tokenizerTest.cpp.o
+
+util/tests/tokenizerTest.i: util/tests/tokenizerTest.cpp.i
+
+.PHONY : util/tests/tokenizerTest.i
+
+# target to preprocess a source file
+util/tests/tokenizerTest.cpp.i:
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/util/tests/tokenizerTest.cpp.i
+.PHONY : util/tests/tokenizerTest.cpp.i
+
+util/tests/tokenizerTest.s: util/tests/tokenizerTest.cpp.s
+
+.PHONY : util/tests/tokenizerTest.s
+
+# target to generate assembly for a file
+util/tests/tokenizerTest.cpp.s:
+	$(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/util/tests/tokenizerTest.cpp.s
+.PHONY : util/tests/tokenizerTest.cpp.s
 
 # Help Target
 help:
@@ -237,21 +370,34 @@ help:
 	@echo "... all (the default if no target is provided)"
 	@echo "... clean"
 	@echo "... depend"
-	@echo "... rebuild_cache"
 	@echo "... edit_cache"
+	@echo "... rebuild_cache"
+	@echo "... StemmerTest"
+	@echo "... ParserEndToEndTest"
+	@echo "... TokenizerTest"
+	@echo "... StringProcessingTest"
 	@echo "... eecs398_search"
-	@echo "... Parser.o"
-	@echo "... Parser.i"
-	@echo "... Parser.s"
-	@echo "... ProducerConsumerQueue.o"
-	@echo "... ProducerConsumerQueue.i"
-	@echo "... ProducerConsumerQueue.s"
-	@echo "... ProducerConsumerQueue_test.o"
-	@echo "... ProducerConsumerQueue_test.i"
-	@echo "... ProducerConsumerQueue_test.s"
 	@echo "... main.o"
 	@echo "... main.i"
 	@echo "... main.s"
+	@echo "... parser/tests/parserTest.o"
+	@echo "... parser/tests/parserTest.i"
+	@echo "... parser/tests/parserTest.s"
+	@echo "... shared/ProducerConsumerQueue.o"
+	@echo "... shared/ProducerConsumerQueue.i"
+	@echo "... shared/ProducerConsumerQueue.s"
+	@echo "... shared/ProducerConsumerQueue_test.o"
+	@echo "... shared/ProducerConsumerQueue_test.i"
+	@echo "... shared/ProducerConsumerQueue_test.s"
+	@echo "... util/tests/stemmerTest.o"
+	@echo "... util/tests/stemmerTest.i"
+	@echo "... util/tests/stemmerTest.s"
+	@echo "... util/tests/stringProcessingTest.o"
+	@echo "... util/tests/stringProcessingTest.i"
+	@echo "... util/tests/stringProcessingTest.s"
+	@echo "... util/tests/tokenizerTest.o"
+	@echo "... util/tests/tokenizerTest.i"
+	@echo "... util/tests/tokenizerTest.s"
 .PHONY : help
 
 
diff --git a/parser/Parser.h b/parser/Parser.h
index 423d164ba0839d34a2da7e833d49a9ebb21b8f57..6435fae59fece4d1404e1587188926e071c19931 100644
--- a/parser/Parser.h
+++ b/parser/Parser.h
@@ -94,15 +94,15 @@ private:
 		{
 		string url = "";
 
-		if ( findStr ( word, "<a" ) != '\0' )
+		if ( *findStr ( word, "<a" ) != '\0' )
 			{
 			auto foundHttp = findStr ( word, "href=http" );
-			if ( foundHttp != '\0' )
+			if ( *foundHttp != '\0' )
 				{
 				url = "http";
 				foundHttp += 9;
 
-				while ( foundHttp != findStr ( word, "\">" ) )
+				while ( *foundHttp != *findStr ( word, "\">" ) )
 					{
 					url += *foundHttp;
 					++foundHttp;
@@ -122,10 +122,10 @@ private:
 		{
 		string title = "";
 		auto pos = findStr ( "<title>", word );
-		if ( pos != '\0')
+		if ( *pos != '\0')
 			{
 			pos += 6;
-			while ( pos != findStr ( "</title>", word ) )
+			while ( *pos != *findStr ( "</title>", word ) )
 				{
 				++pos;
 				title += *pos;
diff --git a/util/tests/stringProcessingTest.cpp b/util/tests/stringProcessingTest.cpp
index 3562e9278f8c77ea1daf2378778c2cd6488792dc..ff020c76cc8ce88b6516a5b0d23a851cc317864e 100644
--- a/util/tests/stringProcessingTest.cpp
+++ b/util/tests/stringProcessingTest.cpp
@@ -100,7 +100,6 @@ void testToLower ( )
 	string test5 = toLower ( word5 );
 
 	assert ( test == "hello" );
-	cout << test2 << endl;
 	assert ( test2 == "hello" );
 	assert ( test3 == "hello goodbye !" );
 	assert ( test4 == "" );