diff --git a/src/inc/categories.php b/src/inc/categories.php
new file mode 100644
index 0000000..a75d998
--- /dev/null
+++ b/src/inc/categories.php
@@ -0,0 +1,161 @@
+<?php
+class categories {
+  private static function parseEmails($string) {
+    $string = str_replace(" ", "", $string);
+    $emails = explode(",", $string);
+
+    foreach ($emails as $i => &$e) {
+      if (empty($e)) {
+        unset($emails[$i]);
+      } else {
+        if (filter_var($e, FILTER_VALIDATE_EMAIL) === false) return false;
+      }
+    }
+
+    return $emails;
+  }
+
+  public static function readableEmails($emails) {
+    $array = json_decode($emails, true);
+    if (json_last_error() != JSON_ERROR_NONE) return false;
+    return implode(", ", $array);
+  }
+
+  private static function canBeParent($id) {
+    if ($id == 0) return true;
+
+    $category = self::get($id);
+    return ($category !== false && $category["parent"] == 0);
+  }
+
+  public static function add($category, $stringEmails, $parent) {
+    global $con;
+
+    $emails = (empty($stringEmails) ? [] : self::parseEmails($stringEmails));
+    if ($emails === false) return false;
+
+    if (!self::canBeParent($parent)) return false;
+
+    $scategory = db::sanitize($category);
+    $semails = db::sanitize(json_encode($emails));
+    $sparent = (int)$parent;
+
+    return mysqli_query($con, "INSERT INTO categories (name, emails, parent) VALUES ('$scategory', '$semails', $sparent)");
+  }
+
+  public static function edit($id, $name, $stringEmails, $parent) {
+    global $con;
+
+    $emails = (empty($stringEmails) ? [] : self::parseEmails($stringEmails));
+    if ($emails === false) return false;
+
+    if (!self::canBeParent($parent)) return false;
+
+    $sid = (int)$id;
+    $sname = db::sanitize($name);
+    $semails = db::sanitize(json_encode($emails));
+    $sparent = (int)$parent;
+
+    return mysqli_query($con, "UPDATE categories SET name = '$sname', emails = '$semails', parent = $sparent WHERE id = $sid LIMIT 1");
+  }
+
+  public static function get($id) {
+    global $con;
+
+    $sid = (int)$id;
+
+    $query = mysqli_query($con, "SELECT * FROM categories WHERE id = $sid");
+
+    if (!mysqli_num_rows($query)) return false;
+
+    return mysqli_fetch_assoc($query);
+  }
+
+  private static function addChilds(&$row) {
+    global $con;
+
+    $query = mysqli_query($con, "SELECT * FROM categories WHERE parent = ".(int)$row["id"]);
+
+    $row["childs"] = [];
+    while ($child = mysqli_fetch_assoc($query)) {
+      $row["childs"][] = $child;
+    }
+  }
+
+  public static function getAll($simplified = true, $withparents = true, $includechilds = false) {
+    global $con, $conf;
+
+    $query = mysqli_query($con, "SELECT ".($simplified ? "id, name" : "c.id id, c.name name, c.parent parent, c.emails emails, p.name parentname")." FROM categories c".($simplified ? "" : " LEFT JOIN categories p ON c.parent = p.id").($withparents ? "" : " WHERE c.parent = 0")." ORDER BY ".($conf["debug"] ? "id" : "name")." ASC");
+
+    $categories = [];
+
+    while ($row = mysqli_fetch_assoc($query)) {
+      if (!$simplified && $includechilds) self::addChilds($row);
+
+      if ($simplified) $categories[$row["id"]] = $row["name"];
+      else $categories[] = $row;
+    }
+
+    return $categories;
+  }
+
+  public static function getAllWithWorkers() {
+    global $con;
+
+    $categories = self::getAll(false);
+
+    foreach ($categories as &$category) {
+      $category["workers"] = [];
+
+      $query = mysqli_query($con, "SELECT w.id FROM workers w LEFT JOIN people p ON w.person = p.id WHERE p.category = ".(int)$category["id"]);
+
+      while ($row = mysqli_fetch_assoc($query)) {
+        $category["workers"][] = $row["id"];
+      }
+    }
+
+    return $categories;
+  }
+
+  public static function getChildren() {
+    global $con, $conf;
+
+    $query = mysqli_query($con, "SELECT p.id parent, c.id child FROM categories c LEFT JOIN categories p ON c.parent = p.id WHERE c.parent != 0");
+
+    $childs = [];
+
+    while ($row = mysqli_fetch_assoc($query)) {
+      if (!isset($childs[$row["parent"]])) {
+        $childs[$row["parent"]] = [];
+      }
+      $childs[$row["parent"]][] = $row["child"];
+    }
+
+    return $childs;
+  }
+
+  public static function exists($id) {
+    global $con;
+
+    if ($id == -1) return true;
+
+    $query = mysqli_query($con, "SELECT id FROM categories WHERE id = ".(int)$id);
+
+    return (mysqli_num_rows($query) > 0);
+  }
+
+  public static function getIdByName($name) {
+    global $con;
+
+    if (strtolower($name) == "sin categoría") return -1;
+
+    $sname = db::sanitize($name);
+    $query = mysqli_query($con, "SELECT id FROM categories WHERE name = '$sname'");
+
+    if (!mysqli_num_rows($query)) return false;
+
+    $row = mysqli_fetch_assoc($query);
+
+    return $row["id"];
+  }
+}
