diff --git a/tunmgr/base.py b/tunmgr/base.py
index 20f709d09ee39f7a76be471c65aa04f8969dd7d9..542171b5f1a9af7dc9c99e864ce74319792ed4b2 100644
--- a/tunmgr/base.py
+++ b/tunmgr/base.py
@@ -12,18 +12,18 @@ def basefromN(repr, base):
         puissance*=base
     return n
 
-def from7bytes(B):
+def frombytes(B):
     n = 0
     for i, b in enumerate(B):
         n|=b<<(8*i)
     return n
 
-def to7bytes(n):
-    for i in range(7):
+def tobytes(n, length):
+    for i in range(length):
         yield (n&(0xff<<(8*i)))>>(8*i)
 
 if __name__=="__main__":
     print(list(basetoN(12, 2)))
     print(basefromN(basetoN(12, 2), 2))
-    print(from7bytes(b"abcdefg"))
-    print(bytes(to7bytes(from7bytes(b"abcdefg"))))
+    print(frombytes(b"abcdefg"))
+    print(bytes(tobytes(frombytes(b"abcdefg"), 7)))
diff --git a/tunmgr/gsm.py b/tunmgr/gsm.py
index 578a993298c860defc8ff1490ac712b8549904d7..d3643c9c0d0d4fb766bdcd38dfd87147b9eb3fe2 100644
--- a/tunmgr/gsm.py
+++ b/tunmgr/gsm.py
@@ -1,27 +1,18 @@
 from base import *
 tableau = ['@','Δ',' ','0','¡','P','¿','p','£','_','!','1','A','Q','a','q','$','Φ','"','2','B','R','b','r','¥','Γ','#','3','C','S','c','s','è','Λ','¤','4','D','T','d','t','é','Ω','%','5','E','U','e','u','ù','Π','&','6','F','V','f','v','ì','Ψ','\'','7','G','W','g','w','ò','Σ','(','8','H','X','h','x','Ç','Θ',')','9','I','Y','i','y','\n','Ξ','*',':','J','Z','j','z','Ø','+',';','K','Ä','k','ä','ø','Æ',',','<','L','Ö','l','ö','\r','æ','-','=','M','Ñ','m','ñ','Å','ß','.','>','N','Ü','n','ü','å','É','/','?','O','§','o','à']
 def convertIntToGSM(i):
-    return tableau[i-1 if i>27 else i]
+    return tableau[i]
 
 def convertGSMtoInt(char):
     for k in range(127):
         if (tableau[k] == char):
-            return k+1 if k>=27 else k
+            return k
 
 def gsmencode(B):
-    msg = convertIntToGSM(len(B)%7)
-    for i in range(0, len(B), 7):
-        septet = B[i: i+7]
-        msg += "".join(map(convertIntToGSM, basetoN(from7bytes(septet), 127)))
-    return msg
+    return "".join(map(convertIntToGSM, (list(basetoN(len(B), 127)) + [0, 0])[:2] +  list(basetoN(frombytes(B), 127))))
 
 def gsmdecode(B):
-    remainder = convertGSMtoInt(B[0])
-    msg = b""
-    for i in range(1, len(B), 8):
-        octet = map(convertGSMtoInt, B[i: i+8])
-        msg += bytes(to7bytes(basefromN(octet, 127)))
-    return msg[:-((7-remainder)%7)]
+    return bytes(tobytes(basefromN(map(convertGSMtoInt, B[2:]), 127), basefromN(map(convertGSMtoInt,B[:2]), 127)))
 
 if __name__=="__main__":
     msg = b"coucou ! j'aime le monde !"
diff --git a/tunmgr/tunmgr.py b/tunmgr/tunmgr.py
index a8ead7a8d9016cb10dd5dd372b94c47f450d44c9..4cd024998c7d485e3af7aec05a6d590eeec28c46 100755
--- a/tunmgr/tunmgr.py
+++ b/tunmgr/tunmgr.py
@@ -5,10 +5,11 @@ import selectors
 import socket
 import sys
 import traceback
+from math import log
 
 from gsm import *
 
-SMS_SIZE = 140 # octets
+SMS_SIZE = 160 # lettres GSM
 PEER = sys.argv[1]
 PORT = 51117
 
@@ -19,7 +20,8 @@ if len(sys.argv)>2:
     addrs = tuple(reversed(addrs))
 tun.addr, tun.dstaddr = addrs
 tun.netmask = '255.255.255.0'
-tun.mtu = SMS_SIZE - 4 - 1 - 7 # header tun et header gsmencode
+tun.mtu = int((SMS_SIZE - 2)*log(127)/log(256)) - 4 # header tun et header gsmencode
+print(tun.mtu)
 
 tun.up()