diff --git a/pom.xml b/pom.xml
index 8d10c6fc..ea43245e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,6 +25,12 @@
commons-io
1.3.2
+
+
+ com.opencsv
+ opencsv
+ 3.9
+
com.googlecode.json-simple
json-simple
diff --git a/src/main/java/seng302/models/PolarTable.java b/src/main/java/seng302/models/PolarTable.java
new file mode 100644
index 00000000..578a3a7b
--- /dev/null
+++ b/src/main/java/seng302/models/PolarTable.java
@@ -0,0 +1,116 @@
+package seng302.models;
+
+import java.io.*;
+import java.util.HashMap;
+
+/**
+ * A static class for parsing and storing the polars. Will parse the whole polar table and also store the optimised
+ * upwind and downwind in separate tables here as well
+ * Created by wmu16 on 22/05/17.
+ */
+public final class PolarTable {
+
+ //A Polar table will consist of a wind speed key to a hashmap value of pairs of wind angles and boat speeds
+ private static HashMap> polarTable;
+ private static HashMap> upwindOptimal;
+ private static HashMap> downwindOptimal;
+
+ private static int upTwaIndex;
+ private static int dnTwaIndex;
+
+
+ /**
+ * Iterates through each row of the polar table, in pairs, to extract the row into a hashmap of angle to boat speed.
+ * These angle boatspeed hashmaps are then added to an outer hashmap at the end of wind speed key to each row hashmap
+ * as a value
+ * @param file containing the polar csv information
+ */
+ public static void parsePolarFile(String file) {
+ polarTable = new HashMap<>();
+ upwindOptimal = new HashMap<>();
+ downwindOptimal = new HashMap<>();
+
+ String line;
+ Boolean isHeaderLine = true;
+
+ try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+ while ((line = br.readLine()) != null) {
+ String[] thisLine = line.split(",");
+
+ //Initial line in file
+ if (isHeaderLine) {
+ deduceHeaders(thisLine);
+ isHeaderLine = false;
+ } else {
+ HashMap thisPolar = new HashMap<>();
+ HashMap thisUpWindPolar = new HashMap<>();
+ HashMap thisDnWindPolar = new HashMap<>();
+ Double thisWindSpeed = Double.parseDouble(thisLine[0]);
+
+ // -3 <== -1 for length -1, and a further -2 as we iterate in pairs of 2 so finish before final 2
+ for (int i = 1; i < thisLine.length; i += 2) {
+ Double thisWindAngle = Double.parseDouble(thisLine[i]);
+ Double thisBoatSpeed = Double.parseDouble(thisLine[i + 1]);
+ thisPolar.put(thisWindAngle, thisBoatSpeed);
+ if (i == upTwaIndex) {
+ thisUpWindPolar.put(thisWindAngle, thisBoatSpeed);
+ } else if (i == dnTwaIndex) {
+ thisDnWindPolar.put(thisWindAngle, thisBoatSpeed);
+ }
+ }
+
+ polarTable.put(thisWindSpeed, thisPolar);
+ upwindOptimal.put(thisWindSpeed, thisUpWindPolar);
+ downwindOptimal.put(thisWindSpeed, thisDnWindPolar);
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+
+ /**
+ * Parses the header line of a polar file
+ * @param thisLine The line which is the header of a polar file
+ */
+ private static void deduceHeaders(String[] thisLine) {
+
+ for (int i = 0; i < thisLine.length; i++) {
+ String thisItem = thisLine[i];
+ if (thisItem.toLowerCase().startsWith("uptwa")) {
+ upTwaIndex = i;
+ }
+ else if (thisItem.toLowerCase().startsWith("dntwa")) {
+ dnTwaIndex = i;
+ }
+ }
+ }
+
+
+ /**
+ * @return The entire polar table
+ */
+ public static HashMap> getPolarTable() {
+ return polarTable;
+ }
+
+
+ /**
+ * @return The polar table just containing the optimal upwind values
+ */
+ public static HashMap> getUpwindOptimal() {
+ return upwindOptimal;
+ }
+
+
+ /**
+ * @return The polar table just containing the optimal downwind values
+ */
+ public static HashMap> getDownwindOptimal() {
+ return downwindOptimal;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/resources/config/acc_polars.csv b/src/main/resources/config/acc_polars.csv
new file mode 100644
index 00000000..ee7ea80e
--- /dev/null
+++ b/src/main/resources/config/acc_polars.csv
@@ -0,0 +1,8 @@
+Tws,Twa0,Bsp0,Twa1,Bsp1,UpTwa,UpBsp,Twa2,Bsp2,Twa3,Bsp3,Twa4,Bsp4,Twa5,Bsp5,Twa6,Bsp6,DnTwa,DnBsp,Twa7,Bsp7
+4,0,0,30,4,45,8,60,9,75,10,90,10,115,10,145,10,155,10,175,4
+8,0,0,30,7,43,10,60,11,75,11,90,11,115,12,145,12,153,12,175,10
+12,0,0,30,11,43,14.4,60,16,75,20,90,23,115,24,145,23,153,21.6,175,14
+16,0,0,30,12,42,19.2,60,25,75,27,90,31,115,32,145,30,153,28.8,175,20
+20,0,0,30,13,41,24,60,29,75,37,90,39,115,40,145,38,153,36,175,24
+25,0,0,30,15,40,30,60,38,75,44,90,49,115,50,145,49,151,47,175,30
+30,0,0,30,15,42,30,60,37,75,42,90,48,115,49,145,48,150,46,175,32