diff --git a/src/DataViewScreen.java b/src/DataViewScreen.java
index 3919bafa3a5d80812a2ae857a47f3e5953f425d6..2af91004e3bd7b2319136cf06d1526347753ca11 100644
--- a/src/DataViewScreen.java
+++ b/src/DataViewScreen.java
@@ -21,6 +21,7 @@ import javafx.scene.text.Text;
 import javafx.stage.Stage;
 import javafx.util.Pair;
 
+import java.lang.management.GarbageCollectorMXBean;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -80,16 +81,11 @@ public class DataViewScreen {
     private HBox metricBox = new HBox();
     private AnchorPane bottomOfUI = new AnchorPane();
     private HBox dropDowns = new HBox();
-    private VBox multiGraphs = new VBox();
 
 
-    //     #justChartThings
 
-    private ArrayList<Series> series_line = new ArrayList<Series>();
-    private LineChart linechart;
-    private PieChart piechart;
-    final Axis xAxis = new NumberAxis();
-    final Axis yAxis = new NumberAxis();
+    //     #justChartThings
+    private GraphManager graphManager;
 
 
     //lists of things to change fontSize on
@@ -113,6 +109,8 @@ public class DataViewScreen {
         this.qry_exec = qry_exec;
         fileSelectScene = stage.getScene();
 
+        this.graphManager = new GraphManager();
+
         //this.menuBarHandler = menuBarHandler;
 
         buttonSetup();
@@ -220,6 +218,8 @@ public class DataViewScreen {
         uiDivider.setLeft(metrics);
         uiDivider.setCenter(filtersNGraphs);
         uiDivider.setBottom(bottomOfUI);
+
+        filtersNGraphs.getChildren().addAll(filterBox, graphManager);
     }
 
 
@@ -278,7 +278,7 @@ public class DataViewScreen {
     // Function defining update by changing metric
     private void metricUpdate(RadioButton selected){
         String granularity = granularitySelect.getSelectionModel().getSelectedItem();
-        String metricText, metricTextMale, metricTextFemale;
+        String metricText = "", metricTextMale = "", metricTextFemale = "";
         appliedFilters.setText("No filters applied.");
         currentFilter = "No Filter";
 
@@ -287,38 +287,40 @@ public class DataViewScreen {
 
         Thread t = null;
 
-        if (selected == imprnsBtn){
+        graphManager.clear();
 
-            metricText = "Number of impressions is "+ qry_exec.executeQuery("Impressions", granularity).get(0).get(0)[0];
-            metricTextMale = "";
-            metricTextFemale = "";
-            Series metric3 = new Series();
-            metric3.setName("Impressions per day");
+        if (selected == imprnsBtn){
+            var queryResult = qry_exec.executeQuery("Impressions", granularity);
+            metricText = "Number of impressions is " + queryResult.get(0).get(0)[0];
             List<String[]> l1 = qry_exec.executeQuery("Impressions", granularity).get(1);
-            int i = 0;
-            while(i<l1.size()){
-                metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1])));
-                i++;
-
-            }
-            series_line = new ArrayList<Series>(){
-                {
-                    add(metric3);
-                }
-            };
-
-            Axis x = new CategoryAxis();
-            x.setLabel("Day");
-            yAxis.setLabel("Number of impressions");
-
-
-            setLineChart(buildLineChart(series_line, x, yAxis, "Impressions per day"));
 
+//            Series metric3 = new Series();
+//            metric3.setName("Impressions per day");
+//
+//            for(var x : l1){
+//                metric3.getData().add(new XYChart.Data(x[0], Integer.parseInt(x[1])));
+//            }
+//
+//            ArrayList<Series> series_line = new ArrayList<Series>(){
+//                {
+//                    add(metric3);
+//                }
+//            };
+//
+//            Axis x = new CategoryAxis();
+//            Axis yAxis = new NumberAxis();
+//            x.setLabel("Day");
+//            yAxis.setLabel("Number of impressions");
+//
+//
+//            setLineChart(buildLineChart(series_line, x, yAxis, "Impressions per day"));
+            graphManager.createGraph(graphManager.resultToMetric(l1), "Impressions", granularity);
             filterSelect.getSelectionModel().clearSelection();
         }
 
         else if(selected == clicks){
-            metricText = "Number of clicks is " + qry_exec.executeQuery("Clicks", granularity).get(0).get(0)[0];
+            var queryResult = qry_exec.executeQuery("Clicks", granularity);
+            metricText = "Number of clicks is " + queryResult.get(0).get(0)[0];
             int maleCount = Integer.parseInt(qry_exec.executeQuery("Clicks", "gender","Male", granularity).get(0).get(0)[0]);
             int femaleCount = Integer.parseInt(qry_exec.executeQuery("Clicks", "gender","Female", granularity).get(0).get(0)[0]);
             int totalClicks = maleCount + femaleCount;
@@ -332,42 +334,24 @@ public class DataViewScreen {
             Series metric3 = new Series();
             metric3.setName("Clicks per day");
 
-            multiGraphs.getChildren().clear();
-            multiGraphs.setSpacing(10);
 
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox, multiGraphs);
-            filtersNGraphs.setHgrow(multiGraphs, Priority.ALWAYS); // Resize chart
 
-            List<String[]> l1 = qry_exec.executeQuery("Clicks", granularity).get(1);
-            int i =0;
-            while(i<l1.size()){
-                metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1])));
-                i++;
-                //indexOfDate++;
+//            multiGraphs.getChildren().clear();
+//            multiGraphs.setSpacing(10);
+//            filtersNGraphs.setHgrow(multiGraphs, Priority.ALWAYS); // Resize chart
 
