diff --git a/src/code_templates/mod.rs b/src/code_templates/mod.rs
index d53065cc04917a526d9e6a109809dc9900e8847c..33d551f57120a96fcbd670ea37b62e41007fa971 100644
--- a/src/code_templates/mod.rs
+++ b/src/code_templates/mod.rs
@@ -1,33 +1,44 @@
 use simplegen::CodeBuffer;
 
-pub fn template_for_header(filename: &str) -> CodeBuffer {
+pub fn template_for_header(filename: &mut String) -> CodeBuffer {
     let mut buffer = CodeBuffer::new(4);
 
-    let mut mod_filename = filename.to_string();
-
     // Removing extension from filename
     for _ in 0..2 {
-        mod_filename.pop();
+        filename.pop();
     }
 
-    buffer.println(format!("#ifndef _{}_H_", mod_filename.to_uppercase()).as_str());
-    buffer.println(format!("#define _{}_H_", mod_filename.to_uppercase()).as_str());
+    buffer.println(format!("#ifndef _{}_H_", filename.to_uppercase()).as_str());
+    buffer.println(format!("#define _{}_H_", filename.to_uppercase()).as_str());
     buffer.println("");
-    buffer.println(format!("typedef struct _{}_t", mod_filename.to_lowercase()).as_str());
+    buffer.println(format!("typedef struct _{}_t", filename.to_lowercase()).as_str());
     buffer.println("{");
     buffer.println("");
-    buffer.println(format!("}} {}_t;", mod_filename.to_lowercase()).as_str());
+    buffer.println(format!("}} {}_t;", filename.to_lowercase()).as_str());
     buffer.println("");
     buffer.println("#endif");
 
     return buffer;
 }
 
-pub fn template_for_main() -> CodeBuffer {
+pub fn template_for_implementation(hfile_name: &mut String) -> CodeBuffer {
+    let mut buffer = CodeBuffer::new(4);
+
+    for _ in 0..1 {
+        hfile_name.pop();
+    }
+
+    buffer.println(format!("#include \"{}h\"", hfile_name.to_lowercase()).as_str());
+
+    return buffer;
+}
+
+pub fn template_for_main(path_to_hfile: String) -> CodeBuffer {
     let mut buffer = CodeBuffer::new(4);
 
     buffer.println("#include <stdio.h>");
     buffer.println("#include <stdlib.h>");
+    buffer.println(format!("#include \"{}\"", path_to_hfile).as_str());
     buffer.println("");
     buffer.println("int main()");
     buffer.println("{");
@@ -37,3 +48,46 @@ pub fn template_for_main() -> CodeBuffer {
 
     return buffer;
 }
+
+pub fn template_for_makefile_algo(hfile_name: &mut String, main_name: &mut String) -> CodeBuffer {
+    let mut buffer = CodeBuffer::new(4);
+
+    // Removing extensions
+    for _ in 0..2 {
+        hfile_name.pop();
+        main_name.pop();
+    }
+
+    buffer.println("# This file was automatically generated by `create-prog-app`");
+    buffer.println("CC:=gcc");
+    buffer.println("CFLAGS:=-Wall -Wextra -g -pedantic -fsanitize=address -fsanitize=leak -lm");
+    buffer.println("VPATH:=struct");
+    buffer.println("# Due to the oddity of MAKE and the fact you cannot generate \"true\" tabs,");
+    buffer.println("# the \"tab\" character is replaced by spaces.");
+    buffer.println("# `create-prog-app` STRONGLY advises you not to change/modify the line below");
+    buffer.println(".RECIPEPREFIX:=$(.RECIPEPREFIX) ");
+    buffer.println("");
+    buffer.println(
+        format!(
+            "{}: {}.o {}.o",
+            main_name.to_lowercase(),
+            main_name.to_lowercase(),
+            hfile_name.to_lowercase()
+        )
+        .as_str(),
+    );
+    buffer.println_right("$(CC) $(CFLAGS) $^ -o $@");
+    buffer.println_left("");
+    buffer.println(format!("{0}.o: {0}.c", main_name.to_lowercase()).as_str());
+    buffer.println_right("$(CC) $(CFLAGS) -c $<");
+    buffer.println_left("");
+    buffer.println(format!("{0}.o: {0}.c {0}.h", hfile_name.to_lowercase()).as_str());
+    buffer.println_right("$(CC) $(CFLAGS) -c $<");
+    buffer.println_left("");
+    buffer.println("clean:");
+    buffer.println_right(format!("rm -f *.o {}", main_name.to_lowercase()).as_str());
+    buffer.println_left("");
+    buffer.println(format!("rebuild: clean {}", main_name.to_lowercase()).as_str());
+
+    return buffer;
+}