diff --git a/src/main.rs b/src/main.rs
index b8d0cc219c7c70b5c3e0cf791b001e553b83ad69..1ce99885332f93719ce6e09faf6722c47b8aaef2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -60,7 +60,9 @@ async fn main() -> std::io::Result<()> {
                             .wrap(AuthService {})
                             .service(service::admin_workspace)
                             .service(service::add_page)
-                            .service(service::get_page_data),
+                            .service(service::get_page_data)
+                            .service(service::files::post_files)
+                            .service(service::files::delete_static_file),
                     ),
             )
             .service(service::files::favicon)
diff --git a/src/service/admin.rs b/src/service/admin.rs
index d10c659fbeabc6da0a1bd1bd3f1302fc0db84747..76fe7a2f1dd1b822d826b811891e284134f4b2f3 100644
--- a/src/service/admin.rs
+++ b/src/service/admin.rs
@@ -1,8 +1,7 @@
-use crate::website::{Page, WebSite};
 use crate::AppState;
 use actix_web::{
     get, post,
-    web::{Data, Form, Json},
+    web::{Data, Form},
     HttpRequest, HttpResponse,
 };
 use std::sync::RwLock;
@@ -89,42 +88,3 @@ pub async fn admin_login() -> HttpResponse {
 ",
     )
 }
-
-#[derive(serde::Deserialize, Clone)]
-pub struct AddPageData {
-    parent_page_id: usize,
-    new_page: Page,
-}
-
-#[post("/add-page")]
-pub async fn add_page(
-    website: Data<RwLock<WebSite>>,
-    add_page_data: Json<AddPageData>,
-) -> HttpResponse {
-    match website
-        .write()
-        .expect("Couldn't acquire website write lock")
-        .add_page(add_page_data.parent_page_id, add_page_data.new_page.clone())
-    {
-        Ok(()) => HttpResponse::Ok().finish(),
-        Err(msg) => {
-            HttpResponse::BadRequest().body(format!("Error adding new page to website - {}", msg))
-        }
-    }
-}
-
-#[get("/page-data/{id}")]
-pub async fn get_page_data(
-    website: Data<RwLock<WebSite>>,
-    id: actix_web::web::Path<usize>,
-) -> HttpResponse {
-    let id = id.into_inner();
-    match website
-        .read()
-        .expect("Couldn't acquire website read lock")
-        .get_page(id)
-    {
-        Some(page) => HttpResponse::Ok().json(page),
-        None => HttpResponse::NotFound().body(format!("Page with id {} was not found", id)),
-    }
-}
diff --git a/src/service/mod.rs b/src/service/mod.rs
index f461f48edf00e87b0d99250d2c16288a977ae750..18a7bf114a2cfc700b076b7cf847efb25c7f166d 100644
--- a/src/service/mod.rs
+++ b/src/service/mod.rs
@@ -1,3 +1,5 @@
 mod admin;
 pub mod files;
+mod website;
 pub use admin::*;
+pub use website::*;
diff --git a/src/service/website.rs b/src/service/website.rs
new file mode 100644
index 0000000000000000000000000000000000000000..a7242a3b5a8cb3736e56159123f3d90d44206f01
--- /dev/null
+++ b/src/service/website.rs
@@ -0,0 +1,67 @@
+use crate::website::{Page, WebSite};
+use actix_web::{
+    get, post, put,
+    web::{Data, Json},
+    HttpResponse,
+};
+use std::sync::RwLock;
+
+#[derive(serde::Deserialize, Clone)]
+pub struct AddPageData {
+    parent_page_id: usize,
+    new_page: Page,
+}
+
+#[post("/add-page")]
+pub async fn add_page(
+    website: Data<RwLock<WebSite>>,
+    add_page_data: Json<AddPageData>,
+) -> HttpResponse {
+    let add_page_data = add_page_data.into_inner();
+    match website
+        .write()
+        .expect("Couldn't acquire website write lock")
+        .add_page(add_page_data.parent_page_id, add_page_data.new_page.clone())
+    {
+        Ok(()) => HttpResponse::Ok().finish(),
+        Err(msg) => {
+            HttpResponse::BadRequest().body(format!("Error adding new page to website - {}", msg))
+        }
+    }
+}
+
+#[get("/page-data/{id}")]
+pub async fn get_page_data(
+    website: Data<RwLock<WebSite>>,
+    id: actix_web::web::Path<usize>,
+) -> HttpResponse {
+    let id = id.into_inner();
+    match website
+        .read()
+        .expect("Couldn't acquire website read lock")
+        .get_page(id)
+    {
+        Some(page) => HttpResponse::Ok().json(page),
+        None => HttpResponse::NotFound().body(format!("Page with id {} was not found", id)),
+    }
+}
+
+#[put("/update-page/{id}")]
+pub async fn update_page(
+    id: actix_web::web::Path<usize>,
+    website: Data<RwLock<WebSite>>,
+    updated_page: Json<Page>,
+) -> HttpResponse {
+    let id = id.into_inner();
+    let updated_page = updated_page.into_inner();
+    match website
+        .write()
+        .expect("Couldn't acquire website write lock")
+        .update_page(id, updated_page)
+    {
+        Ok(page) => HttpResponse::Ok().json(page),
+        Err(msg) => {
+            HttpResponse::NotFound().body(format!("Error updating page with id {} - {:?}", id, msg))
+        }
+    }
+}
diff --git a/src/website/website.rs b/src/website/website.rs
index 3168dbf3162d0298ac4aff448e1d0bb3fd927ec1..2de39e99cd48f4341b02f34380f20b20ca4a09e8 100644
--- a/src/website/website.rs
+++ b/src/website/website.rs
@@ -194,6 +194,10 @@ impl WebSite {
         Self::find_page(&self.root_page, id)
     }
 
+    pub fn get_page_mut(&mut self, id: usize) -> Option<&mut Page> {
+        Self::find_page_mut(&mut self.root_page, id)
+    }
+
     pub fn add_page(&mut self, parent_page_id: usize, page: Page) -> Result<(), String> {
         let id = self.last_generated_page_id + 1;
         let parent_page = Self::find_page_mut(&mut self.root_page, parent_page_id);
@@ -215,6 +219,16 @@ impl WebSite {
 
         Ok(())
     }
+
+    pub fn update_page(&mut self, id: usize, updated_page: Page) -> Result<&mut Page, String> {
+        match self.get_page_mut(id) {
+            Some(page) => {
+                *page = updated_page;
+                Ok(page)
+            }
+            None => Err(format!("Page with id {} was not found", id)),
+        }
+    }
 }
 
 #[cfg(test)]
@@ -290,4 +304,20 @@ mod test_website {
         assert_eq!(retrieved.metadata.title, "Added page");
         remove_test_dir(&test_dir);
     }
+
+    #[test]
+    fn test_update_page() {
+        let test_dir = PathBuf::from("./test");
+        let mut ws = test_website(&test_dir);
+        let mut root_page = ws.get_page_mut(1).unwrap().clone();
+        assert_eq!(root_page.metadata.title, "TEST");
+        root_page.metadata.title = String::from("UPDATED");
+        let updated = ws.update_page(1, root_page).unwrap();
+        assert_eq!(updated.metadata.title, "UPDATED");
+
+        let root_page = ws.get_page(1).unwrap();
+        assert_eq!(root_page.metadata.title, "UPDATED");
+
+        remove_test_dir(&test_dir);
+    }
 }