def _do_paxos(self):
            """Do Paxos algorithm for this Node."""
            #Begin running the Acceptor and Proposer in the background
            thread.start_new_thread(self._proposer.start, ())
            thread.start_new_thread(self._acceptor.start, ())
            thread.start_new_thread(_learner, (self, ))
            thread.start_new_thread(_shut_down, (self, ))

            IP, UDP_PORT = '0.0.0.0', self._ip_table[self._node_id][2]

            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            sock.bind((IP, UDP_PORT))
            while True:
                data, addr = sock.recvfrom(4096)  # buffer size is 1024 bytes

                if data == "terminate":
                    sock.close()
                    break

                #Quick lookup of ID of sender from IP received
                sender_ID = filter(lambda row: row[1][0] == addr[0],
                                   self._ip_table.items())[0][0]

                message = pickle.loads(data)
                #bind sender_ID to message
                message = message + (sender_ID, )

                #construct deserailized version of message
                new_message = []
                for field in message:
                    if type(field) == str:
                        try:
                            deserialized_calendar = Calendar.deserialize(field)
                            new_message.append(deserialized_calendar)
                        except:
                            new_message.append(field)
                    else:
                        new_message.append(field)

                new_message = tuple(new_message)
                _parse_message(new_message)