-            }
-            series_line = new ArrayList<Series>(){
-                {
-                    add(metric3);
-                }
-            };
+            List<String[]> l1 = queryResult.get(1);
 
-            Axis x = new CategoryAxis();
-            x.setLabel("Day");
-            NumberAxis y = new NumberAxis();
-            y.setLabel("Number of clicks");
+            graphManager.createGraph(graphManager.resultToMetric(l1), "Clicks", granularity);
 
-            LineChart lineChart = buildLineChart(series_line, x, y, "Clicks per day");
-            multiGraphs.setVgrow(lineChart, Priority.ALWAYS);
-            multiGraphs.getChildren().add(lineChart);
+//            multiGraphs.setVgrow(lineChart, Priority.ALWAYS);
+//            multiGraphs.getChildren().add(lineChart);
 
 
             inUse = clicks;
             t = new Thread(
                     () -> {
                         List < String[]>results = qry_exec.executeQuery("Clicks", "age groups", 2, granularity);
-                        // Pie Chart
                         ArrayList<PieChart.Data> data = new ArrayList<PieChart.Data>() {
                             {
                                 results.forEach(x ->
@@ -375,11 +359,11 @@ public class DataViewScreen {
                                 );
                             }
                         };
-                        piechart = buildPieChart(data, "Clicks by age ranges");
+                        PieChart piechart = graphManager.buildPieChart(data, "Clicks by age ranges");
                         if (inUse == clicks)
                             Platform.runLater(
                                     () ->{
-                                        setMultiChart(piechart, lineChart);
+                                        graphManager.addPieChart(piechart);//setMultiChart(piechart, lineChart);
                                     }
                             );
 
@@ -389,45 +373,41 @@ public class DataViewScreen {
         }
 
         else if(selected == uniqueUsrs){
-            metricText = "Number of unique users is "+qry_exec.executeQuery("Unique Users", granularity).get(0).get(0)[0];
-            metricTextMale = "";
-            metricTextFemale = "";
-
-            Series metric3 = new Series();
-            metric3.setName("Unique users per day");
-            List<String[]> l1 = qry_exec.executeQuery("Unique Users", granularity).get(1);
-            int i =0;
-            while(i<l1.size()){
-                metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1])));
-                i++;
-
-            }
-            series_line = new ArrayList<Series>(){
-                {
-                    add(metric3);
-                }
-            };
-
-            Axis x = new CategoryAxis();
-            x.setLabel("Day");
-            yAxis.setLabel("Number of unique users");
-            setLineChart(buildLineChart(series_line, x, yAxis, "Unique users per day"));
+            var queryResult = qry_exec.executeQuery("Unique Users", granularity);
+            metricText = "Number of unique users is " + queryResult.get(0).get(0)[0];
+            List<String[]> l1 = queryResult.get(1);
+
+//            Series metric3 = new Series();
+//            metric3.setName("Unique users per day");
+//
+//            int i =0;
+//            while(i<l1.size()){
+//                metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1])));
+//                i++;
+//
+//            }
+//            series_line = new ArrayList<Series>(){
+//                {
+//                    add(metric3);
+//                }
+//            };
+//
+//            Axis x = new CategoryAxis();
+//            x.setLabel("Day");
+//            yAxis.setLabel("Number of unique users");
+//            setLineChart(buildLineChart(series_line, x, yAxis, "Unique users per day"));
+            graphManager.createGraph(graphManager.resultToMetric(l1), "Unique users", granularity);
 
             filterSelect.getSelectionModel().clearSelection();
         }
         else if (selected == conversions){
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox);
+            graphManager.clear();
             metricText = "Not yet implemented.";
