diff --git a/aa.py b/aa.py
new file mode 100755
index 0000000000000000000000000000000000000000..b2a0c3c83310695604bad700a37e7fe039c80f13
--- /dev/null
+++ b/aa.py
@@ -0,0 +1,245 @@
+#!/usr/bin/env python
+#################### Protocol #################################################################
+# Marca - Tipo - Destino - Origem - Prioridade - Tamanho - Inic MSG - Mensagem - Fim MSG - CRC#
+###############################################################################################
+
+#Marca - 1 Byte Marca inicio de transmissao, inicio de msg fim de msg
+#Tipo - 0 Token, 1 - Msg, 2 - ACK, 3 - NACK
+#Destino - pode variar de 1 a 4
+#Origem - pode variar de 1 a 4
+#Prioridade - pode variar de 0 a 7
+#Tamanho - tanto faz
+#Marca (inicio msg) - 1 Byte
+#Mensagem 
+#CRC - 8 bytes
+
+#Exemplo msg#
+#~11313~oie~352D1036
+# ~ - inic transmissao
+# 1 - tipo da mensagem
+# 1 - destino da mensagem
+# 3 - origem da mensagem
+# 1 - prioridade da mensagem
+# 3 - tamanho da string da mensagem
+# ~ - delimitador de inicio da mensagem
+# oie - mensagem
+# ~ - delimitador de fim da mensagem
+# 352D1036 - CRC 
+
+import socket
+import threading
+import sys
+import binascii
+import time
+import Queue
+
+global TOKEN 
+global StartTime
+global HighPriority
+global RECEBIDA
+RECEBIDA = 1
+StartTime = 0
+HighPriority = 10
+TOKEN = 0
+SEND_PORT = 3131        # Porta que o Servidor envia
+RECV_PORT = 3131       # Porta que o Servidor recebe
+
+class Protocol():
+
+    def __init__ (self):
+        self.marca = "~" #Marca
+        self.type = str(1) #Alterar Depois
+        self.destiny = str(0)
+        self.origin = str(MACHINE_ID)
+        self.priority = str(0)
+        self.msg = str(0)
+        self.sizemsg = str(0)
+        self.crc = str(0)
+
+    #set destiny message
+    def setDestiny(self):
+    	sys.stdout.write('Destino: ')
+    	self.destiny = raw_input()
+    	while (0 >= int(self.destiny)) or (int(self.destiny) >= 5):
+    		print 'Entrada Invalida, Por favor escolha entre 1 a 4'
+    		sys.stdout.write('Destino: ')
+    		self.destiny = raw_input()
+    	self.destiny = str(self.destiny)
+
+    #set Priority messsage
+    def setPriority(self):
+    	sys.stdout.write('Prioridade: ')
+    	self.priority = raw_input()
+    	while (0 >= int(self.priority)) or (int(self.priority) >= 8):
+    		print 'Entrada Invalida, Por favor escolha entre 1 a 7'
+        	sys.stdout.write('Prioridade: ')
+    		self.priority = raw_input()		
+    	self.priority = 7 - int(self.priority)
+
+    def setType (self):
+        if (self.msg == 'token'):
+            self.type = str(0)
+        else:
+            self.type = str(1)
+
+    #set message 
+    def setMessage(self):
+    	sys.stdout.write('Mensagem: ')
+    	self.msg = raw_input()
+
+    #set sizeof message
+    def setSizeof (self):
+    	self.sizemsg = len(self.msg)
+    	self.sizemsg = str(self.sizemsg) #String convert
+    
+    #set CRC32
+    def setCRC32(self):
+    	buff = (binascii.crc32(self.msg) & 0xFFFFFFFF)
+    	self.crc = "%08X" % buff
+
+    def getEmpacotar(self):
+        return  self.marca + self.type + self.destiny + self.origin + str(self.priority)  + self.sizemsg + self.marca + self.msg + self.marca + self.crc
+
+    def setDesempacota(self, msg):
+        self.marca = msg[0]
+        self.type = msg[1]
+        self.destiny = int(msg[2])
+        self.origin = msg[3]
+        self.priority = msg[4]
+        self.msg = msg.split('~', 3)[2]
+        self.crc = msg.split('~', 3)[3]
+
+    def getCRC32(self):
+     	buff = (binascii.crc32(self.msg) & 0xFFFFFFFF)
+    	return "%08X" % buff
+
+
+def token ():
+    global TOKEN
+    global StartTime
+    global queue
+    global RECEBIDA
+    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    tokenMessage = Protocol()
+    dest = (HOST, SEND_PORT)
+    while True:
+	EndTime = time.time()
+        if (EndTime - StartTime >= 2  and TOKEN == 1):
+            print 'MANDEI O TOKEN'
+            TOKEN = 0
+            tokenMessage.type = str(0)
+            msg = tokenMessage.getEmpacotar()
+            udp.sendto (msg,dest)
+            #time.sleep(2)
+        if (TOKEN == 1):
+            #print 'ESTOU COM O TOKEN'
+            if (not queue.empty()):
+                msg = queue.get ()
+                udp.sendto (msg[1], dest)
+                print 'ENVIANDO'
+                time.sleep(1)
+                while (RECEBIDA == 0):
+                    print 'ENVIANDO NOVAMENTE A MSG'
+                    udp.sendto (msg[1], dest)
+                    time.sleep(1)
+    udp.close()
+
+def client ():
+    try:
+        global TOKEN
+        global HighPriority
+        protocolMessage = Protocol()
+        global queue
+        queue = Queue.PriorityQueue()
+        while True:
+            protocolMessage.setDestiny()
+            protocolMessage.setPriority()
+            protocolMessage.setMessage()
+            protocolMessage.type = str(1)
+            protocolMessage.setSizeof()
+            protocolMessage.setCRC32()
+            msg = protocolMessage.getEmpacotar()
+            queue.put ((protocolMessage.priority, msg))
+            if (not queue.empty()):
+                HighPriority = queue.queue[0]
+        threadServer._Thread__stop()
+        threadToken._Thread__stop()
+    except:
+        print 'OPS, ALGO OCORREU ERRADO'
+        threadServer._Thread__stop()
+        threadToken._Thread__stop()
+
+def server ():
+    global TOKEN
+    global StartTime
+    global RECEBIDA
+    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    orig = ('', RECV_PORT)
+    dest = (HOST, SEND_PORT)
+    udp.bind(orig)
+    protocolDescompactMessage = Protocol()
+    
+    while True:
+        msg, cliente = udp.recvfrom(1024)
+        protocolDescompactMessage.setDesempacota(msg)
+
+        #A msg foi enviada com sucesso
+        if (msg[1] == '2' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)):
+            print 'A MENSAGEM FOI ENVIADA COM SUCESSO'
+            RECEBIDA = 1
+
+        #Erro no envio
+        elif (msg[1] == '3' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)):
+            RECEBIDA = 0
+
+        #A msg e pra mim
+        elif (msg[1] == '1' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)):
+            #protocolDescompactMessage.crc = "8888888"#caga tdo
+            if (protocolDescompactMessage.crc == protocolDescompactMessage.getCRC32()):
+                print '\n' + protocolDescompactMessage.origin + ' Escreveu: ' + protocolDescompactMessage.msg
+           
+                #envia ack 
+                protocolDescompactMessage.type = str(2)
+                protocolDescompactMessage.destiny = protocolDescompactMessage.origin
+                msg = protocolDescompactMessage.getEmpacotar()
+                udp.sendto (msg, dest)
+            else:
+                print 'ERRO DE MENSAGEM'
+                
+                #envia nack 
+                protocolDescompactMessage.type = str(3)
+                protocolDescompactMessage.destiny = protocolDescompactMessage.origin
+                msg = protocolDescompactMessage.getEmpacotar()
+                udp.sendto (msg, dest)
+            
+        #A msg n e pra mim
+        elif (msg[1] == '1' or msg[2] == '2' or msg[3] == '3'):
+            udp.sendto (msg, dest)
+       	
+        #Recebi o token
+        if (protocolDescompactMessage.type == '0' and TOKEN == 0):
+            print 'RECEBI O TOKEN'
+            TOKEN = 1
+            StartTime = time.time()
+
+    
+    udp.close()
+    
+#------------------MAIN-----------------#
+
+if len(sys.argv) > 1:
+    TOKEN = 1
+    print 'COMECEI COM O TOKEN'
+    StartTime = time.time()
+print 'ID Dessa maquina, escolha entre 1 e 4'
+MACHINE_ID = raw_input ()
+print "Ip da proxima maquina"
+HOST = raw_input()
+if TOKEN == 1:
+    StartTime = time.time()
+threadServer = threading.Thread(target=server)
+threadClient = threading.Thread(target=client)
+threadToken = threading.Thread(target=token)
+threadServer.start()
+threadClient.start()
+threadToken.start()