diff --git a/TestON/TAI/src/tai_ofa/OFATestSummary.java b/TestON/TAI/src/tai_ofa/OFATestSummary.java
new file mode 100644
index 0000000..3a1dc15
--- /dev/null
+++ b/TestON/TAI/src/tai_ofa/OFATestSummary.java
@@ -0,0 +1,663 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package tai_ofa;
+
+import com.sun.org.apache.xalan.internal.xsltc.compiler.util.StringStack;
+import java.awt.Color;
+import java.awt.TextArea;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.application.Application;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.Orientation;
+import javafx.scene.Group;
+import javafx.scene.Scene;
+import javafx.scene.chart.PieChart;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.ComboBoxBuilder;
+import javafx.scene.control.Label;
+import javafx.scene.control.Separator;
+import javafx.scene.control.SplitPane;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TabPane;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import javafx.scene.control.TextAreaBuilder;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TextFieldBuilder;
+import javafx.scene.control.ToolBar;
+import javafx.scene.control.Tooltip;
+import javafx.scene.control.cell.PropertyValueFactory;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.FlowPane;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.text.Text;
+import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
+import org.apache.xmlrpc.XmlRpcClient;
+import org.apache.xmlrpc.XmlRpcException;
+
+/**
+ *
+ * @author Raghav Kashyap (raghavkashyap@paxterrasolutions.com)
+	
+ *   TestON is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 2 of the License, or
+ *   (at your option) any later version.
+
+ *   TestON is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+
+ *   You should have received a copy of the GNU General Public License
+ *   along with TestON.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+public class OFATestSummary extends Application {
+
+    ObservableList<SummaryTable> data;
+    ObservableList<FinalSummaryTable> summaryData;
+    ObservableList<StepTable> stepData;
+    TableView<SummaryTable> summaryTable;
+    TableView<StepTable> stepTable;
+    PieChart.Data passData = new PieChart.Data("Pass", 0);
+    PieChart.Data failData = new PieChart.Data("Fail", 0);
+    PieChart.Data abortData = new PieChart.Data("Abort", 0);
+    PieChart.Data noResult = new PieChart.Data("No Result", 0);
+    ObservableList<PieChart.Data> pieChartData;
+    TableView<FinalSummaryTable> finalSummaryTable = new TableView<FinalSummaryTable>();
+    TableColumn testCaseIdColumn, testCaseNameColumn;
+    TableColumn testCaseStatusColumn, testCaseStartTimeColumn, testCaseEndTimeColumn;
+    Button viewLogs = new Button("Debug & Console");
+    GridPane buttonPane = new GridPane();
+    TableColumn stepId, stepName, stepStatus;
+    TableColumn summaryItem, information;
+    HashMap<String, String> testCaseIdAndName = new HashMap<String, String>();
+    String caseId, caseName;
+    Stage copyStage;
+    PieChart chart;
+    StackPane rootStack;
+    TAI_OFA ofaReference;
+    Stage paramaterWindow;
+    ComboBox LogBox;
+    TabPane execWindow = new TabPane();
+    Tab debugLog = new Tab("Debug Logs");
+    Tab componentLog = new Tab("Test Log");
+    Tab testSummaryTab = new Tab("Test Summary");
+    Tab dpctlSessionTab = new Tab("FlowVisor1.session");
+    Tab mininetSessionTab = new Tab("Mininet1.session");
+    Tab poxSessionTab = new Tab("POX2.session");
+    TabPane baseTabPane = new TabPane();
+    javafx.scene.control.TextArea debugLogText = TextAreaBuilder.create().build();
+    javafx.scene.control.TextArea compononetLogText = TextAreaBuilder.create().build();
+    javafx.scene.control.TextArea flowVisorSessionText = TextAreaBuilder.create().build();
+    javafx.scene.control.TextArea poxSessionText = TextAreaBuilder.create().build();
+    javafx.scene.control.TextArea mininetSessionText = TextAreaBuilder.create().build();
+    String variableName = "";
+    String command = "";
+    ToolBar quickLauchBar = new ToolBar();
+    Double toolBarHeight;
+    Scene scene;
+    SplitPane baseSplitPane = new SplitPane();
+    TabPane consoleTabPane;
+
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String[] args) {
+        launch(args);
+    }
+
+    public OFATestSummary(TAI_OFA ofaReference, Stage paramaterWindow) {
+        this.ofaReference = ofaReference;
+        this.paramaterWindow = paramaterWindow;
+    }
+
+    public void start(Stage primaryStage) {
+        copyStage = primaryStage;
+        primaryStage.setTitle("Test Execution Status");
+        primaryStage.setResizable(false);
+        Group rootGroup = new Group();
+        scene = new Scene(rootGroup, 1020, 920);
+        Pane basePanel = new Pane();
+        HBox baseBox = new HBox();
+        VBox consoleBox = new VBox();
+        VBox buttonBox = new VBox();
+
+        getDebugTab();
+        getToolBar();
+        buttonBox.getChildren().addAll(buttonPane);
+        consoleBox.getChildren().addAll(quickLauchBar, baseTabPane);
+        baseBox.getChildren().addAll(consoleBox);
+        basePanel.getChildren().addAll(baseBox);
+        SplitPane sp = getTestSummary();
+        testSummaryTab.setContent(sp);
+        testSummaryTab.setClosable(false);
+        baseTabPane.getTabs().addAll(testSummaryTab);
+        javafx.scene.control.SingleSelectionModel<Tab> selectionModel = baseTabPane.getSelectionModel();
+        selectionModel.select(testSummaryTab);
+        baseTabPane.prefWidthProperty().bind(scene.widthProperty().subtract(200));
+        baseTabPane.prefHeightProperty().bind(scene.heightProperty().subtract(10));
+        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
+            @Override
+            public void handle(WindowEvent t) {
+                XmlRpcClient server;
+                try {
+                    server = new XmlRpcClient("http://localhost:9000");
+                    Vector params = new Vector();
+                    params.add(new String("main"));
+                    try {
+                        server.execute("stop", new Vector());
+                    } catch (XmlRpcException ex) {
+                        Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                    } catch (IOException ex) {
+                        Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                    }
+                } catch (MalformedURLException ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        });
+
+        basePanel.prefHeightProperty().bind(scene.heightProperty());
+        quickLauchBar.prefWidthProperty().bind(scene.widthProperty());
+        quickLauchBar.setMinHeight(scene.heightProperty().get() / 20);
+        toolBarHeight = quickLauchBar.getMinHeight();
+        baseTabPane.prefHeightProperty().bind(scene.heightProperty());
+        baseBox.prefHeightProperty().bind(scene.heightProperty());
+        consoleBox.prefHeightProperty().bind(scene.heightProperty());
+        rootGroup.getChildren().addAll(basePanel);
+        primaryStage.setScene(scene);
+        primaryStage.show();
+
+    }
+
+    public TableView getTable() {
+        return summaryTable;
+    }
+
+    public SplitPane getTestSummary() {
+        GridPane testCaseSummaryTable = new GridPane();
+        testCaseSummaryTable.setPadding(new Insets(10, 0, 0, 10));
+        GridPane finalSummaryPane = new GridPane();
+        finalSummaryPane.setPadding(new Insets(300, 0, 0, 20));
+        GridPane stepSummaryPane = new GridPane();
+        stepSummaryPane.setPadding(new Insets(300, 0, 0, 20));
+
+        CheckBox selectTestCase = new CheckBox();
+        summaryTable = new TableView<SummaryTable>();
+        stepTable = new TableView<StepTable>();
+        summaryTable.setMinWidth(580);
+        summaryTable.setMaxHeight(250);
+        testCaseIdColumn = new TableColumn(ofaReference.label.testSummaryTestCaseId);
+        testCaseIdColumn.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("testCaseId"));
+        testCaseIdColumn.setMaxWidth(30);
+        testCaseIdColumn.setResizable(true);
+
+        testCaseNameColumn = new TableColumn(ofaReference.label.testSummaryTestCaseName);
+        testCaseNameColumn.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("testCaseName"));
+        testCaseNameColumn.setMinWidth(303);
+        testCaseNameColumn.setResizable(true);
+
+        testCaseStatusColumn = new TableColumn(ofaReference.label.testSummaryExecutionStatus);
+        testCaseStatusColumn.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("testCaseStatus"));
+        testCaseStatusColumn.setMinWidth(85);
+        testCaseStatusColumn.setResizable(true);
+
+        testCaseStartTimeColumn = new TableColumn(ofaReference.label.testSummaryStartTest);
+        testCaseStartTimeColumn.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("testCaseStartTime"));
+        testCaseStartTimeColumn.setMinWidth(195);
+        testCaseStartTimeColumn.setResizable(true);
+
+        testCaseEndTimeColumn = new TableColumn(ofaReference.label.testSummaryEndTest);
+        testCaseEndTimeColumn.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("testCaseEndTime"));
+        testCaseEndTimeColumn.setMinWidth(195);
+        testCaseEndTimeColumn.setResizable(true);
+
+        summaryTable.setItems(data);
+        summaryTable.getColumns().addAll(testCaseIdColumn, testCaseNameColumn, testCaseStatusColumn, testCaseStartTimeColumn, testCaseEndTimeColumn);
+
+        summaryItem = new TableColumn(ofaReference.label.summary);
+        summaryItem.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("summaryItem"));
+        summaryItem.setMinWidth(140);
+        summaryItem.setResizable(true);
+
+        information = new TableColumn(ofaReference.label.information);
+        information.setCellValueFactory(new PropertyValueFactory<SummaryTable, Label>("information"));
+        information.setMinWidth(210);
+        information.setResizable(true);
+
+        finalSummaryTable.setMinWidth(350);
+        finalSummaryTable.setMaxHeight(300);
+        SplitPane leftPane = new SplitPane();
+        SplitPane rightPane = new SplitPane();
+        leftPane.setOrientation(Orientation.HORIZONTAL);
+        rightPane.setOrientation(Orientation.VERTICAL);
+        finalSummaryTable.setItems(summaryData);
+        finalSummaryTable.setVisible(false);
+        finalSummaryTable.getColumns().addAll(summaryItem, information);
+        HBox pieChart = new HBox(10);
+        pieChart.setPadding(new Insets(300, 0, 0, 300));
+        ArrayList<PieChart.Data> dataList = new ArrayList<PieChart.Data>();
+
+        dataList.add(passData);
+        dataList.add(failData);
+        dataList.add(abortData);
+        dataList.add(noResult);
+        pieChartData = FXCollections.observableArrayList(dataList);
+        chart = new PieChart(pieChartData);
+        chart.setTitle(ofaReference.label.testSummaryTestSummary);
+        pieChart.getChildren().add(chart);
+        chart.setVisible(false);
+        summaryTable.setVisible(false);
+        stepTable.setVisible(true);
+        stepTable.setMinWidth(450);
+        stepTable.setMaxHeight(300);
+
+        stepId = new TableColumn("ID");
+        stepId.setCellValueFactory(new PropertyValueFactory<StepTable, Label>("testStepId"));
+        stepId.setMinWidth(10);
+        stepId.setResizable(true);
+
+        stepName = new TableColumn("Name");
+        stepName.setCellValueFactory(new PropertyValueFactory<StepTable, Label>("testStepName"));
+        stepName.setMinWidth(470);
+        stepName.setResizable(true);
+
+        stepStatus = new TableColumn("Status");
+        stepStatus.setCellValueFactory(new PropertyValueFactory<StepTable, Label>("testStepStatus"));
+        stepStatus.setMinWidth(40);
+        stepStatus.setResizable(true);
+        stepTable.getColumns().addAll(stepId, stepName, stepStatus);
+        stepTable.setItems(stepData);
+        stepSummaryPane.add(stepTable, 0, 2);
+
+        finalSummaryPane.add(finalSummaryTable, 0, 2);
+        rootStack = new StackPane();
+        testCaseSummaryTable.add(summaryTable, 0, 1);
+        rootStack.getChildren().addAll(testCaseSummaryTable, pieChart, stepSummaryPane, finalSummaryPane);
+        leftPane.getItems().addAll(rootStack);
+        consoleTabPane = new TabPane();
+        consoleTabPane.setPrefWidth(700);
+        consoleTabPane.getTabs().addAll(componentLog, debugLog, dpctlSessionTab, mininetSessionTab, poxSessionTab);
+
+        Image topoImage = new Image("images/topo.png", 400, 200, true, true);
+        ImageView topo = new ImageView(topoImage);
+        TabPane imageTabPane = new TabPane();
+        Tab imageTab = new Tab("Test Topology");
+        imageTab.setContent(topo);
+        imageTabPane.getTabs().add(imageTab);
+        imageTabPane.setMinWidth(300);
+        rightPane.getItems().addAll(imageTabPane, consoleTabPane);
+        rightPane.setDividerPosition(1, 400);
+        baseSplitPane.setDividerPosition(1, 10);
+        baseSplitPane.getItems().addAll(leftPane, rightPane);
+        return baseSplitPane;
+    }
+
+    public void getDebugTab() {
+        poxSessionText.prefWidth(450);
+        poxSessionText.prefHeight(620);
+        poxSessionText.setStyle(
+                "-fx-text-fill: #0A0A2A;"
+                + "-fx-background-color: #EFFBFB;");
+        poxSessionText.setEditable(false);
+        poxSessionTab.setContent(poxSessionText);
+        flowVisorSessionText.prefWidth(450);
+        flowVisorSessionText.prefHeight(620);
+        flowVisorSessionText.setStyle(
+                "-fx-text-fill: #0A0A2A;"
+                + "-fx-background-color: #EFFBFB;");
+        flowVisorSessionText.setEditable(false);
+        dpctlSessionTab.setContent(flowVisorSessionText);
+        mininetSessionText.prefWidth(450);
+        mininetSessionText.prefHeight(620);
+        mininetSessionText.setStyle(
+                "-fx-text-fill: #0A0A2A;"
+                + "-fx-background-color: #EFFBFB;");
+        mininetSessionText.setEditable(false);
+        mininetSessionTab.setContent(mininetSessionText);
+        debugLogText.prefWidth(450);
+        debugLogText.prefHeight(620);
+        debugLogText.setStyle(
+                "-fx-text-fill: #0A0A2A;"
+                + "-fx-background-color: #EFFBFB;");
+        debugLogText.setEditable(false);
+        componentLog.setClosable(false);
+        compononetLogText.prefWidth(350);
+        compononetLogText.prefHeight(620);
+        compononetLogText.setStyle(
+                "-fx-text-fill: #0A0A2A;"
+                + "-fx-background-color: #EFFBFB;");
+        compononetLogText.setEditable(false);
+        componentLog.setContent(compononetLogText);
+        debugLog.setClosable(false);
+        debugLog.setContent(debugLogText);
+        debugLog.setContent(debugLogText);
+    }
+
+    public void getToolBar() {
+        Image pauseImage = new Image("images/Pause.png", 20.0, 20.0, true, true);
+        Button pause = new Button("", new ImageView(pauseImage));
+        Image stopImage = new Image("images/Stop.png", 20.0, 20.0, true, true);
+        Button stop = new Button("", new ImageView(stopImage));
+        stop.setTooltip(new Tooltip("Stop"));
+
+        Image resumeImage = new Image("images/Resume_1.png", 20.0, 20.0, true, true);
+        Button resume = new Button("", new ImageView(resumeImage));
+        resume.setTooltip(new Tooltip("Resume"));
+
+        Image dumpVarImage = new Image("images/dumpvar.png", 20.0, 20.0, true, true);
+        Button dumpVar = new Button("", new ImageView(dumpVarImage));
+        dumpVar.setTooltip(new Tooltip("Dump Var"));
+
+        Image showlogImage = new Image("images/showlog.jpg", 20.0, 20.0, true, true);
+        Button showlog = new Button("", new ImageView(showlogImage));
+        showlog.setTooltip(new Tooltip("Show Log"));
+
+        Image currentCaseImage = new Image("images/currentcase.jpg", 20.0, 20.0, true, true);
+        Button currentcase = new Button("", new ImageView(currentCaseImage));
+        currentcase.setTooltip(new Tooltip("Current Case"));
+
+        Image currentStepImage = new Image("images/currentstep.png", 20.0, 20.0, true, true);
+        Button currentStep = new Button("", new ImageView(currentStepImage));
+        currentStep.setTooltip(new Tooltip("Current Step"));
+
+        Image nextStepImage = new Image("images/nextStep.jpg", 20.0, 20.0, true, true);
+        Button nextStep = new Button("", new ImageView(nextStepImage));
+        nextStep.setTooltip(new Tooltip("Next Step"));
+
+        Image compileImage = new Image("images/compile.jpg", 20.0, 20.0, true, true);
+        Button compile = new Button("", new ImageView(compileImage));
+        compile.setTooltip(new Tooltip("Compile"));
+
+        Image getTestImage = new Image("images/testname.jpg", 20.0, 20.0, true, true);
+        Button getTest = new Button("", new ImageView(getTestImage));
+        getTest.setTooltip(new Tooltip("Get Test"));
+
+        Image interpretImage = new Image("images/interpreter.jpg", 20.0, 20.0, true, true);
+        Button interpret = new Button("", new ImageView(interpretImage));
+        interpret.setTooltip(new Tooltip("Interpret"));
+
+        Image doImage = new Image("images/do.jpg", 20.0, 20.0, true, true);
+        Button doCommand = new Button("", new ImageView(doImage));
+        doCommand.setTooltip(new Tooltip("Do"));
+
+        Image redoImage = new Image("images/redo.png", 20.0, 20.0, true, true);
+        Button redoCommand = new Button("", new ImageView(redoImage));
+        redoCommand.setTooltip(new Tooltip("Re-execute"));
+
+        final Button submit = new Button("Enter");
+        final TextField value = TextFieldBuilder.create().build();
+        value.setMinWidth(480);
+        final ExecutionConsole execConsole = new ExecutionConsole(command, submit, value);
+
+        redoCommand.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("redo", new Vector());
+                requestServer("resume", new Vector());
+            }
+        });
+
+        getTest.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("getTest", new Vector());
+            }
+        });
+
+        doCommand.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                try {
+                    command = "doCommand";
+                    execConsole.start(new Stage());
+                    execConsole.setTitles("do Command");
+                } catch (Exception ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        });
+
+        interpret.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                try {
+                    value.setEditable(true);
+                    command = "interpret";
+                    execConsole.start(new Stage());
+                    execConsole.setTitles("interpret Command");
+                } catch (Exception ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        });
+
+        compile.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                try {
+                    command = "doCompile";
+                    execConsole.start(new Stage());
+                    execConsole.setTitles("compile Command");
+                } catch (Exception ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        });
+
+        resume.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("resume", new Vector());
+            }
+        });
+
+        nextStep.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("nextStep", new Vector());
+            }
+        });
+
+        currentStep.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("currentStep", new Vector());
+            }
+        });
+
+        currentcase.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("currentCase", new Vector());
+            }
+        });
+
+        showlog.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                requestServer("showLog", new Vector());
+            }
+        });
+
+        submit.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                variableName = value.getText();
+                execConsole.closeWindow();
+                Vector params = new Vector();
+                params.add(variableName);
+                requestServer(command, params);
+            }
+        });
+        dumpVar.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                try {
+                    command = "dumpVar";
+                    execConsole.start(new Stage());
+                    execConsole.setTitles("dumpvar Command");
+                } catch (Exception ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+
+
+            }
+        });
+
+        pause.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                XmlRpcClient server;
+                try {
+                    server = new XmlRpcClient("http://localhost:9000");
+                    try {
+                        Object response = server.execute("pauseTest", new Vector());
+                        compononetLogText.appendText("\n Will pause the test's execution, after completion of this step.....\n\n");
+                    } catch (XmlRpcException ex) {
+                        Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                    } catch (IOException ex) {
+                        Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                    }
+                } catch (MalformedURLException ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        });
+
+        stop.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                XmlRpcClient server;
+                try {
+                    server = new XmlRpcClient("http://localhost:9000");
+                    Vector params = new Vector();
+                    try {
+                        server.execute("stop", new Vector());
+                    } catch (XmlRpcException ex) {
+                        Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                    } catch (IOException ex) {
+                        Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                    }
+                } catch (MalformedURLException ex) {
+                    Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        });
+
+        quickLauchBar.getItems().addAll(pause, resume, stop, new Separator(Orientation.VERTICAL), dumpVar, currentcase, currentStep, showlog, nextStep,
+                new Separator(Orientation.VERTICAL), getTest, compile, doCommand, interpret, redoCommand);
+    }
+
+    public void requestServer(String request, Vector params) {
+
+        XmlRpcClient server;
+        try {
+            server = new XmlRpcClient("http://localhost:9000");
+            try {
+                Object response = server.execute(request, params);
+                javafx.scene.control.SingleSelectionModel<Tab> selectionModel = consoleTabPane.getSelectionModel();
+                selectionModel.select(debugLog);
+                debugLogText.appendText(request + " Ouput \n =====================================================================\n");
+                debugLogText.appendText(response.toString());
+                debugLogText.appendText("\n ======================================================================\n");
+            } catch (XmlRpcException ex) {
+                Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+            } catch (IOException ex) {
+                Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        } catch (MalformedURLException ex) {
+            Logger.getLogger(OFATestSummary.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    public Button getVieLogsButton() {
+        return viewLogs;
+    }
+
+    public StackPane getRoot() {
+        return rootStack;
+    }
+
+    public ObservableList<SummaryTable> getData() {
+        return data;
+    }
+
+    public PieChart getChart() {
+        return chart;
+    }
+
+    public TableView getFinalSummaryTable() {
+        return finalSummaryTable;
+    }
+
+    public ObservableList<FinalSummaryTable> getFinalSummaryData() {
+        return summaryData;
+    }
+
+    public ObservableList<PieChart.Data> getpieChartData() {
+        return pieChartData;
+    }
+
+    public javafx.scene.control.TextArea getTextArea(String name) {
+        if (name.equals("log")) {
+            return compononetLogText;
+        } else if (name.equals("pox")) {
+            return poxSessionText;
+        } else if (name.equals("flowvisor")) {
+            return flowVisorSessionText;
+        } else if (name.equals("mininet")) {
+            return mininetSessionText;
+        }
+        return new javafx.scene.control.TextArea();
+    }
+
+    public PieChart.Data getPassData() {
+        return passData;
+    }
+
+    public PieChart.Data getFailData() {
+        return failData;
+    }
+
+    public PieChart.Data getAbortData() {
+        return abortData;
+    }
+
+    public PieChart.Data getNoResultData() {
+        return noResult;
+    }
+
+    ///Step TABLE 
+    public TableView getStepTable() {
+        return stepTable;
+    }
+
+    public ObservableList<StepTable> getStepData() {
+        return stepData;
+    }
+}
