diff --git a/checker/2-uart-checker/_test/solution.ko b/checker/2-uart-checker/_test/solution.ko
index 80c4a773b9b8eebe4dbbd66336e0f0fd3ca2cda4..996dd21ac572b8fd91bc14645e9bf6e57f4093d8 100644
Binary files a/checker/2-uart-checker/_test/solution.ko and b/checker/2-uart-checker/_test/solution.ko differ
diff --git a/checker/2-uart-checker/_test/test.c b/checker/2-uart-checker/_test/test.c
index ab42a72f4e7bc79bd44ee0c75fdfd05517cf1e46..5c0da2dc93023c09ba6e02bd5e32d54c3b62586b 100644
--- a/checker/2-uart-checker/_test/test.c
+++ b/checker/2-uart-checker/_test/test.c
@@ -42,13 +42,18 @@
 		exit(EXIT_FAILURE);			\
 	} while (0)
 
-#define test(d, v, e)			do_test((d), (v), (e), 0, 0)
-#define not_test(d, v, e)		do_test((d), (v), (e), 1, 0)
-#define fatal_test(d, v, e)		do_test((d), (v), (e), 0, 1)
+#define test(d, v, e, p)		do_test((d), (v), (e), 0, 0, (p))
+#define not_test(d, v, e, p)		do_test((d), (v), (e), 1, 0, (p))
+#define fatal_test(d, v, e,p)		do_test((d), (v), (e), 0, 1, (p))
 
-static int
-do_test(const char *description, int value, int expected, int negate, int fatal)
+/*
+ * if the test passes it will return 0
+ * if it fails it returns the number of points given as argument
+ */
+static float
+do_test(const char *description, int value, int expected, int negate, int fatal, float points)
 {
+	cnt += points;
 	int num_chars;
 
 	num_chars = printf("%s", description);
@@ -58,24 +63,24 @@ do_test(const char *description, int value, int expected, int negate, int fatal)
 	fflush(stdout);
 	if (!negate) {
 		if (value == expected) {
-			printf("passed\n");
+			printf("passed %.1f\n", points);
 			return 0;
 		} else {
-			printf("failed\n");
+			printf("failed 0\n");
 			if (fatal)
 				exit(EXIT_FAILURE);
 		}
 	} else {
 		if (value != expected) {
-			printf("passed\n");
+			printf("passed %.1f\n", points);
 			return 0;
 		} else {
-			printf("failed\n");
+			printf("failed 0\n");
 			if (fatal)
 				exit(EXIT_FAILURE);
 		}
 	}
-	return 1;
+	return points;
 }
 
 static void
@@ -112,100 +117,96 @@ remove_nodes(void)
 	unlink(UART10);
 }
 
