diff --git a/src/io.c b/src/io.c
index 3bd31f2965d61ca178dac23b70a5633636dd74e0..4184aa1b8c45ad118a660d08986fc7e2c4cb583b 100644
--- a/src/io.c
+++ b/src/io.c
@@ -21,10 +21,10 @@ fpt_t read_fpt(FILE* file) {
 
 
 vector_int_t* line_to_vector_int(char* line, const size_t dim) {
-	vector_int_t* vector = vector_int_create(dim);
+	vector_int_t* vector = vector_create_int(dim);
 	char* tgt = line;
 	char* token = NULL;
-	for (size_t i = 0; i < vector->dim; ++i, tgt = NULL) {
+	for (size_t i = 0; i < dim; ++i, tgt = NULL) {
 		token = strtok(tgt, ",");
 		// strtol returns 0 if number not read, which is the desired behaviour:
 		vector->data[i] = token != NULL ? strtol(token, NULL, 10) : 0;
@@ -33,10 +33,10 @@ vector_int_t* line_to_vector_int(char* line, const size_t dim) {
 }
 
 vector_fpt_t* line_to_vector_fpt(char* line, const size_t dim) {
-	vector_fpt_t* vector = vector_fpt_create(dim);
+	vector_fpt_t* vector = vector_create_fpt(dim);
 	char* tgt = line;
 	char* token = NULL;
-	for (size_t i = 0; i < vector->dim; ++i, tgt = NULL) {
+	for (size_t i = 0; i < dim; ++i, tgt = NULL) {
 		token = strtok(tgt, ",");
 		// strtol returns 0 if number not read, which is the desired behaviour:
 		vector->data[i] = token != NULL ? strtod(token, NULL) : 0;
@@ -74,25 +74,34 @@ list_points_fpt_t* get_vector_list_fpt(FILE* ifile, const size_t dim) {
 }
 
 
-static int _point_compare_clusters_int_(const void* p1, const void* p2) {
-	const point_int_t* point1 = (const point_int_t*) p1;
-	const point_int_t* point2 = (const point_int_t*) p2;
-	return point1->cluster < point2->cluster ? -1 : point1->cluster > point2->cluster ? 1 : 0;
+void io_write_clusters_to_file_int(FILE* file, cluster_int_t** clusters, const size_t cluster_count) {
+	for (size_t i = 0; i < cluster_count; ++i) {
+		fprintf(file, "\n*\n");
+		list_points_node_int_t* node = clusters[i]->points->head;
+		while (node != NULL) {
+			const vector_int_t point = *(node->point);
+			fprintf(file, "%ld", point.data[0]);
+			for (size_t p = 1; p < point.dim; ++p) {
+				fprintf(file, " , %ld", point.data[p]);
+			}
+			fprintf(file, "\n");
+			node = node->next;
+		}
+	}
 }
 
-
-void io_write_clusters_to_file_int(FILE* file, point_int_t** points, const size_t point_count) {
-	qsort(points, point_count, sizeof(point_int_t*), _point_compare_clusters_int_);  // group points by cluster
-	vector_int_t* current_cluster = NULL;
-	point_int_t* current_point = NULL;
-	for (size_t i = 0; i < point_count; ++i) {
-		current_point = points[i];
-		if (current_point->cluster != current_cluster) {
-			current_cluster = current_point->cluster;
-			fprintf(file, "\n*\n");
+void io_write_clusters_to_file_fpt(FILE* file, cluster_fpt_t** clusters, const size_t cluster_count) {
+	for (size_t i = 0; i < cluster_count; ++i) {
+		fprintf(file, "\n*\n");
+		list_points_node_fpt_t* node = clusters[i]->points->head;
+		while (node != NULL) {
+			const vector_fpt_t point = *(node->point);
+			fprintf(file, "%lf", point.data[0]);
+			for (size_t p = 1; p < point.dim; ++p) {
+				fprintf(file, " , %lf", point.data[p]);
+			}
+			fprintf(file, "\n");
+			node = node->next;
 		}
-		vector_print_to_file_int(file, current_point->vector);
 	}
 }
-
-void io_write_clusters_to_file_fpt(FILE* file, point_fpt_t** points, const size_t point_count) {}
diff --git a/src/io.h b/src/io.h
index 2487aabd2fb98b8a07379f275352d5bdc020500b..a5d5957a012679020123f0a0f125bed738ef85d2 100644
--- a/src/io.h
+++ b/src/io.h
@@ -2,6 +2,7 @@
 #define PROG_KMEANS_IO_H
 
 #include <stdio.h>
+#include "cluster.h"
 #include "common.h"
 #include "linkedlist.h"
 #include "vector.h"
@@ -22,9 +23,9 @@ list_points_int_t* get_vector_list_int(FILE* ifile, const size_t dim);
 list_points_fpt_t* get_vector_list_fpt(FILE* ifile, const size_t dim);
 
 
-void io_write_clusters_to_file_int(FILE* file, point_int_t** points, const size_t point_count);
+void io_write_clusters_to_file_int(FILE* file, cluster_int_t** clusters, const size_t cluster_count);
 
-void io_write_clusters_to_file_fpt(FILE* file, point_fpt_t** points, const size_t point_count);
+void io_write_clusters_to_file_fpt(FILE* file, cluster_fpt_t** clusters, const size_t cluster_count);
 
 
 #endif //PROG_KMEANS_IO_H