diff --git a/src/inc/calendars.php b/src/inc/calendars.php
new file mode 100644
index 0000000..a8b4a9f
--- /dev/null
+++ b/src/inc/calendars.php
@@ -0,0 +1,182 @@
+<?php
+class calendars {
+  const TYPE_FESTIU = 0;
+  const TYPE_FEINER = 1;
+  const TYPE_LECTIU = 2;
+
+  const NO_CALENDAR_APPLICABLE = 0;
+
+  public static $types = array(
+    0 => "Festivo",
+    2 => "Lectivo",
+    1 => "No lectivo"
+  );
+  public static $workingTypes = [1, 2];
+  public static $days = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"];
+  public static $months = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];
+
+  public static function parseFormCalendar($form, $ibegins, $iends, $timestamp = false) {
+    if ($timestamp) {
+      $current = new DateTime();
+      $current->setTimestamp((int)$ibegins);
+      $ends = new DateTime();
+      $ends->setTimestamp((int)$iends);
+    } else {
+      $current = new DateTime($ibegins);
+      $ends = new DateTime($iends);
+    }
+    $interval = new DateInterval("P1D");
+
+    if ($current->diff($ends)->invert === 1) {
+      return false;
+    }
+
+    $return = array(
+      "begins" => $current->getTimestamp(),
+      "ends" => $ends->getTimestamp(),
+      "calendar" => []
+    );
+
+    $possible_values = array_keys(self::$types);
+
+    $day = 0;
+    while ($current->diff($ends)->invert === 0) {
+      if (!isset($form[$day]) || !in_array($form[$day], $possible_values)) {
+        return false;
+      }
+
+      $return["calendar"][$current->getTimestamp()] = (int)$form[$day];
+
+      $day++;
+      $current->add($interval);
+    }
+
+    return $return;
+  }
+
+  public static function checkOverlap($category, $begins, $ends) {
+    global $con;
+
+    $scategory = (int)$category;
+    $sbegins = (int)$begins;
+    $sends = (int)$ends;
+
+    $query = mysqli_query($con, "SELECT * FROM calendars WHERE begins <= $sends AND ends >= $sbegins AND category = $scategory LIMIT 1");
+
+    return (mysqli_num_rows($query) > 0);
+  }
+
+  public static function add($category, $begins, $ends, $calendar) {
+    global $con;
+
+    if (self::checkOverlap($category, $begins, $ends)) {
+      return -1;
+    }
+
+    $scategory = (int)$category;
+    $sbegins = (int)$begins;
+    $sends = (int)$ends;
+    $scalendar = db::sanitize(json_encode($calendar));
+
+    return (mysqli_query($con, "INSERT INTO calendars (category, begins, ends, details) VALUES ($scategory, $sbegins, $sends, '$scalendar')") ? 0 : -2);
+  }
+
+  public static function edit($id, $calendar) {
+    global $con;
+
+    $sid = (int)$id;
+    $scalendar = db::sanitize(json_encode($calendar));
+
+    return (mysqli_query($con, "UPDATE calendars SET details = '$scalendar' WHERE id = $sid LIMIT 1"));
+  }
+
+  public static function get($id) {
+    global $con;
+
+    $sid = (int)$id;
+
+    $query = mysqli_query($con, "SELECT c.id id, c.begins begins, c.ends ends, c.details details, c.category category, ca.name categoryname FROM calendars c LEFT JOIN categories ca ON c.category = ca.id WHERE c.id = $sid");
+
+    if (!mysqli_num_rows($query)) {
+      return false;
+    }
+
+    $row = mysqli_fetch_assoc($query);
+
+    if ($row["category"] == -1) {
+      $row["categoryname"] = "Calendario por defecto";
+    }
+
+    return $row;
+  }
+
+  public static function getByCategory($id, $details = false) {
+    global $con;
+
+    $sid = (int)$id;
+
+    $query = mysqli_query($con, "SELECT id, begins, ends".($details ? ", details" : "")." FROM calendars WHERE category = $sid");
+
+    $calendars = [];
+
+    while ($row = mysqli_fetch_assoc($query)) {
+      $calendars[] = $row;
+    }
+
+    return $calendars;
+  }
+
+  public static function getAll() {
+    $categories = categories::getAll();
+    $categories[-1] = "Calendario por defecto";
+
+    $return = [];
+
+    foreach ($categories as $id => $category) {
+      $return[] = array(
+        "category" => $category,
+        "categoryid" => $id,
+        "calendars" => self::getByCategory($id)
+      );
+    }
+
+    return $return;
+  }
+
+  public static function getCurrentCalendarByCategory($category) {
+    global $con;
+
+    $scategory = (int)$category;
+    $stime = (int)time();
+
+    $query = mysqli_query($con, "SELECT id, category, begins, ends, details FROM calendars WHERE category IN (-1, $scategory) AND begins <= $stime AND ends >= $stime");
+    if ($query === false) return false;
+
+    $calendars = [];
+    while ($row = mysqli_fetch_assoc($query)) {
+      $row["details"] = json_decode($row["details"], true);
+      if (json_last_error() !== JSON_ERROR_NONE) return false;
+
+      $calendars[$row["category"]] = $row;
+    }
+
+    return $calendars[$category] ??  $calendars[-1] ?? self::NO_CALENDAR_APPLICABLE;
+  }
+
+  public static function remove($id) {
+    global $con;
+
+    $sid = (int)$id;
+
+    return mysqli_query($con, "DELETE FROM calendars WHERE id = $sid LIMIT 1");
+  }
+
+  public static function exists($id) {
+    global $con;
+
+    $sid = (int)$id;
+    $query = mysqli_query($con, "SELECT id FROM calendars WHERE id = $sid");
+
+    return (mysqli_num_rows($query) > 0);
+  }
+}