-            metricTextMale = "";
-            metricTextFemale = "";
         }
         else if(selected== cost){
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox);
+//            filtersNGraphs.getChildren().clear();
+//            filtersNGraphs.getChildren().addAll(filterBox);
             metricText = "Calculating total cost...";
-            metricTextMale = "";
-            metricTextFemale = "";
             t = new Thread(
                     () -> {
                         List<List<String[]>> result = qry_exec.executeQuery("Total Cost", granularity);
@@ -436,28 +416,18 @@ public class DataViewScreen {
                                     metricDisplay.setText("Total cost is " + result.get(0).get(0)[0]);
                                     metricDisplayMale.setText("");
                                     metricDisplayFemale.setText("");
-                                    Series metric3 = new Series();
-                                    metric3.setName("Total cost per day");
+
+                                    Series metric = new Series();
+                                    metric.setName("Total cost per day");
                                     List<String[]> l1 = result.get(1);
                                     int i = 0;
                                     double cumulativeCost=0;
-                                    while (i < l1.size()) {
-                                        cumulativeCost=cumulativeCost+Double.parseDouble(l1.get(i)[1]);
-                                        metric3.getData().add(new XYChart.Data(l1.get(i)[0], cumulativeCost));
-                                        //metric3.getData().add(new XYChart.Data(l1.get(i)[0], Double.parseDouble(l1.get(i)[1])));
-                                        i++;
-
+                                    for(var x : l1){
+                                        cumulativeCost=cumulativeCost+Double.parseDouble(x[1]);
+                                        metric.getData().add(new XYChart.Data(x[0], cumulativeCost));
                                     }
-                                    series_line = new ArrayList<Series>() {
-                                        {
-                                            add(metric3);
-                                        }
-                                    };
 
-                                    Axis x = new CategoryAxis();
-                                    x.setLabel("Day");
-                                    yAxis.setLabel("cost in pence");
-                                    setLineChart(buildLineChart(series_line, x, yAxis, "Total cost per day"));
+                                    graphManager.createGraph(metric, "Total Cost", granularity);
                                 }
                         );
                     }
@@ -466,10 +436,7 @@ public class DataViewScreen {
             filterSelect.getSelectionModel().clearSelection();
         }
         else if (selected == bounces){
-
             metricText = "Loading bounces...";
-            metricTextFemale = "";
-            metricTextMale = "";
             final HBox bounceRateBox = new HBox();
 
             bounceRateLabel = new Label("Calculating bounce rate...");
@@ -483,12 +450,9 @@ public class DataViewScreen {
             filterBox.getChildren().clear();
             filterBox.getChildren().addAll(new Text("Filters"), filterSelect, appliedFilters, metricBox, bounceRateBox);
 
-            multiGraphs.getChildren().clear();
-            multiGraphs.setSpacing(10);
+            graphManager.clear();
 
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox, multiGraphs);
-            filtersNGraphs.setHgrow(multiGraphs, Priority.ALWAYS); // Resize chart
+            filtersNGraphs.setHgrow(graphManager, Priority.ALWAYS); // Resize chart
 
             // Bounces thread
             Thread bounce_t = new Thread (
@@ -496,9 +460,8 @@ public class DataViewScreen {
                         Integer bounces  = Integer.valueOf(qry_exec.executeQuery("Bounces", granularity).get(0).get(0)[0]);
                         Integer totalClicks = Integer.valueOf(qry_exec.executeQuery("Clicks", granularity).get(0).get(0)[0]);
                         Platform.runLater(
-
                                 () -> {
-                                    metricDisplay.setText("Number of bounces: "+ bounces);
+                                    metricDisplay.setText("Number of bounces: " + bounces);
 
                                     // Pie Chart
                                     ArrayList<PieChart.Data> data = new ArrayList<PieChart.Data>(){
@@ -507,9 +470,8 @@ public class DataViewScreen {
                                             add(new PieChart.Data("Normal clicks", totalClicks-bounces));
                                         }
                                     };
-                                    piechart = buildPieChart(data, "Proportion of bounces");
-                                    multiGraphs.setVgrow(piechart, Priority.ALWAYS);
-                                    multiGraphs.getChildren().add(piechart);
+                                    PieChart piechart = graphManager.buildPieChart(data, "Proportion of bounces");
+                                    graphManager.addPieChart(piechart);
                                 }
                         );
                     }
@@ -518,12 +480,12 @@ public class DataViewScreen {
             // Bounce rate thread
             Thread rate_t = new Thread (
                     () ->{
-                        Double bounceRate  = Double.valueOf(qry_exec.executeQuery("Bounces", "bounce rate",1, granularity).get(0)[0]);
+                        Double bounceRate = Double.valueOf(qry_exec.executeQuery("Bounces", "bounce rate",1, granularity).get(0)[0]);
                         List<String[]> bouncesPerDay = qry_exec.executeQuery("Bounces", granularity).get(1);
                         List<String[]> clicksPerDay = qry_exec.executeQuery("Clicks", granularity).get(1);
                         Platform.runLater(
                                 () -> {
-                                    bounceRateLabel.setText("Bounce rate: "+ bounceRate);
+                                    bounceRateLabel.setText("Bounce rate: " + bounceRate);
                                     Series metric = new Series();
                                     metric.setName("Bounce rate per day");
 
@@ -532,20 +494,10 @@ public class DataViewScreen {
                                         double avg = (Double.parseDouble(bouncesPerDay.get(i)[1])) / (Double.parseDouble(clicksPerDay.get(i)[1]));
                                         metric.getData().add(new XYChart.Data(bouncesPerDay.get(i)[0], avg));
                                         i++;
-
                                     }
-                                    series_line = new ArrayList<Series>(){
-                                        {
-                                            add(metric);
-                                        }
-                                    };
-
-                                    Axis x = new CategoryAxis();
-                                    x.setLabel("Day");
-                                    yAxis.setLabel("Bounce rate");
-
-                                    multiGraphs.setVgrow(buildLineChart(series_line, x, yAxis, "Bounce rate per day"), Priority.ALWAYS);
-                                    multiGraphs.getChildren().addAll(buildLineChart(series_line, x, yAxis, "Bounce rate per day"));
+                                    graphManager.createGraph(metric, "Bounce rate", granularity);
+//                                    multiGraphs.setVgrow(buildLineChart(series_line, x, yAxis, "Bounce rate per day"), Priority.ALWAYS);
+//                                    multiGraphs.getChildren().addAll(buildLineChart(series_line, x, yAxis, "Bounce rate per day"));
                                 }
                         );
                     }
@@ -558,16 +510,12 @@ public class DataViewScreen {
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
-
         }
 
         else if (selected == cpc){
             inUse = cpc;
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox);
+            graphManager.clear();
             metricText = "Calculating cost-per-click...";
-            metricTextMale = "";
-            metricTextFemale = "";
             t = new Thread(
                     () -> {
                         Series metric3 = new Series();
@@ -580,20 +528,7 @@ public class DataViewScreen {
                                         metricDisplayMale.setText("");
                                         metricDisplayFemale.setText("");
 
-                                        for(String[] record : result.get(1)){
-                                            metric3.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1])));
-                                        }
-
-                                        series_line = new ArrayList<Series>(){
-                                            {
-                                                add(metric3);
-                                            }
-                                        };
-
-                                        Axis x = new CategoryAxis();
-                                        x.setLabel("Day");
-                                        yAxis.setLabel("CPC in pence");
-                                        setLineChart(buildLineChart(series_line, x, yAxis, "Cost per click over the campaign"));
+                                        graphManager.createGraph(graphManager.resultToMetric(result.get(1)), "Cost per click", granularity);
                                     }
                             );
                     }
@@ -602,15 +537,9 @@ public class DataViewScreen {
             filterSelect.getSelectionModel().clearSelection();
         }
         else if (selected == cpa) {
-            //List<String[]> totalImpCostPerDay = dbc.dbQuery(SQLCommands.totalImpressionCostPerDates,2);
-            //List<String[]> totalClickCostPerDay = dbc.dbQuery(SQLCommands.totalClickCostPerDates,2);
-            //List<String[]> totalConversionsPerDay = dbc.dbQuery(SQLCommands.totalConversionsPerDates,2);
             inUse = cpa;
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox);
+            graphManager.clear();
             metricText = "Calculating cost-per-acquisition...";
-            metricTextMale = "";
-            metricTextFemale = "";
             t = new Thread(
                     () -> {
                         Series metric = new Series();
@@ -623,9 +552,6 @@ public class DataViewScreen {
                                         metricDisplayMale.setText("");
                                         metricDisplayFemale.setText("");
 
-                                        double convEntireTotal = 0.0;
-                                        double costEntireTotal = 0.0;
-
                                             /*
                                             for (String[] convEntry : totalConversionsPerDay) {    // manually joining the data
                                                 String date = convEntry[0];                        // fuck you sql this is your fault
@@ -652,7 +578,6 @@ public class DataViewScreen {
                                             }
 
                                             metricText += Double.toString(costEntireTotal / convEntireTotal) + " pence";
-                                            */
 
                                         for (String[] record : result.get(1)) {
                                             metric.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1])));
@@ -666,6 +591,9 @@ public class DataViewScreen {
                                         x.setLabel("Day");
                                         yAxis.setLabel("CPA");
                                         setLineChart(buildLineChart(series_line, x, yAxis, "Cost-per-Acquisition"));
+                                        */
+
+                                        graphManager.createGraph(graphManager.resultToMetric(result.get(1)), "Cost per Acquistion", granularity);
                                     }
                             );
                     }
