diff --git a/iTrust/WebRoot/auth/admin/reminderMessage.jsp b/iTrust/WebRoot/auth/admin/reminderMessage.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..a9f7df9ab5a859a62572af8d38293722c7f4d7ea
--- /dev/null
+++ b/iTrust/WebRoot/auth/admin/reminderMessage.jsp
@@ -0,0 +1,74 @@
+<%@page errorPage="/auth/exceptionHandler.jsp"%>
+
+<%@page import="edu.ncsu.csc.itrust.action.ViewMyMessagesAction"%>
+<%@page import="edu.ncsu.csc.itrust.beans.MessageBean"%>
+<%@page import="java.util.List"%>
+
+<%@include file="/global.jsp" %>
+
+<%
+pageTitle = "iTrust - View Message";
+%>
+
+<%@include file="/header.jsp" %>
+
+<%
+	ViewMyMessagesAction action = new ViewMyMessagesAction(prodDAO, loggedInMID.longValue());
+	MessageBean original = null;
+
+	loggingAction.logEvent(TransactionType.OUTBOX_VIEW, loggedInMID.longValue(), 0, "");
+	
+	if (request.getParameter("msg") != null) {
+		String msgParameter = request.getParameter("msg");
+		int msgIndex = 0;
+		try {
+			msgIndex = Integer.parseInt(msgParameter);
+		} catch (NumberFormatException nfe) {
+			response.sendRedirect("viewReminderOutbox.jsp");
+		}
+		List<MessageBean> messages = null; 
+		if (session.getAttribute("messages") != null) {
+			messages = (List<MessageBean>) session.getAttribute("messages");
+			if(msgIndex > messages.size() || msgIndex < 0) {
+				msgIndex = 0;
+				response.sendRedirect("oops.jsp");
+			}
+		} else {
+			response.sendRedirect("viewReminderOutbox.jsp");
+		}
+		original = (MessageBean)messages.get(msgIndex);
+		session.setAttribute("message", original);
+	}
+	else {
+		response.sendRedirect("viewReminderOutbox.jsp");
+	}
+	
+%>
+	<div>
+		<table width="99%">
+			<tr>
+				<td><b>To:</b> <%= StringEscapeUtils.escapeHtml("" + ( action.getName(original.getTo()) )) %></td>
+			</tr>
+			<tr>
+				<td><b>Subject:</b> <%= StringEscapeUtils.escapeHtml("" + ( original.getSubject() )) %></td>
+			</tr>
+			<tr>
+				<td><b>Date &amp; Time:</b> <%= StringEscapeUtils.escapeHtml("" + ( original.getSentDate() )) %></td>
+			</tr>
+		</table>
+	</div>
+	
+	<table>
+		<tr>
+			<td colspan="2"><b>Message:</b></td>
+		</tr>
+		<tr>
+			<td colspan="2"><%= StringEscapeUtils.escapeHtml("" + ( original.getBody() )).replace("\n","<br/>") %></td>
+		</tr>
+		<tr>
+			<td colspan="2"><a href="viewReminderOutbox.jsp">Back</a></td>
+		</tr>
+	</table>
+
+
+<%@include file="/footer.jsp" %>
\ No newline at end of file
diff --git a/iTrust/WebRoot/auth/admin/sendAppointmentReminders.jsp b/iTrust/WebRoot/auth/admin/sendAppointmentReminders.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..711032f0c4cf478d0a95bbc755bf61860e04bec0
--- /dev/null
+++ b/iTrust/WebRoot/auth/admin/sendAppointmentReminders.jsp
@@ -0,0 +1,50 @@
+
+<%@taglib prefix="itrust" uri="/WEB-INF/tags.tld"%>
+<%@page errorPage="/auth/exceptionHandler.jsp"%>
+<%@page import="edu.ncsu.csc.itrust.action.SendRemindersAction" %>
+<%@page import="edu.ncsu.csc.itrust.exception.ITrustException" %>
+<%@page import="java.lang.NumberFormatException" %>
+
+<%@include file="/global.jsp" %>
+
+<%
+pageTitle = "iTrust - Send Reminder Message";
+%>
+
+<%@include file="/header.jsp" %>
+
+<%
+	String input = request.getParameter("withinDays"); 
+	if (input != null && !input.equals("")) {
+		try {
+            int days = Integer.valueOf(input);
+            if (days <= 0) {
+%>
+                <span class="iTrustError"><%=StringEscapeUtils.escapeHtml("Provide a positive number") %></span>
+<%
+            }
+            else {
+                SendRemindersAction action = new SendRemindersAction(prodDAO, loggedInMID.longValue());
+			    action.sendReminderForAppointments(days);
+%>
+			    <span class="iTrustMessage"><%=StringEscapeUtils.escapeHtml("Reminders were successfully sent") %></span>
+<%		
+            }
+			
+		} catch (NumberFormatException | ITrustException e) {
+%>
+			<span class="iTrustError"><%=StringEscapeUtils.escapeHtml("Reminders failed to send. Please provide a positive number") %></span>
+<%
+		}
+	}
+%>
+
+<div class="page-header"><h1>Send Reminder Message</h1></div>
+
+<form method="post">
+<h4> Send reminders to all patients with an appointment within the next n days. Provide n: </h4>
+<input type="text" name="withinDays"></td>
+<input type="submit" style="font-size: 12pt; font-weight: bold;" value="Send Appointment Reminders">
+</form>
+
+<%@include file="/footer.jsp" %>
\ No newline at end of file
diff --git a/iTrust/WebRoot/auth/admin/viewReminderOutbox.jsp b/iTrust/WebRoot/auth/admin/viewReminderOutbox.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..d2f2618da93dbc02f634568a57b81f0081a924f4
--- /dev/null
+++ b/iTrust/WebRoot/auth/admin/viewReminderOutbox.jsp
@@ -0,0 +1,71 @@
+<%@page errorPage="/auth/exceptionHandler.jsp"%>
+
+<%@page import="java.util.List"%>
+
+<%@page import="edu.ncsu.csc.itrust.action.ViewMyMessagesAction"%>
+<%@page import="edu.ncsu.csc.itrust.beans.MessageBean"%>
+<%@page import="edu.ncsu.csc.itrust.dao.DAOFactory"%>
+
+<%@include file="/global.jsp" %>
+
+<%
+pageTitle = "iTrust - View My Sent Messages";
+%>
+
+<%@include file="/header.jsp" %>
+
+<div align=center>
+    <h2>Sent Reminders</h2>
+    <%
+        loggingAction.logEvent(TransactionType.OUTBOX_VIEW, loggedInMID.longValue(), loggedInMID.longValue(), "");
+        
+        ViewMyMessagesAction action = new ViewMyMessagesAction(prodDAO, 9000000009L);
+        List<MessageBean> messages = null;
+        if(request.getParameter("sortby") != null) {
+            if(request.getParameter("sortby").equals("name")) {
+                if(request.getParameter("sorthow").equals("asce")) {
+                    messages = action.getAllMySentMessagesNameAscending();
+                } else {
+                    messages = action.getAllMySentMessagesNameDescending();
+                }
+            } else if(request.getParameter("sortby").equals("time")) {
+                if(request.getParameter("sorthow").equals("asce")) {
+                    messages = action.getAllMySentMessagesTimeAscending();
+                } else {
+                    messages = action.getAllMySentMessages();
+                }
+            }
+        }
+        else {
+            messages = action.getAllMySentMessages();
+        }
+        session.setAttribute("messages", messages);
+        if (messages.size() > 0) { %>
+    <br />
+    <table class="fancyTable">
+        <tr>
+            <th>To</th>
+            <th>Subject</th>
+            <th>Sent</th>
+            <th></th>
+        </tr>
+        <%		int index = 0; %>
+        <%		for(MessageBean message : messages) { %>
+        <tr <%=(index%2 == 1)?"class=\"alt\"":"" %>>
+            <td><%= StringEscapeUtils.escapeHtml("" + ( action.getName(message.getTo()) )) %></td>
+            <td><%= StringEscapeUtils.escapeHtml("" + ( message.getSubject() )) %></td>
+            <td><%= StringEscapeUtils.escapeHtml("" + ( message.getSentDate() )) %></td>
+            <td><a href="reminderMessage.jsp?msg=<%= StringEscapeUtils.escapeHtml("" + ( index )) %>">Read</a></td>
+        </tr>
+        <%			index ++; %>
+        <%		} %>
+    </table>
+    <%	} else { %>
+    <div>
+        <i>No reminders sent</i>
+    </div>
+    <%	} %>
+    <br />
+</div>
+
+<%@include file="/footer.jsp" %>
\ No newline at end of file
diff --git a/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp b/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp
index 1d9d99ecd40b3e3e0e73a9ee5c155f2e767a75af..dd1e1dd96756024f214b13c267bc0b9b34bf3157 100644
--- a/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp
+++ b/iTrust/WebRoot/auth/hcp-pha/viewEpidemics.jsp
@@ -101,7 +101,7 @@
 <% if (dsBean != null && avgBean != null) { %>
 
 <p style="display:block; margin-left:auto; margin-right:auto; width:600px;">
-<%@include file="DiagnosisEpidemicsChart.jsp" %>
+
 </p>
 
 <%
diff --git a/iTrust/iTrust.iml b/iTrust/iTrust.iml
deleted file mode 100644
index c1ff8d3cd59969e529825f9c34c90cd438d50356..0000000000000000000000000000000000000000
--- a/iTrust/iTrust.iml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output url="file://$MODULE_DIR$/target/classes" />
-    <output-test url="file://$MODULE_DIR$/target/test-classes" />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/target" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-java:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-android-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-chrome-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-htmlunit-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-api:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.json:json:20080701" level="project" />
-    <orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit:2.9" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: net.sourceforge.htmlunit:htmlunit-core-js:2.9" level="project" />
-    <orderEntry type="library" name="Maven: net.sourceforge.cssparser:cssparser:0.9.5" level="project" />
-    <orderEntry type="library" name="Maven: org.w3c.css:sac:1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-firefox-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-ie-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: net.java.dev.jna:platform:3.4.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-iphone-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-safari-driver:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-support:2.25.0" level="project" />
-    <orderEntry type="library" name="Maven: org.webbitserver:webbit:0.4.6" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.netty:netty:3.2.7.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.james:apache-mime4j:0.6" level="project" />
-    <orderEntry type="library" name="Maven: bsh:bsh:1.3.0" level="project" />
-    <orderEntry type="library" name="Maven: cglib:cglib-nodep:2.2" level="project" />
-    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.9" level="project" />
-    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-exec:1.1" level="project" />
-    <orderEntry type="library" name="Maven: commons-io:commons-io:2.4" level="project" />
-    <orderEntry type="library" name="Maven: commons-jxpath:commons-jxpath:1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.3.2" level="project" />
-    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.3" level="project" />
-    <orderEntry type="library" name="Maven: cssparser:cssparser:0.9.4" level="project" />
-    <orderEntry type="library" name="Maven: findbugs:findbugs:1.0.0" level="project" />
-    <orderEntry type="library" name="Maven: findbugs:annotations:1.0.0" level="project" />
-    <orderEntry type="library" name="Maven: bcel:bcel:5.1" level="project" />
-    <orderEntry type="library" name="Maven: regexp:regexp:1.2" level="project" />
-    <orderEntry type="library" name="Maven: findbugs:coreplugin:1.0.0" level="project" />
-    <orderEntry type="library" name="Maven: findbugs:findbugs-ant:1.0.0" level="project" />
-    <orderEntry type="library" name="Maven: findbugs:findbugsGUI:1.0.0" level="project" />
-    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.3.1" level="project" />
-    <orderEntry type="library" name="Maven: com.google.guava:guava:site:18.0" level="project" />
-    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.2" level="project" />
-    <orderEntry type="library" name="Maven: com.beust:jcommander:1.29" level="project" />
-    <orderEntry type="library" name="Maven: org.eclipse.jetty.aggregate:jetty-websocket:8.1.8.v20121106" level="project" />
-    <orderEntry type="library" name="Maven: net.java.dev.jna:jna:3.4.0" level="project" />
-    <orderEntry type="library" name="Maven: net.java.dev.jna:jna-platform:4.0.0" level="project" />
-    <orderEntry type="library" name="Maven: junit-addons:junit-addons:1.4" level="project" />
-    <orderEntry type="library" name="Maven: xerces:xmlParserAPIs:2.6.2" level="project" />
-    <orderEntry type="library" name="Maven: org.mockito:mockito-all:1.9.5" level="project" />
-    <orderEntry type="library" name="Maven: net.sourceforge.nekohtml:nekohtml:1.9.21" level="project" />
-    <orderEntry type="library" name="Maven: io.netty:netty:3.5.7.Final" level="project" />
-    <orderEntry type="library" name="Maven: com.opera:operadriver:1.5" level="project" />
-    <orderEntry type="library" name="Maven: com.opera:operalaunchers:1.1" level="project" />
-    <orderEntry type="library" name="Maven: com.google.guava:guava:14.0" level="project" />
-    <orderEntry type="library" name="Maven: com.codeborne:phantomjsdriver:1.2.1" level="project" />
-    <orderEntry type="library" name="Maven: org.seleniumhq.selenium:selenium-remote-driver:2.44.0" level="project" />
-    <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:2.4.1" level="project" />
-    <orderEntry type="library" name="Maven: milyn:sac:1.3" level="project" />
-    <orderEntry type="library" name="Maven: org.eclipse.birt.runtime.3_7_1:org.apache.xml.serializer:2.7.1" level="project" />
-    <orderEntry type="library" name="Maven: org.eclipse.birt.runtime.3_7_1:Tidy:1" level="project" />
-    <orderEntry type="library" name="Maven: xalan:xalan:2.7.1" level="project" />
-    <orderEntry type="library" name="Maven: xalan:serializer:2.7.1" level="project" />
-    <orderEntry type="library" name="Maven: xerces:xercesImpl:2.11.0" level="project" />
-    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
-    <orderEntry type="library" name="Maven: xml-apis:xmlParserAPIs:2.0.2" level="project" />
-    <orderEntry type="library" name="Maven: commons-validator:commons-validator:1.3.0" level="project" />
-    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.7.0" level="project" />
-    <orderEntry type="library" name="Maven: commons-digester:commons-digester:1.6" level="project" />
-    <orderEntry type="library" name="Maven: oro:oro:2.0.8" level="project" />
-    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
-    <orderEntry type="library" name="Maven: org.jfree:jfreechart:1.0.19" level="project" />
-    <orderEntry type="library" name="Maven: org.jfree:jcommon:1.0.23" level="project" />
-    <orderEntry type="module-library">
-      <library name="Maven: org.cewolf:cewolf:1.1">
-        <CLASSES>
-          <root url="jar://$MODULE_DIR$/WebRoot/WEB-INF/lib/cewolf-1.1.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:3.0.1" level="project" />
-    <orderEntry type="library" name="Maven: net.jcip:jcip-annotations:1.0" level="project" />
-    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.1" level="project" />
-    <orderEntry type="library" name="Maven: httpunit:httpunit:1.7" level="project" />
-    <orderEntry type="library" name="Maven: javax.servlet:servlet-api:2.3" level="project" />
-    <orderEntry type="library" name="Maven: jtidy:jtidy:4aug2000r7-dev" level="project" />
-    <orderEntry type="library" name="Maven: org.easymock:easymock:2.5.2" level="project" />
-    <orderEntry type="library" name="Maven: org.easymock:easymockclassextension:2.5.2" level="project" />
-    <orderEntry type="library" name="Maven: org.objenesis:objenesis:1.2" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-util:8.0.28" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-juli:8.0.28" level="project" />
-    <orderEntry type="library" name="Maven: tomcat:jasper-runtime:5.5.23" level="project" />
-    <orderEntry type="library" name="Maven: commons-el:commons-el:1.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat:dbcp:6.0.44" level="project" />
-    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.37" level="project" />
-    <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
-    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3" level="project" />
-    <orderEntry type="library" name="Maven: net.tanesha.recaptcha4j:recaptcha4j:0.0.7" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/iTrust/src/edu/ncsu/csc/itrust/action/SendRemindersAction.java b/iTrust/src/edu/ncsu/csc/itrust/action/SendRemindersAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef8b0597ed3a9bfcdec4d7c3a3c92257ba418464
--- /dev/null
+++ b/iTrust/src/edu/ncsu/csc/itrust/action/SendRemindersAction.java
@@ -0,0 +1,67 @@
+package edu.ncsu.csc.itrust.action;
+
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+
+import edu.ncsu.csc.itrust.beans.ApptBean;
+import edu.ncsu.csc.itrust.beans.MessageBean;
+import edu.ncsu.csc.itrust.beans.PersonnelBean;
+import edu.ncsu.csc.itrust.dao.DAOFactory;
+import edu.ncsu.csc.itrust.dao.mysql.ApptDAO;
+import edu.ncsu.csc.itrust.dao.mysql.PersonnelDAO;
+import edu.ncsu.csc.itrust.exception.DBException;
+import edu.ncsu.csc.itrust.exception.FormValidationException;
+import edu.ncsu.csc.itrust.exception.ITrustException;
+import java.util.*;
+
+public class SendRemindersAction {
+    public final long systemReminderMID;
+    private long loggedInMID;
+    private ApptDAO apptDAO;
+    private SendMessageAction smAction;
+
+    public SendRemindersAction(DAOFactory factory, long loggedInMID) throws DBException {
+        PersonnelDAO personnelDAO = factory.getPersonnelDAO();
+        List<PersonnelBean> personnels = personnelDAO.searchForPersonnelWithName("System", "Reminder");
+        this.systemReminderMID = personnels.get(0).getMID();
+        this.loggedInMID = loggedInMID;
+        this.apptDAO = factory.getApptDAO();
+        this.smAction = new SendMessageAction(factory, systemReminderMID);
+    }
+
+    public void sendReminder(ApptBean aBean) throws ITrustException, SQLException, FormValidationException {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime date = aBean.getDate().toLocalDateTime();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm, MMM d");
+
+        MessageBean message = new MessageBean();
+        message.setTo(aBean.getPatient());
+        message.setFrom(systemReminderMID);
+        message.setSubject(String.format("Reminder: upcoming appointment in %d day(s)", now.truncatedTo(ChronoUnit.DAYS).until(date.truncatedTo(ChronoUnit.DAYS), ChronoUnit.DAYS)));
+        message.setBody(String.format("You have an appointment on %s with Dr. %s", date.format(formatter), smAction.getPersonnelName(aBean.getHcp())));
+        message.setSentDate(Timestamp.valueOf(now));
+
+        smAction.sendMessage(message);
+    }
+
+    public int sendReminderForAppointments(int numDays) throws ITrustException {
+        List<ApptBean> appointments = null;
+        try {
+            appointments = apptDAO.getUpcomingAppts(numDays);
+            for (ApptBean appt : appointments) {
+                sendReminder(appt);
+            }
+            return appointments.size();
+        } catch (DBException e) {
+            throw new ITrustException("DB Error in sending reminders.");
+        } catch (SQLException e) {
+            throw new ITrustException("SQL Error in sending reminders.");
+        } catch (FormValidationException e) {
+            throw new ITrustException("Form Validation Error in sending reminders.");
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java b/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java
index a6f01b269e3e19cbf648a58e302193fedb13b238..8b04b6b50040678b230f8ab4480197ba9caac70f 100644
--- a/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java
+++ b/iTrust/src/edu/ncsu/csc/itrust/action/ViewDiagnosisStatisticsAction.java
@@ -182,36 +182,32 @@ public class ViewDiagnosisStatisticsAction {
     /**
      * Determines if an Influenza Epidemic is happening
      * 
-     * @param curDateStr a date in the currently evaluated week
+     * @param weekDate a date in the currently evaluated week
      * @param zip the zip code to analyze
      * @return whether or not there is an epidemic
      * @throws ParseException
      * @throws DBException
      */
-    public boolean isFluEpidemic(String curDateStr, String zip) throws ParseException, DBException {
-        new SimpleDateFormat("MM/dd/yyyy").parse("01/04/1998");
-        Date curDate = new SimpleDateFormat("MM/dd/yyyy").parse(curDateStr);
+    public boolean isFluEpidemic(String weekDate, String zip) throws ParseException, DBException {
+        Date wkDate = new SimpleDateFormat("MM/dd/yyyy").parse(weekDate);
         
         Calendar cal = Calendar.getInstance();
-        cal.setTime(curDate);
+        cal.setTime(wkDate);
         
         int weekOfYr = cal.get(Calendar.WEEK_OF_YEAR);
-        double threshold = calcThreshold(weekOfYr);
-        double thresholdL = calcThreshold(weekOfYr-1);
-        double thresholdN = calcThreshold(weekOfYr+1); 
-        
-        DiagnosisStatisticsBean dbNow = diagnosesDAO.getCountForWeekOf(ICD_INFLUENZA, zip, cal.getTime());
-        cal.add(Calendar.HOUR, -12*7);
-        DiagnosisStatisticsBean dbLast = diagnosesDAO.getCountForWeekOf(ICD_INFLUENZA, zip, cal.getTime());
-        cal.add(Calendar.HOUR, 2*12*7);
-        DiagnosisStatisticsBean dbNext =  diagnosesDAO.getCountForWeekOf(ICD_INFLUENZA, zip, cal.getTime());
-        
-        double weekNow = (double) dbNow.getRegionStats();
-        double weekL = (double) dbLast.getRegionStats();
-        double weekN = (double) dbNext.getRegionStats();
-        
-        return weekNow > threshold && (weekL > thresholdL || weekN > thresholdN);
+        double threshold = calcInfluenzaThreshold(weekOfYr);
+
+        DiagnosisStatisticsBean prev1 = diagnosesDAO.getCountForWeekBefore(ICD_INFLUENZA, zip, cal.getTime());
+        cal.add(Calendar.HOUR, -7*24);
+        DiagnosisStatisticsBean prev2 =  diagnosesDAO.getCountForWeekBefore(ICD_INFLUENZA, zip, cal.getTime());
+
+        long weekL1 = prev1.getRegionStats();
+        long weekL2 = prev2.getRegionStats();
+
+        boolean epidemicL1 = weekL1 > threshold;
+        boolean epidemicL2 = weekL2 > threshold;
         
+        return epidemicL1 && epidemicL2;
     }
     
     /**
@@ -220,7 +216,7 @@ public class ViewDiagnosisStatisticsAction {
      * @param weekNumber the week of the year
      * @return the epidemic threshold for flu cases
      */
-    private double calcThreshold(double weekNumber) {
+    private double calcInfluenzaThreshold(double weekNumber) {
         return 5.34 + 0.271 * weekNumber + 3.45 * Math.sin(2 * Math.PI * weekNumber / 52.0) + 8.41 * Math.cos(2 * Math.PI * weekNumber / 52.0);
     }
     
diff --git a/iTrust/test/edu/ncsu/csc/itrust/selenium/SendRemindersTest.java b/iTrust/test/edu/ncsu/csc/itrust/selenium/SendRemindersTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6dfa3c967de80820686df6ee01c8aa548772a4af
--- /dev/null
+++ b/iTrust/test/edu/ncsu/csc/itrust/selenium/SendRemindersTest.java
@@ -0,0 +1,97 @@
+package edu.ncsu.csc.itrust.selenium;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import java.text.SimpleDateFormat;  
+import java.util.Date; 
+import java.util.List;
+
+public class SendRemindersTest extends iTrustSeleniumTest{
+
+    protected WebDriver driver;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        gen.clearAllTables();
+        gen.standardData();
+    }
+
+    // Test sending reminders
+	public void testSendReminder() throws Exception {
+		// Login as admin
+        driver = login("9000000001", "pw");
+        assertEquals("iTrust - Admin Home", driver.getTitle());
+        driver.findElement(By.linkText("Send Appointment Reminders")).click();
+
+        // Send reminders
+        driver.findElement(By.name("withinDays")).sendKeys("10");
+        driver.findElement(By.name("withinDays")).submit();
+        assertEquals("Reminders were successfully sent",
+        driver.findElement(By.className("iTrustMessage")).getText());
+
+        // Create timestamp
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+		Date date = new Date();
+		String stamp = dateFormat.format(date);
+
+        // Check admin reminders outbox
+        driver.findElement(By.linkText("Reminder Message Outbox")).click();
+        assertNotNull(driver.findElement(By.className("fancyTable")));
+        assertTrue(driver.getPageSource().contains(stamp));
+
+        // Check a reminder message
+        driver.findElement(By.linkText("Read")).click();
+        assertTrue(driver.getPageSource().contains(stamp));
+		
+        // Logout admin and login as patient
+		List<WebElement> links = driver.findElements(By.tagName("a"));
+		int count = 0;
+		for(int i = 0; i < links.size(); i++) {
+			if(links.get(i).getAttribute("href").contains("logout"))
+			{
+				count = i;
+				break;
+			}
+		}
+		links.get(count).click();
+		driver = login("5", "pw");
+		
+		// Check patient inbox
+        driver.findElement(By.linkText("Message Inbox")).click();
+        int index = 1;
+        WebElement baseTable = driver.findElement(By.cssSelector(".display.fTable"));
+        List<WebElement> tableRows = baseTable.findElements(By.tagName("tr"));
+        assertTrue(tableRows.get(index).getText().contains("System Reminder"));
+        assertTrue(tableRows.get(index).getText().contains("Reminder: upcoming appointment"));
+        index++;
+        assertTrue(tableRows.get(index).getText().contains("Reminder: upcoming appointment"));
+        assertTrue(tableRows.get(index).getText().contains(stamp));
+    }
+
+    // Test invalid number of days input for sending reminders
+	public void testInvalidSendReminder() throws Exception {
+
+        // Login as admin
+        driver = login("9000000001", "pw");
+        assertEquals("iTrust - Admin Home", driver.getTitle());
+        driver.findElement(By.linkText("Send Appointment Reminders")).click();
+
+        // Send reminder with negative days
+        driver.findElement(By.name("withinDays")).sendKeys("-4");
+        driver.findElement(By.name("withinDays")).submit();
+        assertEquals("Provide a positive number",
+        driver.findElement(By.className("iTrustError")).getText());
+    
+        // Send reminder with non-numberic days
+        driver.findElement(By.name("withinDays")).sendKeys("Hello");
+        driver.findElement(By.name("withinDays")).submit();
+        assertEquals("Reminders failed to send. Please provide a positive number",
+        driver.findElement(By.className("iTrustError")).getText());
+    }
+
+
+
+    
+}
\ No newline at end of file
diff --git a/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java b/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java
index 1dd3d14fdb8b11d7a1b72b34a8811c95583e7094..cc69e4c816b71efecf16b19d590356007cc3ab12 100644
--- a/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java
+++ b/iTrust/test/edu/ncsu/csc/itrust/selenium/ViewDiagnosisStatisticsTest.java
@@ -559,50 +559,61 @@ public class ViewDiagnosisStatisticsTest extends iTrustSeleniumTest {
 		assertLogged(TransactionType.DIAGNOSIS_EPIDEMICS_VIEW, 9000000007L, 0L, "");
 		assertTrue(driver.getPageSource().contains("There is no epidemic occurring in the region."));
     }
-    
-    public void testViewDiagnosisEpidemics_ErrorFlows() throws Exception {
-		driver = (HtmlUnitDriver)login("9000000007", "pw");
+
+    private void setupErrorFlow(String icd, String zip, String date, String threshold) throws Exception {
+        driver = (HtmlUnitDriver)login("9000000007", "pw");
 
 		// Click Diagnosis Trends
 		driver.findElement(By.cssSelector("h2.panel-title")).click();
 		driver.findElement(By.xpath("//div[@class='panel-body']/ul/li[11]")).click();
 		driver.findElement(By.linkText("Diagnosis Trends")).click();
 
-		// Epidemics
+		// Go to epidemics
 		assertTrue(driver.getCurrentUrl().equals(ADDRESS + "auth/hcp-pha/viewDiagnosisStatistics.jsp"));
 		new Select(driver.findElement(By.name("viewSelect"))).selectByValue("epidemics");
         driver.findElement(By.id("select_View")).click();
-        
-        // No ICD code
-		driver.findElement(By.name("zipCode")).clear();
-		driver.findElement(By.name("zipCode")).sendKeys("27607");
-		driver.findElement(By.name("startDate")).clear();
-        driver.findElement(By.name("startDate")).sendKeys("02/15/2010");
-        driver.findElement(By.name("threshold")).sendKeys("110");
+
+        // Fill provided fields
+        if (icd != null) {
+            new Select(driver.findElement(By.name("icdCode"))).selectByVisibleText(icd);
+        }
+
+        if (zip != null) {
+            driver.findElement(By.name("zipCode")).clear();
+            driver.findElement(By.name("zipCode")).sendKeys(zip);
+        }
+
+        if (date != null) {
+            driver.findElement(By.name("startDate")).clear();
+            driver.findElement(By.name("startDate")).sendKeys(date);
+        }
+
+        if (threshold != null) {
+            driver.findElement(By.name("threshold")).clear();
+            driver.findElement(By.name("threshold")).sendKeys(threshold);
+        }
+
+        // Submit
         driver.findElement(By.id("select_diagnosis")).click();
+    }
+
+    public void testViewDiagnosisEpidemicsNoICD() throws Exception {
+        setupErrorFlow(null, "27607", "02/15/2010", "110");
         assertTrue(driver.getPageSource().contains("Invalid ICD code."));
-        
-        // Invalid zip
-        new Select(driver.findElement(By.name("icdCode"))).selectByVisibleText("84.50 - Malaria");
-        driver.findElement(By.name("zipCode")).clear();
-        driver.findElement(By.name("zipCode")).sendKeys("asdf");
-        driver.findElement(By.id("select_diagnosis")).click();
+    }
+
+    public void testViewDiagnosisEpidemicsBadZip() throws Exception {
+        setupErrorFlow("84.50 - Malaria", "asdf", "02/15/2010", "110");
         assertTrue(driver.getPageSource().contains("Zip Code must be 5 digits!"));
+    }
 
-        // Invalid date
-        driver.findElement(By.name("startDate")).clear();
-        driver.findElement(By.name("startDate")).sendKeys("asdf");
-        driver.findElement(By.name("zipCode")).clear();
-        driver.findElement(By.name("zipCode")).sendKeys("27607");
-        driver.findElement(By.id("select_diagnosis")).click();
+    public void testViewDiagnosisEpidemicsInvalidDate() throws Exception {
+        setupErrorFlow("84.50 - Malaria", "12345", "asdf", "110");
         assertTrue(driver.getPageSource().contains("Enter dates in MM/dd/yyyy"));
+    }
 
-        // Invalid threshold
-        driver.findElement(By.name("threshold")).clear();
-        driver.findElement(By.name("threshold")).sendKeys("asdf");
-        driver.findElement(By.name("startDate")).clear();
-        driver.findElement(By.name("startDate")).sendKeys("02/15/2010");
-        driver.findElement(By.id("select_diagnosis")).click();
+    public void testViewDiagnosisEpidemicsBadThreshold() throws Exception {
+        setupErrorFlow("84.50 - Malaria", "12345", "02/15/2010", "asdf");
         assertTrue(driver.getPageSource().contains("Threshold must be an integer."));
 	}
 }
\ No newline at end of file
diff --git a/iTrust/test/edu/ncsu/csc/itrust/unit/action/SendRemindersActionTest.java b/iTrust/test/edu/ncsu/csc/itrust/unit/action/SendRemindersActionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a91f84a430de111b88d1f79c3fb46a51fb3b509c
--- /dev/null
+++ b/iTrust/test/edu/ncsu/csc/itrust/unit/action/SendRemindersActionTest.java
@@ -0,0 +1,68 @@
+package edu.ncsu.csc.itrust.unit.action;
+
+import edu.ncsu.csc.itrust.action.SendRemindersAction;
+import edu.ncsu.csc.itrust.beans.ApptBean;
+import edu.ncsu.csc.itrust.beans.MessageBean;
+import edu.ncsu.csc.itrust.dao.DAOFactory;
+import edu.ncsu.csc.itrust.dao.mysql.MessageDAO;
+import edu.ncsu.csc.itrust.exception.FormValidationException;
+import edu.ncsu.csc.itrust.exception.ITrustException;
+import edu.ncsu.csc.itrust.unit.datagenerators.TestDataGenerator;
+import edu.ncsu.csc.itrust.unit.testutils.TestDAOFactory;
+import junit.framework.TestCase;
+
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+public class SendRemindersActionTest extends TestCase {
+
+	private DAOFactory factory;
+	private MessageDAO messageDAO;
+	private SendRemindersAction srAction;
+	private TestDataGenerator gen;
+	private long patientId;
+	private long hcpId;
+	
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		gen = new TestDataGenerator();
+		gen.clearAllTables();
+		gen.standardData();
+		
+		this.patientId = 2L;
+		this.hcpId = 9000000000L;
+		this.factory = TestDAOFactory.getTestInstance();
+		this.messageDAO = new MessageDAO(this.factory);
+		this.srAction = new SendRemindersAction(this.factory, this.hcpId);
+	}
+
+	public void testSendRemindersAction() throws ITrustException
+	{
+		int numberOfAppts = srAction.sendReminderForAppointments(10);
+		assertTrue(numberOfAppts >= 5);
+	}
+
+	public void testSendReminders() throws ITrustException, SQLException, FormValidationException {
+		ApptBean aBean = new ApptBean();
+
+    	aBean.setApptType("TEST");
+    	aBean.setPatient(patientId);
+    	aBean.setHcp(hcpId);
+    	aBean.setDate(Timestamp.valueOf(LocalDateTime.now().plusDays(4)));
+
+    	List<MessageBean> mbListBefore = messageDAO.getMessagesFor(patientId);
+
+		srAction.sendReminder(aBean);
+		
+		List<MessageBean> mbList = messageDAO.getMessagesFor(patientId);
+
+		assertEquals(mbList.size(), mbListBefore.size() + 1);
+		MessageBean mBeanDB = mbList.get(0);
+		assertEquals("Reminder: upcoming appointment in 4 day(s)", mBeanDB.getSubject());
+	}
+
+}
\ No newline at end of file
diff --git a/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java b/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java
index 30600b38c3d14103ef71830275c354c1cbb5f97c..a23d9f0d90422ced565e1f011d6a90e471b212a6 100644
--- a/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java
+++ b/iTrust/test/edu/ncsu/csc/itrust/unit/action/ViewDiagnosisStatisticsActionTest.java
@@ -130,13 +130,22 @@ public class ViewDiagnosisStatisticsActionTest extends TestCase {
     }
 
     public void testIsMalariaEpidemicNone() throws Exception {
+        gen.malaria_epidemic1();
         assertFalse(action.isMalariaEpidemic("06/02/2010", "38201", "110"));
     }
 	
 	public void testIsFluEpidemic() throws Exception {
 		gen.influenza_epidemic();
-		assertTrue(action.isFluEpidemic("11/02/" + thisYear, "27606"));
-		assertFalse(action.isFluEpidemic("11/16/" + thisYear, "27606"));
+		assertTrue(action.isFluEpidemic("11/16/" + thisYear, "27606"));
+		assertFalse(action.isFluEpidemic("11/09/" + thisYear, "27606"));
+	}
+
+	public void testIsFluEpidemicEdge() throws Exception {
+		gen.influenza_epidemic();
+		// Test should pass since previous 14 days will have enough cases for epidemic
+		assertTrue(action.isFluEpidemic("11/15/" + thisYear, "27606"));
+		// Test should fail since previous 14 days will not have enough cases for epidemic
+		assertFalse(action.isFluEpidemic("11/17/" + thisYear, "27606"));
 	}
 	
 	public void testGetEpidemicStatisticsInvalidThreshold(){