diff --git a/db/changes/10100-allSaints/00-zone.sql b/db/changes/10081-agency/00-zone.sql
similarity index 83%
rename from db/changes/10100-allSaints/00-zone.sql
rename to db/changes/10081-agency/00-zone.sql
index e2542505ae..74e482c4ca 100644
--- a/db/changes/10100-allSaints/00-zone.sql
+++ b/db/changes/10081-agency/00-zone.sql
@@ -26,6 +26,12 @@ CREATE TABLE `vn`.`zoneEvent` (
   CONSTRAINT `zoneEvent_ibfk_1` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
 
+ALTER TABLE `vn`.`zoneEvent` 
+  ADD COLUMN `type` ENUM('day', 'indefinitely', 'range') NOT NULL AFTER `zoneFk`,
+  ADD COLUMN `dated` DATE NULL DEFAULT NULL AFTER `type`,
+  CHANGE COLUMN `from` `started` DATE NULL DEFAULT NULL ,
+  CHANGE COLUMN `to` `ended` DATE NULL DEFAULT NULL ;
+
 CREATE TABLE `vn`.`zoneExclusion` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `zoneFk` int(11) NOT NULL,
@@ -45,3 +51,6 @@ ADD CONSTRAINT `fk_zone_1`
   REFERENCES `vn`.`warehouse` (`id`)
   ON DELETE NO ACTION
   ON UPDATE CASCADE;
+
+ALTER TABLE `vn`.`zoneExclusion` 
+  CHANGE COLUMN `day` `dated` DATE NOT NULL ;
diff --git a/db/changes/10081-agency/00-zone_getEvents.sql b/db/changes/10081-agency/00-zone_getEvents.sql
index 35d95f7bb8..6e47bad221 100644
--- a/db/changes/10081-agency/00-zone_getEvents.sql
+++ b/db/changes/10081-agency/00-zone_getEvents.sql
@@ -37,11 +37,11 @@ BEGIN
 			WHERE z.agencyModeFk != vAgencyModeFk;
 	END IF;
 
-	SELECT e.`from`, e.`to`, e.weekDays
+	SELECT e.`type`, e.dated, e.`started`, e.`ended`, e.weekDays
 		FROM tmp.zone t
 			JOIN zoneEvent e ON e.zoneFk = t.id;
 
-	SELECT DISTINCT e.`day`
+	SELECT DISTINCT e.dated
 		FROM tmp.zone t
 			JOIN zoneExclusion e ON e.zoneFk = t.id;
 
diff --git a/db/changes/10081-agency/00-zone_getOptionsForDate.sql b/db/changes/10081-agency/00-zone_getOptionsForDate.sql
deleted file mode 100644
index a71f85c1a8..0000000000
--- a/db/changes/10081-agency/00-zone_getOptionsForDate.sql
+++ /dev/null
@@ -1,79 +0,0 @@
-
-DROP PROCEDURE IF EXISTS `vn`.`zone_getOptionsForLanding`;
-DELIMITER $$
-CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`zone_getOptionsForLanding`(vLanded DATE)
-BEGIN
-/**
- * Gets computed options for the passed zones and delivery date.
- *
- * @table tmp.zones(id) The zones ids
- * @param vLanded The delivery date
- * @return tmp.zoneOption The computed options
- */
-    DECLARE vHour TIME DEFAULT TIME(NOW());
-
-	DROP TEMPORARY TABLE IF EXISTS tTemp;
-    CREATE TEMPORARY TABLE tTemp
-		ENGINE = MEMORY
-		SELECT t.id zoneFk,
-				TIME(e.`hour`) `hour`,
-				e.travelingDays,
-				e.price,
-				e.bonus,
-                CASE
-					WHEN e.`from` IS NULL AND e.`to` IS NULL
-						THEN 3
-					WHEN e.`to` IS NULL
-						THEN 2
-						ELSE 1
-				END specificity
-			FROM tmp.zone t
-				JOIN zoneEvent e ON e.zoneFk = t.id
-			WHERE (e.`from` = vLanded AND e.`to` IS NULL)
-				OR (
-					(e.`from` IS NULL OR vLanded BETWEEN e.`from` AND e.`to`)
-					AND e.weekDays & (1 << WEEKDAY(vLanded))
-				);
-
-	-- XXX: Compatibility with the deprecated #zoneCalendar table
-
-	INSERT INTO tTemp
-		SELECT t.id zoneFk,
-				NULL,
-				NULL,
-				c.price,
-				c.bonus,
-                4
-			FROM tmp.zone t
-				JOIN zoneCalendar c ON c.zoneFk = t.id
-			WHERE c.delivered = vLanded;
-
-	DELETE t FROM tTemp t
-		JOIN zoneExclusion e
-			ON e.zoneFk = t.zoneFk AND e.`day` = vLanded;
-
-    UPDATE tTemp t
-		JOIN zone z ON z.id = t.zoneFk
-		SET t.`hour` = IFNULL(t.`hour`, TIME(z.`hour`)),
-			t.travelingDays = IFNULL(t.travelingDays, z.travelingDays),
-			t.price = IFNULL(t.price, z.price),
-			t.bonus = IFNULL(t.bonus, z.bonus);
-    
-	DELETE FROM tTemp
-		WHERE (@shipped := TIMESTAMPADD(DAY, -travelingDays, vLanded)) < CURDATE()
-			OR @shipped = CURDATE() AND vHour > `hour`;
-
-	DROP TEMPORARY TABLE IF EXISTS tmp.zoneOption;
-    CREATE TEMPORARY TABLE tmp.zoneOption
-		ENGINE = MEMORY
-		SELECT *
-			FROM (
-				SELECT * FROM tTemp
-				ORDER BY zoneFk, specificity
-			) t
-			GROUP BY zoneFk;
-
-	DROP TEMPORARY TABLE tTemp;
-END$$
-DELIMITER ;
-
diff --git a/db/changes/10100-allSaints/01-zone_getAgency.sql b/db/changes/10081-agency/01-zone_getAgency.sql
similarity index 100%
rename from db/changes/10100-allSaints/01-zone_getAgency.sql
rename to db/changes/10081-agency/01-zone_getAgency.sql
diff --git a/db/changes/10100-allSaints/01-zone_getFirstShipped.sql b/db/changes/10081-agency/01-zone_getFirstShipped.sql
similarity index 100%
rename from db/changes/10100-allSaints/01-zone_getFirstShipped.sql
rename to db/changes/10081-agency/01-zone_getFirstShipped.sql
diff --git a/db/changes/10100-allSaints/01-zone_getLanded.sql b/db/changes/10081-agency/01-zone_getLanded.sql
similarity index 100%
rename from db/changes/10100-allSaints/01-zone_getLanded.sql
rename to db/changes/10081-agency/01-zone_getLanded.sql
diff --git a/db/changes/10100-allSaints/01-zone_getShippedWarehouse.sql b/db/changes/10081-agency/01-zone_getShippedWarehouse.sql
similarity index 100%
rename from db/changes/10100-allSaints/01-zone_getShippedWarehouse.sql
rename to db/changes/10081-agency/01-zone_getShippedWarehouse.sql
diff --git a/db/changes/10100-allSaints/01-zone_getWarehouse.sql b/db/changes/10081-agency/01-zone_getWarehouse.sql
similarity index 100%
rename from db/changes/10100-allSaints/01-zone_getWarehouse.sql
rename to db/changes/10081-agency/01-zone_getWarehouse.sql
diff --git a/db/changes/10100-allSaints/02-zoneGetAgency.sql b/db/changes/10081-agency/02-zoneGetAgency.sql
similarity index 100%
rename from db/changes/10100-allSaints/02-zoneGetAgency.sql
rename to db/changes/10081-agency/02-zoneGetAgency.sql
diff --git a/db/changes/10100-allSaints/02-zoneGetFirstShipped__.sql b/db/changes/10081-agency/02-zoneGetFirstShipped__.sql
similarity index 100%
rename from db/changes/10100-allSaints/02-zoneGetFirstShipped__.sql
rename to db/changes/10081-agency/02-zoneGetFirstShipped__.sql
diff --git a/db/changes/10100-allSaints/02-zoneGetLanded.sql b/db/changes/10081-agency/02-zoneGetLanded.sql
similarity index 100%
rename from db/changes/10100-allSaints/02-zoneGetLanded.sql
rename to db/changes/10081-agency/02-zoneGetLanded.sql
diff --git a/db/changes/10100-allSaints/02-zoneGetShipped.sql b/db/changes/10081-agency/02-zoneGetShipped.sql
similarity index 100%
rename from db/changes/10100-allSaints/02-zoneGetShipped.sql
rename to db/changes/10081-agency/02-zoneGetShipped.sql
diff --git a/db/changes/10100-allSaints/02-zoneGetShippedWarehouse.sql b/db/changes/10081-agency/02-zoneGetShippedWarehouse.sql
similarity index 100%
rename from db/changes/10100-allSaints/02-zoneGetShippedWarehouse.sql
rename to db/changes/10081-agency/02-zoneGetShippedWarehouse.sql
diff --git a/db/changes/10081-agency/04-zone_getOptionsForLanding.sql b/db/changes/10081-agency/04-zone_getOptionsForLanding.sql
new file mode 100644
index 0000000000..ae081f14bc
--- /dev/null
+++ b/db/changes/10081-agency/04-zone_getOptionsForLanding.sql
@@ -0,0 +1,67 @@
+USE `vn`;
+DROP procedure IF EXISTS `zone_getOptionsForLanding`;
+
+DELIMITER $$
+USE `vn`$$
+CREATE DEFINER=`root`@`%` PROCEDURE `zone_getOptionsForLanding`(vLanded DATE)
+BEGIN
+/**
+ * Gets computed options for the passed zones and delivery date.
+ *
+ * @table tmp.zones(id) The zones ids
+ * @param vLanded The delivery date
+ * @return tmp.zoneOption The computed options
+ */
+	DECLARE vHour TIME DEFAULT TIME(NOW());
+	
+	DROP TEMPORARY TABLE IF EXISTS tTemp;
+	CREATE TEMPORARY TABLE tTemp
+		ENGINE = MEMORY
+		SELECT t.id zoneFk,
+				IFNULL(TIME(e.`hour`), TIME(z.`hour`)) `hour`,
+				IFNULL(e.travelingDays, z.travelingDays) travelingDays,
+				IFNULL(e.price, z.price) price,
+				IFNULL(e.bonus, z.bonus) bonus,
+				CASE
+					WHEN e.`type` = 'day'
+						THEN 1
+					WHEN e.`type` = 'range'
+						THEN 2
+						ELSE 3
+				END specificity
+			FROM tmp.zone t
+				JOIN zone z ON z.id = t.id
+				JOIN zoneEvent e ON e.zoneFk = t.id
+			WHERE (
+					e.`type` = 'day'
+					AND e.dated = vLanded
+				) OR (
+					e.`type` != 'day'
+					AND e.weekDays & (1 << WEEKDAY(vLanded))
+					AND (e.`started` IS NULL OR vLanded >= e.`started`)
+					AND (e.`ended` IS NULL OR vLanded <= e.`ended`)
+				);
+
+	DELETE t FROM tTemp t
+		JOIN zoneExclusion e
+			ON e.zoneFk = t.zoneFk AND e.`dated` = vLanded;
+
+	DELETE FROM tTemp
+		WHERE (@shipped := TIMESTAMPADD(DAY, -travelingDays, vLanded)) < CURDATE()
+			OR @shipped = CURDATE() AND vHour > `hour`;
+
+	DROP TEMPORARY TABLE IF EXISTS tmp.zoneOption;
+	CREATE TEMPORARY TABLE tmp.zoneOption
+		ENGINE = MEMORY
+		SELECT *
+			FROM (
+				SELECT * FROM tTemp
+				ORDER BY zoneFk, specificity
+			) t
+			GROUP BY zoneFk;
+
+	DROP TEMPORARY TABLE tTemp;
+END$$
+
+DELIMITER ;
+
diff --git a/db/changes/10081-agency/04-zone_getOptionsForShipment.sql b/db/changes/10081-agency/04-zone_getOptionsForShipment.sql
new file mode 100644
index 0000000000..3794296297
--- /dev/null
+++ b/db/changes/10081-agency/04-zone_getOptionsForShipment.sql
@@ -0,0 +1,76 @@
+USE `vn`;
+DROP procedure IF EXISTS `zone_getOptionsForShipment`;
+
+DELIMITER $$
+USE `vn`$$
+CREATE DEFINER=`root`@`%` PROCEDURE `zone_getOptionsForShipment`(vShipped DATE)
+BEGIN
+/**
+ * Gets computed options for the passed zones and shipping date.
+ *
+ * @table tmp.zones(id) The zones ids
+ * @param vShipped The shipping date
+ * @return tmp.zoneOption(zoneFk, hour, travelingDays, price, bonus, specificity) The computed options
+ */
+	DROP TEMPORARY TABLE IF EXISTS tLandings;
+	CREATE TEMPORARY TABLE tLandings
+		(INDEX (eventFk))
+		ENGINE = MEMORY
+		SELECT e.id eventFk,
+				@travelingDays := IFNULL(e.travelingDays, z.travelingDays) travelingDays,
+				TIMESTAMPADD(DAY, @travelingDays, vShipped) landed
+			FROM tmp.zone t
+				JOIN zone z ON z.id = t.id
+				JOIN zoneEvent e ON e.zoneFk = t.id;
+
+	DROP TEMPORARY TABLE IF EXISTS tTemp;
+	CREATE TEMPORARY TABLE tTemp
+		ENGINE = MEMORY
+		SELECT t.id zoneFk,
+				IFNULL(TIME(e.`hour`), TIME(z.`hour`)) `hour`,
+				IFNULL(e.price, z.price) price,
+				IFNULL(e.bonus, z.bonus) bonus,
+				CASE
+					WHEN e.`type` = 'day'
+						THEN 1
+					WHEN e.`type` = 'range'
+						THEN 2
+						ELSE 3
+				END specificity,
+				l.travelingDays,
+                l.landed
+			FROM tmp.zone t
+				JOIN zone z ON z.id = t.id
+				JOIN zoneEvent e ON e.zoneFk = t.id
+				JOIN tLandings l ON l.eventFk = e.id
+			HAVING (
+					e.`type` = 'day'
+					AND e.`dated` = l.landed
+				) OR (
+					e.`type` != 'day'
+					AND e.weekDays & (1 << WEEKDAY(l.landed))
+					AND (e.`started` IS NULL OR l.landed >= e.`started`)
+					AND (e.`ended` IS NULL OR l.landed <= e.`ended`)
+				);
+
+	DELETE t FROM tTemp t
+		JOIN zoneExclusion e
+			ON e.zoneFk = t.zoneFk AND e.`dated` = t.landed;
+
+	DROP TEMPORARY TABLE IF EXISTS tmp.zoneOption;
+	CREATE TEMPORARY TABLE tmp.zoneOption
+		ENGINE = MEMORY
+		SELECT *
+			FROM (
+				SELECT * FROM tTemp
+				ORDER BY zoneFk, specificity
+			) t
+			GROUP BY zoneFk;
+
+	DROP TEMPORARY TABLE
+		tTemp,
+        tLandings;
+END$$
+
+DELIMITER ;
+
diff --git a/db/changes/10100-allSaints/04-zone_getOptionsForDated.sql b/db/changes/10100-allSaints/04-zone_getOptionsForDated.sql
deleted file mode 100644
index fce54e012a..0000000000
--- a/db/changes/10100-allSaints/04-zone_getOptionsForDated.sql
+++ /dev/null
@@ -1,88 +0,0 @@
-USE `vn`;
-DROP procedure IF EXISTS `ticketCreateWithUser`;
-
-DELIMITER $$
-USE `vn`$$
-CREATE DEFINER=`root`@`%` PROCEDURE `ticketCreateWithUser`(
-     vClientId INT
-    ,vShipped DATE
-    ,vWarehouseFk INT
-    ,vCompanyFk INT
-    ,vAddressFk INT
-    ,vAgencyModeFk INT
-    ,vRouteFk INT
-    ,vlanded DATE
-    ,vUserId INT
-    ,OUT vNewTicket INT)
-BEGIN
-
-	DECLARE vZoneFk INT;
-    
-	IF vClientId IS NULL THEN  
-		CALL util.throw ('CLIENT_NOT_ESPECIFIED'); 
-	END IF;
-
-	IF NOT vAddressFk OR vAddressFk IS NULL THEN
-        SELECT id INTO vAddressFk 
-            FROM address
-            WHERE clientFk = vClientId AND isDefaultAddress;
-    END IF;
-    
-	IF vAgencyModeFk IS NOT NULL THEN
-		
-		CALL vn.zone_getShippedWarehouse(vlanded, vAddressFk, vAgencyModeFk);
-    
-		SELECT zoneFk INTO vZoneFk FROM tmp.zoneGetShipped
-			WHERE shipped = vShipped AND warehouseFk = vWarehouseFk LIMIT 1;
-		
-		IF vZoneFk IS NULL OR vZoneFk = 0 THEN
-			CALL util.throw ('NOT_ZONE_WITH_THIS_PARAMETERS'); 
-		END IF;
-	END IF;
-	INSERT INTO vn2008.Tickets (
-			Id_Cliente,
-			Fecha,
-			Id_Consigna,
-			Id_Agencia,
-			Alias,
-			warehouse_id,
-			Id_Ruta,
-			empresa_id,
-			landing,
-            zoneFk
-		)
-		SELECT
-					vClientId,
-					vShipped,
-					a.id,
-					vAgencyModeFk,
-					a.nickname,
-					vWarehouseFk,
-					IF(vRouteFk,vRouteFk,NULL),
-					vCompanyFk,
-					vlanded,
-                    vZoneFk
-			FROM address a
-				JOIN agencyMode am ON am.id = a.agencyModeFk
-			WHERE a.id = vAddressFk;
-
-	SET vNewTicket = LAST_INSERT_ID();
-
-	INSERT INTO ticketObservation(ticketFk, observationTypeFk, description)
-		SELECT vNewTicket, ao.observationTypeFk, ao.description
-			FROM addressObservation ao
-				JOIN address a ON a.id = ao.addressFk
-			WHERE a.id = vAddressFk;
-
-    INSERT INTO vn.ticketLog
-		SET originFk = vNewTicket, userFk = vUserId, `action` = 'insert', description = CONCAT('Ha creado el ticket:', ' ', vNewTicket);
-
-	IF (SELECT ct.isCreatedAsServed FROM vn.clientType ct JOIN vn.client c ON c.typeFk = ct.code WHERE c.id = vClientId ) <> FALSE THEN
-		INSERT INTO vncontrol.inter(state_id, Id_Ticket, Id_Trabajador)
-			SELECT id, vNewTicket, getWorker()
-				FROM state
-				WHERE `code` = 'DELIVERED';
-	END IF;
-END$$
-
-DELIMITER ;
diff --git a/db/changes/10100-allSaints/04-zone_getOptionsForLanding.sql b/db/changes/10100-allSaints/04-zone_getOptionsForLanding.sql
deleted file mode 100644
index 116703831d..0000000000
--- a/db/changes/10100-allSaints/04-zone_getOptionsForLanding.sql
+++ /dev/null
@@ -1,83 +0,0 @@
-
-USE `vn`;
-DROP procedure IF EXISTS `vn`.`zone_getOptionsForLanding`;
-
-DELIMITER $$
-USE `vn`$$
-CREATE DEFINER=`root`@`%` PROCEDURE `zone_getOptionsForLanding`(vLanded DATE)
-BEGIN
-/**
- * Gets computed options for the passed zones and delivery date.
- *
- * @table tmp.zones(id) The zones ids
- * @param vLanded The delivery date
- * @return tmp.zoneOption The computed options
- */
-    DECLARE vHour TIME DEFAULT TIME(NOW());
-
-	DROP TEMPORARY TABLE IF EXISTS tTemp;
-    CREATE TEMPORARY TABLE tTemp
-		ENGINE = MEMORY
-		SELECT t.id zoneFk,
-				TIME(e.`hour`) `hour`,
-				e.travelingDays,
-				e.price,
-				e.bonus,
-                CASE
-					WHEN e.`from` IS NULL AND e.`to` IS NULL
-						THEN 3
-					WHEN e.`to` IS NULL
-						THEN 2
-						ELSE 1
-				END specificity
-			FROM tmp.zone t
-				JOIN zoneEvent e ON e.zoneFk = t.id
-			WHERE (e.`from` = vLanded AND e.`to` IS NULL)
-				OR (
-					(e.`from` IS NULL OR vLanded BETWEEN e.`from` AND e.`to`)
-					AND e.weekDays & (1 << WEEKDAY(vLanded))
-				);
-
-	-- XXX: Compatibility with the deprecated #zoneCalendar table
-
-	INSERT INTO tTemp
-		SELECT t.id zoneFk,
-				NULL,
-				NULL,
-				c.price,
-				c.bonus,
-                4
-			FROM tmp.zone t
-				JOIN zoneCalendar c ON c.zoneFk = t.id
-			WHERE c.delivered = vLanded;
-
-	DELETE t FROM tTemp t
-		JOIN zoneExclusion e
-			ON e.zoneFk = t.zoneFk AND e.`day` = vLanded;
-
-    UPDATE tTemp t
-		JOIN zone z ON z.id = t.zoneFk
-		SET t.`hour` = IFNULL(t.`hour`, TIME(z.`hour`)),
-			t.travelingDays = IFNULL(t.travelingDays, z.travelingDays),
-			t.price = IFNULL(t.price, z.price),
-			t.bonus = IFNULL(t.bonus, z.bonus);
-    
-	DELETE FROM tTemp
-		WHERE (@shipped := TIMESTAMPADD(DAY, -travelingDays, vLanded)) < CURDATE()
-			OR @shipped = CURDATE() AND vHour > `hour`;
-
-	DROP TEMPORARY TABLE IF EXISTS tmp.zoneOption;
-    CREATE TEMPORARY TABLE tmp.zoneOption
-		ENGINE = MEMORY
-		SELECT *
-			FROM (
-				SELECT * FROM tTemp
-				ORDER BY zoneFk, specificity
-			) t
-			GROUP BY zoneFk;
-
-	DROP TEMPORARY TABLE tTemp;
-END$$
-
-DELIMITER ;
-;
diff --git a/db/changes/10100-allSaints/04-zone_getOptionsForShipment.sql b/db/changes/10100-allSaints/04-zone_getOptionsForShipment.sql
deleted file mode 100644
index 26a2101f79..0000000000
--- a/db/changes/10100-allSaints/04-zone_getOptionsForShipment.sql
+++ /dev/null
@@ -1,65 +0,0 @@
-USE `vn`;
-DROP procedure IF EXISTS `zone_getOptionsForShipment`;
-
-DELIMITER $$
-USE `vn`$$
-CREATE DEFINER=`root`@`%` PROCEDURE `zone_getOptionsForShipment`(vShipped DATE)
-BEGIN
-/**
- * Gets computed options for the passed zones and shipping date.
- *
- * @table tmp.zones(id) The zones ids
- * @param vShipped The shipping date
- * @return tmp.zoneOption(zoneFk, hour, travelingDays, price, bonus, specificity) The computed options
- */
-    DECLARE vHour TIME DEFAULT TIME(NOW());
-
-	DROP TEMPORARY TABLE IF EXISTS tTemp;
-    CREATE TEMPORARY TABLE tTemp
-		ENGINE = MEMORY
-		SELECT t.id zoneFk,
-				TIME(e.`hour`) `hour`,
-				e.travelingDays,
-				e.price,
-				e.bonus,
-                CASE
-					WHEN e.`from` IS NULL AND e.`to` IS NULL
-						THEN 3
-					WHEN e.`to` IS NULL
-						THEN 2
-						ELSE 1
-				END specificity
-			FROM tmp.zone t
-				JOIN zoneEvent e ON e.zoneFk = t.id
-			WHERE (e.`from` = TIMESTAMPADD(DAY, e.travelingDays, vShipped) AND e.`to` IS NULL)
-				OR (
-					(e.`from` IS NULL OR TIMESTAMPADD(DAY, e.travelingDays, vShipped) BETWEEN e.`from` AND e.`to`)
-					AND e.weekDays & (1 << WEEKDAY(TIMESTAMPADD(DAY, e.travelingDays, vShipped)))
-				);
-
-	DELETE t FROM tTemp t
-		JOIN zoneExclusion e
-			ON e.zoneFk = t.zoneFk AND TIMESTAMPADD(DAY,-t.travelingDays, e.`day`) = vShipped;
-
-    UPDATE tTemp t
-		JOIN zone z ON z.id = t.zoneFk
-		SET t.`hour` = IFNULL(t.`hour`, TIME(z.`hour`)),
-			t.travelingDays = IFNULL(t.travelingDays, z.travelingDays),
-			t.price = IFNULL(t.price, z.price),
-			t.bonus = IFNULL(t.bonus, z.bonus);
-    
-	DROP TEMPORARY TABLE IF EXISTS tmp.zoneOption;
-    CREATE TEMPORARY TABLE tmp.zoneOption
-		ENGINE = MEMORY
-		SELECT *
-			FROM (
-				SELECT * FROM tTemp
-				ORDER BY zoneFk, specificity
-			) t
-			GROUP BY zoneFk;
-
-	DROP TEMPORARY TABLE tTemp;
-END$$
-
-DELIMITER ;
-
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 72c10664eb..04878be699 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -1619,220 +1619,220 @@ INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`)
         (8, 5,      0), 
         (8, 1,      1);
 
-INSERT INTO `vn`.`zoneEvent`(`zoneFk`, `from`)
+INSERT INTO `vn`.`zoneEvent`(`zoneFk`, `type`, `dated`)
     VALUES
-        (1, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=2, 2, 9 ) - DAYOFWEEK(CURDATE())) DAY)),
-        (1, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=3, 3, 10) - DAYOFWEEK(CURDATE())) DAY)),
-        (1, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=4, 4, 11) - DAYOFWEEK(CURDATE())) DAY)),
-        (1, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=5, 5, 12) - DAYOFWEEK(CURDATE())) DAY)),
-        (1, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=6, 6, 13) - DAYOFWEEK(CURDATE())) DAY)),
-        (2, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=2, 2, 9 ) - DAYOFWEEK(CURDATE())) DAY)),
-        (2, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=3, 3, 10) - DAYOFWEEK(CURDATE())) DAY)),
-        (2, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=4, 4, 11) - DAYOFWEEK(CURDATE())) DAY)),
-        (2, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=5, 5, 12) - DAYOFWEEK(CURDATE())) DAY)),
-        (2, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=6, 6, 13) - DAYOFWEEK(CURDATE())) DAY)),
-        (3, CURDATE()),
-        (3, DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
-        (3, DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
-        (4, CURDATE()),
-        (4, DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
-        (4, DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
-        (5, CURDATE()),
-        (5, DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
-        (5, DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
-        (6, CURDATE()),
-        (6, DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
-        (6, DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
-        (7, CURDATE()),
-        (7, DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
-        (7, DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
-        (7, DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
-        (7, DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
-        (7, DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
-        (7, DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
-        (8, CURDATE()),
-        (8, DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
-        (8, DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
-        (8, DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
-        (8, DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
-        (8, DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
-        (8, DATE_ADD(CURDATE(), INTERVAL +6 DAY));
+        (1, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=2, 2, 9 ) - DAYOFWEEK(CURDATE())) DAY)),
+        (1, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=3, 3, 10) - DAYOFWEEK(CURDATE())) DAY)),
+        (1, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=4, 4, 11) - DAYOFWEEK(CURDATE())) DAY)),
+        (1, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=5, 5, 12) - DAYOFWEEK(CURDATE())) DAY)),
+        (1, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=6, 6, 13) - DAYOFWEEK(CURDATE())) DAY)),
+        (2, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=2, 2, 9 ) - DAYOFWEEK(CURDATE())) DAY)),
+        (2, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=3, 3, 10) - DAYOFWEEK(CURDATE())) DAY)),
+        (2, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=4, 4, 11) - DAYOFWEEK(CURDATE())) DAY)),
+        (2, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=5, 5, 12) - DAYOFWEEK(CURDATE())) DAY)),
+        (2, 'day', DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=6, 6, 13) - DAYOFWEEK(CURDATE())) DAY)),
+        (3, 'day', CURDATE()),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
+        (3, 'day', DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
+        (4, 'day', CURDATE()),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
+        (4, 'day', DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
+        (5, 'day', CURDATE()),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
+        (5, 'day', DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
+        (6, 'day', CURDATE()),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +7 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +8 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +9 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +10 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +11 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +12 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +13 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +14 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +15 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +16 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +17 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +18 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +19 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +20 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +21 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +22 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +23 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +24 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +25 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +26 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +27 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +28 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +29 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +30 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +31 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +32 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +33 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +34 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +35 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +36 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +37 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +38 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +39 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +40 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +41 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +42 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +43 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +44 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +45 DAY)),
+        (6, 'day', DATE_ADD(CURDATE(), INTERVAL +46 DAY)),
+        (7, 'day', CURDATE()),
+        (7, 'day', DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
+        (7, 'day', DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
+        (7, 'day', DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
+        (7, 'day', DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
+        (7, 'day', DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
+        (7, 'day', DATE_ADD(CURDATE(), INTERVAL +6 DAY)),
+        (8, 'day', CURDATE()),
+        (8, 'day', DATE_ADD(CURDATE(), INTERVAL +1 DAY)),
+        (8, 'day', DATE_ADD(CURDATE(), INTERVAL +2 DAY)),
+        (8, 'day', DATE_ADD(CURDATE(), INTERVAL +3 DAY)),
+        (8, 'day', DATE_ADD(CURDATE(), INTERVAL +4 DAY)),
+        (8, 'day', DATE_ADD(CURDATE(), INTERVAL +5 DAY)),
+        (8, 'day', DATE_ADD(CURDATE(), INTERVAL +6 DAY));
 
 INSERT INTO `vn`.`workerTimeControl`(`userFk`,`timed`,`manual`, `direction`)
     VALUES
diff --git a/db/tests/vn/orderConfirmWithUser.spec.js b/db/tests/vn/orderConfirmWithUser.spec.js
new file mode 100644
index 0000000000..f2a3d0c4e3
--- /dev/null
+++ b/db/tests/vn/orderConfirmWithUser.spec.js
@@ -0,0 +1,37 @@
+const app = require('vn-loopback/server/server');
+const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
+
+// #1885
+xdescribe('order_confirmWithUser()', () => {
+    it('should confirm an order', async() => {
+        let stmts = [];
+        let stmt;
+
+        stmts.push('START TRANSACTION');
+
+        let params = {
+            orderFk: 10,
+            userId: 9
+        };
+        // problema: la funcion order_confirmWithUser tiene una transacción, por tanto esta nunca hace rollback
+        stmt = new ParameterizedSQL('CALL hedera.order_confirmWithUser(?, ?)', [
+            params.orderFk,
+            params.userId
+        ]);
+        stmts.push(stmt);
+
+        stmt = new ParameterizedSQL('SELECT confirmed FROM hedera.order WHERE id = ?', [
+            params.orderFk
+        ]);
+        let orderIndex = stmts.push(stmt) - 1;
+
+        stmts.push('ROLLBACK');
+
+        let sql = ParameterizedSQL.join(stmts, ';');
+        let result = await app.models.Ticket.rawStmt(sql);
+
+        savedDescription = result[orderIndex][0].confirmed;
+
+        expect(savedDescription).toBeTruthy();
+    });
+});
diff --git a/front/core/components/wday-picker/index.html b/front/core/components/wday-picker/index.html
index e8d74f1c2b..4262431e61 100644
--- a/front/core/components/wday-picker/index.html
+++ b/front/core/components/wday-picker/index.html
@@ -2,7 +2,7 @@
 <span
     ng-repeat="day in $ctrl.days"
     translate-attr="::{title: day.name}"
-    ng-class="{marked: $ctrl.field[day.code]}"
-    ng-click="$ctrl.field[day.code] = !$ctrl.field[day.code]">
+    ng-class="{marked: $ctrl.field[day.index]}"
+    ng-click="$ctrl.toggleDay(day.index)">
     {{day.localeChar}}
 </span>
\ No newline at end of file
diff --git a/front/core/components/wday-picker/index.js b/front/core/components/wday-picker/index.js
index 3cbb288e05..94a6d424cc 100644
--- a/front/core/components/wday-picker/index.js
+++ b/front/core/components/wday-picker/index.js
@@ -8,6 +8,13 @@ export default class WdayPicker extends FormInput {
         this.days = vnWeekDays.locales;
         this.initTabIndex();
     }
+
+    toggleDay(index) {
+        let field = this.field;
+        if (!field) field = [];
+        field[index] = !field[index];
+        this.change(field);
+    }
 }
 WdayPicker.$inject = ['$element', '$scope', 'vnWeekDays'];
 
diff --git a/front/core/services/week-days.js b/front/core/services/week-days.js
index f7d432c01b..698d6df2cf 100644
--- a/front/core/services/week-days.js
+++ b/front/core/services/week-days.js
@@ -1,5 +1,22 @@
 import ngModule from '../module';
 
+/**
+ * @property {Array} days Weekdays data array with the same indexes as Date.getDay()
+ * @property {Object} map Weekdays data map using weekday codes as key
+ * @property {Array} localeCodes Locale weekday codes indexes depend on current locale
+ * @property {Array} locale Weekday data array with indexes depending on current locale
+ *
+ * Weekday properties:
+ *
+ * @property {Number} index The weekday index acording to Date.getDay()
+ * @property {String} code The weekday code
+ * @property {String} name The weekday name
+ * @property {String} char The first weekday letter
+ * @property {String} abr The abreviated 3 letters weekday name
+ * @property {String} locale The weekday name in current locale
+ * @property {String} localeChar The first weekday letter in current locale
+ * @property {String} localeAbr The abreviated 3 letters weekday name in current locale
+ */
 class WeekDays {
     constructor($translate) {
         this.$translate = $translate;
@@ -65,6 +82,34 @@ class WeekDays {
         for (let code of this.localeCodes)
             this.locales.push(this.map[code]);
     }
+
+    fromSet(weekDays) {
+        let wdays = [];
+
+        if (weekDays) {
+            let codes = weekDays.split(',');
+            for (let code of codes) {
+                let data = this.map[code];
+                if (data) wdays[data.index] = true;
+            }
+        }
+
+        return wdays;
+    }
+
+    toSet(wdays) {
+        let weekDays = [];
+
+        if (wdays) {
+            for (let i = 0; i < wdays.length; i++) {
+                if (!wdays[i]) continue;
+                let data = this.days[i];
+                if (data) weekDays.push(data.code);
+            }
+        }
+
+        return weekDays.join(',');
+    }
 }
 WeekDays.$inject = ['$translate'];
 
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 171e376d2d..70293a9655 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -113,5 +113,9 @@
 	"You can't create a claim for a removed ticket": "No puedes crear una reclamación para un ticket eliminado",
 	"You cannot delete a ticket that part of it is being prepared": "No puedes eliminar un ticket en el que una parte que está siendo preparada",
 	"You must delete all the buy requests first": "Debes eliminar todas las peticiones de compra primero",
-	"Has deleted the ticket id": "Ha eliminado el ticket id [#{{id}}]({{{url}}})"
+	"Has deleted the ticket id": "Ha eliminado el ticket id [#{{id}}]({{{url}}})",
+	"You should specify a date": "Debes especificar una fecha",
+	"You should specify at least a start or end date": "Debes especificar al menos una fecha de inicio o de fín",
+	"Start date should be lower than end date": "La fecha de inicio debe ser menor que la fecha de fín",
+	"You should mark at least one week day": "Debes marcar al menos un día de la semana"
 }
\ No newline at end of file
diff --git a/modules/agency/back/models/zone-event.js b/modules/agency/back/models/zone-event.js
index 5b1c183fd2..6af031a239 100644
--- a/modules/agency/back/models/zone-event.js
+++ b/modules/agency/back/models/zone-event.js
@@ -1,9 +1,35 @@
 module.exports = Self => {
-    function rangeValid(err) {
-        if (this.from && this.to && this.from >= this.to)
+    Self.validate('range', function(err) {
+        if (this.type == 'range'
+        && !this.started
+        && !this.ended)
             err();
-    }
-    Self.validate('rangeValid', rangeValid, {
+    }, {
+        message: `You should specify at least a start or end date`
+    });
+
+    Self.validate('validRange', function(err) {
+        if (this.type == 'range'
+        && this.started
+        && this.ended
+        && this.started >= this.ended)
+            err();
+    }, {
         message: `Start date should be lower than end date`
     });
+
+    Self.validate('dated', function(err) {
+        if (this.type == 'day' && !this.dated)
+            err();
+    }, {
+        message: `You should specify a date`
+    });
+
+    Self.validate('weekDays', function(err) {
+        if (['range', 'indefinitely'].indexOf(this.type) !== -1
+        && !this.weekDays)
+            err();
+    }, {
+        message: `You should mark at least one week day`
+    });
 };
diff --git a/modules/agency/back/models/zone-event.json b/modules/agency/back/models/zone-event.json
index 822328dc63..0d46b1fe26 100644
--- a/modules/agency/back/models/zone-event.json
+++ b/modules/agency/back/models/zone-event.json
@@ -15,10 +15,16 @@
 			"id": true,
 			"type": "Number"
 		},
-		"from": {
+		"type": {
+			"type": "String"
+		},
+		"dated": {
 			"type": "Date"
 		},
-		"to": {
+		"started": {
+			"type": "Date"
+		},
+		"ended": {
 			"type": "Date"
 		},
 		"weekDays": {
diff --git a/modules/agency/back/models/zone-exclusion.json b/modules/agency/back/models/zone-exclusion.json
index 79e2f5aae6..f1c80debdb 100644
--- a/modules/agency/back/models/zone-exclusion.json
+++ b/modules/agency/back/models/zone-exclusion.json
@@ -11,7 +11,7 @@
 			"id": true,
 			"type": "Number"
 		},
-		"day": {
+		"dated": {
 			"type": "Date",
 			"required": true
 		}
diff --git a/modules/agency/front/calendar/index.js b/modules/agency/front/calendar/index.js
index f324bb122d..ec28fa1343 100644
--- a/modules/agency/front/calendar/index.js
+++ b/modules/agency/front/calendar/index.js
@@ -3,8 +3,9 @@ import Component from 'core/lib/component';
 import './style.scss';
 
 class Controller extends Component {
-    constructor($element, $) {
+    constructor($element, $, vnWeekDays) {
         super($element, $);
+        this.vnWeekDays = vnWeekDays;
         this.nMonths = 4;
 
         let date = new Date();
@@ -54,19 +55,29 @@ class Controller extends Component {
         this._data = value;
 
         value = value || {};
-        this.events = value.events;
-        this.exclusions = value.exclusions;
 
-        if (this.events) {
-            let codes = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-            for (event of this.events) {
-                event.wdays = [];
-                if (!event.weekDays) continue;
-                let weekDays = event.weekDays.split(',');
-                for (let wday of weekDays) {
-                    let index = codes.indexOf(wday);
-                    if (index !== -1) event.wdays[index] = true;
-                }
+        this.events = value.events;
+
+        function toStamp(date) {
+            return date && new Date(date).setHours(0, 0, 0, 0);
+        }
+
+        this.exclusionsMap = {};
+        let exclusions = value.exclusions;
+
+        if (exclusions) {
+            for (let exclusion of exclusions)
+                this.exclusionsMap[toStamp(exclusion.dated)] = exclusion;
+        }
+
+        let events = value.events;
+
+        if (events) {
+            for (event of events) {
+                event.dated = toStamp(event.dated);
+                event.ended = toStamp(event.ended);
+                event.started = toStamp(event.started);
+                event.wdays = this.vnWeekDays.fromSet(event.weekDays);
             }
         }
 
@@ -78,17 +89,9 @@ class Controller extends Component {
     }
 
     refreshEvents() {
-        function getDate(date) {
-            return date && new Date(date).setHours(0, 0, 0, 0);
-        }
-
-        let exclusionsMap = {};
-        if (this.exclusions) {
-            for (let exclusion of this.exclusions)
-                exclusionsMap[getDate(exclusion.day)] = exclusion;
-        }
-
         this.days = {};
+        if (!this.data) return;
+
         let day = new Date(this.firstDay.getTime());
 
         while (day <= this.lastDay) {
@@ -99,23 +102,24 @@ class Controller extends Component {
             if (this.events) {
                 for (let event of this.events) {
                     let match;
-                    let from = getDate(event.from);
-                    let to = getDate(event.to);
 
-                    if (event.from && event.to) {
-                        match = stamp >= from && stamp <= to
-                            && event.wdays[wday];
-                    } else if (event.from)
-                        match = from == stamp;
-                    else
-                        match = event.wdays[wday];
+                    switch (event.type) {
+                    case 'day':
+                        match = event.dated == stamp;
+                        break;
+                    default:
+                        match = event.wdays[wday]
+                            && (!event.started || stamp >= event.started)
+                            && (!event.ended || stamp <= event.ended);
+                        break;
+                    }
 
                     if (match)
                         dayEvents.push(event);
                 }
             }
 
-            let exclusion = exclusionsMap[stamp];
+            let exclusion = this.exclusionsMap[stamp];
 
             if (dayEvents.length || exclusion) {
                 let dayData = {};
@@ -152,6 +156,7 @@ class Controller extends Component {
         return dayData && dayData.exclusion ? 'excluded' : '';
     }
 }
+Controller.$inject = ['$element', '$scope', 'vnWeekDays'];
 
 ngModule.component('vnZoneCalendar', {
     template: require('./index.html'),
diff --git a/modules/agency/front/events/index.html b/modules/agency/front/events/index.html
index ec1bec4e8d..1b8c1e8716 100644
--- a/modules/agency/front/events/index.html
+++ b/modules/agency/front/events/index.html
@@ -42,17 +42,17 @@
             class="vn-item">
             <vn-item-section>
                 <div
-                    ng-if="::row.from && !row.to"
+                    ng-if="::row.type == 'day'"
                     class="vn-mb-sm">
-                    {{::row.from | date:'dd/MM/yy'}}
+                    {{::row.dated | date:'dd/MM/yy'}}
                 </div>
                 <div
-                    ng-if="::!row.from || row.to"
+                    ng-if="::row.type != 'day'"
                     class="vn-mb-sm ellipsize">
-                    <span ng-if="row.to">
-                        {{::row.from | date:'dd/MM/yy'}} - {{::row.to | date:'dd/MM/yy'}}
+                    <span ng-if="row.type == 'range'">
+                        {{::row.started | date:'dd/MM/yy'}} - {{::row.ended | date:'dd/MM/yy'}}
                     </span>
-                    <span ng-if="!row.to" translate>
+                    <span ng-if="row.type == 'indefinitely'" translate>
                         Indefinitely
                     </span>
                     <span ng-if="row.weekDays">
@@ -94,40 +94,40 @@
         <vn-vertical>
             <vn-vertical class="vn-pb-md">
                 <vn-radio
-                    ng-model="$ctrl.eventType"
+                    ng-model="$ctrl.selected.type"
                     label="One day"
                     val="day">
                 </vn-radio>
                 <vn-radio
-                    ng-model="$ctrl.eventType"
+                    ng-model="$ctrl.selected.type"
                     label="Indefinitely"
                     val="indefinitely">
                 </vn-radio>
                 <vn-radio
-                    ng-model="$ctrl.eventType"
+                    ng-model="$ctrl.selected.type"
                     label="Range of dates"
                     val="range">
                 </vn-radio>
             </vn-vertical>
             <vn-wday-picker
-                ng-if="$ctrl.eventType != 'day'"
+                ng-if="$ctrl.selected.type != 'day'"
                 ng-model="$ctrl.selected.wdays"
                 class="vn-mt-sm vn-mb-md">
             </vn-wday-picker>
             <vn-date-picker
-                ng-if="$ctrl.eventType == 'day'"
+                ng-if="$ctrl.selected.type == 'day'"
                 label="Day"
-                ng-model="$ctrl.selected.from">
+                ng-model="$ctrl.selected.dated">
             </vn-date-picker>
             <vn-horizontal
-                ng-if="$ctrl.eventType == 'range'">
+                ng-if="$ctrl.selected.type == 'range'">
                 <vn-date-picker
                     label="From"
-                    ng-model="$ctrl.selected.from">
+                    ng-model="$ctrl.selected.started">
                 </vn-date-picker>
                 <vn-date-picker
                     label="To"
-                    ng-model="$ctrl.selected.to">
+                    ng-model="$ctrl.selected.ended">
                 </vn-date-picker>
             </vn-horizontal>
             <vn-input-time
@@ -162,7 +162,7 @@
         </input>
         <button
             ng-if="!$ctrl.isNew"
-            response="DELETE"
+            response="delete"
             translate>
             Delete
         </button>
diff --git a/modules/agency/front/events/index.js b/modules/agency/front/events/index.js
index f7e689afed..b6352802aa 100644
--- a/modules/agency/front/events/index.js
+++ b/modules/agency/front/events/index.js
@@ -1,7 +1,7 @@
 import ngModule from '../module';
-import Component from 'core/lib/component';
+import Section from 'salix/components/section';
 
-class Controller extends Component {
+class Controller extends Section {
     constructor($element, $, vnWeekDays) {
         super($element, $);
         this.vnWeekDays = vnWeekDays;
@@ -27,13 +27,13 @@ class Controller extends Component {
     formatWdays(weekDays) {
         if (!weekDays) return;
 
-        let abrWdays = [];
-        for (let wday of weekDays.split(','))
-            abrWdays.push(this.vnWeekDays.map[wday].localeAbr);
+        let abrWdays = weekDays
+            .split(',')
+            .map(wday => this.vnWeekDays.map[wday].localeAbr);
 
         return abrWdays.length < 7
             ? abrWdays.join(', ')
-            : this._('Everyday');
+            : this.$t('Everyday');
     }
 
     onSelection(days, type, weekday, data) {
@@ -66,37 +66,28 @@ class Controller extends Component {
 
     edit(row) {
         this.isNew = false;
-
-        if (row.from && !row.to)
-            this.eventType = 'day';
-        else if (!row.from)
-            this.eventType = 'indefinitely';
-        else
-            this.eventType = 'range';
-
         this.selected = angular.copy(row);
-        this.selected.wdays = {};
-
-        if (row.weekDays) {
-            let weekDays = row.weekDays.split(',');
-            for (let day of weekDays)
-                this.selected.wdays[day] = true;
-        }
-
+        this.selected.wdays = this.vnWeekDays.fromSet(row.weekDays);
         this.$.dialog.show();
     }
 
     create(days, type, weekday) {
         this.isNew = true;
-        this.eventType = type == 'day' ? 'day' : 'indefinitely';
 
         if (type == 'weekday') {
             let wdays = [];
-            let code = this.vnWeekDays.days[weekday].code;
-            wdays[code] = true;
-            this.selected = {wdays};
-        } else
-            this.selected = {from: days[0]};
+            wdays[weekday] = true;
+
+            this.selected = {
+                type: 'indefinitely',
+                wdays
+            };
+        } else {
+            this.selected = {
+                type: 'day',
+                dated: days[0]
+            };
+        }
 
         this.$.dialog.show();
     }
@@ -105,24 +96,18 @@ class Controller extends Component {
         switch (response) {
         case 'accept': {
             let selected = this.selected;
+            let type = selected.type;
 
-            if (this.eventType == 'indefinitely') {
-                selected.from = null;
-                selected.to = null;
-            }
+            selected.weekDays = this.vnWeekDays.toSet(selected.wdays);
 
-            if (this.eventType != 'day') {
-                let weekDays = [];
-
-                for (let wday in selected.wdays) {
-                    if (selected.wdays[wday])
-                        weekDays.push(wday);
-                }
-
-                selected.weekDays = weekDays.join(',');
-            } else {
-                selected.to = null;
+            if (type == 'day')
                 selected.weekDays = '';
+            else
+                selected.dated = null;
+
+            if (type != 'range') {
+                selected.started = null;
+                selected.ended = null;
             }
 
             let req;
@@ -138,7 +123,7 @@ class Controller extends Component {
                 this.refresh();
             });
         }
-        case 'DELETE':
+        case 'delete':
             return this.onDelete(this.selected.id)
                 .then(response => response == 'accept');
         }
@@ -162,8 +147,8 @@ class Controller extends Component {
     }
 
     exclusionCreate(days) {
-        let exclusions = days.map(day => {
-            return {day};
+        let exclusions = days.map(dated => {
+            return {dated};
         });
 
         this.$http.post(this.exclusionsPath, exclusions)
diff --git a/modules/ticket/front/basic-data/step-one/index.spec.js b/modules/ticket/front/basic-data/step-one/index.spec.js
index 77d20bda5e..4a985d0175 100644
--- a/modules/ticket/front/basic-data/step-one/index.spec.js
+++ b/modules/ticket/front/basic-data/step-one/index.spec.js
@@ -72,7 +72,8 @@ describe('Ticket', () => {
                 const spectedResult = {
                     landed: landed,
                     addressFk: 100,
-                    agencyModeFk: 7
+                    agencyModeFk: 7,
+                    warehouseFk: 1
                 };
                 controller.landed = landed;
 
@@ -98,7 +99,8 @@ describe('Ticket', () => {
                 const spectedResult = {
                     landed: landed,
                     addressFk: 121,
-                    agencyModeFk: 7
+                    agencyModeFk: 7,
+                    warehouseFk: 2
                 };
                 controller.landed = landed;
 
@@ -123,7 +125,8 @@ describe('Ticket', () => {
                 const spectedResult = {
                     shipped: shipped,
                     addressFk: 121,
-                    agencyModeFk: 7
+                    agencyModeFk: 7,
+                    warehouseFk: 1
                 };
                 controller.shipped = shipped;
 
@@ -147,7 +150,8 @@ describe('Ticket', () => {
                 const spectedResult = {
                     landed: landed,
                     addressFk: 121,
-                    agencyModeFk: 7
+                    agencyModeFk: 7,
+                    warehouseFk: 1
                 };
                 controller.landed = landed;
 
@@ -172,7 +176,8 @@ describe('Ticket', () => {
                 const spectedResult = {
                     shipped: shipped,
                     addressFk: 121,
-                    agencyModeFk: agencyModeId
+                    agencyModeFk: agencyModeId,
+                    warehouseFk: 1
                 };
                 controller.ticket.shipped = shipped;
                 controller.agencyModeId = 8;
@@ -187,7 +192,8 @@ describe('Ticket', () => {
                 const spectedResult = {
                     landed: landed,
                     addressFk: 121,
-                    agencyModeFk: agencyModeId
+                    agencyModeFk: agencyModeId,
+                    warehouseFk: 1
                 };
                 controller.ticket.landed = landed;
                 controller.agencyModeId = 7;