diff --git a/config.py b/config.py
index 26e9800..57888c3 100644
--- a/config.py
+++ b/config.py
@@ -3,4 +3,5 @@
 WORK_SHEET = "Worksheet"
 COL_COUNT = 2
 ROW_COUNT = 10
-DEFAULT_FILE_PATH="test.json"
+DEFAULT_FILE_PATH = "test.json"
+OUTPUT_FILE = "output.json"
diff --git a/make_report.py b/make_report.py
index 0dd363d..eb99ae8 100644
--- a/make_report.py
+++ b/make_report.py
@@ -2,9 +2,9 @@
 import argparse
 import json
 
-from config import DEFAULT_FILE_PATH, PASSWORD, EMAIL, \
-    WORK_SHEET, DOCUMENT_ID, ROW_COUNT
-from gspread.exceptions import WorksheetNotFound
+from config import DEFAULT_FILE_PATH, \
+    WORK_SHEET, DOCUMENT_ID, ROW_COUNT, OUTPUT_FILE
+from storage_api import DiskStorage, GoogleDocsStorage, get_work_sheet, append_row
 
 
 def load_data(file_name):
@@ -14,39 +14,6 @@
 
 
 #getting worksheet from sheet or create it with specified column names.
-def get_work_sheet(sheet, name, column_names):
-    try:
-        work_sheet = sheet.worksheet(name)
-    except WorksheetNotFound:
-        work_sheet = sheet.add_worksheet(title=name, rows=ROW_COUNT,
-                                         cols=max(40, len(column_names)))
-
-        for i in range(1, len(column_names) + 1):
-            work_sheet.update_cell(1, i, column_names[i - 1])
-
-    return work_sheet
-
-
-def get_row_number(work_sheet):
-    num = 2
-
-    while num < work_sheet.row_count and work_sheet.cell(num, 1).value != "":
-        num += 1
-
-    if num == work_sheet.row_count:
-        work_sheet.append_row(["" for x in range(work_sheet.col_count)])
-
-    return num
-
-
-def append_row(work_sheet, row):
-    row_number = get_row_number(work_sheet)
-
-    i = 1
-    for k in row.keys():
-        work_sheet.update_cell(row_number, i, row[k])
-        i += 1
-
 
 def make_report(email, password, data):
     gc = gspread.login(email, password)
@@ -56,9 +23,15 @@
     append_row(work_sheet, data)
 
 
-def main(file_name, email, password):
+def main(file_name, email, password, mode):
     data = load_data(file_name)
-    make_report(email, password, data)
+
+    if mode == 'local':
+        storage = DiskStorage(OUTPUT_FILE)
+    else:
+        storage = GoogleDocsStorage(DOCUMENT_ID, WORK_SHEET, email, password)
+
+    storage.store(data)
 
 
 if __name__ == '__main__':
@@ -70,8 +43,7 @@
     parser.add_argument('-p', '--password', help='user password',
                         default="1234")
     parser.add_argument('-m', '--mode', help='mode type local or global',
-                        default=DEFAULT_FILE_PATH)
+                        default='local')
     results = parser.parse_args()
-    print results
-    # main(file_name, email, password)
+    main(results.name, results.email, results.password, results.mode)
 
diff --git a/storage_api.py b/storage_api.py
index 2b571dd..c0a9cb1 100644
--- a/storage_api.py
+++ b/storage_api.py
@@ -1,6 +1,41 @@
-import gspread
-from config import EMAIL, PASSWORD, DOCUMENT_ID, WORK_SHEET
-from make_report import get_work_sheet, append_row
+from gspread import WorksheetNotFound, login
+import json
+import os
+from config import ROW_COUNT
+
+
+def get_work_sheet(sheet, name, column_names):
+    try:
+        work_sheet = sheet.worksheet(name)
+    except WorksheetNotFound:
+        work_sheet = sheet.add_worksheet(title=name, rows=ROW_COUNT,
+                                         cols=max(40, len(column_names)))
+
+        for i in range(1, len(column_names) + 1):
+            work_sheet.update_cell(1, i, column_names[i - 1])
+
+    return work_sheet
+
+
+def get_row_number(work_sheet):
+    num = 2
+
+    while num < work_sheet.row_count and work_sheet.cell(num, 1).value != "":
+        num += 1
+
+    if num == work_sheet.row_count:
+        work_sheet.append_row(["" for x in range(work_sheet.col_count)])
+
+    return num
+
+
+def append_row(work_sheet, row):
+    row_number = get_row_number(work_sheet)
+
+    i = 1
+    for k in row.keys():
+        work_sheet.update_cell(row_number, i, row[k])
+        i += 1
 
 
 class Measurement(object):
@@ -14,9 +49,17 @@
 
 
 class Storage(object):
+    def store(self, data):
+        pass
 
-    def __init__(self, email, password, doc_id, work_sheet_name):
-        self.gc = gspread.login(email, password)
+    def retrieve(self, id):
+        pass
+
+
+class GoogleDocsStorage(Storage):
+
+    def __init__(self, doc_id, work_sheet_name, email=None, password=None):
+        self.gc = login(email, password)
         self.sh = self.gc.open_by_key(doc_id)
         self.work_sheet = get_work_sheet(self.sh, work_sheet_name, 40)
 
@@ -29,12 +72,9 @@
         if row_number != -1:
             vals = self.work_sheet.row_values(row_number)
             m = Measurement()
-            m.build = vals["build_id"]
-            del vals["build_id"]
-            m.build_type = vals["type"]
-            del vals["type"]
-            m.md5 = vals["iso_md5"]
-            del vals["iso_md5"]
+            m.build = vals.pop("build_id")
+            m.build_type = vals.pop("type")
+            m.md5 = vals.pop("iso_md5")
             m.results = {k: vals[k] for k in vals.keys()}
         else:
             return None
@@ -47,3 +87,36 @@
         return -1
 
 
+class DiskStorage(Storage):
+    def __init__(self, file_name):
+        self.file_name = file_name
+
+        if not os.path.exists(file_name):
+            with open(file_name, "w+") as f:
+                f.write(json.dumps([]))
+
+    def store(self, data):
+        with open(self.file_name, "rt") as f:
+            raw_data = f.read()
+            document = json.loads(raw_data)
+            document.append(data)
+
+        with open(self.file_name, "w+") as f:
+            f.write(json.dumps(document))
+
+    def retrieve(self, id):
+        with open(self.file_name, "rt") as f:
+            raw_data = f.read()
+            document = json.loads(raw_data)
+
+            for row in document:
+                if row["build_id"] == id:
+                    m = Measurement()
+                    m.build = row.pop("build_id")
+                    m.build_type = row.pop("type")
+                    m.md5 = row.pop("iso_md5")
+                    m.results = {k: row[k] for k in row.keys()}
+
+                    return m
+        return None
+
