diff --git a/TestON/core/testparser.py b/TestON/core/testparser.py
new file mode 100644
index 0000000..f158259
--- /dev/null
+++ b/TestON/core/testparser.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+'''
+Created on 26-Dec-2012
+
+@author: Anil Kumar (anilkumar.s@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/>.		
+
+
+'''
+import re
+import sys
+class TestParser:
+    def __init__(self,testFile):
+        try :
+            testFileHandler = open(testFile, 'r')
+        except IOError: 
+            print "No such file "+testFile
+            sys.exit(0)
+ 
+        testFileList = testFileHandler.readlines()
+        self.testscript = testFileList              
+        self.caseCode = {}
+        self.caseBlock = ''
+        self.statementsList = []
+        index = 0 
+        self.statementsList = []
+        #initialSpaces = len(line) -len(line.lstrip())
+        while index < len(testFileList):
+            testFileList[index] = re.sub("^\s{8}|^\s{4}", "", testFileList[index])
+            # Skip multiline comments 
+            if re.match('^(\'\'\')|^(\"\"\")',testFileList[index],0) :
+                index = index + 1
+                try :
+                    while not re.match('^\s*(\'\'\')|^\s*(\"\"\")',testFileList[index],0) :
+                        index = index + 1
+                except IndexError,e:
+                    print ''
+                    
+
+            # skip empty lines and single line comments 
+            elif not re.match('#|^\s*$',testFileList[index],0):
+                self.statementsList.append(testFileList[index])
+            index = index + 1
+    
+    def case_code(self):
+        index = 0 
+        statementsList = self.statementsList       
+        while index < len(statementsList):
+            #print statementsList[index]
+            m= re.match('def\s+CASE(\d+)',statementsList[index],0)
+            self.caseBlock = []
+            if m:
+                #print m.group(1)
+                index = index + 1
+                try :
+                    while not re.match('\s*def\s+CASE(\d+)',statementsList[index],0) :
+                        self.caseBlock.append(statementsList[index])
+                        if index < len(statementsList)-1:
+                            index = index + 1
+                        else :
+                            break
+                    index = index - 1
+                except IndexError,e:
+                    #print 'IndexError'
+                    print ''
+    
+                self.caseCode [str(m.group(1))] = self.caseBlock
+                #print "Case CODE "+self.caseCode [str(m.group(1))]
+            index = index + 1
+        
+        return self.caseCode 
+    
+    def step_code(self,caseStatements):
+        index = 0
+        step = 0 
+        stepCode = {}  
+        step_flag = False    
+        while index < len(caseStatements):
+            m= re.match('main\.step',caseStatements[index],0)
+            stepBlock = ''
+            if m:
+                step_flag = True
+                if step == 0 :
+                    i = 0
+                    block = ''
+                    while i <= index :
+                        block += caseStatements[i]
+                        i = i + 1
+                    stepCode[step] = block   
+                    step = step + 1
+                stepBlock= stepBlock + caseStatements[index]
+                index = index + 1
+                try :
+                    while not re.match('main\.step',caseStatements[index],0) :
+                        stepBlock= stepBlock + caseStatements[index]
+                        if index < len(caseStatements)-1:
+                            index = index + 1
+                        else :
+                            break
+                    index = index - 1
+                except IndexError,e:
+                    #print 'IndexError'
+                    print ''
+                stepCode[step] = stepBlock
+                step = step + 1
+            index = index + 1
+        # If there is no step defined !!
+        if not step_flag :
+            stepCode[step] = "".join(caseStatements)
+        return stepCode
+    
+    def getStepCode(self):
+        case_step_code = {}
+        case_block = self.case_code()
+        
+        for case in case_block :
+            case_step_code[case] = {}
+            step_block = self.step_code(case_block[case])
+            for step in step_block :
+                case_step_code[case][step] = step_block[step]
+        return case_step_code
