diff --git a/src/grade-openmp.sh b/src/grade-openmp.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9fb5275ba6098fbaea39261295cbc54c5e5229b6
--- /dev/null
+++ b/src/grade-openmp.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+    echo "Usage: ./autograde.sh 13518056 13518104"
+    exit
+fi
+
+rm -rf $2/*
+
+rm -rf ./tmp
+mkdir ./tmp
+mkdir ./tmp/testcases
+
+if ! python3 ./python_script/get_testcase.py $1; then
+    exit
+fi
+
+testcases_names=()
+
+readarray -d '' testcases_names < <(find ./tmp/testcases -type f -print0)
+
+for tc in ${testcases_names[@]}; do
+    ./openmp-script.sh $tc
+done
+
+if ! python3 ./python_script/check_openmp.py $1 $2; then
+    exit
+fi
+
+zip -r $1.zip .
+
+if ! python3 ./python_script/submit_file.py $1 $1.zip; then
+    exit
+fi
+echo "Thank you for using our service!"
diff --git a/src/grade-openmpi.sh b/src/grade-openmpi.sh
new file mode 100644
index 0000000000000000000000000000000000000000..010c5c4d3424e620ba40c0805d4da15bf3733270
--- /dev/null
+++ b/src/grade-openmpi.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+    echo "Usage: ./autograde.sh 13518056 13518104"
+    exit
+fi
+
+rm -rf $2/*
+
+rm -rf ./tmp
+mkdir ./tmp
+mkdir ./tmp/testcases
+
+if ! python3 ./python_script/get_testcase.py $1; then
+    exit
+fi
+
+testcases_names=()
+
+readarray -d '' testcases_names < <(find ./tmp/testcases -type f -print0)
+
+for tc in ${testcases_names[@]}; do
+    ./openmpi-script.sh $tc
+done
+
+if ! python3 ./python_script/check_openmpi.py $1 $2; then
+    exit
+fi
+
+zip -r $1.zip .
+
+if ! python3 ./python_script/submit_file.py $1 $1.zip then
+    exit
+fi
+echo "Thank you for using our service!"
diff --git a/src/python_script/check_openmp.py b/src/python_script/check_openmp.py
new file mode 100644
index 0000000000000000000000000000000000000000..7021a046a7a5b88b5a61c2ae05ea4e58d9951396
--- /dev/null
+++ b/src/python_script/check_openmp.py
@@ -0,0 +1,43 @@
+import os
+import sys
+import requests
+
+from os import walk
+
+nim = sys.argv[1]
+openmp_dir = sys.argv[2]
+
+url = 'http://100.25.13.77/api/v1/check'
+
+body = {
+    'nim': nim,
+    'is_openmp': True,
+    'answers': [],
+}
+
+_, _, openmp_files = next(walk(openmp_dir))
+
+for file in openmp_files:
+    total_node = file.split('_')[0]
+    testcase_id = file.split('_')[1]
+    f = open(os.path.join(openmp_dir, file), 'r')
+    content = f.read()
+    f.close()
+    answer = {
+        'total_node': int(total_node),
+        'testcase_id': int(testcase_id),
+        'answer': content,
+    }
+    body['answers'].append(answer)
+
+response = requests.post(url = url, json = body)
+
+print('OpenMP Status Code:', response.status_code)
+if response.status_code != 200:
+    sys.exit(-1)
+else:
+    data = response.json()
+    results = data['results']
+    for result in results:
+        print('Total Node:', result['total_node'])
+        print('Correct:', result['is_accepted'])
diff --git a/src/python_script/check_openmpi.py b/src/python_script/check_openmpi.py
new file mode 100644
index 0000000000000000000000000000000000000000..d484f396f8d12ff7853b352f8d092b1e5fa64f1d
--- /dev/null
+++ b/src/python_script/check_openmpi.py
@@ -0,0 +1,43 @@
+import os
+import sys
+import requests
+
+from os import walk
+
+nim = sys.argv[1]
+openmpi_dir = sys.argv[2]
+
+url = 'http://100.25.13.77/api/v1/check'
+
+body = {
+    'nim': nim,
+    'is_openmp': False,
+    'answers': [],
+}
+
+_, _, openmpi_files = next(walk(openmpi_dir))
+
+for file in openmpi_files:
+    total_node = file.split('_')[0]
+    testcase_id = file.split('_')[1]
+    f = open(os.path.join(openmpi_dir, file), 'r')
+    content = f.read()
+    f.close()
+    answer = {
+        'total_node': int(total_node),
+        'testcase_id': int(testcase_id),
+        'answer': content,
+    }
+    body['answers'].append(answer)
+
+response = requests.post(url = url, json = body)
+
+print('OpenMPI Status Code:', response.status_code)
+if response.status_code != 200:
+    sys.exit(-1)
+else:
+    data = response.json()
+    results = data['results']
+    for result in results:
+        print('Total Node:', result['total_node'])
+        print('Correct:', result['is_accepted'])
diff --git a/src/python_script/get_testcase.py b/src/python_script/get_testcase.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec6c763b9e1daf418a1b765d46857dfdc4c9b65b
--- /dev/null
+++ b/src/python_script/get_testcase.py
@@ -0,0 +1,24 @@
+import os
+import sys
+import requests
+
+nim = sys.argv[1]
+
+url = 'http://100.25.13.77/api/v1/testcase'
+
+params = {
+    'nim': nim,
+}
+
+response = requests.get(url = url, params = params)
+
+data = response.json()
+
+for tc in data['set']:
+    total_node = tc['total_node']
+    tc_id = tc['testcase_id']
+    content = tc['question']
+    filename = str(total_node) + '_' + str(tc_id)
+    f = open(os.path.join('tmp', 'testcases', filename), 'w')
+    f.write(content)
+    f.close()
diff --git a/src/python_script/submit_file.py b/src/python_script/submit_file.py
new file mode 100644
index 0000000000000000000000000000000000000000..e7642114aec2429e3fa975c6d1b1873fa83f709f
--- /dev/null
+++ b/src/python_script/submit_file.py
@@ -0,0 +1,16 @@
+import os
+import sys
+import requests
+
+from os import walk
+
+nim = sys.argv[1]
+filename = sys.argv[2]
+
+url = 'http://100.25.13.77/api/v1/submit?nim={nim}'.format(nim = nim)
+files = {
+    'file': open(filename, 'rb')
+}
+
+response = requests.post(url = url, files = files)
+print('Submission Status Code: {statusCode}'.format(statusCode = response.status_code))