diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java b/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java
index 0e7274d..84d7fa4 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java
@@ -68,6 +68,7 @@
   private String createdBy;
   private String lastModifiedOn;
   private String lastModifiedBy;
+  private boolean enabled;
 
   public Product() {
   }
@@ -200,6 +201,14 @@
     this.lastModifiedBy = lastModifiedBy;
   }
 
+  public boolean isEnabled() {
+    return enabled;
+  }
+
+  public void setEnabled(boolean enabled) {
+    this.enabled = enabled;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
@@ -227,22 +236,23 @@
   @Override
   public String toString() {
     return "Product{" +
-            "identifier='" + identifier + '\'' +
-            ", name='" + name + '\'' +
-            ", termRange=" + termRange +
-            ", balanceRange=" + balanceRange +
-            ", interestRange=" + interestRange +
-            ", interestBasis=" + interestBasis +
-            ", patternPackage='" + patternPackage + '\'' +
-            ", description='" + description + '\'' +
-            ", currencyCode='" + currencyCode + '\'' +
-            ", minorCurrencyUnitDigits=" + minorCurrencyUnitDigits +
-            ", accountAssignments=" + accountAssignments +
-            ", parameters='" + parameters + '\'' +
-            ", createdOn='" + createdOn + '\'' +
-            ", createdBy='" + createdBy + '\'' +
-            ", lastModifiedOn='" + lastModifiedOn + '\'' +
-            ", lastModifiedBy='" + lastModifiedBy + '\'' +
-            '}';
+        "identifier='" + identifier + '\'' +
+        ", name='" + name + '\'' +
+        ", termRange=" + termRange +
+        ", balanceRange=" + balanceRange +
+        ", interestRange=" + interestRange +
+        ", interestBasis=" + interestBasis +
+        ", patternPackage='" + patternPackage + '\'' +
+        ", description='" + description + '\'' +
+        ", currencyCode='" + currencyCode + '\'' +
+        ", minorCurrencyUnitDigits=" + minorCurrencyUnitDigits +
+        ", accountAssignments=" + accountAssignments +
+        ", parameters='" + parameters + '\'' +
+        ", createdOn='" + createdOn + '\'' +
+        ", createdBy='" + createdBy + '\'' +
+        ", lastModifiedOn='" + lastModifiedOn + '\'' +
+        ", lastModifiedBy='" + lastModifiedBy + '\'' +
+        ", enabled='" + enabled + '\'' +
+        '}';
   }
 }
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestProducts.java b/component-test/src/main/java/io/mifos/portfolio/TestProducts.java
index 876d07a..cb52a9d 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestProducts.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestProducts.java
@@ -50,6 +50,7 @@
     final Product productAsSaved = portfolioManager.getProduct(product.getIdentifier());
 
     Assert.assertEquals(product, productAsSaved);
+    Assert.assertFalse(productAsSaved.isEnabled());
 
     Assert.assertFalse(portfolioManager.getProductEnabled(product.getIdentifier()));
 
@@ -76,6 +77,9 @@
     portfolioManager.enableProduct(product.getIdentifier(), true);
     Assert.assertTrue(this.eventRecorder.wait(EventConstants.PUT_PRODUCT_ENABLE, product.getIdentifier()));
 
+    final Product productAfterEnable = portfolioManager.getProduct(product.getIdentifier());
+
+    Assert.assertTrue(productAfterEnable.isEnabled());
     Assert.assertTrue(portfolioManager.getProductEnabled(product.getIdentifier()));
 
     {
@@ -300,6 +304,13 @@
     portfolioManager.deleteProduct("habberdash");
   }
 
+  @Test(expected = IllegalArgumentException.class)
+  public void shouldFailToCreateProductDirectlyAsEnabled() throws InterruptedException {
+    final Product product = Fixture.createAdjustedProduct(x -> {});
+    product.setEnabled(true);
+    portfolioManager.createProduct(product);
+  }
+
   @Test
   public void shouldDeleteProduct() throws InterruptedException {
     final Product product = createAndEnableProduct();
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java
index 4e470b3..fa9977a 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java
@@ -57,6 +57,7 @@
     product.setCreatedOn(DateConverter.toIsoString(productEntity.getCreatedOn()));
     product.setLastModifiedBy(productEntity.getLastModifiedBy());
     product.setLastModifiedOn(DateConverter.toIsoString(productEntity.getLastModifiedOn()));
+    product.setEnabled(productEntity.getEnabled());
 
     return product;
   }
diff --git a/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java b/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java
index ece7c71..27cad2f 100644
--- a/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java
+++ b/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java
@@ -109,7 +109,10 @@
       throw ServiceException.badRequest("CreatedOn must be 'null' upon initial creation.");
 
     if (instance.getLastModifiedOn() != null)
-      throw ServiceException.badRequest("LastModifiedOn must 'null' be upon initial creation.");
+      throw ServiceException.badRequest("LastModifiedOn must be 'null' be upon initial creation.");
+
+    if (instance.isEnabled())
+      throw ServiceException.badRequest("Enabled must be 'false' be upon initial creation.");
 
     this.commandGateway.process(new CreateProductCommand(instance));
     return new ResponseEntity<>(HttpStatus.ACCEPTED);
@@ -146,6 +149,9 @@
     if (caseService.existsByProductIdentifier(productIdentifier))
       throw ServiceException.conflict("Cases exist for product with the identifier '" + productIdentifier + "'. Product cannot be changed.");
 
+    if (instance.isEnabled())
+      throw ServiceException.badRequest("Enabled must be 'false' be during editing.");
+
     commandGateway.process(new ChangeProductCommand(instance));
 
     return ResponseEntity.accepted().build();
