diff --git a/apigen-deps/pom.xml b/apigen-deps/pom.xml
index ccf8632..1052381 100644
--- a/apigen-deps/pom.xml
+++ b/apigen-deps/pom.xml
@@ -4,16 +4,20 @@
     <maven>3.0</maven>
   </prerequisites>
 
-  <groupId>com.distelli.graphql</groupId>
   <artifactId>graphql-apigen-deps</artifactId>
-  <version>3.0.1-SNAPSHOT</version>
   <name>Dependencies for generated code</name>
   <packaging>jar</packaging>
 
+  <version>${apigen.version}</version>
+
+  <properties>
+    <apigen.version>3.0.2</apigen.version>
+  </properties>
+
   <parent>
     <groupId>com.distelli.graphql</groupId>
     <artifactId>graphql-apigen-pom</artifactId>
-    <version>3.0.1-SNAPSHOT</version>
+    <version>3.0.0</version>
   </parent>
 
   <url>https://github.com/distelli/graphql-apigen</url>
diff --git a/apigen-deps/src/main/java/com/distelli/graphql/ResolverDataFetcher.java b/apigen-deps/src/main/java/com/distelli/graphql/ResolverDataFetcher.java
index 77cb37a..bf48a69 100644
--- a/apigen-deps/src/main/java/com/distelli/graphql/ResolverDataFetcher.java
+++ b/apigen-deps/src/main/java/com/distelli/graphql/ResolverDataFetcher.java
@@ -53,7 +53,9 @@ public Object get(DataFetchingEnvironment env) {
 
     public Object replaceResolved(Object result, Iterator<Object> resolved, int depth) {
         if ( depth <= 0 ) {
-            return resolved.next();
+            if(resolved.hasNext())
+               return resolved.next();
+            return result;
         }
         List<Object> resolvedResults = new ArrayList<>();
         if ( null == result ) return null;
diff --git a/apigen/pom.xml b/apigen/pom.xml
index dcb185a..3e0dbce 100644
--- a/apigen/pom.xml
+++ b/apigen/pom.xml
@@ -4,16 +4,19 @@
     <maven>3.0</maven>
   </prerequisites>
 
-  <groupId>com.distelli.graphql</groupId>
   <artifactId>graphql-apigen</artifactId>
-  <version>3.0.1-SNAPSHOT</version>
   <name>Generate Java interfaces given a GraphQL Schema</name>
   <packaging>maven-plugin</packaging>
+  <version>${apigen.version}</version>
+
+  <properties>
+    <apigen.version>3.0.2</apigen.version>
+  </properties>
 
   <parent>
     <groupId>com.distelli.graphql</groupId>
     <artifactId>graphql-apigen-pom</artifactId>
-    <version>3.0.1-SNAPSHOT</version>
+    <version>3.0.0</version>
   </parent>
 
   <url>https://github.com/distelli/graphql-apigen</url>
@@ -129,7 +132,7 @@
     <dependency>
       <groupId>com.distelli.graphql</groupId>
       <artifactId>graphql-apigen-deps</artifactId>
-      <version>3.0.1-SNAPSHOT</version>
+      <version>${apigen.version}</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/apigen/src/main/java/com/distelli/graphql/apigen/ApiGen.java b/apigen/src/main/java/com/distelli/graphql/apigen/ApiGen.java
index e801687..947af55 100644
--- a/apigen/src/main/java/com/distelli/graphql/apigen/ApiGen.java
+++ b/apigen/src/main/java/com/distelli/graphql/apigen/ApiGen.java
@@ -27,6 +27,7 @@ public class ApiGen {
     private Path outputDirectory;
     private STGroup stGroup;
     private String guiceModuleName;
+    private String springModuleName;
     private String defaultPackageName;
     private Map<String, TypeEntry> generatedTypes = new LinkedHashMap<>();
     private Map<String, TypeEntry> referenceTypes = new HashMap<>();
@@ -36,6 +37,7 @@ public static class Builder {
         private Path outputDirectory;
         private STGroup stGroup;
         private String guiceModuleName;
+        private String springModuleName;
         private String defaultPackageName;
 
         /**
@@ -67,6 +69,11 @@ public Builder withGuiceModuleName(String guiceModuleName) {
             return this;
         }
 
+        public Builder withSpringModuleName(String springModuleName) {
+            this.springModuleName = springModuleName;
+            return this;
+        }
+
         public Builder withDefaultPackageName(String defaultPackageName) {
             this.defaultPackageName = defaultPackageName;
             return this;
@@ -89,6 +96,8 @@ private ApiGen(Builder builder) throws IOException {
             throw new NullPointerException("The ApiGen outputDirectory must be specified");
         }
         guiceModuleName = builder.guiceModuleName;
+        springModuleName = builder.springModuleName;
+
         defaultPackageName = builder.defaultPackageName;
         outputDirectory = builder.outputDirectory;
         stGroup = ( null == builder.stGroup )
@@ -200,7 +209,7 @@ public void generate() throws IOException {
                     String content = stGroup.getInstanceOf(generatorName+"Generator")
                         .add("model", model)
                         .render();
-                    if ( stGroup.isDefined(generatorName + "GuiceModule") ) {
+                    if ( guiceModuleName != null && stGroup.isDefined(generatorName + "GuiceModule") ) {
                         moduleBuilder.append(stGroup.getInstanceOf(generatorName+"GuiceModule")
                                              .add("model", model)
                                              .render());
@@ -216,13 +225,42 @@ public void generate() throws IOException {
         if ( moduleBuilder.length() > 0 && guiceModuleName != null && stGroup.isDefined("guiceModule") ) {
             PackageClassName packageClassName = getPackageClassName(guiceModuleName);
             String content = stGroup.getInstanceOf("guiceModule")
-                .add("packageName", packageClassName.packageName)
-                .add("className", packageClassName.className)
-                .add("configure", moduleBuilder.toString())
-                .render();
+                    .add("packageName", packageClassName.packageName)
+                    .add("className", packageClassName.className)
+                    .add("configure", moduleBuilder.toString())
+                    .render();
+            writeFile(Paths.get(getDirectory(packageClassName.packageName).toString(),
+                    packageClassName.className+".java"),
+                    content);
+        } else if (springModuleName != null && stGroup.isDefined("springModule") ) {
+            PackageClassName packageClassName = getPackageClassName(springModuleName);
+            final String body = " /*\n" +
+                    "       Please insert to your graphQL server class:\n" +
+                    "\n" +
+                    "           @Autowired\n" +
+                    "           List<Provider<? extends GraphQLType>> graphQLTypes;\n" +
+                    "\n" +
+                    "           @Autowired\n" +
+                    "           BeanFactory beanFactory;\n" +
+                    "                   Map<String, GraphQLType> graphqlTypeMap;\n" +
+                    "\n" +
+                    "           @PostConstruct\n" +
+                    "           public void initGraphQLServer(){\n" +
+                    "              graphqlTypeMap = (Map<String, GraphQLType>)beanFactory.getBean(\"graphqlTypeMap\", graphQLTypes);\n" +
+                    "           }\n" +
+                    "\n" +
+                    "       Note: GraphQLServer class is not been generated because there is no one implementation for that class,\n" +
+                    "             the comments above are required in-order to generate schema files\n" +
+                    "     */";
+
+            String content = stGroup.getInstanceOf("springModule")
+                    .add("packageName", packageClassName.packageName)
+                    .add("className", packageClassName.className)
+                    .add("body",body)
+                    .render();
             writeFile(Paths.get(getDirectory(packageClassName.packageName).toString(),
-                                packageClassName.className+".java"),
-                      content);
+                    packageClassName.className+".java"),
+                    content);
         }
     }
 
