diff --git a/main.c b/main.c
index 8c6a45d8a3cd3f800f08111c561560203bdf4de7..f767d277c09d4aded11af1b1920343fcee9effed 100644
--- a/main.c
+++ b/main.c
@@ -5,100 +5,122 @@
 #include <fcntl.h>
 #include <string.h>
 #include <errno.h>
+#include <zlib.h>
 
-static const char *PIPE_ONE = "/tmp/pipeOne";
-static const char *PIPE_TWO = "/tmp/pipeTwo";
+// static const char *PIPE_ONE = "/tmp/pipeOne";
+// static const char *PIPE_TWO = "/tmp/pipeTwo";
 
-int main(void)
-{
-    // mkfifo() nur ausführen, wenn die Pipes noch nicht existieren,
-    // bzw. Fehler ignorieren, falls schon existiert:
-    if (mkfifo(PIPE_ONE, 0666) < 0 && errno != EEXIST) {
-        perror("mkfifo pipeOne");
-        return 1;
+static const char *CHAR_DEV = "/dev/packet_receiver";
+
+static const char *SENDER_ID = "0x91";
+
+char* build_crc_checksum(const char *payload) {
+    uLong crc = crc32(0L, Z_NULL, 0);
+    crc = crc32(crc, payload, strlen(payload));
+
+    char* crc_checksum = ("0x%08lX", crc);
+
+    return crc_checksum;
+}
+
+char* build_package(char const *payload) {
+    char* crc_checksum = build_crc_checksum(payload);
+
+    return "SENDER=%s %s %s", SENDER_ID, payload, crc_checksum;
+}
+
+void send_package(const char *package, const int fdCharDev) {
+    char transmitBuf[256] = {0};
+    snprintf(transmitBuf, sizeof(transmitBuf), package);
+
+    const ssize_t written = write(fdCharDev, transmitBuf, strlen(transmitBuf));
+    if (written < 0) {
+        perror("write /dev/packet_receiver");
+    } else {
+        printf("Wrote %ld bytes to %s\n", written, CHAR_DEV);
     }
-    if (mkfifo(PIPE_TWO, 0666) < 0 && errno != EEXIST) {
-        perror("mkfifo pipeTwo");
-        return 1;
+}
+
+char* read_pipe(int fd, char const *pipeName, char *payload) {
+    char buf[128] = {0};
+    // =========== Lesevorgang Pipe ===========
+    // read() kann blockieren, wenn noch keine Daten da sind,
+    // da wir blockierendes I/O verwenden.
+    // Wenn die Schreibseite offen bleibt, kommen periodisch neue Daten.
+    const ssize_t bytesReadOne = read(fd, buf, sizeof(buf));
+    if (bytesReadOne > 0) {
+        // Gültige Daten -> ausgeben
+        printf("Value: %s\n", buf);
+    } else if (bytesReadOne == 0) {
+        // EOF -> Schreibseite hat geschlossen
+        // -> ggf. Pipe erneut öffnen
+        printf("Pipe closed by writer. Reopening...\n");
+        close(fd);
+
+        // Neu öffnen
+        fd = open(pipeName, O_RDONLY);
+        if (fd == -1) {
+            perror("Reopen pipe");
+        }
+    } else {
+        // bytesReadOne < 0 => Fehler
+        if (errno == EINTR) {
+            // Signal unterbrochen, einfach weiter
+            return;
+        }
+        perror("read pipe");
     }
+}
 
-    // Beide Pipes blockierend öffnen
-    int fdOne = open(PIPE_ONE, O_RDONLY);
-    if (fdOne == -1) {
-        perror("open pipeOne for reading");
-        return 1;
+// argc = Anzahl Pipes *argv[] Pipe Pfade
+int main(const int argc, char *argv[]) {
+    int fds[argc];
+
+    for (int i = 0; i < argc; i++) {
+        // mkfifo() nur ausführen, wenn die Pipes noch nicht existieren,
+        // bzw. Fehler ignorieren, falls schon existiert:
+        if (mkfifo(argv[i], 0666) < 0 && errno != EEXIST) {
+            perror("mkfifo pipe");
+            return 1;
+        }
+
+        // Pipes blockierend öffnen
+        fds[i] = open(argv[i], O_RDONLY);
+        if (fds[i] == -1) {
+            perror("open pipeOne for reading");
+            return 1;
+        }
     }
 
-    int fdTwo = open(PIPE_TWO, O_RDONLY);
-    if (fdTwo == -1) {
-        perror("open pipeTwo for reading");
-        close(fdOne);
+    // Open the char device for writing
+    const int fdCharDev = open(CHAR_DEV, O_WRONLY);
+    if (fdCharDev == -1) {
+        perror("open /dev/packet_receiver");
+        for (int i = 0; i < argc; i++) {
+            close(fds[i]);
+        }
         return 1;
     }
+    printf("Opened %s for writing.\n", CHAR_DEV);
 
     // Dauerhafte Lese-Schleife
     while (1) {
-        char bufOne[128] = {0};
-        char bufTwo[128] = {0};
-
-        // =========== Lesevorgang PipeOne ===========
-        // read() kann blockieren, wenn noch keine Daten da sind,
-        // da wir blockierendes I/O verwenden.
-        // Wenn die Schreibseite offen bleibt, kommen periodisch neue Daten.
-        ssize_t bytesReadOne = read(fdOne, bufOne, sizeof(bufOne));
-        if (bytesReadOne > 0) {
-            // Gültige Daten -> ausgeben
-            printf("PipeOne CPU Temp: %s °C\n", bufOne);
-        } else if (bytesReadOne == 0) {
-            // EOF -> Schreibseite hat geschlossen
-            // -> ggf. Pipe erneut öffnen
-            printf("PipeOne closed by writer. Reopening...\n");
-            close(fdOne);
-
-            // Neu öffnen
-            fdOne = open(PIPE_ONE, O_RDONLY);
-            if (fdOne == -1) {
-                perror("Reopen pipeOne");
-                break;  // oder return 1;
-            }
-        } else {
-            // bytesReadOne < 0 => Fehler
-            if (errno == EINTR) {
-                // Signal unterbrochen, einfach weiter
-                continue;
-            }
-            perror("read pipeOne");
-            break; // oder return 1;
+        // =========== Lesevorgang Pipes ===========
+        for (int i = 0; i < argc; i++) {
+            read_pipe(fds[i], argv[i]);
         }
 
-        // =========== Lesevorgang PipeTwo ===========
-        ssize_t bytesReadTwo = read(fdTwo, bufTwo, sizeof(bufTwo));
-        if (bytesReadTwo > 0) {
-            printf("PipeTwo CPU Freq: %s GHz\n", bufTwo);
-        } else if (bytesReadTwo == 0) {
-            printf("PipeTwo closed by writer. Reopening...\n");
-            close(fdTwo);
-            fdTwo = open(PIPE_TWO, O_RDONLY);
-            if (fdTwo == -1) {
-                perror("Reopen pipeTwo");
-                break;
-            }
-        } else {
-            if (errno == EINTR) {
-                continue;
-            }
-            perror("read pipeTwo");
-            break;
-        }
+        // =========== Zum cdev schreiben ===========
+        send_package(package, fdCharDev);
 
         // Kurze Pause, damit CPU-Last nicht durch
         // Dauerschleife hochgetrieben wird
         usleep(200000); // 200 ms
     }
-
     // Sollte man jemals aus der while(1)-Schleife ausbrechen:
-    close(fdOne);
-    close(fdTwo);
+    for (int i = 0; i < argc; i++) {
+        close(fds[i]);
+    }
 
     return 0;
 }