diff --git a/DB/Database.py b/DB/Database.py
index 3480089aa4ef5a5dd538e2ae651ea36794d0e809..2baa2bd15f157e37ec9ff3d67b77be564782c5e0 100644
--- a/DB/Database.py
+++ b/DB/Database.py
@@ -2,95 +2,155 @@
 ez file lenne ami osszekoti a db-t a programunkal. hogy egyszerubb legyen
 az eletunk, ezert most csak egyszeru dictekbe, meg setekbe tarolunk mindent
 """
-# import pprint
+import pprint
 import re
-fake_db = {}
-# ez garantalja hogy egy username csak egyszer lehet benne
-fake_db['u_names'] = set()
-# ezek objektumok nev-jelszo paros listaja lesz, tehat csak sima array
-fake_db['users'] = []
+import time
+# fake_db = {}
+# # ez garantalja hogy egy username csak egyszer lehet benne
+# fake_db['u_names'] = set()
+# # ezek objektumok nev-jelszo paros listaja lesz, tehat csak sima array
+# fake_db['users'] = []
+
+
+class Database:
+
+    def __init__(self):
+        db, error = load_db()
+        self.db = db
+        load_secrets(self)
+
+    def __del__(self):
+        pprint.pprint(self.db)
+        valid_db(self.db)
+        save_db(self.db)
+
+    def check_user_name(self, username=None):
+        if not username:
+            return 'No name given'
+        if username in self.db['u_names']:  # legyen u_names a usernevek setje
+            return 'Username taken'
+        else:
+            return ''
+
+    def validate_password(self, password=None):
+        if isinstance(password, str) is False:
+            return 'Bad password'
+        elif len(password) < 8 or 'dick' in password:
+            return 'Password is too short'
+        elif hasNumbers(password) is False:
+            return 'must contain number'
+        else:
+            return ''
+
+    def get_user_data(self, username):
+        for user in self.db['users']:
+            if user['username'] == username:
+                return user
+        return 'user not found'
+
+    def get_encryption_key(self, username):
+        if self.get_user_data(username) == 'user not found':
+            return False
+        encryption_key = self.get_user_data(username).get('encryption_key', None)
+        return encryption_key
+
+    def put_encryption_key(self, username, encryption_key=None):
+        if encryption_key is None:
+            encryption_key = self.get_user_data(username)['password']
+        self.get_user_data(username)['encryption_key'] = encryption_key
+        return
+
+    def create_user(self, username, password):
+        try:
+            self.db['u_names'].add(username)
+            self.db['users'].append({'username': username, 'password': password})
+        except Exception as e:
+            return 'oopsie', e
+            # pprint.pprint(fake_db)
+            print('Welcome new user: ', username)
+            return True
+
+    def login_user(self, username, password):
+        if username is None or password is None:
+            return False, ''
+        if (username, password) in [(u['username'], u['password'])
+                                    for u in self.db['users']]:
+            return True, username
+        else:
+            return False, ''
+
+
+def hasNumbers(inputString):
+    return any(char.isdigit() for char in inputString)
+
+
+def save_db(db):
+    with open('db.txt', 'w') as f:
+        for user in db['users']:
+            f.write('username {} - password {}\n'.format(user['username'],
+                                                         user['password']))
+    with open('secrets.txt', 'w') as f:
+        for user in db['users']:
+            if 'encryption_key' in user:
+                f.write('username {} - key {}\n'.format(user['username'], user['encryption_key']))
+
+    return 'Succes'
+
+
+def valid_db(db):
+    if len(db['users']) != len(set([u['username'] for u in db['users']])):
+        return ['Error', len(db['users']) != len(set([u['username'] for u in db['users']]))]
+    elif set([u['username'] for u in db['users']]) - db['u_names'] == set():
+        return 'Succes'
+    return ['error', set([u['username'] for u in db['users']]) - db['u_names']]
 
 
 def load_db():
+    fake_db = {}
+    fake_db['u_names'] = set()
+    fake_db['users'] = []
+    error_msgs = []
     try:
         with open('db.txt', 'r') as f:
             data = f.readline()
-            print(data)
             m = re.search('username (.*) - password (.*)', data)
             while data != '':
-                print()
                 m = re.search('username (.*) - password (.*)', data)
                 assert m.group()
                 if m.group(1) in fake_db['u_names']:
+                    error_msgs += ['Duplicate error on loading {} user | name already in db at {}'.format(m.group(1),
+                                                                                                          time.time())]
                     data = f.readline()
                     continue
-                fake_db['users'].append({'Username': m.group(1), 'Password': m.group(2)})
+                fake_db['users'].append({'username': m.group(1), 'password': m.group(2)})
                 fake_db['u_names'].add(m.group(1))
                 data = f.readline()
     except OSError as e:
-        return 'Succes'
-    return 'Succes'
-
-
-def check_user_name(username=None):
-    if not username:
-        return 'No name given'
-    if username in fake_db['u_names']:  # legyen u_names a usernevek setje
-        return 'Username taken'
-    else:
-        return ''
+        error_msgs += ['No db file found']
+        return fake_db, error_msgs
+    return fake_db, error_msgs
 
 
-def hasNumbers(inputString):
-    return any(char.isdigit() for char in inputString)
-
-
-def validate_password(password=None):
-    if isinstance(password, str) is False:
-        return 'Bad password'
-    elif len(password) < 8 or 'dick' in password:
-        return 'Password is too short'
-    elif hasNumbers(password) is False:
-        return 'must contain number'
-    else:
-        return ''
-
-
-def create_user(username, password):
+def load_secrets(db):
+    error_msgs = []
     try:
-        fake_db['u_names'].add(username)
-        fake_db['users'].append({'Username': username, 'Password': password})
-    except Exception as e:
-        return 'oopsie', e
-    # pprint.pprint(fake_db)
-    print('Welcome new user: ', username)
-    return True
-
-
-def login_user(username, password):
-    if username is None or password is None:
-        return 'No Way'
-    if (username, password) in [(u['Username'], u['Password'])
-                                for u in fake_db['users']]:
-        return 'Succes', username
-    else:
-        return 'Nein'
-
-
-def save_db():
-    with open('db.txt', 'w') as f:
-        for user in fake_db['users']:
-            f.write('username {} - password {}\n'.format(user['Username'],
-                                                         user['Password']))
-    return 'Succes'
-
-
-def valid_db():
-    if len(fake_db['users']) != len(set([u['Username'] for u in fake_db['users']])):
-        return ['Error', len(fake_db['users']) != len(set([u['Username'] for u in fake_db['users']]))]
-    elif set([u['Username'] for u in fake_db['users']]) - fake_db['u_names'] == set():
-        return 'Succes'
-    return ['error', set([u['Username'] for u in fake_db['users']]) - fake_db['u_names']]
+        with open('secrets.txt', 'r') as f:
+            data = f.readline()
+            print(data)
+            m = re.search('username (.*) - key (.*)', data)
+            if data == '':
+                return
+            while data != '':
+                m = re.search('username (.*) - key (.*)', data)
+                assert m.group()
+                if db.get_user_data(m.group(1)) == 'user not found':
+                    error_msgs += ['{} user not found at loading secrets | name not in db at {}'.format(m.group(1),
+                                                                                                        time.time())]
+                db.put_encryption_key(m.group(1), m.group(2))
+                data = f.readline()
+    except OSError as e:
+        error_msgs += ['No db file found']
+        return error_msgs
 
 
 if __name__ != "__main__":
diff --git a/program.py b/program.py
index 18ee75b9df1f0f395e792784accd7639de7d4ad8..6e8b798da5571331b2c5b88737da2b23afc21929 100644
--- a/program.py
+++ b/program.py
@@ -1,49 +1,139 @@
-import DB.Database as db
+from DB.Database import Database
+import pyAesCrypt
 
+# List of Messages
+WELCOME_MESSAGE = 'WELCOME TO THE MATRIX\n'
+MENU_SELECTION = '      PLease press R/r to register, L/l to log in, E/e to encrypt, Q/q to quit the program\n'
+REGISTRATION_MESSAGE = 'WELCOME TO THE REGISTRATION STATION!\n   If you wish to continue, press Y/y and enter!\n'
+NAME_SELECTION = 'Please select a username!\n'
+PASSWORD_SELECTION = 'Please select a password!\n'
+FAILED_LOGGING_ATTEMPT = 'Username and password combination is not found\n'
+BAD_INPUT = 'Please only use one character to select\n!'
+LOGGING_MESSAGE = 'WELCOME TO THE LOGIN MENU, PRESS Y TO CONTINUE\n'
+NAME_LOGGING = 'Username!\n'
+PASSWORD_LOGGING = 'Password!\n'
+SUCCESFULLY_LOGGED = 'Succes! Welcome: '
+ENCRYPTION_MENU = '\n\n\n WELCOME TO THE ENCRYPTION MENU!'
+ENCRYPTION_SELECTION = '\n TO ENCRYPT A FILE PRESS E/e TO DECRYPT A FILE PRESS D/d! Press Q/q to quit!'
+bufferSize = 64 * 1024
 
-def Register(username=None, password=None):
+
+def Register(db):
+    user_interaction_input = input(REGISTRATION_MESSAGE)
+    if user_interaction_input not in ['y', 'Y']:
+        return False, 'Aborted'
+    username = input(NAME_SELECTION)
+    password = input(PASSWORD_SELECTION)
     if db.check_user_name(username) != '':
-        return db.check_user_name(username)
+        return False, db.check_user_name(username)
     if db.validate_password(password) != '':
-        return db.validate_password(password)
+        return False, db.validate_password(password)
     else:
-        db.create_user(username, password)
-        return 'Succes'
+        error_msgs = db.create_user(username, password)
+        return [False, error_msgs] if error_msgs is not True else [True, '']
+
+
+def login_user(db):
+    user_interaction_input = input(LOGGING_MESSAGE)
+    if user_interaction_input not in ['y', 'Y']:
+        return False, 'Aborted'
+    username = input(NAME_LOGGING)
+    password = input(PASSWORD_LOGGING)
+    state, logged_username = db.login_user(username, password)
+    if state is True:
+        print(SUCCESFULLY_LOGGED, logged_username, '\n')
+        return state, logged_username
+    else:
+        print(FAILED_LOGGING_ATTEMPT)
+        return state, None
+
 
+def file_encryption(user, encryption_key, filename):
+    try:
+        pyAesCrypt.encryptFile(filename, filename + '.aes', encryption_key, bufferSize)
+    except OSError as e:
+        return e
+    return 'succes'
 
-def login_user(username=None, password=None):
-    return db.login_user(username, password)
+
+def file_decryption(user, encryption_key, filename):
+    try:
+        pyAesCrypt.decryptFile(filename + ".aes", filename, encryption_key, bufferSize)
+    except OSError as e:
+        return e
+    return 'succes'
+
+
+def file_encryption_menu(db, username=None):
+    if username is None or username == '':
+        print('You need to log in first!')
+        return 'Not logged in'
+    print(ENCRYPTION_MENU)
+    encryption_key = db.get_encryption_key(username)
+    if encryption_key is False:
+        print('internal error at {}'.format(username))
+        return
+    while encryption_key is None:
+        print('         You need to set up your encryption key!!!\n')
+        user_interaction_input = input('            If you wish to set up an ecryption key, press Y/y and enter!\n')
+        user_interaction_input = user_interaction_input.upper()
+        if user_interaction_input != 'Y':
+            return 'Aborted'
+        user_interaction_input = input('If you want to use your password as encryption key, press Y!\n')
+        user_interaction_input = user_interaction_input.upper()
+        if user_interaction_input == 'Y':
+            db.put_encryption_key(username)
+            encryption_key = db.get_encryption_key(username)
+            break
+        password = input('Please submit your encryption key!\n')
+        if db.validate_password(password) != '':
+            print('!!!!ERROR!!!! ->', db.validate_password(password))
+            encryption_key = db.get_encryption_key(username)
+            continue
+        db.put_encryption_key(username, password)
+        encryption_key = db.get_encryption_key(username)
+    while 1:
+        user_interaction_input = input(ENCRYPTION_SELECTION)
+        user_interaction_input = user_interaction_input.upper()
+        if len(user_interaction_input) > 1:
+            print(BAD_INPUT)
+            continue
+        elif user_interaction_input == 'E':
+            filename = input('Give Us The File Name!')
+            state = file_encryption(db, username, filename)
+            print(state)
+        elif user_interaction_input == 'D':
+            filename = input('Give Us The File Name!')
+            state = file_decryption(db, username, filename)
+            print(state)
+        elif user_interaction_input == 'Q':
+            return
 
 
 if __name__ == "__main__":
-    print(db.load_db())
+    print(WELCOME_MESSAGE)
+    db = Database()
+    username = ''
     while 1:
-        text_input = input("Press enter to start registration, anything else \
-            + enter if login")
-        if text_input == '':
-            name = input("Give us a Username ")
-            psw = input("Give us a Password ")
-            state = Register(name, psw)
-            if state != 'Succes':
-                while state != 'Succes':
-                    print('Let\'s Try again because:' + state, '\n')
-                    name = input("Give us a Username ")
-                    psw = input("Give us a Password ")
-                    state = Register(name, psw)
-            db.save_db()
-            # print('Noice')
-        elif text_input != '0':
-            name = input("Give us a Username ")
-            psw = input("Give us a Password ")
-            state = login_user(name, psw)
-            if state[0] != 'Succes':
-                while state[0] != 'Succes':
-                    print('Let\'s Try again because:' + state, '\n')
-                    name = input("Give us a Username ")
-                    psw = input("Give us a Password ")
-                    state = login_user(name, psw)
-        else:
-            print('Db validation: ', db.valid_db())
-            db.save_db()
+        user_interaction_input = input(MENU_SELECTION)
+        user_interaction_input = user_interaction_input.upper()
+        if len(user_interaction_input) > 1:
+            print(BAD_INPUT)
+            continue
+        elif user_interaction_input == 'R':
+            [state, error] = Register(db)
+            while error not in [None, 'Aborted']:
+                print('!!!!ERROR!!!! ->', error)
+                state, error = Register(db)
+        elif user_interaction_input == 'L':
+            state, username = login_user(db)
+            print(username)
+            while state is False and username != 'Aborted':
+                state, username = login_user(db)
+            if state is True:
+                MENU_SELECTION += 'Logged in as ' + str(username) + '\n'
+        elif user_interaction_input == 'E':
+            file_encryption_menu(db, username)
+        elif user_interaction_input == 'Q':
+            del db
             exit()
-            # print('Noice: ', state[1])