diff --git a/examples/flit.toml b/examples/flit.toml
index e4111f692b74203702ee22061babbe3adb74deee..69ecdeab01f076334dce91f3cc77c3098ffcd9e5 100644
--- a/examples/flit.toml
+++ b/examples/flit.toml
@@ -5,10 +5,17 @@ template ='''
 	<button id="start_game">Start Game</button>
 </div>
 <script>
-let content = `{{{}}}`;
 document.addEventListener('DOMContentLoaded', () => {
   	document.getElementById('start_game').addEventListener('click', function() {
-  		this.innerHTML = content
+  		let element = document.createElement('{{{TAG}}}');
+  		let attr_string = `{{{ATTR}}}`
+  		attr_string.split(' ').forEach(function(attr) {
+  			let attr_array = attr.split('=');
+  			element.setAttribute(attr_array[0], attr_array[1].slice(1, -1));
+  		});
+  		element.innerHTML = `{{{CONTENT}}}`;
+  		document.body.appendChild(element);
+
   	});
 });
 </script>'''
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index be0cfd3e7b374c2c30be8c263432313632defae1..478b4e945ee99d6e1acea3ac91856797c1bb3360 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,9 +2,12 @@ use clap::Parser;
 use lol_html::html_content::ContentType;
 use lol_html::{element, rewrite_str, text, RewriteStrSettings};
 use serde::{Deserialize, Serialize};
+use std::borrow::{Borrow, BorrowMut};
+use std::cell::RefCell;
 use std::collections::HashMap;
 use std::fs::File;
 use std::io::{Read, Write};
+use std::rc::Rc;
 use std::sync::{Arc, Mutex};
 use thiserror::Error;
 
@@ -78,12 +81,14 @@ fn main() -> AppResult<()> {
 				.into_iter()
 				.flat_map(|(selector, op)| match op {
 					ConfigEntry::Wrap { template } => {
-						let el_buffer = Arc::new(Mutex::new(String::new()));
-						let txt_buffer = el_buffer.clone();
+						let mut tag_name = Arc::new(Mutex::new(String::new()));
+						let mut attributes = Arc::new(Mutex::new(String::new()));
+						let mut content = Arc::new(Mutex::new(String::new()));
 
+						let el_content = content.clone();
 						vec![
 							element!(selector, move |e| {
-								el_buffer.lock().unwrap().clear();
+								tag_name.lock().unwrap().push_str(&e.tag_name());
 
 								let attr_list = e
 									.attributes()
@@ -92,27 +97,27 @@ fn main() -> AppResult<()> {
 									.collect::<Vec<String>>()
 									.join(" ");
 
-								el_buffer.lock().unwrap().push_str(&format!(
-									"<{} {}>",
-									e.tag_name(),
-									attr_list
-								));
-
+								attributes.lock().unwrap().push_str(&attr_list);
 								e.remove();
-								let inner_buffer = el_buffer.clone();
+
 								let inner_template = template.clone();
+								let inner_tag_name = tag_name.clone();
+								let inner_attr = attributes.clone();
+								let inner_content = el_content.clone();
 								e.on_end_tag(move |end_tag| {
-									inner_buffer
-										.lock()
-										.unwrap()
-										.push_str(&format!("</{}>", end_tag.name()));
-									end_tag.after(
-										&inner_template.replace(
-											"{{{}}}",
-											inner_buffer.lock().unwrap().as_str(),
-										),
-										ContentType::Html,
+									let mut value = inner_template.replace(
+										"{{{TAG}}}",
+										inner_tag_name.clone().lock().unwrap().as_str(),
+									);
+									let mut value = value
+										.replace("{{{ATTR}}}", inner_attr.lock().unwrap().as_str());
+									let mut value = value.replace(
+										"{{{CONTENT}}}",
+										inner_content.lock().unwrap().as_str(),
 									);
+
+									end_tag.after(&value, ContentType::Html);
+
 									end_tag.remove();
 									Ok(())
 								})
@@ -120,7 +125,7 @@ fn main() -> AppResult<()> {
 								Ok(())
 							}),
 							text!(selector, move |t| {
-								txt_buffer.lock().unwrap().push_str(t.as_str());
+								content.lock().unwrap().push_str(t.as_str());
 								t.remove();
 								Ok(())
 							}),