diff --git a/pom.xml b/pom.xml
index 3c437d2..c6e1971 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,7 +146,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature</artifactId>
-            <version>1.0.6</version>
+            <version>1.0.7-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java b/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
index 5c7988a..1d113e3 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONReaderBase.java
@@ -52,6 +52,7 @@
 import org.apache.sling.feature.Configuration;
 import org.apache.sling.feature.Configurations;
 import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionState;
 import org.apache.sling.feature.ExtensionType;
 import org.apache.sling.feature.Extensions;
 import org.apache.sling.feature.MatchingRequirement;
@@ -342,24 +343,24 @@
             final int sep = (postfix == null ? key.indexOf('|') : postfix.indexOf('|'));
             final String name;
             final String type;
-            final String optional;
+            final String state;
             if ( pos == -1 ) {
                 type = ExtensionType.ARTIFACTS.name();
                 if ( sep == -1 ) {
                     name = key;
-                    optional = Boolean.FALSE.toString();
+                    state = ExtensionState.OPTIONAL.name();
                 } else {
                     name = key.substring(0, sep);
-                    optional = key.substring(sep + 1);
+                    state = key.substring(sep + 1);
                 }
             } else {
                 name = key.substring(0, pos);
                 if ( sep == -1 ) {
                     type = postfix;
-                    optional = Boolean.FALSE.toString();
+                    state = ExtensionState.OPTIONAL.name();
                 } else {
                     type = postfix.substring(0, sep);
-                    optional = postfix.substring(sep + 1);
+                    state = postfix.substring(sep + 1);
                 }
             }
             if ( JSONConstants.FEATURE_KNOWN_PROPERTIES.contains(name) ) {
@@ -370,9 +371,19 @@
             }
 
             final ExtensionType extType = ExtensionType.valueOf(type);
-            final boolean opt = Boolean.valueOf(optional).booleanValue();
+            final ExtensionState extState;
+            if (ExtensionState.OPTIONAL.name().equalsIgnoreCase(state)) {
+                extState = ExtensionState.OPTIONAL;
+            } else if (ExtensionState.REQUIRED.name().equalsIgnoreCase(state)) {
+                extState = ExtensionState.REQUIRED;
+            } else if (ExtensionState.TRANSIENT.name().equalsIgnoreCase(state)) {
+                extState = ExtensionState.TRANSIENT;
+            } else {
+                final boolean opt = Boolean.valueOf(state).booleanValue();
+                extState = opt ? ExtensionState.REQUIRED : ExtensionState.OPTIONAL;
+            }
 
-            final Extension ext = new Extension(extType, name, opt);
+            final Extension ext = new Extension(extType, name, extState);
             final Object value = map.get(key);
             switch ( extType ) {
                 case ARTIFACTS : final List<Artifact> list = new ArrayList<>();
diff --git a/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java b/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
index b32da05..c41ddff 100644
--- a/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
+++ b/src/main/java/org/apache/sling/feature/io/json/JSONWriterBase.java
@@ -212,7 +212,18 @@
             final List<Extension> extensions,
             final Configurations allConfigs) {
         for(final Extension ext : extensions) {
-            final String key = ext.getName() + ":" + ext.getType().name() + "|" + ext.isRequired();
+            final String state;
+            switch (ext.getState()) {
+            case OPTIONAL:
+                state = "false";
+                break;
+            case REQUIRED:
+                state = "true";
+                break;
+            default:
+                state = ext.getState().name();
+            }
+            final String key = ext.getName().concat(":").concat(ext.getType().name()).concat("|").concat(state);
             if ( ext.getType() == ExtensionType.JSON ) {
                 final JsonStructure struct;
                 try ( final StringReader reader = new StringReader(ext.getJSON()) ) {
diff --git a/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java b/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java
index bdd34f1..e2ecc54 100644
--- a/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java
+++ b/src/test/java/org/apache/sling/feature/io/json/ArtifactsExtensions.java
@@ -1,13 +1,14 @@
 package org.apache.sling.feature.io.json;
 
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.Extensions;
-import org.apache.sling.feature.Feature;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.ExtensionState;
+import org.apache.sling.feature.Extensions;
+import org.apache.sling.feature.Feature;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -34,7 +35,7 @@
         Extension extension1 = extensions.getByName("my-extension1");
         assertNotNull(extension1);
         assertEquals(extension1.getName(), "my-extension1");
-        assertEquals(extension1.isRequired(), false);
+        assertEquals(extension1.getState(), ExtensionState.OPTIONAL);
         assertEquals(1, extension1.getArtifacts().size());
 
         ArtifactId artifactId1 = extension1.getArtifacts().get(0).getId();
@@ -45,7 +46,7 @@
         Extension extension2 = extensions.getByName("my-extension2");
         assertNotNull(extension2);
         assertEquals(extension2.getName(), "my-extension2");
-        assertEquals(extension2.isRequired(), true);
+        assertEquals(extension2.getState(), ExtensionState.REQUIRED);
         assertEquals(1, extension2.getArtifacts().size());
 
         ArtifactId artifactId2 = extension2.getArtifacts().get(0).getId();
