diff --git a/ex2/T3.c b/ex2/T3.c
index a8a154e70d7bd8da4578c8c4c659d1f2fecff4e9..0d03106c6e048ff8409d4576b6a69a060006d1c5 100644
--- a/ex2/T3.c
+++ b/ex2/T3.c
@@ -5,8 +5,61 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+void* runner(void* pid) {
+    printf("My TID is: %ld\nMy PID is: %d\n", pthread_self(), *((int*) pid));
+    pthread_exit(0);
+}
+
+pthread_t thread_gen(int* pid) {
+    pthread_t tid;
+    pthread_attr_t attr;
+    pthread_attr_init(&attr);
+    pthread_create(&tid, &attr, runner, (void*) pid);
+    return tid;
+}
+
 int main() {
-    // TODO: Fork multiple processes here
-    // TODO: Each process with a different number of threads
-    // TODO: Each thread should print the PID and TID
+    int cpid1, cpid2;
+    switch (cpid1 = fork()) {
+        case -1 :
+            perror("error");
+            exit(EXIT_FAILURE);
+        case 0 :
+            // Child process:
+            pthread_t tid1, tid2;
+            tid1 = thread_gen(&cpid1);
+            tid2 = thread_gen(&cpid1);
+            pthread_join(tid1, NULL);
+            pthread_join(tid2, NULL);
+            exit(0);
+        default :
+            // Parent process:
+            int status;
+            if (wait(&status) == -1) {
+                perror("error");
+            }
+    }
+    switch (cpid2 = fork()) {
+        case -1 :
+            perror("error");
+            exit(EXIT_FAILURE);
+        case 0 :
+            // Child process:
+            pthread_t tid1, tid2, tid3;
+            tid1 = thread_gen(&cpid2);
+            tid2 = thread_gen(&cpid2);
+            tid3 = thread_gen(&cpid2);
+            pthread_join(tid1, NULL);
+            pthread_join(tid2, NULL);
+            pthread_join(tid3, NULL);
+            exit(0);
+        default :
+            // Parent process:
+            int status;
+            if (wait(&status) == -1) {
+                perror("error");
+            }
+    }
+
+    return 0;
 }
\ No newline at end of file