diff --git a/Tags/TagOps.cs b/Tags/TagOps.cs
new file mode 100644
index 0000000..30b6b13
--- /dev/null
+++ b/Tags/TagOps.cs
@@ -0,0 +1,98 @@
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+
+
+namespace raven_integration
+{
+
+ public class TagOps
+ {
+
+ ///
+ ///
+ ///
+ [Fact]
+ public async void TagCRUDProcessingWorks()
+ {
+
+ var TestName = "TagCRUDProcessingWorks";
+ var WidgetRunNameStart = Util.Uniquify(TestName);
+ var TagNameStart = Util.Uniquify("crud-tag-test-") + "-";//ensure this run gets it's own unique tags
+
+ List InitialTagsList = new List();
+ InitialTagsList.Add(TagNameStart + "red");
+ InitialTagsList.Add(TagNameStart + "orange");
+ InitialTagsList.Add(TagNameStart + "yellow");
+ InitialTagsList.Add(TagNameStart + "green");
+ InitialTagsList.Add(TagNameStart + "blue");
+ InitialTagsList.Add(TagNameStart + "indigo");
+ InitialTagsList.Add(TagNameStart + "violet");
+
+ List UpdateTagsList = new List();
+ //Newly added tags
+ UpdateTagsList.Add(TagNameStart + "crimson");
+ UpdateTagsList.Add(TagNameStart + "amber");
+ UpdateTagsList.Add(TagNameStart + "saffron");
+ UpdateTagsList.Add(TagNameStart + "emerald");
+ UpdateTagsList.Add(TagNameStart + "azure");
+ UpdateTagsList.Add(TagNameStart + "cobalt");
+ UpdateTagsList.Add(TagNameStart + "magenta");
+
+ //maintains these tags
+ UpdateTagsList.Add(TagNameStart + "red");
+ UpdateTagsList.Add(TagNameStart + "blue");
+
+ //Removes these tags by omission
+ //orange, yellow, green, indigo, violet
+
+
+ dynamic w = new JObject();
+ w.name = Util.Uniquify(WidgetRunNameStart);
+ //Tags
+ dynamic InitialTags = new JArray();
+ foreach (string s in InitialTagsList)
+ {
+ InitialTags.Add(s);
+ }
+ w.tags = InitialTags;
+
+ ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateDataReturnResponseOk(a);
+ long WidgetId = a.ObjectResponse["data"]["id"].Value();
+
+ //HERE TODO: validate the repository LIST ROUTE of tags contains the ones above and that their refcount is 1
+
+
+ //UPDATE Tags
+ dynamic UpdateTags = new JArray();
+
+ //Adds these tags
+ foreach (string s in UpdateTagsList)
+ {
+ UpdateTags.Add(s);
+ }
+ //update Widget and put to server
+ w.concurrencyToken = a.ObjectResponse["data"]["concurrencyToken"].Value();
+ w.tags = UpdateTags;
+ ApiResponse PUTTestResponse = await Util.PutAsync("Widget/" + WidgetId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), w.ToString());
+ Util.ValidateHTTPStatusCode(PUTTestResponse, 200);
+
+
+ //Verify the tags collection remaining
+ //HERE TODO: validate the repository LIST ROUTE of tags contains the ones above and that their refcount is 1
+
+
+
+
+ }
+
+
+//TODO: Deliberate concurrency violation tests here
+
+
+ //==================================================
+
+ }//eoc
+}//eons