diff --git a/apigen/src/main/java/com/distelli/graphql/apigen/ApiGenMojo.java b/apigen/src/main/java/com/distelli/graphql/apigen/ApiGenMojo.java
index 415cdc3..f8fcf93 100644
--- a/apigen/src/main/java/com/distelli/graphql/apigen/ApiGenMojo.java
+++ b/apigen/src/main/java/com/distelli/graphql/apigen/ApiGenMojo.java
@@ -35,7 +35,7 @@ public class ApiGenMojo extends AbstractMojo {
     private MavenProject project;
 
     @Parameter(name="sourceDirectory",
-               defaultValue="schema")
+            defaultValue="schema")
     private File sourceDirectory;
 
     @Parameter(name="outputDirectory",
@@ -45,6 +45,9 @@ public class ApiGenMojo extends AbstractMojo {
     @Parameter(name="guiceModuleName")
     private String guiceModuleName;
 
+    @Parameter(name="springModuleName")
+    private String springModuleName;
+
     @Parameter(name="defaultPackageName", defaultValue = "com.graphql.generated")
     private String defaultPackageName;
 
@@ -84,6 +87,7 @@ public void execute() {
             ApiGen apiGen = new ApiGen.Builder()
                 .withOutputDirectory(outputDirectory.toPath())
                 .withGuiceModuleName(guiceModuleName)
+                .withSpringModuleName(springModuleName)
                 .withDefaultPackageName(defaultPackageName)
                 .build();
             PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cp);
@@ -109,20 +113,20 @@ public void execute() {
     }
 
     private interface VisitPath {
-        public void visit(Path path) throws IOException;
+        void visit(Path path) throws IOException;
     }
 
     private void findGraphql(File rootDir, VisitPath visitPath) throws IOException {
         PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.graphql{,s}");
         Files.walkFileTree(rootDir.toPath(), new SimpleFileVisitor<Path>() {
-                @Override
-                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                    if ( matcher.matches(file) ) {
-                        getLog().debug("Processing "+file);
-                        visitPath.visit(file);
-                    }
-                    return FileVisitResult.CONTINUE;
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                if ( matcher.matches(file) ) {
+                    getLog().debug("Processing "+file);
+                    visitPath.visit(file);
                 }
-            });
+                return FileVisitResult.CONTINUE;
+            }
+        });
     }
 }