@@ -676,11 +604,8 @@ public class DataViewScreen {
 
         else if (selected == ctr) {
             inUse = ctr;
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox);
+            graphManager.clear();
             metricText = "Calculating click-through-rate...";
-            metricTextMale = "";
-            metricTextFemale = "";
             t = new Thread(
                     () -> {
                         Series metric = new Series();
@@ -693,21 +618,23 @@ public class DataViewScreen {
                                         metricDisplayMale.setText("");
                                         metricDisplayFemale.setText("");
 
-                                        for(String[] record : result.get(1)){
-                                            metric.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1])));
-                                        }
-
-
-                                        series_line = new ArrayList<Series>(){
-                                            {
-                                                add(metric);
-                                            }
-                                        };
-
-                                        Axis x = new CategoryAxis();
-                                        x.setLabel("Day");
-                                        yAxis.setLabel("CTR");
-                                        setLineChart(buildLineChart(series_line, x, yAxis, "Click Through Rate over the campaign"));
+                                        graphManager.createGraph(graphManager.resultToMetric(result.get(1)), "Click through rate", granularity);
+
+//                                        for(String[] record : result.get(1)){
+//                                            metric.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1])));
+//                                        }
+//
+//
+//                                        series_line = new ArrayList<Series>(){
+//                                            {
+//                                                add(metric);
+//                                            }
+//                                        };
+//
+//                                        Axis x = new CategoryAxis();
+//                                        x.setLabel("Day");
+//                                        yAxis.setLabel("CTR");
+//                                        setLineChart(buildLineChart(series_line, x, yAxis, "Click Through Rate over the campaign"));
                                     }
                             );
                     }
