diff --git a/header/vectors.h b/header/vectors.h
index 8c3dfca86a783d4995bea46f38b93eb249ccfe8a..fdef828975bd4c58ec6ac706537de5f1ab2269aa 100644
--- a/header/vectors.h
+++ b/header/vectors.h
@@ -31,5 +31,6 @@ void vector_empty(vector vec);
 void vector_free(vector vec);
 void vector_print(vector vec, void (*print)(type));
 vector vector_map(vector vec, type (*f)(type));
+vector vector_filter(vector vec, bool (*f)(type));
 
 #endif
\ No newline at end of file
diff --git a/src/test_vectors.c b/src/test_vectors.c
index 01db5a0c5d23162a59ac6de7a1f3ffe386622e17..bda3a8743aa5897026384d706920d02fc5a1c8c2 100644
--- a/src/test_vectors.c
+++ b/src/test_vectors.c
@@ -12,6 +12,7 @@
 
 void print_type(type val);
 int times_two(type a);
+bool lower_than_five(type a);
 
 int main()
 {	
@@ -63,12 +64,17 @@ int main()
 	//Test Vector map
 	vector test_2 = vector_map(test, &times_two);
 	vector_print(test_2, &print_type);
+	printf("\n");
 
 	//Test Vector filter
+	vector test_3 = vector_filter(test_2, lower_than_five);
+	vector_print(test_3, &print_type);
+	printf("\n");
 
 	//Test Vector Free
 	vector_free(test);
 	vector_free(test_2);
+	vector_free(test_3);
 	
 	return 0;
 }
@@ -81,4 +87,9 @@ void print_type(type val)
 int times_two(type a) 
 {
     return 2 * a;
+}
+
+bool lower_than_five(type a) 
+{
+    return (a < 5);
 }
\ No newline at end of file
diff --git a/src/vectors.c b/src/vectors.c
index 92590bb2a5e415a96972390e5c8eb38c82a9e800..83a7159a73ff9e87fb2f8d6a8cac77ec7b83fa6c 100644
--- a/src/vectors.c
+++ b/src/vectors.c
@@ -147,3 +147,15 @@ vector vector_map(vector vec, type (*f)(type))
 	return new_vec;
 }
 
+vector vector_filter(vector vec, bool (*f)(type))
+{
+	vector new_vec = vector_create();
+	for (int i = 0; i < vec->length; i++)
+	{
+		if(f(vec->content[i]))
+		{
+			vector_push(new_vec, vec->content[i]);
+		}
+	}
+	return new_vec;
+}
\ No newline at end of file