diff --git a/src/base4.rs b/src/base4.rs
index cddd51b..68f8c9a 100644
--- a/src/base4.rs
+++ b/src/base4.rs
@@ -1,10 +1,9 @@
-use crate::core;
+use crate::anybase;
 
 pub fn alphabet() -> Vec<String> {
-    return vec!["meow", "mrrp", "mreow", "mrow"]
-        .into_iter()
-        .map(|a| a.to_string())
-        .collect();
+    let mut tmp = anybase::alphabet();
+    tmp.truncate(4);
+    return tmp;
 }
 
 /// How many words long a character is when translated to catspeak
@@ -12,42 +11,16 @@ pub fn char_length() -> u32 {
     return 3;
 }
 
+
 /// Encodes english text into base 4 catspeak
-/// 
+///
 /// ```
 /// use cat2text::base4::encode;
-/// 
+///
 /// assert_eq!("meow mreow mrrp; meow mrow meow meow mrow mrow mrrp mrrp mreow meow mrrp mrrp; meow meow mrow meow meow mrrp mrrp mrrp meow mrrp meow mrow", encode("i love cats".to_string()))
 /// ```
 pub fn encode(text: impl AsRef<str>) -> String {
-    let text = text.as_ref();
-    // makes it lowercase and split by spaces
-    let words: Vec<String> = text
-        .to_ascii_lowercase()
-        .split(" ")
-        .map(|item| return item.to_string())
-        .collect();
-    let mut words_as_bytes: Vec<Vec<u8>> = Vec::new();
-    for word in words {
-        // convert to bytes then subtract by 96
-        words_as_bytes.push(word.as_bytes().into_iter().map(|item| item - 96).collect());
-    }
-
-    let mut results: Vec<Vec<String>> = Vec::new();
-    for i in 0..words_as_bytes.len() {
-        results.push(Vec::new());
-        for j in 0..words_as_bytes[i].len() {
-            results[i].push(core::num_to_cat(
-                words_as_bytes[i][j] as u32,
-                alphabet(),
-                char_length(),
-            ));
-        }
-    }
-
-    let results: Vec<String> = results.into_iter().map(|item| item.join(" ")).collect();
-    let results = results.join("; ");
-    return results;
+    return anybase::encode(text.as_ref().to_string(), 4, char_length());
 }
 
 /// Decodes base 4 catspeak to english text
@@ -58,70 +31,32 @@ pub fn encode(text: impl AsRef<str>) -> String {
 /// assert_eq!("i love cats", decode("meow mreow mrrp; meow mrow meow meow mrow mrow mrrp mrrp mreow meow mrrp mrrp; meow meow mrow meow meow mrrp mrrp mrrp meow mrrp meow mrow".to_string()));
 /// ```
 pub fn decode(text: String) -> String {
-    let catspeak_words: Vec<String> = text
-        .split("; ")
-        .map(|item| item.to_string())
-        .collect();
-    let mut output: String = String::new();
-    for engl_word in catspeak_words {
-        let mut word = String::new();
-        for engl_letter in core::split_every_x(engl_word, 3) {
-            let char_num = core::cat_to_num(
-                engl_letter
-                    .split(" ")
-                    .map(|item| item.to_string())
-                    .collect(),
-                alphabet(),
-                char_length(),
-            );
-            word += String::from_utf8(vec![(char_num + 96) as u8])
-                .unwrap()
-                .as_str();
-        }
-        word += " ";
-        output += word.as_str();
-    }
-
-    return output.trim().to_string();
+    return anybase::decode(text, 4, char_length())
 }
 
-
 pub mod bytes {
-    use crate::core;
-    use crate::base4::alphabet;
-/// Encodes from bytes into catspeak
-/// 
-/// ```
-/// use cat2text::base4::bytes::encode;
-/// 
-/// assert_eq!("meow meow mreow mrrp meow meow meow mrrp", encode(&[9, 1]));
-/// ```
-pub fn encode(bytes: impl AsRef<[u8]>) -> String {
-    let mut output = String::new();
-    for byte in bytes.as_ref() {
-        output += core::num_to_cat(*byte as u32, alphabet(), 4).as_str();
-        output += " ";
+    use crate::anybase;
+    use super::char_length;
+    /// Encodes from bytes into catspeak
+    ///
+    /// ```
+    /// use cat2text::base4::bytes::encode;
+    ///
+    /// assert_eq!("meow meow mreow mrrp meow meow meow mrrp", encode(&[9, 1]));
+    /// ```
+    pub fn encode(bytes: impl AsRef<[u8]>) -> String {
+        anybase::bytes::encode(bytes, 4, super::char_length())
     }
-    return output.trim().to_string();
-}
 
-/// Decodes catspeak into bytes
-///
-/// ```
-/// use cat2text::base4::bytes::decode;
-///
-/// assert_eq!(vec![9, 1], decode("meow meow mreow mrrp meow meow meow mrrp".to_string()));
-/// ```
-pub fn decode(text: String) -> Vec<u8> {
-    let mut output: Vec<u8> = Vec::new();
-    for byte in core::split_every_x(text.clone(), 4) {
-        output.push(core::cat_to_num(
-            byte.split(" ").map(|item| item.to_string()).collect(),
-            alphabet(),
-            4,
-        ) as u8);
+    /// Decodes catspeak into bytes
+    ///
+    /// ```
+    /// use cat2text::base4::bytes::decode;
+    ///
+    /// assert_eq!(vec![9, 1], decode("meow meow mreow mrrp meow meow meow mrrp".to_string()));
+    /// ```
+    pub fn decode(text: String) -> Vec<u8> {
+        anybase::bytes::decode(text, 4, super::char_length())
     }
-    return output;
 }
-
-}
\ No newline at end of file
+// ..............d......4..............a.q..a....y..d..w...a............
\ No newline at end of file