diff --git a/mapping/boot.py b/hepialight/boot.py
similarity index 100%
rename from mapping/boot.py
rename to hepialight/boot.py
diff --git a/hepialight/main.py b/hepialight/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5274daf8aa420cd660255adcd601b49b2d3fc23
--- /dev/null
+++ b/hepialight/main.py
@@ -0,0 +1,167 @@
+id = [0,0]
+matsize = [0, 0]
+ 
+def color16_to_32(color):
+    color = int(color)
+    r = ((color >> 11) & 0x1F) * 2**3
+    g = ((color >> 5) & 0x3F) * 2**2
+    b = (color & 0x1F) * 2**3
+    return r << 16 | g << 8 | b
+
+def disp_img_data(data):
+    for i in range(NBR_LIGNES):
+        for j in range(NBR_COLONNES):
+            allumer_led(j, NBR_LIGNES-1-i, data[i * NBR_COLONNES + j])
+
+def data_to_color16(data):
+    d_color16 = []
+
+    for i in range(0, len(data), 2):
+        d_color16.append(data[i] << 8 | data[i+1])
+    
+    return list(map(color16_to_32, d_color16))
+
+def display_id():
+    afficher_texte("{}, {}".format(id[0], id[1]), speed=0.01)
+ 
+def msg_to_str(msg):
+    return str(msg)[2:-1]
+ 
+def send_passthrough_str(msg, x, y):
+    x = int(x)
+    y = int(y)
+
+    if x > id[0]:
+        d = E
+    elif x < id[0]:
+        d = O
+    elif y > id[1]:
+        d = N
+    else:
+        d = S
+
+    envoyer_msg(d, "PT;{},{};{}".format(x, y, msg))
+
+def send_passthrough_bytes(msg, x, y):
+    x = int(x)
+    y = int(y)
+
+    if x > id[0]:
+        d = E
+    elif x < id[0]:
+        d = O
+    elif y > id[1]:
+        d = N
+    else:
+        d = S
+
+    envoyer_msg(d, msg)
+
+def send_xy(x, y, msg):
+    send_passthrough_str(msg, x, y)
+
+def send_text_xy(x, y, text, color=ROUGE, speed=0.1):
+    send_xy(x, y, "TEXT;{};{};{}".format(color, speed, text))
+
+def send_moving_xy(x, y, text, color=ROUGE, speed=0.1):
+    send_xy(x, y, "MOVING;{};{};{}".format(color, speed, text))
+
+
+def check_presence(d):
+    envoyer_msg(d, "PING")
+
+    for x in range(10):
+        time.sleep(0.1)
+        ret = recevoir_msg(d)
+
+        if ret == b"PONG": return True
+
+    return False
+
+
+def update_id(new_id):
+    global id
+
+    id[0] = int(new_id[0])
+    id[1] = int(new_id[1])
+    envoyer_msg(N, "SET_ID:{},{}".format(id[0], id[1] + 1))
+    envoyer_msg(E, "SET_ID:{},{}".format(id[0] + 1, id[1]))
+
+    if not check_presence(N) and not check_presence(E):
+        send_xy(0, 0, "MATSIZE;{},{}".format(id[0], id[1]))
+
+    display_id()
+
+
+def handle_receive(msg, msg_bytes, d):
+ 
+    print("Received from {} : {}".format(d, msg))
+
+    if msg.startswith("SET_ID"):
+        tmp_id = msg[7:].split(",")
+        update_id(tmp_id)
+ 
+    elif msg == "PING":
+        envoyer_msg(d, "PONG")
+ 
+    elif msg == "DISP_ID":
+        display_id()
+
+    elif msg.startswith("PT;"):
+        msgs = msg.split(";")
+        m = msgs[2:]
+        m = ";".join(m)
+        x, y = msgs[1].split(",")
+
+        x = int(x)
+        y = int(y)
+
+        if x == id[0] and y == id[1]:
+            handle_receive(m, msg_bytes[7:], d)
+            return
+        
+        print("sending passthrough to {},{}: {}".format(x,y,m))
+        send_passthrough_bytes(msg_bytes, x, y)
+ 
+    elif msg.startswith("MATSIZE"):
+        x, y = msg.split(";")[-1].split(",")
+        print("Matsize : {} {}".format(x, y))
+        matsize = [int(x), int(y)]
+
+    elif msg.startswith("TEXT"):
+        msgs = msg.split(";")
+        color = int(msgs[1])
+        speed = float(msgs[2])
+        afficher_texte(msgs[3], color, speed)
+
+    elif msg.startswith("MOVING"):
+        msgs 	= msg.split(";")
+        color 	= int(msgs[1])
+        speed 	= float(msgs[2])
+        text 	= msgs[3]
+
+        time.sleep(speed * 11)
+        send_moving_xy(id[0] - 1, id[1], text, color=color, speed=speed)
+        afficher_texte(text, color, speed)
+
+    elif msg.startswith("IMAGE"):
+        print("IMAGE LEN : {}".format(len(msg_bytes[6:])))
+        img = data_to_color16(msg_bytes[6:])
+        disp_img_data(img)
+
+# send_text_xy(1,0,text,speed=speed);time.sleep(speed*13);afficher_texte(text,speed=speed)
+
+
+
+# Main
+afficher_texte("Ready", VERT, speed=0.01)
+
+while True:
+
+    for d in [N, S, E, O]:
+        msg_bytes = recevoir_msg(d)
+
+        if msg_bytes == b"": continue
+
+        msg = msg_to_str(msg_bytes)
+        handle_receive(msg, msg_bytes, d)
\ No newline at end of file
diff --git a/mapping/userlib.py b/hepialight/userlib.py
similarity index 100%
rename from mapping/userlib.py
rename to hepialight/userlib.py
diff --git a/mapping/main.py b/mapping/main.py
deleted file mode 100644
index f2b33f04ab165d7106ad68ee7482db43c73973ac..0000000000000000000000000000000000000000
--- a/mapping/main.py
+++ /dev/null
@@ -1,152 +0,0 @@
-id = [0,0]
-matsize = [0, 0]
- 
-def color16_to_32(color):
-    color = int(color)
-    r = ((color >> 11) & 0xFF) * 2**3
-    g = ((color >> 5) & 0xFF) * 2**2
-    b = (color & 0xFF) * 2**3
-    return r << 16 | g << 8 | b
-
-def disp_img_data(data):
-    for i in range(NBR_LIGNES):
-        for j in range(NBR_COLONNES):
-            allumer_led(i, j, data[i * NBR_LIGNES + j])
-
-def data_to_color16(data):
-    d_color16 = []
-
-    for i in range(0, len(data), 2):
-        d_color16.append(data[i] << 8 | data[i+1])
-    
-    return list(map(color16_to_32, d_color16))
-
-def display_id():
-	afficher_texte("{}, {}".format(id[0], id[1]), speed=0.01)
- 
-def msg_to_str(msg):
-	return str(msg)[2:-1]
- 
-def send_passthrough(msg, x, y):
-	x = int(x)
-	y = int(y)
-
-	if x > id[0]:
-		d = E
-	elif x < id[0]:
-		d = O
-	elif y > id[1]:
-		d = N
-	else:
-		d = S
-
-	envoyer_msg(d, "PT;{},{};{}".format(x, y, msg))
-
-def send_xy(x, y, msg):
-	send_passthrough(msg, x, y)
-
-def send_text_xy(x, y, text, color=ROUGE, speed=0.1):
-	send_xy(x, y, "TEXT;{};{};{}".format(color, speed, text))
-
-def send_moving_xy(x, y, text, color=ROUGE, speed=0.1):
-	send_xy(x, y, "MOVING;{};{};{}".format(color, speed, text))
-
-
-def check_presence(d):
-	envoyer_msg(d, "PING")
-
-	for x in range(10):
-		time.sleep(0.1)
-		ret = recevoir_msg(d)
-
-		if ret == b"PONG": return True
-
-	return False
-
-
-def update_id(new_id):
-	global id
-
-	id[0] = int(new_id[0])
-	id[1] = int(new_id[1])
-	envoyer_msg(N, "SET_ID:{},{}".format(id[0], id[1] + 1))
-	envoyer_msg(E, "SET_ID:{},{}".format(id[0] + 1, id[1]))
-
-	if not check_presence(N) and not check_presence(E):
-		send_xy(0, 0, "MATSIZE;{},{}".format(id[0], id[1]))
-
-	display_id()
-
-
-def handle_receive(msg, msg_bytes, d):
- 
-	print("Received from {} : {}".format(d, msg))
-
-	if msg.startswith("SET_ID"):
-		tmp_id = msg[7:].split(",")
-		update_id(tmp_id)
- 
-	elif msg == "PING":
-		envoyer_msg(d, "PONG")
- 
-	elif msg == "DISP_ID":
-		display_id()
-
-	elif msg.startswith("PT;"):
-		msgs = msg.split(";")
-		m = msgs[2:]
-		m = ";".join(m)
-		x, y = msgs[1].split(",")
-
-		x = int(x)
-		y = int(y)
-
-		if x == id[0] and y == id[1]:
-			handle_receive(m, msg_bytes[7:], d)
-			return
-		
-		print("sending passthrough to {},{}: {}".format(x,y,m))
-		send_passthrough(m, x, y)
- 
-	elif msg.startswith("MATSIZE"):
-		x, y = msg.split(";")[-1].split(",")
-		print("Matsize : {} {}".format(x, y))
-		matsize = [int(x), int(y)]
-
-	elif msg.startswith("TEXT"):
-		msgs = msg.split(";")
-		color = int(msgs[1])
-		speed = float(msgs[2])
-		afficher_texte(msgs[3], color, speed)
-
-	elif msg.startswith("MOVING"):
-		msgs 	= msg.split(";")
-		color 	= int(msgs[1])
-		speed 	= float(msgs[2])
-		text 	= msgs[3]
-
-		time.sleep(speed * 11)
-		send_moving_xy(id[0] - 1, id[1], text, color=color, speed=speed)
-		afficher_texte(text, color, speed)
-
-	elif msg.startswith("IMAGE"):
-		print("IMAGE LEN : {}".format(len(msg_bytes[6:])))
-		img = data_to_color16(msg_bytes[6:])
-		disp_img_data(img)
-
-# send_text_xy(1,0,text,speed=speed);time.sleep(speed*13);afficher_texte(text,speed=speed)
-
-
-
-# Main
-afficher_texte("Ready", VERT, speed=0.01)
-
-while True:
-
-	for d in [N, S, E, O]:
-		msg_bytes = recevoir_msg(d)
-
-		if msg_bytes == b"": continue
-
-		msg = msg_to_str(msg_bytes)
-		handle_receive(msg, msg_bytes, d)