diff --git a/test/raven-integration/Tags/TagGroupOps.cs b/test/raven-integration/Tags/TagGroupOps.cs
new file mode 100644
index 00000000..6a3842dd
--- /dev/null
+++ b/test/raven-integration/Tags/TagGroupOps.cs
@@ -0,0 +1,127 @@
+using System;
+using Xunit;
+using Newtonsoft.Json.Linq;
+using FluentAssertions;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace raven_integration
+{
+
+ public class TagGroupOps
+ {
+
+ ///
+ /// Test taggroup
+ ///
+ [Fact]
+ public async void GroupOpsShouldWork()
+ {
+
+ //CREATE TAG1
+ dynamic D = new JObject();
+ D.name = Util.Uniquify("test-tag1-4-tag-group");
+ ApiResponse R = await Util.PostAsync("Tag", await Util.GetTokenAsync("BizAdminFull"), D.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+ long TestTag1Id = R.ObjectResponse["result"]["id"].Value();
+
+
+ //CREATE TAG2
+ D.name = Util.Uniquify("test-tag2-4-tag-group");
+ R = await Util.PostAsync("Tag", await Util.GetTokenAsync("BizAdminFull"), D.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+ long TestTag2Id = R.ObjectResponse["result"]["id"].Value();
+
+
+ //CREATE TAG-GROUP
+ D = new JObject();
+ D.name = Util.Uniquify("test-tag-group-for-ops");
+
+ R = await Util.PostAsync("TagGroup", await Util.GetTokenAsync("BizAdminFull"), D.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+ long TestTagGroupId = R.ObjectResponse["result"]["id"].Value();
+
+
+ //ADD TEST TAGS TO GROUP
+ D = new JObject();
+ D.tagId = TestTag1Id;
+ D.tagGroupId= TestTagGroupId;
+ R = await Util.PostAsync("TagGroupMap", await Util.GetTokenAsync("BizAdminFull"), D.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+
+ D.tagId = TestTag2Id;
+ D.tagGroupId= TestTagGroupId;
+ R = await Util.PostAsync("TagGroupMap", await Util.GetTokenAsync("BizAdminFull"), D.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+
+
+
+
+
+
+
+ //CREATE WIDGET
+ dynamic w = new JObject();
+ w.name = Util.Uniquify("WIDGET_TAG");
+ w.created = DateTime.Now.ToString();
+ w.dollarAmount = 1.11m;
+ w.active = true;
+ w.roles = 0;
+
+ R = await Util.PostAsync("Widget", await Util.GetTokenAsync("BizAdminFull"), w.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+ long widgetId = R.ObjectResponse["result"]["id"].Value();
+
+ //CREATE TAGMAP (tag the widget)
+ /*
+ {
+ "tagId": 0,
+ "tagToObjectId": 0,
+ "tagToObjectType": 0
+ }
+ */
+ dynamic tm = new JObject();
+ tm.tagId = TestTagId;
+ tm.tagToObjectId = widgetId;
+ tm.tagToObjectType = 2;//widget
+
+
+ R = await Util.PostAsync("TagMap", await Util.GetTokenAsync("BizAdminFull"), tm.ToString());
+ Util.ValidateDataReturnResponseOk(R);
+ long tagMapId = R.ObjectResponse["result"]["id"].Value();
+
+ //VERIFY TAGMAP
+ R = await Util.GetAsync("TagMap/" + tagMapId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateDataReturnResponseOk(R);
+ R.ObjectResponse["result"]["id"].Value().Should().Be(tagMapId);
+
+
+ //ATTEMPT TO DELETE TAG THAT HAS TAGMAP SHOULD FAIL with 2200 / 400
+ R = await Util.DeleteAsync("Tag/" + TestTagId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateViolatesReferentialIntegrityError(R);
+
+ //DELETE TAGMAP
+ R = await Util.DeleteAsync("TagMap/" + tagMapId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(R, 204);
+
+ //DELETE TAG
+ R = await Util.DeleteAsync("Tag/" + TestTagId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(R, 204);
+
+ //DELETE WIDGET
+ R = await Util.DeleteAsync("Widget/" + widgetId.ToString(), await Util.GetTokenAsync("BizAdminFull"));
+ Util.ValidateHTTPStatusCode(R, 204);
+ }
+
+
+
+
+
+
+
+
+
+ //==================================================
+
+ }//eoc
+}//eons