diff --git a/.cmake-format.json b/.cmake-format.json
deleted file mode 100644
index f0c505c31c5b51fea610bf3c6ee6003707c326bb..0000000000000000000000000000000000000000
--- a/.cmake-format.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-	"format": {
-		"line_width": 100,
-		"use_tabchars": true
-	}
-}
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index f6f53d44dbfe6cfca33093a92300ee68cac5e151..0000000000000000000000000000000000000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-cmake_minimum_required(VERSION 3.14)
-project(praktikum)
-
-# Always create a compile_commands.json for clangd
-set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-
-# Enable optimization by default
-if(NOT CMAKE_BUILD_TYPE)
-	set(CMAKE_BUILD_TYPE Release)
-endif()
-
-# Enable LTO
-set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..39cd472e4971204ad2a4985da8539e3b2d169944
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,11 @@
+project(
+	'praktikum',
+	'c',
+	default_options: [
+		'warning_level=3',
+		'buildtype=release',
+		'b_lto=true',
+	],
+)
+
+subdir('src')
diff --git a/src/benchmarks/meson.build b/src/benchmarks/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..cd38a8b2e1c467ce270bdee29ef41136a8d7f6b5
--- /dev/null
+++ b/src/benchmarks/meson.build
@@ -0,0 +1 @@
+subdir('zellularautomat')
diff --git a/src/benchmarks/zellularautomat/c/Makefile b/src/benchmarks/zellularautomat/c/Makefile
deleted file mode 100644
index 8637161911bd613b8102f2182cd182495d1c02c8..0000000000000000000000000000000000000000
--- a/src/benchmarks/zellularautomat/c/Makefile
+++ /dev/null
@@ -1,60 +0,0 @@
-BASE_CC=gcc
-
-COMMON_CFLAGS=-O2
-COMMON_LDFLAGS=-lcrypto -lrt
-
-BASE_CFLAGS=-Wall -std=gnu99 -pedantic
-
-OMP_CFLAGS=-fopenmp
-
-C_DEPS=ca_common.c random.c
-
-TARGETS=ca_openmp
-
-.PHONY: all
-all: $(TARGETS)
-
-.PHONY: cpu
-cpu: ca_openmp
-
-ca_openmp: ca_openmp.c $(C_DEPS)
-	$(BASE_CC) $(COMMON_CFLAGS) $(BASE_CFLAGS) $(OMP_CFLAGS) $^ $(COMMON_LDFLAGS) -o $@
-
-.PHONY: test
-
-test: $(TARGETS)
-	@for ITS in 10 31 57 100; do \
-		for LINES in 10 33 47 100; do \
-			echo "$$LINES lines, $$ITS iterations"; \
-			for BINARY in $^; do printf '%-10s\t' $$BINARY; ./$$BINARY $$LINES $$ITS; done; \
-		done \
-	done
-
-.PHONY: bench
-
-bench: ca_openmp
-	@for ITS in 128 256 512; do \
-		for LINES in 1000 10000 50000; do \
-			echo "$$LINES lines, $$ITS iterations"; \
-			for BINARY in $^; do printf '%-10s\t' $$BINARY; time ./$$BINARY $$LINES $$ITS; done; \
-		done \
-	done
-
-.PHONY: omp_scaling
-
-omp_scaling: ca_openmp
-	@for ITS in 128 256 512; do \
-		for LINES in 1000 10000 50000; do \
-			echo "$$LINES lines, $$ITS iterations"; \
-			for THREADS in `seq \`nproc\``; do \
-				printf "$$THREADS threads\t"; \
-				OMP_NUM_THREADS=$$THREADS ./ca_openmp $$LINES $$ITS; \
-			done; \
-		done; \
-	done
-
-.PHONY: clean
-
-clean:
-	rm -f *.o
-	rm -f $(TARGETS)
diff --git a/src/benchmarks/zellularautomat/c/meson.build b/src/benchmarks/zellularautomat/c/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..4ff650e70fd0ad2125c578f27e36d0538bcd8e2f
--- /dev/null
+++ b/src/benchmarks/zellularautomat/c/meson.build
@@ -0,0 +1,24 @@
+cc = meson.get_compiler('c')
+
+sources = [
+	'ca_common.c',
+	'ca_openmp.c',
+	'random.c',
+]
+
+dependencies = [
+	dependency('openmp'),
+	cc.find_library('crypto'),
+	cc.find_library('rt'),
+]
+
+options = [
+	'c_std=c99',
+]
+
+executable(
+	'zellularautomat-c',
+	sources,
+	dependencies: dependencies,
+	override_options: options,
+)
diff --git a/src/benchmarks/zellularautomat/meson.build b/src/benchmarks/zellularautomat/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..76d1974ff05dc93d7fe7516692cfeb139c10ce0a
--- /dev/null
+++ b/src/benchmarks/zellularautomat/meson.build
@@ -0,0 +1 @@
+subdir('c')
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..46c5c1ca6500e36bf016b2647158fad0c1e0da6d
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1 @@
+subdir('benchmarks')