diff --git a/devdocs/todo.txt b/devdocs/todo.txt
index 45a57d92..bcb9be65 100644
--- a/devdocs/todo.txt
+++ b/devdocs/todo.txt
@@ -22,6 +22,7 @@ Overall plan for now: anything standing in the way of making the initial client
- Audit log
- Route for retrieving as log format for reading (like reports: one for specific object id and type, one for user id as log of what they've been doing etc)
- Test with huge dataset
+ - Remove CREATED from all objects now that event log tracks it
- Localized text
- Search and search text indexing
- Auto visible id number assigning code
diff --git a/test/raven-integration/EventLog/EventLog.cs b/test/raven-integration/EventLog/EventLog.cs
new file mode 100644
index 00000000..5858700e
--- /dev/null
+++ b/test/raven-integration/EventLog/EventLog.cs
@@ -0,0 +1,92 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace raven_integration
+{
+
+ public class EventLog
+ {
+
+
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void ObjectLogWorks()
+ {
+ //CRUD a widget and confirm it logs properly
+ //http://localhost:7575/api/v8.0/EventLog/UserLog?AyType=3&AyId=1
+ //http://localhost:7575/api/v8.0/EventLog/ObjectLog?AyType=2&AyId=242
+ //http://localhost:7575/api/v8.0/EventLog/UserLog?AyType=3&AyId=1&StartDate=2018-08-23&EndDate=2018-08-24
+
+ dynamic w = new JObject();
+ w.name = Util.Uniquify("EventLog Test WIDGET");
+ w.created = DateTime.Now.ToString();
+ w.dollarAmount = 2.22m;
+ w.active = true;
+ w.roles = 0;
+
+ ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync("InventoryFull"), w.ToString());
+ Util.ValidateDataReturnResponseOk(r2);
+ long w2Id = r2.ObjectResponse["result"]["id"].Value();
+
+
+ //RETRIEVE
+
+ //Get one
+ ApiResponse r3 = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateDataReturnResponseOk(r3);
+ r3.ObjectResponse["result"]["name"].Value().Should().Be(w.name.ToString());
+
+
+
+ //UPDATE
+ //PUT
+
+ //update w2id
+ w.name = Util.Uniquify("UPDATED VIA PUT SECOND TEST WIDGET");
+ w.OwnerId = 1;
+ w.concurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value();
+ ApiResponse PUTTestResponse = await Util.PutAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("InventoryFull"), w.ToString());
+ Util.ValidateHTTPStatusCode(PUTTestResponse, 200);
+
+ //check PUT worked
+ ApiResponse checkPUTWorked = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateNoErrorInResponse(checkPUTWorked);
+ checkPUTWorked.ObjectResponse["result"]["name"].Value().Should().Be(w.name.ToString());
+ uint concurrencyToken = PUTTestResponse.ObjectResponse["result"]["concurrencyToken"].Value();
+
+ //PATCH
+ var newName = Util.Uniquify("UPDATED VIA PATCH SECOND TEST WIDGET");
+ string patchJson = "[{\"value\": \"" + newName + "\",\"path\": \"/name\",\"op\": \"replace\"}]";
+ ApiResponse PATCHTestResponse = await Util.PatchAsync("Widget/" + w2Id.ToString() + "/" + concurrencyToken.ToString(), await Util.GetTokenAsync("InventoryFull"), patchJson);
+ Util.ValidateHTTPStatusCode(PATCHTestResponse, 200);
+
+ //check PATCH worked
+ ApiResponse checkPATCHWorked = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateNoErrorInResponse(checkPATCHWorked);
+ checkPATCHWorked.ObjectResponse["result"]["name"].Value().Should().Be(newName);
+
+ //DELETE
+ ApiResponse DELETETestResponse = await Util.DeleteAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("InventoryFull"));
+ Util.ValidateHTTPStatusCode(DELETETestResponse, 204);
+
+
+
+
+
+ ApiTextResponse t = await Util.GetTextResultAsync("EventLog/", await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(t, 200);
+ t.TextResponse.Should().Contain("|INFO|");//assumes any log will have at least one INFO log item in it
+
+ }
+
+ //==================================================
+
+ }//eoc
+}//eons