diff --git a/TestON/TAI/src/tai_ofa/AddParams.java b/TestON/TAI/src/tai_ofa/AddParams.java
new file mode 100644
index 0000000..8d35046
--- /dev/null
+++ b/TestON/TAI/src/tai_ofa/AddParams.java
@@ -0,0 +1,435 @@
+/*
+
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package tai_ofa;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Observable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.event.Event;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.Orientation;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.SplitPane;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableColumn.CellEditEvent;
+import javafx.scene.control.TableView;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TextFieldBuilder;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeView;
+import javafx.scene.control.cell.PropertyValueFactory;
+import javafx.scene.control.cell.TextFieldTableCell;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+import javafx.scene.text.Font;
+import javafx.scene.text.Text;
+import javafx.stage.Stage;
+
+/**
+ *
+ * @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 AddParams {
+
+    TAI_OFA referenceOFA;
+    boolean splitFlag = false;
+    Map<String, Object> paramsHash;
+    TreeView<String> paramsTreeView;
+    TextField Value, tableAttrib, tableValue;
+    TableView<ParamsAttribute> attributeTable;
+    ObservableList<ParamsAttribute> data;
+    Button save, Cancel, edit, add, saveParams;
+    HBox buttonBox, tableViewBox, baseLeftPane;
+    VBox box, buttonTableVBox;
+    GridPane buttonBoxPane, baseRightPane;
+    TreeItem<String> params;
+    Pane tableViewPane;
+    Text Heading;
+    String tabValue, tabs;
+    OFAWizard wizard;
+    OFAFileOperations fileOperations;
+    Tab baseTab;
+    Button delete;
+
+    public void setOFA(TAI_OFA ofa) {
+        this.referenceOFA = ofa;
+    }
+
+    public void getNewParams() {
+        baseTab = new Tab();
+        paramsHash = new HashMap<String, Object>();
+        fileOperations = new OFAFileOperations();
+        final SplitPane basePane = new SplitPane();
+        basePane.setOrientation(Orientation.HORIZONTAL);
+        baseLeftPane = new HBox(30);
+        params = new TreeItem<String>();
+        params.setValue("params");
+        TreeItem<String> log_dir = new TreeItem<String>();
+        log_dir.setValue("log_dir");
+        ImageView logIView = new ImageView(new Image("images/parameter.jpg", 20, 20, true, true));
+        logIView.setId("/home/paxterra/");
+        log_dir.setGraphic(logIView);
+        TreeItem<String> mail = new TreeItem<String>();
+        mail.setValue("mail");
+        ImageView mailIView = new ImageView(new Image("images/parameter.jpg", 20, 20, true, true));
+        mailIView.setId("raghavkashyap@paxterrasolution.com");
+        mail.setGraphic(mailIView);
+        TreeItem<String> testcases = new TreeItem<String>();
+        testcases.setValue("testcases");
+        ImageView testIView = new ImageView(new Image("images/parameter.jpg", 20, 20, true, true));
+        testIView.setId("1");
+        testcases.setGraphic(testIView);
+        data = FXCollections.observableArrayList();
+        params.getChildren().addAll(testcases, mail, log_dir);
+        paramsTreeView = new TreeView<String>(params);
+        saveParams = new Button("Save");
+        delete = new Button("Delete");
+        baseLeftPane.getChildren().addAll(paramsTreeView, saveParams, delete);
+        baseRightPane = new GridPane();
+        Value = TextFieldBuilder.create().build();
+        delete.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                removeParamsValue(paramsTreeView.getSelectionModel().getSelectedItem());
+            }
+        });
+
+        saveParams.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                tabs = getParams(params);
+                referenceOFA.paramsFileContent = tabs;
+                wizard = new OFAWizard(referenceOFA.projectExplorerTree, 2, referenceOFA.projectExplorerTree.getChildren(), referenceOFA.projectExplorerTreeView);
+                wizard.setOFA(referenceOFA);
+                try {
+                    wizard.start(new Stage());
+                } catch (Exception ex) {
+                    Logger.getLogger(AddParams.class.getName()).log(Level.SEVERE, null, ex);
+                }
+
+            }
+        });
+        save = new Button("Save");
+        Cancel = new Button("Cancel");
+        edit = new Button("Edit");
+        attributeTable = new TableView<ParamsAttribute>();
+        attributeTable.setEditable(true);
+        TableColumn attribColumn = new TableColumn("Attribute");
+        attribColumn.setCellValueFactory(new PropertyValueFactory<ParamsAttribute, String>("Attribute"));
+        TableColumn valueColumn = new TableColumn("Value");
+        valueColumn.setCellValueFactory(new PropertyValueFactory<ParamsAttribute, String>("Values"));
+        attributeTable.setItems(data);
+        attributeTable.getColumns().addAll(attribColumn, valueColumn);
+        baseRightPane.setPadding(new Insets(30, 0, 10, 30));
+        baseRightPane.prefHeight(referenceOFA.scene.heightProperty().get());
+        baseRightPane.setVgap(9);
+        baseRightPane.add(new Label("Value :"), 4, 4);
+        baseRightPane.add(Value, 5, 4);
+        box = new VBox();
+        buttonBox = new HBox();
+        buttonBoxPane = new GridPane();
+        buttonBoxPane.setPadding(new Insets(30, 0, 10, 30));
+        buttonBoxPane.setHgap(3);
+        buttonBoxPane.add(save, 2, 7);
+        buttonBoxPane.add(Cancel, 4, 7);
+        buttonBoxPane.add(edit, 6, 7);
+        buttonBox.getChildren().addAll(buttonBoxPane);
+        tableAttrib = TextFieldBuilder.create().build();
+        tableValue = TextFieldBuilder.create().build();
+        add = new Button("Add");
+        tableViewPane = new Pane();
+        buttonTableVBox = new VBox();
+        tableViewBox = new HBox();
+        tableViewBox.getChildren().addAll(tableAttrib, tableValue, add);
+        buttonTableVBox.getChildren().addAll(attributeTable);
+        box.getChildren().addAll(baseRightPane, buttonTableVBox, buttonBoxPane);
+
+        attributeTable.setEditable(true);
+        attribColumn.setCellFactory(TextFieldTableCell.forTableColumn());
+        attribColumn.setOnEditCommit(new EventHandler<CellEditEvent<ParamsAttribute, String>>() {
+            @Override
+            public void handle(CellEditEvent<ParamsAttribute, String> t) {
+
+                for (int i = 0; i < paramsTreeView.getSelectionModel().getSelectedItem().getChildren().size(); i++) {
+
+                    if (paramsTreeView.getSelectionModel().getSelectedItem().getChildren().get(i).getValue().equals(t.getOldValue())) {
+                        paramsTreeView.getSelectionModel().getSelectedItem().getChildren().get(i).setValue(t.getNewValue());
+                    }
+                }
+                ((ParamsAttribute) t.getTableView().getItems().get(
+                        t.getTablePosition().getRow())).setAttribute(t.getNewValue());
+
+            }
+        });
+
+        valueColumn.setCellFactory(TextFieldTableCell.forTableColumn());
+        valueColumn.setOnEditCommit(new EventHandler<CellEditEvent<ParamsAttribute, String>>() {
+            @Override
+            public void handle(CellEditEvent<ParamsAttribute, String> t) {
+                for (int i = 0; i < paramsTreeView.getSelectionModel().getSelectedItem().getChildren().size(); i++) {
+                    if (paramsTreeView.getSelectionModel().getSelectedItem().getChildren().get(i).getValue().equals(t.getOldValue())) {
+                        paramsTreeView.getSelectionModel().getSelectedItem().getChildren().get(i).getGraphic().setId(t.getNewValue());
+                    }
+                }
+                ((ParamsAttribute) t.getTableView().getItems().get(
+                        t.getTablePosition().getRow())).setValues(t.getNewValue());
+            }
+        });
+
+        Value.setOnKeyReleased(new EventHandler<KeyEvent>() {
+            @Override
+            public void handle(KeyEvent t) {
+                if (Value.getText().isEmpty()) {
+                    edit.setDisable(false);
+                } else {
+                    edit.setDisable(true);
+                }
+            }
+        });
+
+        Cancel.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                basePane.getItems().removeAll(box);
+                splitFlag = false;
+                baseRightPane.getChildren().remove(Heading);
+                edit.setDisable(false);
+            }
+        });
+
+        save.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+                String selected = paramsTreeView.getSelectionModel().getSelectedItem().getValue();
+                TreeItem<String> selectedTreeItem = paramsTreeView.getSelectionModel().getSelectedItem();
+                String attribVal = Value.getText();
+                basePane.getItems().removeAll(box);
+                splitFlag = false;
+                Map<String, Object> prevParent = new HashMap<String, Object>();
+                ArrayList<String> names = new ArrayList<String>();
+                if (!edit.isDisabled()) {
+                    for (int i = 0; i < attributeTable.getItems().size(); i++) {
+                        ParamsAttribute table = attributeTable.getItems().get(i);
+                        if (selectedTreeItem.getChildren().size() == 0) {
+                            TreeItem<String> childNode = new TreeItem<String>();
+                            childNode.setValue(table.getAttribute());
+                            selectedTreeItem.getChildren().add(childNode);
+                            selectedTreeItem.setExpanded(true);
+                            Image chidlImage = new Image("images/parameter.jpg", 20, 20, true, true);
+                            ImageView childImageView = new ImageView();
+                            childImageView.setImage(chidlImage);
+                            childImageView.setId(table.getValues());
+                            childNode.setGraphic(childImageView);
+                        } else if (selectedTreeItem.getChildren().size() > 0) {
+                            names.clear();
+                            for (int index = 0; index < selectedTreeItem.getChildren().size(); index++) {
+                                names.add(selectedTreeItem.getChildren().get(index).getValue());
+                            }
+                            if (!names.contains(table.getAttribute())) {
+                                TreeItem<String> childNode = new TreeItem<String>();
+                                childNode.setValue(table.getAttribute());
+                                selectedTreeItem.getChildren().addAll(childNode);
+                                selectedTreeItem.setExpanded(true);
+                                Image chidlImage = new Image("images/parameter.jpg", 20, 20, true, true);
+                                ImageView childImageView = new ImageView();
+                                childImageView.setImage(chidlImage);
+                                childImageView.setId(table.getValues());
+                                childNode.setGraphic(childImageView);
+                            }
+                        }
+                    }
+                } else {
+                    TreeItem<String> selectTreeItem = paramsTreeView.getSelectionModel().getSelectedItem();
+                    if (!Value.getText().isEmpty()) {
+                        paramsTreeView.getSelectionModel().getSelectedItem().getGraphic().setId(Value.getText());
+                    }
+                }
+                baseRightPane.getChildren().remove(Heading);
+                buttonTableVBox.getChildren().removeAll(tableViewBox);
+                Value.clear();
+            }
+        });
+
+        add.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+
+                if (tableAttrib.getText().isEmpty() && tableValue.getText().isEmpty()) {
+                } else {
+                    data.add(new ParamsAttribute(tableAttrib.getText(), tableValue.getText()));
+                    tableAttrib.clear();
+                    tableValue.clear();
+                }
+            }
+        });
+
+
+        edit.setOnAction(new EventHandler<ActionEvent>() {
+            @Override
+            public void handle(ActionEvent t) {
+
+                buttonTableVBox.getChildren().addAll(tableViewBox);
+
+                Value.setEditable(false);
+
+            }
+        });
+
+        basePane.getItems().addAll(baseLeftPane);
+        paramsTreeView.setOnMouseClicked(new EventHandler<MouseEvent>() {
+            @Override
+            public void handle(MouseEvent args0) {
+                String selected = paramsTreeView.getSelectionModel().getSelectedItem().getValue();
+                TreeItem<String> selectItem = paramsTreeView.getSelectionModel().getSelectedItem();
+                if (args0.getClickCount() == 2 & !splitFlag) {
+                    Value.setEditable(true);
+                    Heading = new Text(selected);
+                    Heading.setFont(Font.font("Arial", 20));
+                    Heading.setFill(Color.BLUE);
+                    baseRightPane.add(Heading, 6, 1);
+
+                    if (selectItem.isLeaf()) {
+                        Value.setDisable(false);
+                        if (!selectItem.getGraphic().getId().equals("")) {
+                            basePane.getItems().addAll(box);
+                            splitFlag = true;
+                            Value.setText(selectItem.getGraphic().getId());
+                            edit.setDisable(true);
+                            data.clear();
+                        } else {
+                            basePane.getItems().addAll(box);
+                            splitFlag = true;
+                            Value.clear();
+                            edit.setDisable(false);
+                            data.clear();
+                        }
+                    } else if (!selectItem.isLeaf()) {
+                        Value.clear();
+                        Value.setDisable(true);
+                        basePane.getItems().addAll(box);
+                        splitFlag = true;
+                        data.clear();
+                        for (int i = 0; i < selectItem.getChildren().size(); i++) {
+
+                            data.add(new ParamsAttribute(selectItem.getChildren().get(i).getValue(), selectItem.getChildren().get(i).getGraphic().getId()));
+                        }
+                    }
+
+                }
+            }
+        });
+        basePane.prefWidthProperty().bind(referenceOFA.scene.widthProperty().subtract(300));
+        basePane.prefHeightProperty().bind(referenceOFA.scene.heightProperty().subtract(120));
+        baseTab.setContent(basePane);
+        baseTab.setText("Unnamed.params");
+        referenceOFA.editorTabPane.getTabs().addAll(baseTab);
+    }
+
+    public String getParams(TreeItem<String> treeNode) {
+        tabValue = "";
+        tabValue = tabValue + "<" + treeNode.getValue() + ">\n";
+        if (!treeNode.isLeaf()) {
+            for (int i = 0; i < treeNode.getChildren().size(); i++) {
+                if (treeNode.getChildren().get(i).isLeaf()) {
+                    tabValue = tabValue + "\n<" + treeNode.getChildren().get(i).getValue() + ">" + treeNode.getChildren().get(i).getGraphic().getId()
+                            + "</" + treeNode.getChildren().get(i).getValue() + ">\n";
+                } else if (!treeNode.getChildren().get(i).isLeaf()) {
+                    int index = 0;
+                    tabValue = tabValue + "\n<" + treeNode.getChildren().get(i).getValue() + ">\n";
+                    while (index < treeNode.getChildren().get(i).getChildren().size()) {
+                        tabValue = tabValue + getParams(treeNode.getChildren().get(i).getChildren().get(index));
+                        index++;
+                    }
+                    tabValue = tabValue + "\n</" + treeNode.getChildren().get(i).getValue() + ">\n";
+                }
+            }
+        } else if (treeNode.isLeaf()) {
+            tabValue = tabValue + treeNode.getGraphic().getId();
+        }
+        tabValue = tabValue + "\n</" + treeNode.getValue() + ">";
+        return tabValue;
+    }
+
+    public void removeParamsValue(TreeItem treeItem) {
+        for (int i = 0; i < paramsTreeView.getRoot().getChildren().size(); i++) {
+            if (paramsTreeView.getRoot().getChildren().get(i).isLeaf()) {
+                if (paramsTreeView.getRoot().getChildren().get(i).getValue().equals(treeItem.getValue())) {
+                    paramsTreeView.getRoot().getChildren().remove(paramsTreeView.getRoot().getChildren().get(i));
+                }
+            } else if (!paramsTreeView.getRoot().getChildren().get(i).isLeaf()) {
+                if (paramsTreeView.getRoot().getChildren().get(i).getValue().equals(treeItem.getValue())) {
+                    paramsTreeView.getRoot().getChildren().remove(paramsTreeView.getRoot().getChildren().get(i));
+                } else {
+                    for (int index = 0; index < paramsTreeView.getRoot().getChildren().get(i).getChildren().size(); index++) {
+                        if (paramsTreeView.getRoot().getChildren().get(i).getChildren().get(index).getValue().equals(treeItem.getValue())) {
+                            paramsTreeView.getRoot().getChildren().get(i).getChildren().remove(paramsTreeView.getRoot().getChildren().get(i).getChildren().get(index));
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+
+    public static class ParamsAttribute {
+        private final SimpleStringProperty Attributes;
+        private final SimpleStringProperty Values;
+
+        private ParamsAttribute(String attrib, String val) {
+            this.Attributes = new SimpleStringProperty(attrib);
+            this.Values = new SimpleStringProperty(val);
+        }
+
+        public String getAttribute() {
+            return Attributes.get();
+        }
+
+        public void setAttribute(String attrib) {
+            Attributes.set(attrib);
+        }
+
+        public String getValues() {
+            return Values.get();
+        }
+
+        public void setValues(String val) {
+            Values.set(val);
+        }
+    }
+}