diff --git a/apigen/src/main/java/com/distelli/graphql/apigen/STModel.java b/apigen/src/main/java/com/distelli/graphql/apigen/STModel.java
index a29b03f..953260c 100644
--- a/apigen/src/main/java/com/distelli/graphql/apigen/STModel.java
+++ b/apigen/src/main/java/com/distelli/graphql/apigen/STModel.java
@@ -1,22 +1,7 @@
 package com.distelli.graphql.apigen;
 
-import graphql.language.Definition;
-import graphql.language.EnumTypeDefinition;
-import graphql.language.EnumValueDefinition;
-import graphql.language.FieldDefinition;
-import graphql.language.InputObjectTypeDefinition;
-import graphql.language.InputValueDefinition;
-import graphql.language.InterfaceTypeDefinition;
-import graphql.language.ListType;
-import graphql.language.NonNullType;
-import graphql.language.ObjectTypeDefinition;
-import graphql.language.OperationTypeDefinition;
-import graphql.language.ScalarTypeDefinition;
-import graphql.language.SchemaDefinition;
-import graphql.language.Type;
-import graphql.language.TypeName;
-import graphql.language.UnionTypeDefinition;
-import graphql.language.Value;
+import graphql.language.*;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -76,7 +61,7 @@ public static class Arg {
         public String name;
         public String type;
         public String graphQLType;
-        public String defaultValue;
+        public Object defaultValue;
         public Arg(String name, String type) {
             this.name = name;
             this.type = type;
@@ -90,9 +75,10 @@ public static class Field {
         public String name;
         public String type;
         public DataResolver dataResolver;
+        public boolean isStringValue;
         public String graphQLType;
         public List<Arg> args;
-        public String defaultValue;
+        public Object defaultValue;
         public Field(String name, String type) {
             this.name = name;
             this.type = type;
@@ -289,6 +275,11 @@ private List<Field> getFields(InputObjectTypeDefinition def) {
             Field field = new Field(fieldDef.getName(), toJavaTypeName(fieldDef.getType()));
             field.graphQLType = toGraphQLType(fieldDef.getType());
             field.defaultValue = toJavaValue(fieldDef.getDefaultValue());
+            if(field.defaultValue != null && field.defaultValue instanceof String ) {
+                field.isStringValue = true;
+            }else {
+                field.isStringValue = false;
+            }
             fields.add(field);
         }
         return fields;
@@ -329,7 +320,12 @@ private List<Arg> toArgs(List<InputValueDefinition> defs) {
         return result;
     }
 
-    private String toJavaValue(Value value) {
+    private Object toJavaValue(Value value) {
+        if(value instanceof StringValue){
+            return ((StringValue) value).getValue();
+        }else if(value instanceof IntValue){
+            return ((IntValue) value).getValue();
+        }
         // TODO: Implement me!
         return null;
     }
diff --git a/apigen/src/main/resources/graphql-apigen.stg b/apigen/src/main/resources/graphql-apigen.stg
index 133dd99..4ff3a75 100644
--- a/apigen/src/main/resources/graphql-apigen.stg
+++ b/apigen/src/main/resources/graphql-apigen.stg
@@ -149,8 +149,7 @@ public class <model.name>TypeProvider implements Provider\<GraphQLObjectType> {
 <endif>}>
     @Inject
     private Optional\<<model.name>\> _impl;
-    @Inject
-    protected <model.name>TypeProvider() {}
+
     @Override
     public GraphQLObjectType get() {
         return GraphQLObjectType.newObject()
@@ -202,6 +201,19 @@ objectTypeProviderGuiceModule(model) ::= <<
 
 >>
 
+objectTypeProviderSpringModule(model) ::= <<
+    @Bean
+    public <model.packageName>.<model.name>TypeProvider _<model.name>TypeProvider(){
+      return new <model.packageName>.<model.name>TypeProvider();
+    }
+   <if(model.idField)>
+    @Bean
+    public <model.packageName>.<model.name>.Resolver _<model.name>Resolver(){
+      return list -> list;
+    }
+   <endif>
+>>
+
 //////////////////////////////////////////////////////////////////////
 // Define the inputObjectType builder:
 inputObjectTypeFileName(model) ::= "<if(model.inputObjectType)><model.name>.java<endif>"
@@ -260,9 +272,10 @@ public interface <model.name> {
         }
         // TODO: equals(Object) & hashCode()
     }
+
 <model.fields:{ it |
 
-    public default <it.type> get<it.ucname>() { return null; \}}>
+    public default <it.type> get<it.ucname>() { return <if(it.defaultValue)><if(it.isStringValue)>"<it.defaultValue>"<else><it.defaultValue><endif><else>null<endif>; \}}>
 }
 
 >>
@@ -283,8 +296,7 @@ import javax.inject.Named;
 
 @Named
 public class <model.name>TypeProvider implements Provider\<GraphQLInputObjectType> {
-    @Inject
-    protected <model.name>TypeProvider() {}
+
     @Override
     public GraphQLInputObjectType get() {
         return GraphQLInputObjectType.newInputObject()
@@ -295,7 +307,7 @@ public class <model.name>TypeProvider implements Provider\<GraphQLInputObjectTyp
                 .type(<it.graphQLType>)
                 .name("<it.name>")
 <if(it.defaultValue)>
-                .defaultValue(<it.defaultValue>)
+                .defaultValue(<if(it.isStringValue)>"<it.defaultValue>"<else><it.defaultValue><endif>)
 <endif>
                 .build())}>
             .build();
@@ -310,6 +322,13 @@ inputObjectTypeProviderGuiceModule(model) ::= <<
 
 >>
 
+inputObjectTypeProviderSpringModule(model) ::= <<
+    @Bean
+    public <model.packageName>.<model.name>TypeProvider _<model.name>TypeProvider(){
+      return new <model.packageName>.<model.name>TypeProvider();
+    }
+>>
+
 //////////////////////////////////////////////////////////////////////
 // Define the GuiceModule:
 guiceModule(packageName, className, configure) ::= <<
@@ -329,6 +348,34 @@ public class <className> extends AbstractModule {
 
 >>
 
+//////////////////////////////////////////////////////////////////////
+// Define the SpringModule:
+springModule(packageName, className, body) ::= <<
+package <packageName>;
+
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import graphql.schema.GraphQLType;
+
+import javax.inject.Provider;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Configuration
+public class <className> {
+   <body>
+   @Lazy
+   @Bean
+   public Map\<String, GraphQLType> graphqlTypeMap(List\<Provider\<? extends GraphQLType>\> typeList) {
+      return typeList.stream().map(Provider::get).collect(Collectors.toMap(GraphQLType::getName, Function.identity()));
+   }
+}
+>>
+
 //////////////////////////////////////////////////////////////////////
 // Define the interface builder:
 interfaceFileName(model) ::= "<if(model.interfaceType)><model.name>.java<endif>"
@@ -380,4 +427,38 @@ public enum <model.name> {
     <it.name>,}>
 }
 
->>
\ No newline at end of file
+>>
+
+
+enumTypeProviderFileName(model) ::= "<if(model.enumType)><model.name>TypeProvider.java<endif>"
+enumTypeProviderGenerator(model) ::= <<
+package <model.packageName>;
+
+<model.imports:{ it |
+
+import <it>;}>
+import graphql.schema.*;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.inject.Named;
+
+
+@Named
+public class <model.name>TypeProvider implements Provider\<GraphQLEnumType> {
+    @Override
+    public GraphQLEnumType get() {
+        return GraphQLEnumType.newEnum()
+            .name("<model.name>")
+<model.fields:{ it |
+
+            .value("<it.name>", <model.name>.<it.name>, "<it.name>")}>
+            .build();
+    }
+}
+
+>>
+enumTypeProviderGuiceModule(model) ::= <<
+        types.addBinding("<model.name>")
+             .toProvider(<model.packageName>.<model.name>TypeProvider.class);
+>>
+
diff --git a/apigen/src/test/projects/basic/pom.xml b/apigen/src/test/projects/basic/pom.xml
index 69b8dda..f499b19 100644
--- a/apigen/src/test/projects/basic/pom.xml
+++ b/apigen/src/test/projects/basic/pom.xml
@@ -14,7 +14,7 @@
   </modules>
 
   <properties>
-    <apigen.version>3.0.1-SNAPSHOT</apigen.version>
+    <apigen.version>3.0.2</apigen.version>
   </properties>
 
   <build>
diff --git a/apigen/src/test/projects/posts/pom.xml b/apigen/src/test/projects/posts/pom.xml
index 54009f2..2e49a30 100644
--- a/apigen/src/test/projects/posts/pom.xml
+++ b/apigen/src/test/projects/posts/pom.xml
@@ -9,7 +9,7 @@
   <name>test-posts</name>
 
   <properties>
-    <apigen.version>3.0.1-SNAPSHOT</apigen.version>
+    <apigen.version>3.0.2</apigen.version>
   </properties>
 
   <build>
@@ -33,7 +33,7 @@
         <artifactId>graphql-apigen</artifactId>
         <version>${apigen.version}</version>
         <configuration>
-          <guiceModuleName>com.distelli.posts.PostsModule</guiceModuleName>
+          <springModuleName>com.distelli.posts.ConfigureGraphQL</springModuleName>
         </configuration>
         <executions>
           <execution>
@@ -90,5 +90,10 @@
       <artifactId>guice-multibindings</artifactId>
       <version>4.0</version>
     </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context</artifactId>
+      <version>4.3.1.RELEASE</version>
+    </dependency>
   </dependencies>
 </project>
diff --git a/apigen/src/test/projects/posts/schema/posts.graphql b/apigen/src/test/projects/posts/schema/posts.graphql
index e49d24d..ec24d9b 100644
--- a/apigen/src/test/projects/posts/schema/posts.graphql
+++ b/apigen/src/test/projects/posts/schema/posts.graphql
@@ -17,15 +17,25 @@ type QueryPosts @java(package:"com.distelli.posts") {
     posts: [Post]
 }
 
+enum Alphabet @java(package:"com.distelli.posts") {
+   A B C D E F G H I J
+}
+
+enum TRY2 @java(package:"com.distelli.posts") {
+   maybe
+   might
+   iDontKnow
+}
+
 input InputPost @java(package:"com.distelli.posts") {
-    title: String
-    authorId: Int!
+    title: String = "MYpOST"
+    authorId: Int! = 5
 }
 
 # this schema allows the following mutation:
 type MutatePosts @java(package:"com.distelli.posts") {
     createPost(post:InputPost): Post
     upvotePost(
-      postId: Int!
+      postId: Int! = 4
     ): Post
 }
diff --git a/apigen/src/test/projects/posts/src/test/java/com/disteli/posts/PostsTest.java b/apigen/src/test/projects/posts/src/test/java/com/disteli/posts/PostsTest.java
index 34259dd..1287de5 100644
--- a/apigen/src/test/projects/posts/src/test/java/com/disteli/posts/PostsTest.java
+++ b/apigen/src/test/projects/posts/src/test/java/com/disteli/posts/PostsTest.java
@@ -1,22 +1,20 @@
 package com.distelli.posts;
 
-import org.junit.Test;
-import graphql.execution.batched.BatchedExecutionStrategy;
-import java.util.*;
-import graphql.schema.*;
-import graphql.ExecutionResult;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import graphql.GraphQL;
-import com.google.inject.Guice;
-import com.google.inject.Key;
-import com.google.inject.AbstractModule;
-import com.google.inject.Injector;
-import com.google.inject.TypeLiteral;
 import com.fasterxml.jackson.databind.SerializationFeature;
-import com.google.inject.multibindings.MapBinder;
-import javax.inject.Singleton;
-import java.util.concurrent.atomic.AtomicInteger;
+import com.google.inject.*;
+import graphql.ExecutionResult;
+import graphql.GraphQL;
+import graphql.execution.batched.BatchedExecutionStrategy;
 import graphql.schema.DataFetchingEnvironment;
+import graphql.schema.GraphQLObjectType;
+import graphql.schema.GraphQLSchema;
+import graphql.schema.GraphQLType;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import static org.junit.Assert.*;
 
 public class PostsTest {
@@ -152,7 +150,7 @@ public Injector setup() throws Exception {
                   .build());
 
         Injector injector = Guice.createInjector(
-            new PostsModule(),
+//            new PostsModule(),
             new AbstractModule() {
                 @Override
                 protected void configure() {
@@ -166,7 +164,7 @@ protected void configure() {
                         .toInstance(new QueryPostsImpl(posts));
                 }
             });
-        return injector;
+        return null;
     }
 
     @Test
diff --git a/pom.xml b/pom.xml
index 572e3c9..cf5ae1b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
   <groupId>com.distelli.graphql</groupId>
   <artifactId>graphql-apigen-pom</artifactId>
-  <version>3.0.1-SNAPSHOT</version>
+  <version>3.0.0</version>
   <name>Generate Java interfaces given a GraphQL Schema</name>
   <packaging>pom</packaging>
   <description>