-static int
+static float
 test1(void)
 {
-	int err = 0;
+	float total = 16;
 
 	test_title("Test 1. Module insertion and removal");
 
 	/* Insert module with default params and test. */
-	err |= fatal_test("insmod " MODULE_NAME ", default options",
-			system("insmod " MODULE_NAME ".ko"), 0);
-	err |= test("major",
+	total -= fatal_test("insmod " MODULE_NAME ", default options",
+			system("insmod " MODULE_NAME ".ko"), 0, 1);
+	total -= test("major",
 			system("cat /proc/devices | grep '" XSTR(COM1_MAJOR) " " MODULE_NAME "' >/dev/null 2>&1"),
-			0);
-	err |= test("ioports COM1",
+			0, 1);
+	total -= test("ioports COM1",
 			system("cat /proc/ioports | grep '03f8-03ff : " MODULE_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("ioports COM2",
+			0, 1);
+	total -= test("ioports COM2",
 			system("cat /proc/ioports | grep '02f8-02ff : " MODULE_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("interrupts COM1",
+			0, 1);
+	total -= test("interrupts COM1",
 			system("cat /proc/interrupts | grep '4:.*" MODULE_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("interrupts COM2",
+			0, 1);
+	total -= test("interrupts COM2",
 			system("cat /proc/interrupts | grep '3:.*" MODULE_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("rmmod", system("rmmod " MODULE_NAME), 0);
-	if (err)
-		return err;
+			0, 1);
+	total -= test("rmmod", system("rmmod " MODULE_NAME), 0, 0.5);
 
 	/* Insert module with different major. */
-	err |= fatal_test("insmod " MODULE_NAME ", major=" XSTR(COM2_MAJOR),
-			system("insmod " MODULE_NAME ".ko major=" XSTR(COM2_MAJOR)), 0);
-	err |= test("major",
+	total -= fatal_test("insmod " MODULE_NAME ", major=" XSTR(COM2_MAJOR),
+			system("insmod " MODULE_NAME ".ko major=" XSTR(COM2_MAJOR)), 0, 1);
+	total -= test("major",
 			system("cat /proc/devices | grep '" XSTR(COM2_MAJOR) " " MODULE_NAME "' >/dev/null 2>&1"),
-			0);
-	err |= test("rmmod", system("rmmod " MODULE_NAME), 0);
-	if (err)
-		return err;
+			0, 1);
+	total -= test("rmmod", system("rmmod " MODULE_NAME), 0, 0.5);
 
 	/* Insert module only for COM2, check that it works side by side
 	 * with solution.
 	 */
-	err |= fatal_test("insmod " MODULE_NAME ", COM2 only",
+	total -= fatal_test("insmod " MODULE_NAME ", COM2 only",
 			system("insmod " MODULE_NAME ".ko option=" XSTR(OPTION_COM2_ONLY)),
-			0);
-	err |= fatal_test("insmod " SOLUTION_NAME ", COM1 only",
+			0, 1);
+	total -= fatal_test("insmod " SOLUTION_NAME ", COM1 only",
 			system("insmod " SOLUTION_NAME ".ko option=" XSTR(OPTION_COM1_ONLY)),
-			0);
-	err |= test("ioports COM1",
+			0, 1);
+	total -= test("ioports COM1",
 			system("cat /proc/ioports | grep '03f8-03ff : " SOLUTION_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("ioports COM2",
+			0, 1);
+	total -= test("ioports COM2",
 			system("cat /proc/ioports | grep '02f8-02ff : " MODULE_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("interrupts COM1",
+			0, 1);
+	total -= test("interrupts COM1",
 			system("cat /proc/interrupts | grep '4:.*" SOLUTION_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("interrupts COM2",
+			0, 1);
+	total -= test("interrupts COM2",
 			system("cat /proc/interrupts | grep '3:.*" MODULE_NAME "' > /dev/null 2>&1"),
-			0);
-	err |= test("rmmod " MODULE_NAME, system("rmmod " MODULE_NAME), 0);
-	err |= test("rmmod " SOLUTION_NAME, system("rmmod " SOLUTION_NAME), 0);
+			0, 1);
+	total -= test("rmmod " MODULE_NAME, system("rmmod " MODULE_NAME), 0, 0.5);
+	total -= test("rmmod " SOLUTION_NAME, system("rmmod " SOLUTION_NAME), 0, 0.5);
 
-	return err;
+	return total;
 }
 
-static int
+static float
 test2(void)
 {
-	int err = 0;
+	float total = 5.5;
 	int fd;
 
 	test_title("Test 2. Invalid parameters");
 
 	/* Check ioctl sanity. */
-	err |= fatal_test("insmod", system("insmod " MODULE_NAME ".ko"), 0);
+	total -= fatal_test("insmod", system("insmod " MODULE_NAME ".ko"), 0, 1);
 	fd = open(UART0, O_RDWR);
 	if (fd == -1)
 		fail("open " UART0);
 #define ioctl_test(n)	test("invalid ioctl " XSTR((n)), \
-		ioctl(fd, UART16550_IOCTL_SET_LINE, (n)), -1)
-	err |= ioctl_test(0xdeadbeef);
-	err |= ioctl_test(0x1337cafe);
+		ioctl(fd, UART16550_IOCTL_SET_LINE, (n)), -1, 1)
+	total -= ioctl_test(0xdeadbeef);
+	total -= ioctl_test(0x1337cafe);
 #undef ioctl_test
-	err |= test("invalid ioctl wrong operation", ioctl(fd, 0xffff), -1);
+	total -= test("invalid ioctl wrong operation", ioctl(fd, 0xffff), -1, 1);
 	close(fd);
-	err |= test("rmmod", system("rmmod " MODULE_NAME), 0);
+	total -= test("rmmod", system("rmmod " MODULE_NAME), 0, 0.5);
 
 	/* Check invalid module parameters. */
-	err |= not_test("insmod " MODULE_NAME ", option=0xdeadbabe",
+	total -= not_test("insmod " MODULE_NAME ", option=0xdeadbabe",
 			system("insmod " MODULE_NAME ".ko option=0xdeadbabe"),
-			0);
+			0, 1);
 
-	return err;
+	return total;
 }
 
 /* Speed sets:
@@ -375,11 +376,12 @@ copy_test(int fd0, int fd1, int speed_set)
 	return system("diff " INFILE " " OUTFILE "> /dev/null 2> /dev/null");
 }
 
-static int
+static float
 generic_test(const char *reader, const char *writer, int speed_set,
 		int num_tests)
 {
-	int fd0, fd1, i, err = 0;
+	int fd0, fd1, i;
+	float total = num_tests * 1.5 + (reader != writer ? 6 : 4) * 0.5;
 	char dbuf[1024], cbuf[1024];
 	struct uart16550_line_info uli;
 
@@ -387,15 +389,15 @@ generic_test(const char *reader, const char *writer, int speed_set,
 		sprintf(dbuf, "insmod %s", reader);
 		sprintf(cbuf, "insmod %s.ko option=%d",
 				reader, OPTION_COM2_ONLY);
-		fatal_test(dbuf, system(cbuf), 0);
+		total -= fatal_test(dbuf, system(cbuf), 0, 0.5);
 		sprintf(dbuf, "insmod %s", writer);
 		sprintf(cbuf, "insmod %s.ko option=%d",
 				writer, OPTION_COM1_ONLY);
-		fatal_test(dbuf, system(cbuf), 0);
+		total -= fatal_test(dbuf, system(cbuf), 0, 0.5);
 	} else {
 		sprintf(dbuf, "insmod %s", reader);
 		sprintf(cbuf, "insmod %s.ko", reader);
-		fatal_test(dbuf, system(cbuf), 0);
+		total -= fatal_test(dbuf, system(cbuf), 0, 0.5);
 	}
 
 	gen_params(&uli, speed_set);
@@ -405,14 +407,14 @@ generic_test(const char *reader, const char *writer, int speed_set,
 	fd1 = open(UART1, O_RDONLY);
 	if (fd1 == -1)
 		fail("open " UART1);
-	err |= test("ioctl reader",
-			ioctl(fd1, UART16550_IOCTL_SET_LINE, &uli), 0);
-	err |= test("ioctl writer",
-			ioctl(fd0, UART16550_IOCTL_SET_LINE, &uli), 0);
+	total -= test("ioctl reader",
+			ioctl(fd1, UART16550_IOCTL_SET_LINE, &uli), 0, 0.5);
+	total -= test("ioctl writer",
+			ioctl(fd0, UART16550_IOCTL_SET_LINE, &uli), 0, 0.5);
 
 	for (i = 0; i < num_tests; i++) {
 		sprintf(dbuf, "test %02d", i + 1);
-		test(dbuf, copy_test(fd0, fd1, speed_set), 0);
+		total -= test(dbuf, copy_test(fd0, fd1, speed_set), 0, 1.5);
 	}
 
 	close(fd0);
@@ -421,17 +423,17 @@ generic_test(const char *reader, const char *writer, int speed_set,
 	if (reader != writer) {
 		sprintf(dbuf, "rmmod %s", reader);
 		sprintf(cbuf, "rmmod %s.ko", reader);
-		fatal_test(dbuf, system(cbuf), 0);
+		total -= fatal_test(dbuf, system(cbuf), 0, 0.5);
 		sprintf(dbuf, "rmmod %s", writer);
 		sprintf(cbuf, "rmmod %s.ko", writer);
-		fatal_test(dbuf, system(cbuf), 0);
+		total -= fatal_test(dbuf, system(cbuf), 0, 0.5);
 	} else {
 		sprintf(dbuf, "rmmod %s", reader);
 		sprintf(cbuf, "rmmod %s.ko", reader);
-		fatal_test(dbuf, system(cbuf), 0);
+		total -= fatal_test(dbuf, system(cbuf), 0, 0.5);
 	}
 
-	return err;
+	return total;
 }
 
 #define choose_one(rd, wr)		do {			\
@@ -445,7 +447,7 @@ generic_test(const char *reader, const char *writer, int speed_set,
 		}						\
 	} while (0)
 
-static int
+static float
 test3(void)
 {
 	const char *rd, *wr;
@@ -456,7 +458,7 @@ test3(void)
 	return generic_test(rd, wr, 0, 5);
 }
 
-static int
+static float
 test4(void)
 {
 	const char *rd, *wr;
@@ -467,7 +469,7 @@ test4(void)
 	return generic_test(rd, wr, 0, 5);
 }
 
-static int
+static float
 test5(void)
 {
 	const char *rd, *wr;
@@ -477,7 +479,7 @@ test5(void)
 	return generic_test(rd, wr, 0, 5);
 }
 
-static int
+static float
 test6(void)
 {
 	const char *rd, *wr;
@@ -487,7 +489,7 @@ test6(void)
 	return generic_test(rd, wr, 1, 5);
 }
 
-static int
+static float
 test7(void)
 {
 	const char *rd, *wr;
@@ -497,7 +499,7 @@ test7(void)
 	return generic_test(rd, wr, 1, 5);
 }
 
-static int
+static float
 test8(void)
 {
 	const char *rd, *wr;
@@ -507,7 +509,7 @@ test8(void)
 	return generic_test(rd, wr, 2, 5);
 }
 
-static int
+static float
 test9(void)
 {
 	const char *rd, *wr;
@@ -520,35 +522,26 @@ test9(void)
 int
 main(void)
 {
-	int num_passed = 0;
-	const int total = 9;
+	float num_passed = 0;
+	const int total = 92;
 
 	srand(time(NULL));
 	make_nodes();
 
-	if (test1() == 0)
-		num_passed++;
-	if (test2() == 0)
-		num_passed++;
-	if (test3() == 0)
-		num_passed++;
-	if (test4() == 0)
-		num_passed++;
-	if (test5() == 0)
-		num_passed++;
-	if (test6() == 0)
-		num_passed++;
-	if (test7() == 0)
-		num_passed++;
-	if (test8() == 0)
-		num_passed++;
-	if (test9() == 0)
-		num_passed++;
+	num_passed += test1();
+	num_passed += test2();
+	num_passed += test3();
+	num_passed += test4();
+	num_passed += test5();
+	num_passed += test6();
+	num_passed += test7();
+	num_passed += test8();
+	num_passed += test9();
 
 	remove_nodes();
 	unlink(INFILE);
 	unlink(OUTFILE);
-	printf("\nFinal score: %d/%d\n", num_passed, total);
+	printf("\nTotal: [%.1f/%d]\n", num_passed, total);
 
 	return 0;
 }
diff --git a/checker/checker.sh b/checker/checker.sh
index 27e16bf06747d00b59f3bd53adc598c1e9157902..4a29e71d2b9a23f61b298630436273e0d8270f97 100755
--- a/checker/checker.sh
+++ b/checker/checker.sh
@@ -141,7 +141,7 @@ run_checker()
 			done
 		fi
 
-		LINUX_ADD_CMDLINE="so2=$assignment" ./qemu/run-qemu.sh &> /dev/null &
+		LINUX_ADD_CMDLINE="so2=$assignment" make checker &> /dev/null &
 		
 		echo -n "CHECKER IS RUNNING"
 		while [ ! -f $finished ]