killbill-aplcache

util, jaxrs: Add (enforce) ability to specify applicableObjectTypes

10/12/2017 12:30:44 AM

Changes

Details

diff --git a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
index e8ea8f0..2bc7bd3 100644
--- a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
@@ -184,7 +184,7 @@ public class TestAccountDao extends AccountTestSuiteWithEmbeddedDB {
     @Test(groups = "slow", description = "Test Account DAO: tags")
     public void testTags() throws TagApiException, TagDefinitionApiException {
         final AccountModelDao account = createTestAccount();
-        final TagDefinitionModelDao tagDefinition = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 4), UUID.randomUUID().toString(), internalCallContext);
+        final TagDefinitionModelDao tagDefinition = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 4), UUID.randomUUID().toString(), ObjectType.ACCOUNT.name(), internalCallContext);
         final Tag tag = new DescriptiveTag(tagDefinition.getId(), ObjectType.ACCOUNT, account.getId(), internalCallContext.getCreatedDate());
         tagDao.create(new TagModelDao(tag), internalCallContext);
 
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java
index 0654926..11dbba0 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestTagApi.java
@@ -35,6 +35,9 @@ import org.killbill.billing.util.tag.ControlTagType;
 import org.killbill.billing.util.tag.Tag;
 import org.killbill.billing.util.tag.TagDefinition;
 
