diff --git a/TestON/TAI/src/tai_ofa/OFAParamDeviceName.java b/TestON/TAI/src/tai_ofa/OFAParamDeviceName.java
new file mode 100644
index 0000000..a8146df
--- /dev/null
+++ b/TestON/TAI/src/tai_ofa/OFAParamDeviceName.java
@@ -0,0 +1,336 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package tai_ofa;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @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/>.
+
+ */
+class OFAParamDeviceName {
+
+    String paramFilePath;
+    ArrayList<String> paramDeviceName;
+    ArrayList<String> driverFunctionName;
+    ArrayList<String> paramDeviceType;
+    ArrayList<String> paramDeviceCoordinate;
+    ArrayList<String> paramDeviceHost;
+    ArrayList<String> paramDeviceUser;
+    ArrayList<String> paramDevicePassword;
+    ArrayList<String> paramDeviceTransport;
+    ArrayList<String> paramDevicePort;
+    ArrayList<String> paramDeviceBrowser;
+    ArrayList<String> paramDeviceUrl;
+    HashMap<String, String> deviceInfo = new HashMap();
+    HashMap<String, String> urlInfo = new HashMap();
+    HashMap<String, String> browserInfo = new HashMap();
+    HashMap<String, String> coordinateInfo = new HashMap();
+    HashMap<String, String> hostInfo = new HashMap();
+    HashMap<String, String> userInfo = new HashMap();
+    HashMap<String, String> passwordInfo = new HashMap();
+    HashMap<String, String> portInfo = new HashMap();
+    HashMap<String, String> transportInfo = new HashMap();
+    String cliFunction;
+    HashMap deviceFunctionAndParameter = new HashMap();
+    HashMap<String, String> functionWithParameter;
+    String functionName;
+    String functionParameter;
+    HashMap<String, String> webFunctionHashFirstParameter = new HashMap<String, String>();
+    HashMap<String, String> webFunctionHashSecondParameter = new HashMap<String, String>();
+    ArrayList<String> seleniumFunctionList = new ArrayList<String>();
+    String bdrAction;
+    TAILocale label = new TAILocale(new Locale("en", "EN"));
+    String autoMateHarnessPath = label.OFAHarnessPath;
+    ArrayList<String> bdrFunctionName;
+
+    public OFAParamDeviceName() {
+    }
+
+    public OFAParamDeviceName(String filePath, String driverFilePath) {
+        paramDeviceName = new ArrayList<String>();
+        paramDeviceType = new ArrayList<String>();
+        paramDeviceCoordinate = new ArrayList<String>();
+        paramDeviceHost = new ArrayList<String>();
+        paramDeviceUser = new ArrayList<String>();
+        paramDevicePassword = new ArrayList<String>();
+        paramDeviceTransport = new ArrayList<String>();
+        paramDevicePort = new ArrayList<String>();
+        paramDeviceBrowser = new ArrayList<String>();
+        paramDeviceUrl = new ArrayList<String>();
+        this.paramFilePath = filePath;
+    }
+
+    public void parseParamFile() {
+        try {
+
+            FileInputStream fstream = new FileInputStream(paramFilePath);
+            ArrayList<String> paramFileName = new ArrayList<String>();
+            ArrayList<String> nameBetweenTags = new ArrayList<String>();
+            DataInputStream in = new DataInputStream(fstream);
+            BufferedReader br = new BufferedReader(new InputStreamReader(in));
+            String strLine;
+            while ((strLine = br.readLine()) != null) {
+                paramFileName.add(strLine);
+
+            }
+
+            for (int i = 0; i < paramFileName.size(); i++) {
+                String dName = "";
+                String dType = "";
+                String dCoordinate = "";
+                String dHost = "";
+                String dUser = "";
+                String dPassword = "";
+                String dTransport = "";
+                String dPort = "";
+                String dBrowser = "";
+                String dUrl = "";
+                Pattern devicePatternMatch = Pattern.compile("<COMPONENT>");
+                Matcher deviceNameMatch = devicePatternMatch.matcher(paramFileName.get(i));
+                if (deviceNameMatch.find()) {
+                    int j = i + 1;
+                    while (!paramFileName.get(j).equals("</COMPONENT>")) {
+                        Pattern newTag = Pattern.compile("<(.+)(\\d+)>");
+                        Matcher tagMatch = newTag.matcher(paramFileName.get(j));
+                        if (tagMatch.find()) {
+                            String temp = tagMatch.group(1);
+                            Pattern slashCheck = Pattern.compile("^\\w+");
+                            Matcher slashMatch = slashCheck.matcher(temp);
+                            if (slashMatch.find()) {
+                                paramDeviceName.add(slashMatch.group() + tagMatch.group(2));
+                                dName = slashMatch.group() + tagMatch.group(2);
+                            }
+
+                        }
+
+
+                        Pattern deviceTypePattern = Pattern.compile("<type>\\s*(.+)\\s*</type>");
+                        Matcher deviceTypeMatch = deviceTypePattern.matcher(paramFileName.get(j));
+
+                        while (deviceTypeMatch.find()) {
+                            paramDeviceType.add(deviceTypeMatch.group(1));
+                            dType = deviceTypeMatch.group(1).toLowerCase();
+
+                        }
+                        Pattern deviceCoordinatePattern = Pattern.compile("<coordinate(x,y)>\\s*(.+)\\s*</coordinate(x,y)>");
+                        Matcher deviceCoordinateMatch = deviceCoordinatePattern.matcher(paramFileName.get(j));
+                        while (deviceCoordinateMatch.find()) {
+                            paramDeviceCoordinate.add(deviceCoordinateMatch.group(1));
+                            dCoordinate = deviceCoordinateMatch.group(1);
+
+                        }
+                        Pattern devicehostNamePattern = Pattern.compile("<host>\\s*(.+)\\s*</host>");
+                        Matcher deviceHostMatch = devicehostNamePattern.matcher(paramFileName.get(j));
+
+                        while (deviceHostMatch.find()) {
+                            paramDeviceHost.add(deviceHostMatch.group(1));
+                            dHost = deviceHostMatch.group(1);
+                        }
+                        Pattern deviceUserPattern = Pattern.compile("<user>\\s*(.+)\\s*</user>");
+                        Matcher deviceUserMatch = deviceUserPattern.matcher(paramFileName.get(j));
+                        while (deviceUserMatch.find()) {
+                            paramDeviceUser.add(deviceUserMatch.group(1));
+                            dUser = deviceUserMatch.group(1);
+                        }
+
+                        Pattern devicePasswordPattern = Pattern.compile("<password>\\s*(.+)\\s*</password>");
+                        Matcher devicePasswordMatch = devicePasswordPattern.matcher(paramFileName.get(j));
+                        while (devicePasswordMatch.find()) {
+                            paramDevicePassword.add(devicePasswordMatch.group(1));
+                            dPassword = devicePasswordMatch.group(1);
+                        }
+
+                        Pattern devicePortPattern = Pattern.compile("<test_target>\\s*(.+)\\s*</test_target>");
+                        Matcher devicePortMatch = devicePortPattern.matcher(paramFileName.get(j));
+                        while (devicePortMatch.find()) {
+                            paramDevicePort.add(devicePortMatch.group(1));
+                            dPort = devicePortMatch.group(1);
+                        }
+
+                        deviceInfo.put(dName, dType);
+                        coordinateInfo.put(dName, dCoordinate);
+                        hostInfo.put(dName, dHost);
+                        userInfo.put(dName, dUser);
+                        passwordInfo.put(dName, dPassword);
+                        portInfo.put(dName, dPort);
+                        j++;
+                    }
+                }
+            }
+            //Close the input stream
+            in.close();
+        } catch (Exception e) {//Catch exception if any
+            System.err.println("Error: " + e.getMessage());
+        }
+    }
+
+    public void parseDevice(String devicePath) {
+        try {
+            FileInputStream fstream = new FileInputStream(devicePath);
+            DataInputStream in = new DataInputStream(fstream);
+            BufferedReader br = new BufferedReader(new InputStreamReader(in));
+            String strLine;
+            while ((strLine = br.readLine()) != null) {
+                Pattern cliFunctionPattern = Pattern.compile("sub\\s+(\\w+)");
+                Matcher cliFunctionMatch = cliFunctionPattern.matcher(strLine);
+                Pattern cliFunctionArgumentPattern = Pattern.compile("utilities.parse_args\\(\\[\\s+qw\\((.*)\\)\\s*\\]\\,(.*)");
+                Matcher argumentMatch = cliFunctionArgumentPattern.matcher(strLine);
+                while (cliFunctionMatch.find()) {
+                    cliFunction = cliFunctionMatch.group(1);
+                    Pattern rm = Pattern.compile("_(.*)");
+                    Matcher str2 = rm.matcher(cliFunction);
+                    if (!str2.find()) {
+                    }
+                }
+                while (argumentMatch.find()) {
+                    deviceFunctionAndParameter.put(cliFunction, argumentMatch.group(1));
+                }
+            }
+        } catch (Exception e) {
+        }
+    }
+
+    public void driverFunctionName(String driverPath) {
+        try {
+            functionWithParameter = new HashMap<String, String>();
+            FileInputStream fstream = new FileInputStream(driverPath);
+            driverFunctionName = new ArrayList<String>();
+            DataInputStream in = new DataInputStream(fstream);
+            BufferedReader br = new BufferedReader(new InputStreamReader(in));
+            String strLine;
+            while ((strLine = br.readLine()) != null) {
+                Pattern functionParameterPattern = Pattern.compile("(.*)\\s*=\\s*utilities.parse_args\\(\\s*\\[\\s*(.*)\\s*\\]\\s*\\,(.*)");
+                Matcher functionParaMeterMatch = functionParameterPattern.matcher(strLine);
+                Pattern pattern = Pattern.compile("^\\s*def\\s+(\\w+)");
+                Matcher match = pattern.matcher(strLine);
+                while (match.find()) {
+                    functionName = match.group(1);
+                    Pattern cliFunctionWithOut_ = Pattern.compile("_(.*)");
+                    Matcher cliFunctionWithOut_Match = cliFunctionWithOut_.matcher(functionName);
+                    if (!cliFunctionWithOut_Match.find()) {
+                        driverFunctionName.add(match.group(1));
+                    }
+
+
+                }
+                while (functionParaMeterMatch.find()) {
+                    functionParameter = functionParaMeterMatch.group(2);
+                    functionWithParameter.put(functionName, functionParameter);
+                }
+            }
+        } catch (Exception e) {
+        }
+    }
+
+    public ArrayList<String> getParamDeviceName() {
+        return paramDeviceName;
+    }
+
+    public ArrayList<String> getParamDeviceType() {
+        return paramDeviceType;
+    }
+
+    public ArrayList<String> getDriverFunctionName() {
+        return driverFunctionName;
+    }
+
+    public ArrayList<String> getCoordinateName() {
+        return paramDeviceCoordinate;
+    }
+
+    public ArrayList<String> getBrowserName() {
+        return paramDeviceBrowser;
+    }
+
+    public ArrayList<String> getHostName() {
+        return paramDeviceHost;
+    }
+
+    public ArrayList<String> getUserName() {
+        return paramDeviceUser;
+    }
+
+    public ArrayList<String> getPassword() {
+        return paramDevicePassword;
+    }
+
+    public ArrayList<String> getTransport() {
+        return paramDeviceTransport;
+    }
+
+    public ArrayList<String> getPort() {
+        return paramDevicePort;
+    }
+
+    public ArrayList<String> getUrl() {
+        return paramDeviceUrl;
+    }
+
+    public HashMap<String, String> getdeviceNameAndType() {
+        return deviceInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndBrowser() {
+        return browserInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndUrl() {
+        return urlInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndCoordinate() {
+        return coordinateInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndHost() {
+        return hostInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndUser() {
+        return userInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndPassword() {
+        return passwordInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndTransport() {
+        return transportInfo;
+    }
+
+    public HashMap<String, String> getdeviceNameAndPort() {
+        return portInfo;
+    }
+
+    public HashMap<String, String> getDeviceFunctionAndArgument() {
+        return deviceFunctionAndParameter;
+    }
+}
