diff --git a/src/main/java/edu/unl/cse/soft160/statistics/GeneralizedStatistics.java b/src/main/java/edu/unl/cse/soft160/statistics/GeneralizedStatistics.java
new file mode 100644
index 0000000000000000000000000000000000000000..165339c729cd9598d92e7ffdb4767654e1b2a18d
--- /dev/null
+++ b/src/main/java/edu/unl/cse/soft160/statistics/GeneralizedStatistics.java
@@ -0,0 +1,121 @@
+package edu.unl.cse.soft160.statistics;
+
+import java.util.Scanner;
+
+/**
+ * Computes simple statistics of three values
+ */
+public class GeneralizedStatistics {
+	public enum StatisticsType {
+		MEAN, MEDIAN, // to keep this example shorter, we're omitting maximum and minimum
+	}
+
+	private static String getUserInput(String prompt, Scanner scanner) {
+		System.out.print(prompt);
+		String userInput = scanner.nextLine();
+		return userInput;
+	}
+
+	private static Number getValue(String ordinal, Scanner scanner) {
+		String userInput = getUserInput("Enter the " + ordinal + " value: ", scanner);
+		if (userInput.contains(".")) {
+			return Double.valueOf(userInput);
+		} else {
+			return Integer.valueOf(userInput);
+		}
+	}
+
+	private static StatisticsType getStaticsticsType(Scanner scanner) {
+		String userInput = getUserInput("Please enter the statistic to calculate: ", scanner);
+		userInput = userInput.toUpperCase();
+		StatisticsType statisticsType = StatisticsType.valueOf(userInput);
+		return statisticsType;
+	}
+
+	private static double computeMean(double firstValue, double secondValue, double thirdValue) {
+		double statistic = (firstValue + secondValue + thirdValue) / 3;
+		return statistic;
+	}
+
+	private static double computeMedian(double firstValue, double secondValue, double thirdValue) {
+		double statistic = Double.NaN;
+		if (((secondValue <= firstValue) && (firstValue <= thirdValue))
+				|| ((secondValue >= firstValue) && (firstValue >= thirdValue))) {
+			statistic = secondValue;
+		}
+		if (((firstValue <= secondValue) && (secondValue <= thirdValue))
+				|| ((firstValue >= secondValue) && (secondValue >= thirdValue))) {
+			statistic = secondValue;
+		}
+		if (((firstValue <= thirdValue) && (thirdValue <= secondValue))
+				|| ((firstValue >= thirdValue) && (thirdValue >= secondValue))) {
+			statistic = secondValue;
+		}
+		return statistic;
+	}
+
+	private static int computeMean(int firstValue, int secondValue, int thirdValue) {
+		int statistic = (firstValue + secondValue + thirdValue) / 3;
+		return statistic;
+	}
+
+	private static int computeMedian(int firstValue, int secondValue, int thirdValue) {
+		int statistic = Integer.MAX_VALUE;
+		if (((secondValue <= firstValue) && (firstValue <= thirdValue))
+				|| ((secondValue >= firstValue) && (firstValue >= thirdValue))) {
+			statistic = secondValue;
+		}
+		if (((firstValue <= secondValue) && (secondValue <= thirdValue))
+				|| ((firstValue >= secondValue) && (secondValue >= thirdValue))) {
+			statistic = secondValue;
+		}
+		if (((firstValue <= thirdValue) && (thirdValue <= secondValue))
+				|| ((firstValue >= thirdValue) && (thirdValue >= secondValue))) {
+			statistic = secondValue;
+		}
+		return statistic;
+	}
+
+	private static Number computeStatisticFromInput(StatisticsType type, Scanner scanner) {
+		Number firstInputValue = getValue("first", scanner);
+		Number secondInputValue = getValue("second", scanner);
+		Number thirdInputValue = getValue("third", scanner);
+		Number statisticValue = null;
+		if (firstInputValue instanceof Integer 
+				&& secondInputValue instanceof Integer
+				&& thirdInputValue instanceof Integer) {
+			int firstValue = (int) firstInputValue;
+			int secondValue = (int) secondInputValue;
+			int thirdValue = (int) thirdInputValue;
+			if (type == StatisticsType.MEAN) {
+				statisticValue = computeMean(firstValue, secondValue, thirdValue);
+			} else if (type == StatisticsType.MEDIAN) {
+				statisticValue = computeMedian(firstValue, secondValue, thirdValue);
+			} else {
+				System.err.println("Cannot compute " + type + ".");
+				statisticValue = Integer.MAX_VALUE;
+			}
+		} else {
+			double firstValue = (double) firstInputValue;
+			double secondValue = (double) secondInputValue;
+			double thirdValue = (double) thirdInputValue;
+			if (type == StatisticsType.MEAN) {
+				statisticValue = computeMean(firstValue, secondValue, thirdValue);
+			} else if (type == StatisticsType.MEDIAN) {
+				statisticValue = computeMedian(firstValue, secondValue, thirdValue);
+			} else {
+				System.err.println("Cannot compute " + type + ".");
+				statisticValue = Double.NaN;
+			}
+		}
+		return statisticValue;
+	}
+
+	public static void main(String[] args) {
+		Scanner scanner = new Scanner(System.in);
+		StatisticsType type = getStaticsticsType(scanner);
+		Number statistic = computeStatisticFromInput(type, scanner);
+		scanner.close();
+		System.out.println("The " + type.toString().toLowerCase() + " is " + statistic);
+	}
+}
\ No newline at end of file