diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.desc.xml
new file mode 100644
index 0000000000..5c8870d787
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.desc.xml
@@ -0,0 +1,8 @@
+
+ deleteevent
+ Event Action - Delete event
+ /calendar/delete/{siteid}/{eventname}
+ argument
+ user
+ required
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.js
new file mode 100644
index 0000000000..6e690ea4f4
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.js
@@ -0,0 +1,64 @@
+/**
+ * Delete event action
+ * @method DELETE
+ * @param uri {string} /{siteid}/{eventname}
+ */
+var result = deleteEvent();
+status.code = result;
+
+function deleteEvent()
+{
+ var params = getTemplateParams();
+ if (params === null)
+ {
+ return status.STATUS_BAD_REQUEST;
+ }
+
+ var site = siteService.getSite(params.siteid);
+ if (site === null)
+ {
+ return status.STATUS_NOT_FOUND;
+ }
+
+ var eventsFolder = site.getContainer("calendar");
+ if (eventsFolder === null)
+ {
+ return status.STATUS_NOT_FOUND;
+ }
+
+ var event = eventsFolder.childByNamePath(params.eventname);
+ if (event === null)
+ {
+ return status.STATUS_NOT_FOUND;
+ }
+
+ if (!event.remove())
+ {
+ return status.STATUS_INTERNAL_SERVER_ERROR;
+ }
+
+ // Success
+ return status.STATUS_NO_CONTENT;
+}
+
+function getTemplateParams()
+{
+ // Grab the URI parameters
+ var siteid = "" + url.templateArgs.siteid;
+ var eventname = "" + url.templateArgs.eventname;
+
+ if (siteid === null || siteid.length === 0)
+ {
+ return null;
+ }
+
+ if (eventname === null || eventname.length === 0)
+ {
+ return null;
+ }
+
+ return {
+ "siteid": siteid,
+ "eventname": eventname
+ };
+}
diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.delete.json.ftl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.desc.xml
new file mode 100644
index 0000000000..553c155d87
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.desc.xml
@@ -0,0 +1,8 @@
+
+ updateevent
+ Event Action - Update event
+ /calendar/event/{siteid}/{eventname}
+ argument
+ user
+ required
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.js
new file mode 100644
index 0000000000..101518453a
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.js
@@ -0,0 +1,84 @@
+/**
+ * Update event properties
+ * @method PUT
+ * @param uri {string} /calendar/event/{siteid}/{eventname}
+ */
+function getTemplateParams()
+{
+ // Grab the URI parameters
+ var siteid = "" + url.templateArgs.siteid;
+ var eventname = "" + url.templateArgs.eventname;
+
+ if (siteid === null || siteid.length === 0)
+ {
+ return null;
+ }
+
+ if (eventname === null || eventname.length === 0)
+ {
+ return null;
+ }
+
+ return {
+ "siteid": siteid,
+ "eventname": eventname
+ };
+}
+
+function main()
+{
+ var params = getTemplateParams();
+ if (params === null)
+ {
+ return status.STATUS_BAD_REQUEST;
+ }
+
+ // Get the site
+ var site = siteService.getSite(params.siteid);
+ if (site === null)
+ {
+ return status.STATUS_NOT_FOUND;
+ }
+
+ var eventsFolder = site.getContainer("calendar");
+ if (eventsFolder === null)
+ {
+ return status.STATUS_NOT_FOUND;
+ }
+
+ var event = eventsFolder.childByNamePath(params.eventname);
+ if (event === null)
+ {
+ return status.STATUS_NOT_FOUND;
+ }
+
+ var props = [
+ "ia:whatEvent",
+ "ia:descriptionEvent",
+ "ia:whereEvent"
+ ];
+
+ for (var i=0; i < props.length; i++)
+ {
+ var prop = props[i];
+ try
+ {
+ var value = json.get(prop);
+ // TODO: deal with formatting date strings correctly
+ if (value)
+ {
+ event.properties[prop] = value;
+ }
+ }
+ catch(e)
+ {
+ // Couldn't find the property in the JSON data
+ }
+ }
+
+ event.save();
+ return status.STATUS_NO_CONTENT;
+}
+
+var response = main();
+status.code = response;
diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/calendar/event.put.json.ftl
new file mode 100644
index 0000000000..e69de29bb2