diff --git a/src/com/mirantis/mk/python.groovy b/src/com/mirantis/mk/python.groovy
index c832cb3..b8ea694 100644
--- a/src/com/mirantis/mk/python.groovy
+++ b/src/com/mirantis/mk/python.groovy
@@ -55,11 +55,132 @@
  * @param format     Format of the table
  */
 def parseTextTable(tableStr, type = 'item', format = 'rest') {
-    parserScript = "${env.WORKSPACE}/scripts/parse_text_table.py"
+    parserFile = "${env.WORKSPACE}/textTableParser.py"
+    parserScript = """import json
+import argparse
+from docutils.parsers.rst import tableparser
+from docutils import statemachine
+
+def parse_item_table(raw_data):
+    i = 1
+    pretty_raw_data = []
+    for datum in raw_data:
+        if datum != "":
+            if datum[3] != ' ' and i > 4:
+                pretty_raw_data.append(raw_data[0])
+            if i == 3:
+                pretty_raw_data.append(datum.replace('-', '='))
+            else:
+                pretty_raw_data.append(datum)
+            i += 1
+    parser = tableparser.GridTableParser()
+    block = statemachine.StringList(pretty_raw_data)
+    docutils_data = parser.parse(block)
+    final_data = {}
+    for line in docutils_data[2]:
+        key = ' '.join(line[0][3]).strip()
+        value = ' '.join(line[1][3]).strip()
+        if key != "":
+            try:
+                value = json.loads(value)
+            except:
+                pass
+            final_data[key] = value
+        i+=1
+    return final_data
+
+def parse_list_table(raw_data):
+    i = 1
+    pretty_raw_data = []
+    for datum in raw_data:
+        if datum != "":
+            if datum[3] != ' ' and i > 4:
+                pretty_raw_data.append(raw_data[0])
+            if i == 3:
+                pretty_raw_data.append(datum.replace('-', '='))
+            else:
+                pretty_raw_data.append(datum)
+            i += 1
+    parser = tableparser.GridTableParser()
+    block = statemachine.StringList(pretty_raw_data)
+    docutils_data = parser.parse(block)
+    final_data = []
+    keys = []
+    for line in docutils_data[1]:
+        for item in line:
+             keys.append(' '.join(item[3]).strip())
+    for line in docutils_data[2]:
+        final_line = {}
+        key = ' '.join(line[0][3]).strip()
+        value = ' '.join(line[1][3]).strip()
+        if key != "":
+            try:
+                value = json.loads(value)
+            except:
+                pass
+            final_data[key] = value
+        i+=1
+    return final_data
+
+def parse_list_table(raw_data):
+    i = 1
+    pretty_raw_data = []
+    for datum in raw_data:
+        if datum != "":
+            if datum[3] != ' ' and i > 4:
+                pretty_raw_data.append(raw_data[0])
+            if i == 3:
+                pretty_raw_data.append(datum.replace('-', '='))
+            else:
+                pretty_raw_data.append(datum)
+            i += 1
+    parser = tableparser.GridTableParser()
+    block = statemachine.StringList(pretty_raw_data)
+    docutils_data = parser.parse(block)
+    final_data = []
+    keys = []
+    for line in docutils_data[1]:
+        for item in line:
+             keys.append(' '.join(item[3]).strip())
+    for line in docutils_data[2]:
+        final_line = {}
+        i = 0
+        for item in line:
+            value = ' '.join(item[3]).strip()
+            try:
+                value = json.loads(value)
+            except:
+                pass
+            final_line[keys[i]] = value
+            i += 1
+        final_data.append(final_line)
+    return final_data
+
+def read_table_file(file):
+    table_file = open(file, 'r')
+    raw_data = table_file.read().split('\n')
+    table_file.close()
+    return raw_data
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-f','--file', help='File with table data', required=True)
+parser.add_argument('-t','--type', help='Type of table (list/item)', required=True)
+args = vars(parser.parse_args())
+
+raw_data = read_table_file(args['file'])
+
+if args['type'] == 'list':
+  final_data = parse_list_table(raw_data)
+else:
+  final_data = parse_item_table(raw_data)
+
+print json.dumps(final_data)
+"""
+    writeFile file: parserFile, text: parserScript
     tableFile = "${env.WORKSPACE}/prettytable.txt"
     writeFile file: tableFile, text: tableStr
     rawData = sh (
-        script: "python ${parserScript} --file '${tableFile}' --type ${type}",
+        script: "python ${parserFile} --file '${tableFile}' --type ${type}",
         returnStdout: true
     ).trim()
     data = loadJson(rawData)