+import com.google.common.collect.ImmutableSet;
+
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
 public class TestTagApi extends TestIntegrationBase {
@@ -95,9 +98,14 @@ public class TestTagApi extends TestIntegrationBase {
         // Create a new tag definition
         //
         busHandler.pushExpectedEvents(NextEvent.TAG_DEFINITION);
-        final TagDefinition tagDefinition = tagUserApi.createTagDefinition("foo", "foo desc", callContext);
+        final TagDefinition tagDefinition = tagUserApi.createTagDefinition("foo", "foo desc", ImmutableSet.<ObjectType>of(ObjectType.ACCOUNT, ObjectType.INVOICE), callContext);
         assertListenerStatus();
 
+        final TagDefinition tagDefinition2 = tagUserApi.getTagDefinition(tagDefinition.getId(), callContext);
+        assertEquals(tagDefinition2.getApplicableObjectTypes().size(), 2);
+        assertEquals(tagDefinition2.getApplicableObjectTypes().get(0), ObjectType.ACCOUNT);
+        assertEquals(tagDefinition2.getApplicableObjectTypes().get(1), ObjectType.INVOICE);
+
         //
         // Add 2 Tags on the invoice (1 invoice tag and 1 user tag)
         //
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/TagDefinitionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/TagDefinitionJson.java
index 453883e..779931c 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/TagDefinitionJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/TagDefinitionJson.java
@@ -17,6 +17,7 @@
 package org.killbill.billing.jaxrs.json;
 
 import java.util.List;
+import java.util.Set;
 
 import javax.annotation.Nullable;
 
@@ -29,6 +30,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import io.swagger.annotations.ApiModelProperty;
 
 public class TagDefinitionJson extends JsonBase {
@@ -40,14 +42,14 @@ public class TagDefinitionJson extends JsonBase {
     private final String name;
     @ApiModelProperty(required = true)
     private final String description;
-    private final List<String> applicableObjectTypes;
+    private final Set<String> applicableObjectTypes;
 
     @JsonCreator
     public TagDefinitionJson(@JsonProperty("id") final String id,
                              @JsonProperty("isControlTag") final Boolean isControlTag,
                              @JsonProperty("name") final String name,
                              @JsonProperty("description") @Nullable final String description,
-                             @JsonProperty("applicableObjectTypes") @Nullable final List<String> applicableObjectTypes,
+                             @JsonProperty("applicableObjectTypes") @Nullable final Set<String> applicableObjectTypes,
                              @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
         super(auditLogs);
         this.id = id;
@@ -62,7 +64,7 @@ public class TagDefinitionJson extends JsonBase {
              tagDefinition.isControlTag(),
              tagDefinition.getName(),
              tagDefinition.getDescription(),
-             ImmutableList.<String>copyOf(Collections2.transform(tagDefinition.getApplicableObjectTypes(), new Function<ObjectType, String>() {
+             ImmutableSet.<String>copyOf(Collections2.transform(tagDefinition.getApplicableObjectTypes(), new Function<ObjectType, String>() {
                  @Override
                  public String apply(@Nullable final ObjectType input) {
                      if (input == null) {
@@ -92,7 +94,7 @@ public class TagDefinitionJson extends JsonBase {
         return description;
     }
 
-    public List<String> getApplicableObjectTypes() {
+    public Set<String> getApplicableObjectTypes() {
         return applicableObjectTypes;
     }
 
@@ -156,4 +158,13 @@ public class TagDefinitionJson extends JsonBase {
         result = 31 * result + (applicableObjectTypes != null ? applicableObjectTypes.hashCode() : 0);
         return result;
     }
+
+    public static Set<ObjectType> toObjectType(final Set<String> applicableObjectTypes) {
+        return ImmutableSet.copyOf(Collections2.transform(applicableObjectTypes, new Function<String, ObjectType>() {
+            @Override
+            public ObjectType apply(final String input) {
+                return ObjectType.valueOf(input);
+            }
+        }));
+    }
 }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
index d5cfaa0..efa5c24 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TagDefinitionResource.java
@@ -52,6 +52,7 @@ import org.killbill.billing.util.tag.TagDefinition;
 import org.killbill.clock.Clock;
 import org.killbill.commons.metrics.TimedResource;
 
+import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.swagger.annotations.Api;
@@ -129,8 +130,11 @@ public class TagDefinitionResource extends JaxRsResourceBase {
         verifyNonNullOrEmpty(json, "TagDefinitionJson body should be specified");
         verifyNonNullOrEmpty(json.getName(), "TagDefinition name needs to be set",
                              json.getDescription(), "TagDefinition description needs to be set");
+        Preconditions.checkArgument(json.getApplicableObjectTypes() != null &&
+                                    !json.getApplicableObjectTypes().isEmpty(), "Applicable object types must be set");
 
-        final TagDefinition createdTagDef = tagUserApi.createTagDefinition(json.getName(), json.getDescription(), context.createCallContextNoAccountId(createdBy, reason, comment, request));
+
+        final TagDefinition createdTagDef = tagUserApi.createTagDefinition(json.getName(), json.getDescription(), TagDefinitionJson.toObjectType(json.getApplicableObjectTypes()), context.createCallContextNoAccountId(createdBy, reason, comment, request));
         return uriBuilder.buildResponse(uriInfo, TagDefinitionResource.class, "getTagDefinition", createdTagDef.getId(), request);
     }
 
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestTagDefinitionJson.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestTagDefinitionJson.java
index 93721d6..2a6da5e 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestTagDefinitionJson.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestTagDefinitionJson.java
@@ -24,6 +24,7 @@ import org.testng.annotations.Test;
 import org.killbill.billing.jaxrs.JaxrsTestSuiteNoDB;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 public class TestTagDefinitionJson extends JaxrsTestSuiteNoDB {
 
@@ -33,7 +34,7 @@ public class TestTagDefinitionJson extends JaxrsTestSuiteNoDB {
         final Boolean isControlTag = true;
         final String name = UUID.randomUUID().toString();
         final String description = UUID.randomUUID().toString();
-        final ImmutableList<String> applicableObjectTypes = ImmutableList.<String>of(UUID.randomUUID().toString());
+        final ImmutableSet<String> applicableObjectTypes = ImmutableSet.<String>of(UUID.randomUUID().toString());
         final TagDefinitionJson tagDefinitionJson = new TagDefinitionJson(id, isControlTag, name, description, applicableObjectTypes, null);
         Assert.assertEquals(tagDefinitionJson.getId(), id);
         Assert.assertEquals(tagDefinitionJson.isControlTag(), isControlTag);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
index 69c17a0..d7beb54 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
@@ -26,6 +26,7 @@ import java.util.UUID;
 
 import javax.annotation.Nullable;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.client.KillBillClientException;
 import org.killbill.billing.client.RequestOptions;
 import org.killbill.billing.client.model.Account;
@@ -696,7 +697,7 @@ public class TestPayment extends TestJaxrsBase {
     public void testGetTagsForPaymentTransaction() throws Exception {
         UUID tagDefinitionId = UUID.randomUUID();
         String tagDefinitionName = "payment-transaction";
-        TagDefinition tagDefinition = new TagDefinition(tagDefinitionId, false, tagDefinitionName, "description", null);
+        TagDefinition tagDefinition = new TagDefinition(tagDefinitionId, false, tagDefinitionName, "description",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         final TagDefinition createdTagDefinition = killBillClient.createTagDefinition(tagDefinition, requestOptions);
 
         final Account account = createAccountWithDefaultPaymentMethod();
@@ -719,7 +720,7 @@ public class TestPayment extends TestJaxrsBase {
     public void testCreateTagForPaymentTransaction() throws Exception {
         UUID tagDefinitionId = UUID.randomUUID();
         String tagDefinitionName = "payment-transaction";
-        TagDefinition tagDefinition = new TagDefinition(tagDefinitionId, false, tagDefinitionName, "description", null);
+        TagDefinition tagDefinition = new TagDefinition(tagDefinitionId, false, tagDefinitionName, "description", ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         final TagDefinition createdTagDefinition = killBillClient.createTagDefinition(tagDefinition, requestOptions);
 
         final Account account = createAccountWithDefaultPaymentMethod();
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java
index 5ba7ba8..ae69442 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestTag.java
@@ -49,9 +49,9 @@ public class TestTag extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Cannot add badly formatted TagDefinition")
     public void testTagErrorHandling() throws Exception {
-        final TagDefinition[] tagDefinitions = {new TagDefinition(null, false, null, null, null),
-                                                new TagDefinition(null, false, "something", null, null),
-                                                new TagDefinition(null, false, null, "something", null)};
+        final TagDefinition[] tagDefinitions = {new TagDefinition(null, false, null, null,  ImmutableList.<ObjectType>of(ObjectType.ACCOUNT)),
+                                                new TagDefinition(null, false, "something", null,  ImmutableList.<ObjectType>of(ObjectType.INVOICE)),
+                                                new TagDefinition(null, false, null, "something",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION))};
 
         for (final TagDefinition tagDefinition : tagDefinitions) {
             try {
@@ -66,7 +66,7 @@ public class TestTag extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Can create a TagDefinition")
     public void testTagDefinitionOk() throws Exception {
-        final TagDefinition input = new TagDefinition(null, false, "blue", "relaxing color", ImmutableList.<ObjectType>of());
+        final TagDefinition input = new TagDefinition(null, false, "blue", "relaxing color",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
 
         final TagDefinition objFromJson = killBillClient.createTagDefinition(input, requestOptions);
         assertNotNull(objFromJson);
@@ -80,16 +80,16 @@ public class TestTag extends TestJaxrsBase {
         final int sizeSystemTag = objFromJson.isEmpty() ? 0 : objFromJson.size();
 
 
-        final TagDefinition inputBlue = new TagDefinition(null, false, "blue", "relaxing color", ImmutableList.<ObjectType>of());
+        final TagDefinition inputBlue = new TagDefinition(null, false, "blue", "relaxing color",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         killBillClient.createTagDefinition(inputBlue, requestOptions);
 
-        final TagDefinition inputRed = new TagDefinition(null, false, "red", "hot color", ImmutableList.<ObjectType>of());
+        final TagDefinition inputRed = new TagDefinition(null, false, "red", "hot color",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         killBillClient.createTagDefinition(inputRed, requestOptions);
 
-        final TagDefinition inputYellow = new TagDefinition(null, false, "yellow", "vibrant color", ImmutableList.<ObjectType>of());
+        final TagDefinition inputYellow = new TagDefinition(null, false, "yellow", "vibrant color",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         killBillClient.createTagDefinition(inputYellow, requestOptions);
 
-        final TagDefinition inputGreen = new TagDefinition(null, false, "green", "super relaxing color", ImmutableList.<ObjectType>of());
+        final TagDefinition inputGreen = new TagDefinition(null, false, "green", "super relaxing color",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         killBillClient.createTagDefinition(inputGreen, requestOptions);
 
         objFromJson = killBillClient.getTagDefinitions(requestOptions);
@@ -119,7 +119,7 @@ public class TestTag extends TestJaxrsBase {
             killBillClient.createAccountTag(account.getAccountId(), controlTagType.getId(), requestOptions);
         }
 
-        final TagDefinition bundleTagDefInput = new TagDefinition(null, false, "bundletagdef", "nothing special", ImmutableList.<ObjectType>of());
+        final TagDefinition bundleTagDefInput = new TagDefinition(null, false, "bundletagdef", "nothing special",  ImmutableList.<ObjectType>of(ObjectType.TRANSACTION));
         final TagDefinition bundleTagDef = killBillClient.createTagDefinition(bundleTagDefInput, requestOptions);
 
         killBillClient.createBundleTag(subscriptionJson.getBundleId(), bundleTagDef.getId(), requestOptions);
diff --git a/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java b/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java
index 55314d1..eb81b50 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/api/DefaultTagUserApi.java
@@ -18,6 +18,7 @@ package org.killbill.billing.util.tag.api;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 
 import org.killbill.billing.ErrorCode;
@@ -45,6 +46,7 @@ import org.killbill.billing.util.tag.dao.TagModelDao;
 import org.killbill.billing.util.tag.dao.TagModelDaoHelper;
 
 import com.google.common.base.Function;
+import com.google.common.base.Joiner;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
@@ -53,6 +55,8 @@ import static org.killbill.billing.util.entity.dao.DefaultPaginationHelper.getEn
 
 public class DefaultTagUserApi implements TagUserApi {
 
+    private static final Joiner JOINER = Joiner.on(",");
+
     private static final Function<TagModelDao, Tag> TAG_MODEL_DAO_TAG_FUNCTION = new Function<TagModelDao, Tag>() {
         @Override
         public Tag apply(final TagModelDao input) {
@@ -85,11 +89,11 @@ public class DefaultTagUserApi implements TagUserApi {
     }
 
     @Override
-    public TagDefinition createTagDefinition(final String definitionName, final String description, final CallContext context) throws TagDefinitionApiException {
+    public TagDefinition createTagDefinition(final String definitionName, final String description, final Set<ObjectType> applicableObjectTypes, final CallContext context) throws TagDefinitionApiException {
         if (definitionName.matches(".*[A-Z].*")) {
             throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_HAS_UPPERCASE, definitionName);
         }
-        final TagDefinitionModelDao tagDefinitionModelDao = tagDefinitionDao.create(definitionName, description, internalCallContextFactory.createInternalCallContextWithoutAccountRecordId(context));
+        final TagDefinitionModelDao tagDefinitionModelDao = tagDefinitionDao.create(definitionName, description, JOINER.join(applicableObjectTypes), internalCallContextFactory.createInternalCallContextWithoutAccountRecordId(context));
         return new DefaultTagDefinition(tagDefinitionModelDao, TagModelDaoHelper.isControlTag(tagDefinitionModelDao.getName()));
     }
 
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java
index 90d2d75..dfa1331 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/DefaultTagDefinitionDao.java
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 
 import org.killbill.billing.BillingExceptionBase;
@@ -59,6 +60,7 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
     private final TagEventBuilder tagEventBuilder;
     private final PersistentBus bus;
 
+
     @Inject
     public DefaultTagDefinitionDao(final IDBI dbi, final TagEventBuilder tagEventBuilder, final PersistentBus bus, final Clock clock,
                                    final CacheControllerDispatcher controllerDispatcher, final NonEntityDao nonEntityDao, final InternalCallContextFactory internalCallContextFactory) {
@@ -134,7 +136,7 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
     }
 
     @Override
-    public TagDefinitionModelDao create(final String definitionName, final String description,
+    public TagDefinitionModelDao create(final String definitionName, final String description, final String tagDefinitionObjectTypes,
                                         final InternalCallContext context) throws TagDefinitionApiException {
         // Make sure a invoice tag with this name don't already exist
         if (TagModelDaoHelper.isControlTag(definitionName)) {
@@ -154,7 +156,7 @@ public class DefaultTagDefinitionDao extends EntityDaoBase<TagDefinitionModelDao
                     }
 
                     // Create it
-                    final TagDefinitionModelDao tagDefinition = new TagDefinitionModelDao(context.getCreatedDate(), definitionName, description);
+                    final TagDefinitionModelDao tagDefinition = new TagDefinitionModelDao(context.getCreatedDate(), definitionName, description, tagDefinitionObjectTypes);
                     createAndRefresh(tagDefinitionSqlDao, tagDefinition, context);
 
                     // Post an event to the bus
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/SystemTags.java b/util/src/main/java/org/killbill/billing/util/tag/dao/SystemTags.java
index 5879654..61ae17e 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/SystemTags.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/SystemTags.java
@@ -24,6 +24,7 @@ import java.util.UUID;
 
 import javax.annotation.Nullable;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.util.tag.ControlTagType;
 
 import com.google.common.base.Predicate;
@@ -37,7 +38,7 @@ public class SystemTags {
     public static final String PARK_TAG_DEFINITION_NAME = "__PARK__";
 
     // Note! TagSqlDao.sql.stg needs to be kept in sync (see userAndSystemTagDefinitions)
-    private static final List<TagDefinitionModelDao> SYSTEM_DEFINED_TAG_DEFINITIONS = ImmutableList.<TagDefinitionModelDao>of(new TagDefinitionModelDao(PARK_TAG_DEFINITION_ID, null, null, PARK_TAG_DEFINITION_NAME, "Accounts with invalid invoicing state"));
+    private static final List<TagDefinitionModelDao> SYSTEM_DEFINED_TAG_DEFINITIONS = ImmutableList.<TagDefinitionModelDao>of(new TagDefinitionModelDao(PARK_TAG_DEFINITION_ID, null, null, PARK_TAG_DEFINITION_NAME, "Accounts with invalid invoicing state", ObjectType.ACCOUNT.name()));
 
     public static Collection<TagDefinitionModelDao> get(final boolean includeSystemTags) {
         final Collection<TagDefinitionModelDao> all = includeSystemTags ?
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java
index 84f3bed..e409c89 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionDao.java
@@ -34,7 +34,7 @@ public interface TagDefinitionDao extends EntityDao<TagDefinitionModelDao, TagDe
 
     public List<TagDefinitionModelDao> getByIds(Collection<UUID> definitionIds, InternalTenantContext context);
 
-    public TagDefinitionModelDao create(String definitionName, String description, InternalCallContext context) throws TagDefinitionApiException;
+    public TagDefinitionModelDao create(String definitionName, String description, String tagDefinitionObjectTypes, InternalCallContext context) throws TagDefinitionApiException;
 
     public void deleteById(UUID definitionId, InternalCallContext context) throws TagDefinitionApiException;
 }
diff --git a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionModelDao.java b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionModelDao.java
index 337afbc..d2f5fdd 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionModelDao.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/dao/TagDefinitionModelDao.java
@@ -27,32 +27,38 @@ import org.killbill.billing.util.entity.dao.EntityModelDaoBase;
 import org.killbill.billing.util.tag.ControlTagType;
 import org.killbill.billing.util.tag.TagDefinition;
 
+import com.google.common.base.Joiner;
+
 public class TagDefinitionModelDao extends EntityModelDaoBase implements EntityModelDao<TagDefinition> {
 
+    private static final Joiner JOINER = Joiner.on(",");
     private String name;
+    private String applicableObjectTypes;
     private String description;
     private Boolean isActive;
 
     public TagDefinitionModelDao() { /* For the DAO mapper */ }
 
-    public TagDefinitionModelDao(final UUID id, final DateTime createdDate, final DateTime updatedDate, final String name, final String description) {
+    public TagDefinitionModelDao(final UUID id, final DateTime createdDate, final DateTime updatedDate, final String name, final String description, String applicableObjectTypes) {
         super(id, createdDate, updatedDate);
         this.name = name;
         this.description = description;
         this.isActive = true;
+        this.applicableObjectTypes = applicableObjectTypes;
     }
 
     public TagDefinitionModelDao(final ControlTagType tag) {
-        this(tag.getId(), null, null, tag.name(), tag.getDescription());
+        this(tag.getId(), null, null, tag.name(), tag.getDescription(), JOINER.join(tag.getApplicableObjectTypes()));
     }
 
-    public TagDefinitionModelDao(final DateTime createdDate, final String name, final String description) {
-        this(UUIDs.randomUUID(), createdDate, createdDate, name, description);
+    public TagDefinitionModelDao(final DateTime createdDate, final String name, final String description, String applicableObjectTypes) {
+        this(UUID.randomUUID(), createdDate, createdDate, name, description, applicableObjectTypes);
     }
 
+
     public TagDefinitionModelDao(final TagDefinition tagDefinition) {
         this(tagDefinition.getId(), tagDefinition.getCreatedDate(), tagDefinition.getUpdatedDate(), tagDefinition.getName(),
-             tagDefinition.getDescription());
+             tagDefinition.getDescription(), JOINER.join(tagDefinition.getApplicableObjectTypes()));
     }
 
     public String getName() {
@@ -67,6 +73,14 @@ public class TagDefinitionModelDao extends EntityModelDaoBase implements EntityM
         return isActive;
     }
 
+    public String getApplicableObjectTypes() {
+        return applicableObjectTypes;
+    }
+
+    public void setApplicableObjectTypes(final String applicableObjectTypes) {
+        this.applicableObjectTypes = applicableObjectTypes;
+    }
+
     public void setName(final String name) {
         this.name = name;
     }
@@ -85,6 +99,7 @@ public class TagDefinitionModelDao extends EntityModelDaoBase implements EntityM
         sb.append("TagDefinitionModelDao");
         sb.append("{name='").append(name).append('\'');
         sb.append(", description='").append(description).append('\'');
+        sb.append(", applicableObjectTypes='").append(applicableObjectTypes).append('\'');
         sb.append(", isActive=").append(isActive);
         sb.append('}');
         return sb.toString();
@@ -110,6 +125,9 @@ public class TagDefinitionModelDao extends EntityModelDaoBase implements EntityM
         if (isActive != null ? !isActive.equals(that.isActive) : that.isActive != null) {
             return false;
         }
+        if (applicableObjectTypes != null ? !applicableObjectTypes.equals(that.applicableObjectTypes) : that.applicableObjectTypes != null) {
+            return false;
+        }
         if (name != null ? !name.equals(that.name) : that.name != null) {
             return false;
         }
@@ -123,6 +141,7 @@ public class TagDefinitionModelDao extends EntityModelDaoBase implements EntityM
         result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (description != null ? description.hashCode() : 0);
         result = 31 * result + (isActive != null ? isActive.hashCode() : 0);
+        result = 31 * result + (applicableObjectTypes != null ? applicableObjectTypes.hashCode() : 0);
         return result;
     }
 
diff --git a/util/src/main/java/org/killbill/billing/util/tag/DefaultTagDefinition.java b/util/src/main/java/org/killbill/billing/util/tag/DefaultTagDefinition.java
index 05ca6b4..77db66f 100644
--- a/util/src/main/java/org/killbill/billing/util/tag/DefaultTagDefinition.java
+++ b/util/src/main/java/org/killbill/billing/util/tag/DefaultTagDefinition.java
@@ -19,6 +19,8 @@ package org.killbill.billing.util.tag;
 import java.util.List;
 import java.util.UUID;
 
+import javax.annotation.Nullable;
+
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.entity.EntityBase;
 import org.killbill.billing.util.UUIDs;
@@ -26,32 +28,41 @@ import org.killbill.billing.util.tag.dao.TagDefinitionModelDao;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 
 public class DefaultTagDefinition extends EntityBase implements TagDefinition {
 
+    private static final Splitter SPLITTER = Splitter.on(',').omitEmptyStrings().trimResults();
+
     private final String name;
     private final String description;
     private final Boolean controlTag;
     private final List<ObjectType> applicableObjectTypes;
 
+
     public DefaultTagDefinition(final TagDefinitionModelDao tagDefinitionModelDao, final boolean isControlTag) {
-        this(tagDefinitionModelDao.getId(), tagDefinitionModelDao.getName(), tagDefinitionModelDao.getDescription(), isControlTag);
+        this(tagDefinitionModelDao.getId(), tagDefinitionModelDao.getName(), tagDefinitionModelDao.getDescription(), isControlTag, toObjectTypes(tagDefinitionModelDao.getApplicableObjectTypes()));
     }
 
+
+    public DefaultTagDefinition(final ControlTagType controlTag) {
+        this(controlTag.getId(), controlTag.toString(), controlTag.getDescription(), true, controlTag.getApplicableObjectTypes());
+    }
+
+    // Test only
     public DefaultTagDefinition(final String name, final String description, final Boolean isControlTag) {
         this(UUIDs.randomUUID(), name, description, isControlTag);
     }
 
+    // Test only
     public DefaultTagDefinition(final UUID id, final String name, final String description, final Boolean isControlTag) {
         this(id, name, description, isControlTag, getApplicableObjectTypes(id, isControlTag));
     }
 
-    public DefaultTagDefinition(final ControlTagType controlTag) {
-        this(controlTag.getId(), controlTag.toString(), controlTag.getDescription(), true, controlTag.getApplicableObjectTypes());
-    }
-
-
     @JsonCreator
     public DefaultTagDefinition(@JsonProperty("id") final UUID id,
                                 @JsonProperty("name") final String name,
@@ -144,4 +155,14 @@ public class DefaultTagDefinition extends EntityBase implements TagDefinition {
         }
         throw new IllegalStateException(String.format("ControlTag id %s does not seem to exist", id));
     }
+
+    private static List<ObjectType> toObjectTypes(final String input) {
+        return ImmutableList.copyOf(Iterables.transform(SPLITTER.splitToList(input), new Function<String, ObjectType>() {
+            @Override
+            public ObjectType apply(final String input) {
+                return ObjectType.valueOf(input);
+            }
+        }));
+    }
+
 }
diff --git a/util/src/main/resources/org/killbill/billing/util/ddl.sql b/util/src/main/resources/org/killbill/billing/util/ddl.sql
index 552f8dd..5523655 100644
--- a/util/src/main/resources/org/killbill/billing/util/ddl.sql
+++ b/util/src/main/resources/org/killbill/billing/util/ddl.sql
@@ -49,6 +49,7 @@ CREATE TABLE tag_definitions (
     record_id serial unique,
     id varchar(36) NOT NULL,
     name varchar(20) NOT NULL,
+    applicable_object_types varchar(500),
     description varchar(200) NOT NULL,
     is_active boolean default true,
     created_by varchar(50) NOT NULL,
@@ -67,6 +68,7 @@ CREATE TABLE tag_definition_history (
     id varchar(36) NOT NULL,
     target_record_id bigint /*! unsigned */ not null,
     name varchar(30) NOT NULL,
+    applicable_object_types varchar(500),
     description varchar(200),
     is_active boolean default true,
     change_type varchar(6) NOT NULL,
diff --git a/util/src/main/resources/org/killbill/billing/util/migration/V20171011170256__tag_definition_object_types.sql b/util/src/main/resources/org/killbill/billing/util/migration/V20171011170256__tag_definition_object_types.sql
new file mode 100644
index 0000000..09b02bd
--- /dev/null
+++ b/util/src/main/resources/org/killbill/billing/util/migration/V20171011170256__tag_definition_object_types.sql
@@ -0,0 +1,2 @@
+alter table tag_definitions add column applicable_object_types varchar(500) after name;
+alter table tag_definition_history add column applicable_object_types varchar(500) after name;
diff --git a/util/src/main/resources/org/killbill/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg b/util/src/main/resources/org/killbill/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg
index cc1f546..3b16041 100644
--- a/util/src/main/resources/org/killbill/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg
+++ b/util/src/main/resources/org/killbill/billing/util/tag/dao/TagDefinitionSqlDao.sql.stg
@@ -6,6 +6,7 @@ andCheckSoftDeletionWithComma(prefix) ::= "and <prefix>is_active"
 
 tableFields(prefix) ::= <<
   <prefix>name
+, <prefix>applicable_object_types
 , <prefix>description
 , <prefix>is_active
 , <prefix>created_by
@@ -16,6 +17,7 @@ tableFields(prefix) ::= <<
 
 tableValues() ::= <<
   :name
+, :applicableObjectTypes
 , :description
 , :isActive
 , :createdBy
diff --git a/util/src/test/java/org/killbill/billing/util/audit/dao/TestDefaultAuditDao.java b/util/src/test/java/org/killbill/billing/util/audit/dao/TestDefaultAuditDao.java
index 4249b18..9251e98 100644
--- a/util/src/test/java/org/killbill/billing/util/audit/dao/TestDefaultAuditDao.java
+++ b/util/src/test/java/org/killbill/billing/util/audit/dao/TestDefaultAuditDao.java
@@ -96,6 +96,7 @@ public class TestDefaultAuditDao extends UtilTestSuiteWithEmbeddedDB {
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
         final TagDefinitionModelDao tagDefinition = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5),
                                                                             UUID.randomUUID().toString().substring(0, 5),
+                                                                            ObjectType.ACCOUNT.name(),
                                                                             internalCallContext);
         assertListenerStatus();
 
diff --git a/util/src/test/java/org/killbill/billing/util/dao/TestPagination.java b/util/src/test/java/org/killbill/billing/util/dao/TestPagination.java
index 107585e..72dcfc7 100644
--- a/util/src/test/java/org/killbill/billing/util/dao/TestPagination.java
+++ b/util/src/test/java/org/killbill/billing/util/dao/TestPagination.java
@@ -18,6 +18,7 @@ package org.killbill.billing.util.dao;
 
 import java.util.List;
 
+import org.killbill.billing.ObjectType;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -38,7 +39,7 @@ public class TestPagination extends UtilTestSuiteWithEmbeddedDB {
             final String definitionName = "name-" + i;
             final String description = "description-" + i;
             eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-            tagDefinitionDao.create(definitionName, description, internalCallContext);
+            tagDefinitionDao.create(definitionName, description, ObjectType.ACCOUNT.name(), internalCallContext);
             assertListenerStatus();
         }
 
diff --git a/util/src/test/java/org/killbill/billing/util/tag/api/TestDefaultTagUserApiWithMockDao.java b/util/src/test/java/org/killbill/billing/util/tag/api/TestDefaultTagUserApiWithMockDao.java
index fd7b6a1..7dba212 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/api/TestDefaultTagUserApiWithMockDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/api/TestDefaultTagUserApiWithMockDao.java
@@ -17,6 +17,7 @@
 
 package org.killbill.billing.util.tag.api;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.callcontext.DefaultCallContext;
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.util.UtilTestSuiteNoDB;
@@ -31,6 +32,8 @@ import org.mockito.Mockito;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableSet;
+
 import static org.testng.Assert.assertEquals;
 
 public class TestDefaultTagUserApiWithMockDao extends UtilTestSuiteNoDB {
@@ -50,17 +53,17 @@ public class TestDefaultTagUserApiWithMockDao extends UtilTestSuiteNoDB {
 
     @Test(groups = "fast", expectedExceptions = TagDefinitionApiException.class, expectedExceptionsMessageRegExp = "The tag definition name must be in lowercase .*")
     public void testCreateTagDefinitionWithMiddleUpperCase() throws Exception {
-        tagUserApi.createTagDefinition("inVaLid", "description", context);
+        tagUserApi.createTagDefinition("inVaLid", "description", ImmutableSet.<ObjectType>of(ObjectType.ACCOUNT), context);
     }
 
     @Test(groups = "fast", expectedExceptions = TagDefinitionApiException.class, expectedExceptionsMessageRegExp = "The tag definition name must be in lowercase .*")
     public void testCreateTagDefinitionWithFrontUpperCase() throws Exception {
-        tagUserApi.createTagDefinition("Invalid", "description", context);
+        tagUserApi.createTagDefinition("Invalid", "description", ImmutableSet.<ObjectType>of(ObjectType.ACCOUNT), context);
     }
 
     @Test(groups = "fast", expectedExceptions = TagDefinitionApiException.class, expectedExceptionsMessageRegExp = "The tag definition name must be in lowercase .*")
     public void testCreateTagDefinitionWithBackUpperCase() throws Exception {
-        tagUserApi.createTagDefinition("invaliD", "description", context);
+        tagUserApi.createTagDefinition("invaliD", "description", ImmutableSet.<ObjectType>of(ObjectType.ACCOUNT), context);
     }
 
     @Test(groups = "fast")
@@ -68,8 +71,9 @@ public class TestDefaultTagUserApiWithMockDao extends UtilTestSuiteNoDB {
         final String tagDefinitionName = "lowercase";
         final TagDefinitionModelDao tagDefinitionModelDao = new TagDefinitionModelDao();
         tagDefinitionModelDao.setName(tagDefinitionName);
-        Mockito.when(tagDefinitionDao.create(Mockito.anyString(), Mockito.anyString(), Mockito.any(InternalCallContext.class))).thenReturn(tagDefinitionModelDao);
-        final TagDefinition tagDefinition = tagUserApi.createTagDefinition(tagDefinitionName, "description", context);
+        tagDefinitionModelDao.setApplicableObjectTypes(ObjectType.ACCOUNT.name());
+        Mockito.when(tagDefinitionDao.create(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.any(InternalCallContext.class))).thenReturn(tagDefinitionModelDao);
+        final TagDefinition tagDefinition = tagUserApi.createTagDefinition(tagDefinitionName, "description", ImmutableSet.<ObjectType>of(ObjectType.ACCOUNT), context);
         assertEquals(tagDefinitionName, tagDefinition.getName());
     }
 }
diff --git a/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java b/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java
index f382b4f..8ae3ab6 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/dao/MockTagDefinitionDao.java
@@ -29,6 +29,8 @@ import org.killbill.billing.util.api.TagDefinitionApiException;
 import org.killbill.billing.util.entity.dao.MockEntityDaoBase;
 import org.killbill.billing.util.tag.TagDefinition;
 
+import com.google.common.collect.ImmutableList;
+
 public class MockTagDefinitionDao extends MockEntityDaoBase<TagDefinitionModelDao, TagDefinition, TagDefinitionApiException> implements TagDefinitionDao {
 
     private final Map<String, TagDefinitionModelDao> tags = new ConcurrentHashMap<String, TagDefinitionModelDao>();
@@ -44,9 +46,9 @@ public class MockTagDefinitionDao extends MockEntityDaoBase<TagDefinitionModelDa
     }
 
     @Override
-    public TagDefinitionModelDao create(final String definitionName, final String description,
+    public TagDefinitionModelDao create(final String definitionName, final String description, final String tagDefinitionObjectTypes,
                                         final InternalCallContext context) throws TagDefinitionApiException {
-        final TagDefinitionModelDao tag = new TagDefinitionModelDao(null, definitionName, description);
+        final TagDefinitionModelDao tag = new TagDefinitionModelDao(null, definitionName, description, tagDefinitionObjectTypes);
 
         tags.put(tag.getId().toString(), tag);
         return tag;
diff --git a/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDao.java b/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDao.java
index d648fcd..e3f019c 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDao.java
@@ -46,17 +46,17 @@ public class TestDefaultTagDao extends UtilTestSuiteWithEmbeddedDB {
         assertEquals(result.size(), 0);
 
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao defYo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion yo", internalCallContext);
+        final TagDefinitionModelDao defYo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion yo", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
         uuids.add(defYo.getId());
 
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao defBah = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion bah", internalCallContext);
+        final TagDefinitionModelDao defBah = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion bah", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
         uuids.add(defBah.getId());
 
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao defZoo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion zoo", internalCallContext);
+        final TagDefinitionModelDao defZoo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion zoo", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
         uuids.add(defZoo.getId());
 
@@ -76,7 +76,7 @@ public class TestDefaultTagDao extends UtilTestSuiteWithEmbeddedDB {
     public void testGetById() throws TagDefinitionApiException {
         // User Tag
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao defYo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion yo", internalCallContext);
+        final TagDefinitionModelDao defYo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion yo", ObjectType.ACCOUNT.name(),internalCallContext);
         assertListenerStatus();
 
         final TagDefinitionModelDao resDefYo = tagDefinitionDao.getById(defYo.getId(), internalCallContext);
@@ -84,7 +84,7 @@ public class TestDefaultTagDao extends UtilTestSuiteWithEmbeddedDB {
 
         // Control Tag
         try {
-            tagDefinitionDao.create(ControlTagType.AUTO_INVOICING_OFF.name(), ControlTagType.AUTO_INVOICING_OFF.name(), internalCallContext);
+            tagDefinitionDao.create(ControlTagType.AUTO_INVOICING_OFF.name(), ControlTagType.AUTO_INVOICING_OFF.name(), ObjectType.ACCOUNT.name(),internalCallContext);
             Assert.fail("Should not be able to create a invoice tag");
         } catch (TagDefinitionApiException ignore) {
         }
@@ -98,7 +98,7 @@ public class TestDefaultTagDao extends UtilTestSuiteWithEmbeddedDB {
     public void testGetByName() throws TagDefinitionApiException {
         // User Tag
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao defYo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion yo", internalCallContext);
+        final TagDefinitionModelDao defYo = tagDefinitionDao.create(UUID.randomUUID().toString().substring(0, 5), "defintion yo", ObjectType.ACCOUNT.name(),internalCallContext);
         assertListenerStatus();
 
         final TagDefinitionModelDao resDefYo = tagDefinitionDao.getByName(defYo.getName(), internalCallContext);
@@ -106,7 +106,7 @@ public class TestDefaultTagDao extends UtilTestSuiteWithEmbeddedDB {
 
         // Control Tag
         try {
-            tagDefinitionDao.create(ControlTagType.AUTO_PAY_OFF.name(), ControlTagType.AUTO_INVOICING_OFF.name(), internalCallContext);
+            tagDefinitionDao.create(ControlTagType.AUTO_PAY_OFF.name(), ControlTagType.AUTO_INVOICING_OFF.name(), ObjectType.ACCOUNT.name(), internalCallContext);
             Assert.fail("Should not be able to create a invoice tag");
         } catch (TagDefinitionApiException ignore) {
         }
@@ -125,7 +125,7 @@ public class TestDefaultTagDao extends UtilTestSuiteWithEmbeddedDB {
 
         // Create a tag definition
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao createdTagDefinition = tagDefinitionDao.create(definitionName, description, internalCallContext);
+        final TagDefinitionModelDao createdTagDefinition = tagDefinitionDao.create(definitionName, description, ObjectType.ACCOUNT.name(), internalCallContext);
         Assert.assertEquals(createdTagDefinition.getName(), definitionName);
         Assert.assertEquals(createdTagDefinition.getDescription(), description);
         assertListenerStatus();
diff --git a/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java b/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
index a24ba3e..187300e 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
@@ -16,10 +16,12 @@
 
 package org.killbill.billing.util.tag.dao;
 
+import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import org.killbill.billing.ObjectType;
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
@@ -42,7 +44,7 @@ public class TestDefaultTagDefinitionDao extends UtilTestSuiteWithEmbeddedDB {
 
         // Make sure we can create a tag definition
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao createdTagDefinition = tagDefinitionDao.create(definitionName, description, internalCallContext);
+        final TagDefinitionModelDao createdTagDefinition = tagDefinitionDao.create(definitionName, description, ObjectType.ACCOUNT.name(), internalCallContext);
         Assert.assertEquals(createdTagDefinition.getName(), definitionName);
         Assert.assertEquals(createdTagDefinition.getDescription(), description);
         assertListenerStatus();
diff --git a/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java b/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java
index 8de750a..d9bd318 100644
--- a/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java
+++ b/util/src/test/java/org/killbill/billing/util/tag/TestTagStore.java
@@ -41,11 +41,11 @@ public class TestTagStore extends UtilTestSuiteWithEmbeddedDB {
         final UUID accountId = UUID.randomUUID();
 
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        tagDefinitionDao.create("tag1", "First tag", internalCallContext);
+        tagDefinitionDao.create("tag1", "First tag", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
 
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        final TagDefinitionModelDao testTagDefinition = tagDefinitionDao.create("testTagDefinition", "Second tag", internalCallContext);
+        final TagDefinitionModelDao testTagDefinition = tagDefinitionDao.create("testTagDefinition", "Second tag", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
 
         final Tag tag = new DescriptiveTag(testTagDefinition.getId(), ObjectType.ACCOUNT, accountId, clock.getUTCNow());
@@ -76,14 +76,14 @@ public class TestTagStore extends UtilTestSuiteWithEmbeddedDB {
     @Test(groups = "slow", expectedExceptions = TagDefinitionApiException.class)
     public void testTagDefinitionCreationWithControlTagName() throws TagDefinitionApiException {
         final String definitionName = ControlTagType.AUTO_PAY_OFF.toString();
-        tagDefinitionDao.create(definitionName, "This should break", internalCallContext);
+        tagDefinitionDao.create(definitionName, "This should break", ObjectType.ACCOUNT.name(), internalCallContext);
     }
 
     @Test(groups = "slow")
     public void testTagDefinitionDeletionForUnusedDefinition() throws TagDefinitionApiException {
         final String definitionName = "TestTag1234";
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        tagDefinitionDao.create(definitionName, "Some test tag", internalCallContext);
+        tagDefinitionDao.create(definitionName, "Some test tag", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
 
         TagDefinitionModelDao tagDefinition = tagDefinitionDao.getByName(definitionName, internalCallContext);
@@ -101,7 +101,7 @@ public class TestTagStore extends UtilTestSuiteWithEmbeddedDB {
     public void testTagDefinitionDeletionForDefinitionInUse() throws TagDefinitionApiException, TagApiException {
         final String definitionName = "TestTag12345";
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        tagDefinitionDao.create(definitionName, "Some test tag", internalCallContext);
+        tagDefinitionDao.create(definitionName, "Some test tag", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
 
         final TagDefinitionModelDao tagDefinition = tagDefinitionDao.getByName(definitionName, internalCallContext);
@@ -120,7 +120,7 @@ public class TestTagStore extends UtilTestSuiteWithEmbeddedDB {
     public void testDeleteTagBeforeDeleteTagDefinition() throws TagDefinitionApiException, TagApiException {
         final String definitionName = "TestTag1234567";
         eventsListener.pushExpectedEvent(NextEvent.TAG_DEFINITION);
-        tagDefinitionDao.create(definitionName, "Some test tag", internalCallContext);
+        tagDefinitionDao.create(definitionName, "Some test tag", ObjectType.ACCOUNT.name(), internalCallContext);
         assertListenerStatus();
 
         final TagDefinitionModelDao tagDefinition = tagDefinitionDao.getByName(definitionName, internalCallContext);