@@ -716,24 +643,17 @@ public class DataViewScreen {
             filterSelect.getSelectionModel().clearSelection();
         }
         else if (selected == cpm){
-            filtersNGraphs.getChildren().clear();
-            filtersNGraphs.getChildren().addAll(filterBox);
+            graphManager.clear();
             metricText = "Not yet implemented.";
-            metricTextMale = "";
-            metricTextFemale = "";
         }
         else if (selected == null){
             // Used on graph reset
             // No actions needed
             metricText = "";
-            metricTextFemale = "";
-            metricTextMale = "";
         }
 
         else{
             metricText = selected.getText();
-            metricTextFemale = "";
-            metricTextMale = "";
             filterSelect.getSelectionModel().clearSelection();
         }
 
@@ -819,49 +739,6 @@ public class DataViewScreen {
         appliedFilters.setText("Applied filter:\n\n- "+filter);
     }
 
-
-    /*
-     @desc - populates two series' with test data
-     @return - a pair of series containing the test data
-     */
-    private Pair<Series, Series> createTestSeriesData() {
-        Series metric1 = new Series();
-        metric1.setName("Metric 1");
-        //populating the series with data
-        metric1.getData().add(new XYChart.Data(1, 23));
-        metric1.getData().add(new XYChart.Data(2, 14));
-        metric1.getData().add(new XYChart.Data(3, 15));
-        metric1.getData().add(new XYChart.Data(4, 24));
-        metric1.getData().add(new XYChart.Data(5, 34));
-        metric1.getData().add(new XYChart.Data(6, 36));
-        metric1.getData().add(new XYChart.Data(7, 22));
-        metric1.getData().add(new XYChart.Data(8, 45));
-        metric1.getData().add(new XYChart.Data(9, 43));
-        metric1.getData().add(new XYChart.Data(10, 17));
-        metric1.getData().add(new XYChart.Data(11, 29));
-        metric1.getData().add(new XYChart.Data(12, 25));
-
-        Series metric2 = new Series();
-        metric2.setName("Metric 2");
-        //populating the series with data
-        metric2.getData().add(new XYChart.Data(1, 25));
-        metric2.getData().add(new XYChart.Data(2, 10));
-        metric2.getData().add(new XYChart.Data(3, 19));
-        metric2.getData().add(new XYChart.Data(4, 32));
-        metric2.getData().add(new XYChart.Data(5, 33));
-        metric2.getData().add(new XYChart.Data(6, 35));
-        metric2.getData().add(new XYChart.Data(7, 38));
-        metric2.getData().add(new XYChart.Data(8, 40));
-        metric2.getData().add(new XYChart.Data(9, 41));
-        metric2.getData().add(new XYChart.Data(10, 10));
-        metric2.getData().add(new XYChart.Data(11, 24));
-        metric2.getData().add(new XYChart.Data(12, 21));
-
-        return new Pair(metric1,metric2);
-    }
-
-
-
     private String getTableName(ToggleGroup metricGroup) {
         switch (((RadioButton) metricGroup.getSelectedToggle()).getText()) {
             case "Impressions":
@@ -896,54 +773,6 @@ public class DataViewScreen {
         return null;
     }
 
-    public void setLineChart(LineChart chart){
-        this.linechart = chart;
-        filtersNGraphs.getChildren().clear();
-        filtersNGraphs.getChildren().addAll(filterBox, linechart);
-        filtersNGraphs.setHgrow(linechart, Priority.ALWAYS); // Resize chart
-    }
-
-    public LineChart getLineChart(){
-        return linechart;
-    }
-
-    public void setMultiChart(PieChart piechart, LineChart linechart){
-        this.piechart = piechart;
-        this.linechart = linechart;
-        multiGraphs.getChildren().clear();
-        multiGraphs.setVgrow(piechart, Priority.SOMETIMES); // Resize chart
-        multiGraphs.setVgrow(linechart, Priority.SOMETIMES); // Resize chart
-        multiGraphs.getChildren().add(piechart);
-        multiGraphs.getChildren().add(linechart);
-    }
-
-    public PieChart getPieChart(){
-        return piechart;
-    }
-
-    private LineChart buildLineChart(ArrayList<Series> series, Axis x, Axis y, String title){
-        LineChart linechart = new LineChart(x, y);
-        linechart.getData().addAll(series);
-        linechart.setTitle(title);
-        linechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
-        return linechart;
-    }
-
-    private BarChart buildBarChart(ArrayList<XYChart.Series> series, Axis x, Axis y, String title){
-        BarChart barchart = new BarChart(x, y);
-        barchart.getData().addAll(series);
-        barchart.setTitle(title);
-        return barchart;
-    }
-
-    private PieChart buildPieChart(ArrayList<PieChart.Data> data, String title){
-        ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(data);
-        final PieChart piechart = new PieChart(pieChartData);
-        piechart.setTitle(title);
-        piechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
-        return piechart;
-    }
-
     //changes the UI to set size
     private void initFonts(){
         for (Label l : allLabels){
@@ -963,16 +792,17 @@ public class DataViewScreen {
         metrics.setSpacing(20);
         fontSize.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
         granularitySelect.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
-        linechart.getXAxis().tickLabelFontProperty().set(Font.font(sizeOfFont));
-        yAxis.setTickLabelFont(Font.font(sizeOfFont));
-        xAxis.setTickLabelFont(Font.font(sizeOfFont));
-        linechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
-        if (piechart != null)
-            piechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
+
+        graphManager.changeFontSize(sizeOfFont);
+
         filterSelect.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";");
         back.setFont(new Font("Arial", sizeOfFont));
 
         stage.sizeToScene();
     }
 
+    public GraphManager getGraphManager(){
+        return graphManager;
+    }
+
 }
diff --git a/src/DateFilter.java b/src/DateFilter.java
index 32736bb3cab128ca34104aaca9edf8d61b168786..3a8268e9663c46b9808f7696efcf891ce4986ef3 100644
--- a/src/DateFilter.java
+++ b/src/DateFilter.java
@@ -181,10 +181,10 @@ public class DateFilter extends Filter {
         if (metricName.equals("Bounces")) {
             PieChart pieChart = updateBounces(Integer.valueOf(filiteredValue));
             LineChart lineChart = updateBounceRate(filteredValues, granularity);
-            dvs.setMultiChart(pieChart, lineChart);
+            dvs.getGraphManager().setMultiChart(pieChart, lineChart);
         } else {
             Series data = new Series();
-            data.setName(dvs.getLineChart().getTitle());
+            data.setName(dvs.getGraphManager().getLinechart().getTitle());
 
 
             //cumulative chart for total cost, standard for others
@@ -213,28 +213,28 @@ public class DateFilter extends Filter {
             Axis x = new CategoryAxis();
             x.setLabel("Day");
             Axis y = new NumberAxis();
-            y.setLabel(dvs.getLineChart().getYAxis().getLabel());
+            y.setLabel(dvs.getGraphManager().getLinechart().getYAxis().getLabel());
             LineChart linechart = new LineChart(x, y);
             linechart.getData().addAll(data);
-            linechart.setTitle(dvs.getLineChart().getTitle());
+            linechart.setTitle(dvs.getGraphManager().getLinechart().getTitle());
             if (metricName.equals("Clicks")){
-                PieChart pieChart = dvs.getPieChart();
+                PieChart pieChart = dvs.getGraphManager().getPieChart();
                 pieChart.getData().clear();
 
                 List<String[]> ageValues = qry_exec.executeQuery("Clicks", "date", startVal+","+endVal, "age groups",2);
                 for(String[] record : ageValues) {
                     pieChart.getData().add(new PieChart.Data(record[0], Integer.valueOf(record[1])));
                 }
-                dvs.setMultiChart(pieChart, linechart);
+                dvs.getGraphManager().setMultiChart(pieChart, linechart);
             } else
-                dvs.setLineChart(linechart);
+                dvs.getGraphManager().setLineChart(linechart);
         }
         dvs.showFilterApplied("Date range: "+startVal+" to "+endVal);
     }
 
     private PieChart updateBounces(Integer bounces) {
         // Update pie chart
-        PieChart pieChart = dvs.getPieChart();
+        PieChart pieChart = dvs.getGraphManager().getPieChart();
         pieChart.getData().remove(0);
         pieChart.getData().add(new PieChart.Data("Bounce clicks", bounces));
 
diff --git a/src/FilterController.java b/src/FilterController.java
index 48742d1504e8646929ecfc0f52131eb6463ed545..47516f2f10aaf668e4c4f956ecb40a66597734f9 100644
--- a/src/FilterController.java
+++ b/src/FilterController.java
@@ -169,10 +169,16 @@ public class FilterController extends Filter {
             pieChart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
             lineChart.getXAxis().tickLabelFontProperty().set(Font.font(fontSize));
             lineChart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
-            dvs.setMultiChart(pieChart, lineChart);
+
+            dvs.getGraphManager().setMultiChart(pieChart, lineChart);
+            //dvs.getGraphManager().changeFontSize();
         } else {
             XYChart.Series data = new XYChart.Series();
-            data.setName(dvs.getLineChart().getTitle());
+            //data.setName(dvs.getLineChart().getTitle());
+
+            GraphManager graphManager = dvs.getGraphManager();
+
+            data.setName(graphManager.getLinechart().getTitle());
 
 
             //cumulative chart for total cost, standard for others
@@ -200,25 +206,25 @@ public class FilterController extends Filter {
             */
             Axis x = new CategoryAxis();
             NumberAxis y = new NumberAxis();
-            y.setLabel(dvs.getLineChart().getYAxis().getLabel());
+            y.setLabel(dvs.getGraphManager().getLinechart().getYAxis().getLabel());
             x.setLabel("Day");
             //dvs.getLineChart().getYAxis().setLabel(dvs.getLineChart().getYAxis().getLabel());
             LineChart linechart = new LineChart(x,y);
             linechart.getData().addAll(data);
-            linechart.setTitle(dvs.getLineChart().getTitle());
+            linechart.setTitle(graphManager.getLinechart().getTitle());
             if (metricName.equals("Clicks")){
-                PieChart pieChart = dvs.getPieChart();
+                PieChart pieChart = graphManager.getPieChart();
                 pieChart.getData().clear();
 
                 List<String[]> ageValues = qry_exec.executeQuery("Clicks", filterName.toLowerCase(), selectedValue, "age groups",2);
                 for(String[] record : ageValues) {
                     pieChart.getData().add(new PieChart.Data(record[0], Integer.valueOf(record[1])));
                 }
-                dvs.setMultiChart(pieChart, linechart);
+                dvs.getGraphManager().setMultiChart(pieChart, linechart);
             } else
-                dvs.setLineChart(linechart);
+                graphManager.setLineChart(linechart);
             linechart.getXAxis().tickLabelFontProperty().set(Font.font(fontSize));
-            dvs.getLineChart().getYAxis().setTickLabelFont(Font.font(fontSize));
+            graphManager.getLinechart().getYAxis().setTickLabelFont(Font.font(fontSize));
             x.setTickLabelFont(Font.font(fontSize));
             linechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
 
@@ -230,7 +236,7 @@ public class FilterController extends Filter {
 
     private PieChart updateBounces(Integer bounces) {
         // Update pie chart
-        PieChart pieChart = dvs.getPieChart();
+        PieChart pieChart = dvs.getGraphManager().getPieChart();
         pieChart.getData().clear();
         Integer totalClicks = Integer.valueOf(qry_exec.executeQuery("Clicks", "").get(0).get(0)[0]);
         pieChart.getData().add(new PieChart.Data("Normal clicks",totalClicks-bounces));
diff --git a/src/GraphManager.java b/src/GraphManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..46589402dfb73e6ca4a93a7441a6ab9cb183b8fa
--- /dev/null
+++ b/src/GraphManager.java
@@ -0,0 +1,125 @@
+package src;
+
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.scene.chart.*;
+import javafx.scene.layout.Priority;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Font;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GraphManager extends VBox {
+
+    private ArrayList<XYChart.Series> series_line = new ArrayList<XYChart.Series>();
+    private LineChart linechart;
+    private PieChart piechart;
+    private Axis xAxis = new NumberAxis();
+    private  Axis yAxis = new NumberAxis();
+    private int fontSize;
+
+
+    public GraphManager(){
+        super();
+        this.setSpacing(10);
+    }
+
+    public void changeFontSize(int size){
+        fontSize = size;
+        // Changes to current graph next
+
+        linechart.getXAxis().tickLabelFontProperty().set(Font.font(fontSize));
+        yAxis.setTickLabelFont(Font.font(fontSize));
+        xAxis.setTickLabelFont(Font.font(fontSize));
+        linechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
+        if (piechart != null)
+            piechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
+    }
+
+    public void clear(){
+        getChildren().clear();
+        setSpacing(10);
+    }
+
+    public XYChart.Series resultToMetric(List<String[]> data){
+        XYChart.Series metric = new XYChart.Series();
+        for(var x : data){
+            metric.getData().add(new XYChart.Data(x[0], Double.parseDouble(x[1])));
+        }
+        return metric;
+    }
+
+    public void createGraph(XYChart.Series metric, String name, String granuleUnit){
+        String thing = name + " per " + granuleUnit;
+        metric.setName(thing);
+
+        ArrayList<XYChart.Series> series_line = new ArrayList<XYChart.Series>(){
+            {
+                add(metric);
+            }
+        };
+
+        xAxis = new CategoryAxis();
+        yAxis = new NumberAxis();
+        xAxis.setLabel(granuleUnit);
+        yAxis.setLabel("Number of " + name);
+
+        setLineChart(buildLineChart(series_line, xAxis, yAxis, thing));
+    }
+
+    public void setLineChart(LineChart chart){
+        this.linechart = chart;
+        setVgrow(linechart, Priority.ALWAYS);
+        this.getChildren().add(linechart);
+    }
+
+
+    public void addPieChart(PieChart piechart){
+        this.piechart = piechart;
+        setVgrow(this.piechart, Priority.SOMETIMES);
+        setVgrow(linechart, Priority.SOMETIMES);
+        this.getChildren().add(0, piechart);
+    }
+
+    public void setMultiChart(PieChart piechart, LineChart linechart){
+        this.piechart = piechart;
+        this.linechart = linechart;
+        this.getChildren().clear();
+        setVgrow(piechart, Priority.SOMETIMES); // Resize chart
+        setVgrow(linechart, Priority.SOMETIMES); // Resize chart
+        this.getChildren().add(piechart);
+        this.getChildren().add(linechart);
+    }
+
+    public PieChart getPieChart(){
+        return piechart;
+    }
+
+    public LineChart buildLineChart(ArrayList<XYChart.Series> series, Axis x, Axis y, String title){
+        LineChart linechart = new LineChart(x, y);
+        linechart.getData().addAll(series);
+        linechart.setTitle(title);
+        linechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
+        return linechart;
+    }
+
+    public BarChart buildBarChart(ArrayList<XYChart.Series> series, Axis x, Axis y, String title){
+        BarChart barchart = new BarChart(x, y);
+        barchart.getData().addAll(series);
+        barchart.setTitle(title);
+        return barchart;
+    }
+
+    public PieChart buildPieChart(ArrayList<PieChart.Data> data, String title){
+        ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(data);
+        final PieChart piechart = new PieChart(pieChartData);
+        piechart.setTitle(title);
+        piechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";");
+        return piechart;
+    }
+
+    public LineChart getLinechart() {
+        return linechart;
+    }
+}