diff --git a/src/elements/media.rs b/src/elements/media.rs
index ece4fe0..c1a7d9c 100644
--- a/src/elements/media.rs
+++ b/src/elements/media.rs
@@ -37,7 +37,7 @@ use crate::parser::util::PropertyParser;
 use super::paragraph::Paragraph;
 use super::reference::Reference;
 
-#[derive(Debug)]
+#[derive(Debug, PartialEq, Eq)]
 pub enum MediaType {
 	IMAGE,
 	VIDEO,
@@ -148,14 +148,15 @@ impl Element for Medium {
 					.width
 					.as_ref()
 					.map_or(String::new(), |w| format!(r#" style="width:{w};""#));
-				result.push_str(format!(r#"<div class="medium" {width}>"#).as_str());
-				match self.media_type {
-					MediaType::IMAGE => result.push_str(
-						format!(r#"<a href="{0}"><img src="{0}"></a>"#, self.uri).as_str(),
-					),
-					MediaType::VIDEO => todo!(),
-					MediaType::AUDIO => todo!(),
-				}
+				result.push_str(format!(r#"<div class="medium"{width}>"#).as_str());
+				result += match self.media_type {
+					MediaType::IMAGE =>
+						format!(r#"<a href="{0}"><img src="{0}"></a>"#, self.uri),
+					MediaType::VIDEO =>
+						format!(r#"<video controls{width}><source src="{0}"></video>"#, self.uri),
+					MediaType::AUDIO =>
+						format!(r#"<audio controls src="{0}"{width}></audio>"#, self.uri),
+				}.as_str();
 
 				let caption = self
 					.caption
@@ -311,6 +312,8 @@ impl MediaRule {
 		match filename.split_at(sep + 1).1.to_ascii_lowercase().as_str() {
 			"png" | "apng" | "avif" | "gif" | "webp" | "svg" | "bmp" | "jpg" | "jpeg" | "jfif"
 			| "pjpeg" | "pjp" => Some(MediaType::IMAGE),
+			"mp4" | "m4v" | "webm" | "mov" => Some(MediaType::VIDEO),
+			"mp3" | "ogg" | "flac" | "wav" => Some(MediaType::AUDIO),
 			_ => None,
 		}
 	}
@@ -353,7 +356,7 @@ impl RegexRule for MediaRule {
 			matches.get(2).unwrap(),
 			MediaRule::validate_uri(matches.get(2).unwrap().as_str()),
 		) {
-			(_, Ok(uri)) => uri.to_string(),
+			(_, Ok(uri)) => util::process_escaped('\\', ")", uri),
 			(m, Err(err)) => {
 				reports.push(
 					Report::build(ReportKind::Error, token.source(), m.start())
@@ -514,6 +517,9 @@ impl RegexRule for MediaRule {
 
 #[cfg(test)]
 mod tests {
+	use crate::parser::langparser::LangParser;
+	use crate::parser::source::SourceFile;
+
 	use super::*;
 
 	#[test]
@@ -527,4 +533,34 @@ mod tests {
 		));
 		assert!(re.is_match_at("![r1](uri1)[props1] desc1\n![r2](uri2)[props2] desc2", 26));
 	}
+
+	#[test]
+	fn element_test() {
+		let source = Rc::new(SourceFile::with_content(
+			"".to_string(),
+			r#"
+![ref1](  image.png )[width = 200px, caption = Caption\,] Description
+![ref2]( ur\)i\\)[type=audio]
+				"#
+			.to_string(),
+			None,
+		));
+		let parser = LangParser::default();
+		let doc = parser.parse(source, None);
+
+		let borrow = doc.content().borrow();
+		let group = borrow.first().as_ref().unwrap().as_container().unwrap();
+
+		let first = group.contained()[0].downcast_ref::<Medium>().unwrap();
+		assert_eq!(first.reference, "ref1");
+		assert_eq!(first.uri, "image.png");
+		assert_eq!(first.media_type, MediaType::IMAGE);
+		assert_eq!(first.width, Some("200px".to_string()));
+		assert_eq!(first.caption, Some("Caption,".to_string()));
+
+		let second = group.contained()[1].downcast_ref::<Medium>().unwrap();
+		assert_eq!(second.reference, "ref2");
+		assert_eq!(second.uri, "ur)i\\");
+		assert_eq!(second.media_type, MediaType::AUDIO);
+	}
 }
diff --git a/src/elements/raw.rs b/src/elements/raw.rs
index a1b0309..34d0760 100644
--- a/src/elements/raw.rs
+++ b/src/elements/raw.rs
@@ -273,3 +273,35 @@ impl RegexRule for RawRule {
 		bindings
 	}
 }
+
+#[cfg(test)]
+mod tests {
+	use super::*;
+	use crate::compiler::compiler::Target;
+	use crate::parser::langparser::LangParser;
+	use crate::parser::source::SourceFile;
+
+	#[test]
+	fn raw_tests() {
+		let source = Rc::new(SourceFile::with_content(
+			"".to_string(),
+			r#"
+Break{?[kind=block]<RAW>?}NewParagraph
+				"#
+			.to_string(),
+			None,
+		));
+		let parser = LangParser::default();
+		let compiler = Compiler::new(Target::HTML, None);
+		let doc = parser.parse(source, None);
+
+		let borrow = doc.content().borrow();
+		let found = borrow
+			.iter()
+			.filter_map(|e| e.downcast_ref::<Raw>())
+			.collect::<Vec<_>>();
+
+		assert_eq!(found[0].compile(&compiler, &*doc), Ok("<RAW>".to_string()));
+		//assert_eq!(found[1].compile(&compiler, &*doc), Ok("<RAW>".to_string()));
+	}
+}
diff --git a/src/parser/util.rs b/src/parser/util.rs
index dcfa20d..e79748d 100644
--- a/src/parser/util.rs
+++ b/src/parser/util.rs
@@ -128,7 +128,7 @@ pub fn process_escaped<S: AsRef<str>>(escape: char, token: &'static str, content
 		}
 	}
 	// Add trailing escapes
-	(0..escaped).for_each(|_| processed.push('\\'));
+	(0..escaped / 2).for_each(|_| processed.push('\\'));
 
 	processed
 }
@@ -458,6 +458,8 @@ mod tests {
 			process_escaped('\\', "]", "Unescaped \\\\\\\\]"),
 			"Unescaped \\\\\\\\]".to_string()
 		);
+		assert_eq!(process_escaped('\\', ")", "A\\)B\\"), "A)B".to_string(),);
+		assert_eq!(process_escaped('\\', ")", "A\\)B\\\\"), "A)B\\".to_string(),);
 	}
 
 	#[test]