diff --git a/src/main/jastadd/OpenAPISpecification.relast b/src/main/jastadd/OpenAPISpecification.relast
index 53e774d4c5fde42093a1ac805cddc01f1b9a4a59..3d656e084b253d142412f5a247e03cc1ce963620 100644
--- a/src/main/jastadd/OpenAPISpecification.relast
+++ b/src/main/jastadd/OpenAPISpecification.relast
@@ -99,7 +99,7 @@ abstract PathItemOb;
 PathItemReference : PathItemOb ::= <Ref> <Summary> <Description>;
 PathItemObject : PathItemOb ::= <Ref> <Summary> <Description>;
 
-rel PathItemReference.r -> PathItemTuple;
+rel PathItemReference.r -> PathItemObject;
 rel PathItemObject.g? -> Get;
 rel PathItemObject.put? -> Put;
 rel PathItemObject.post? -> Post;
@@ -154,7 +154,7 @@ ParameterObject : ParameterOb ::= <Name> <In> <Description> <Required:Boolean> <
 ContentTuple ::= <Key>;
 rel ContentTuple.m -> MediaTypeObject;
 
-rel ParameterReference.p -> PathItemTuple;
+rel ParameterReference.p -> ParameterObject;
 rel ParameterObject.s? -> SchemaOb;
 rel ParameterObject.e* -> ExampleTuple;
 rel ParameterObject.c* -> ContentTuple;
@@ -166,7 +166,7 @@ abstract RequestBodyOb;
 RequestBodyReference : RequestBodyOb ::= <Ref> <Summary> <Description>;
 RequestBodyObject : RequestBodyOb ::= <Description> <Required:Boolean>;
 
-rel RequestBodyReference.r -> RequestBodyTuple;
+rel RequestBodyReference.r -> RequestBodyObject;
 rel RequestBodyObject.c* -> ContentTuple;
 rel RequestBodyObject.ex* -> Extension;
 
@@ -188,9 +188,6 @@ rel EncodingObject.ex* -> Extension;
 
 //Responses Object (ResponseTuple is used for HTTPStatusCode)
 ResponsesObject;
-
-//Default
-rel ResponsesObject.d? -> ResponseOb;
 //HTTPStatusCode
 rel ResponsesObject.r* -> ResponseTuple;
 
@@ -199,7 +196,7 @@ abstract ResponseOb;
 ResponseReference : ResponseOb ::= <Ref> <Summary> <Description>;
 ResponseObject : ResponseOb ::= <Description>;
 
-rel ResponseReference.r -> ResponseTuple;
+rel ResponseReference.r -> ResponseObject;
 rel ResponseObject.h* -> HeaderTuple;
 rel ResponseObject.c* -> ContentTuple;
 rel ResponseObject.l* -> LinkTuple;
@@ -214,7 +211,7 @@ Extension ::= <Key> <Value:Object>;
 Expression ::= <Name>;
 rel Expression.p -> PathItemOb;
 
-rel CallbackReference.r -> CallbackTuple;
+rel CallbackReference.r -> CallbackObject;
 rel CallbackObject.e* -> Expression;
 rel CallbackObject.ex* -> Extension;
 
@@ -229,7 +226,7 @@ LinkReference : LinkOb ::= <Ref> <Summary> <Description>;
 LinkObject : LinkOb ::= <OperationRef> <OperationID> <LinkRequestBody:Object> <Description>;
 LinkParameterTuple ::= <Key> <Value:Object>;
 
-rel LinkReference.r -> LinkTuple;
+rel LinkReference.r -> LinkObject;
 rel LinkObject.l* -> LinkParameterTuple;
 rel LinkObject.s? -> ServerObject;
 rel LinkObject.ex* -> Extension;
@@ -239,7 +236,7 @@ abstract HeaderOb;
 HeaderReference : HeaderOb ::= <Ref> <Summary> <Description>;
 HeaderObject : HeaderOb ::= <Description> <Required:Boolean> <DeprecatedBoolean:Boolean> <AllowEmptyValue:Boolean> <Style> <Explode:Boolean> <AllowReserved:Boolean> <Example:Object>;
 
-rel HeaderReference.r -> HeaderTuple;
+rel HeaderReference.r -> HeaderObject;
 rel HeaderObject.s? -> SchemaOb;
 rel HeaderObject.e* -> ExampleTuple;
 rel HeaderObject.c* -> ContentTuple;
@@ -282,7 +279,7 @@ TypeArray ::= <TypeElements:Object>;
 EnumObj ::= <EnumOb:Object>;
 RequiredField ::= <Value>;
 
-rel SchemaReference.r -> SchemaTuple;
+rel SchemaReference.r -> SchemaObject;
 rel SchemaObject.a? -> AdditionalProperties;
 rel SchemaObject.d? -> DiscriminatorObject;
 rel SchemaObject.e* -> EnumObj;
@@ -317,7 +314,7 @@ abstract SecuritySchemeOb;
 SecuritySchemeReference : SecuritySchemeOb ::= <Ref> <Summary> <Description>;
 SecuritySchemeObject : SecuritySchemeOb ::= <Type> <Description> <Name> <In> <Scheme> <BearerFormat> <OpenIdConnectUrl>;
 
-rel SecuritySchemeReference.r -> SecuritySchemeTuple;
+rel SecuritySchemeReference.r -> SecuritySchemeObject;
 rel SecuritySchemeObject.o? -> OAuthFlowsObject;
 rel SecuritySchemeObject.ex* -> Extension;
 
diff --git a/src/main/jastadd/Parser.jrag b/src/main/jastadd/Parser.jrag
index 850c91537e11ce285a0e0b05b427d612143796b8..14f2ec8f005fa469ef7248ab92e10136262f85e1 100644
--- a/src/main/jastadd/Parser.jrag
+++ b/src/main/jastadd/Parser.jrag
@@ -1,7 +1,17 @@
 import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.*;
+import io.swagger.v3.oas.models.callbacks.*;
+import io.swagger.v3.oas.models.examples.*;
+import io.swagger.v3.oas.models.headers.*;
 import io.swagger.v3.oas.models.info.*;
+import io.swagger.v3.oas.models.links.*;
+import io.swagger.v3.oas.models.media.*;
+import io.swagger.v3.oas.models.parameters.*;
+import io.swagger.v3.oas.models.responses.*;
+import io.swagger.v3.oas.models.security.*;
 import io.swagger.v3.oas.models.servers.*;
-import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.tags.*;
+
 
 aspect Parser {
 
@@ -189,139 +199,154 @@ aspect Parser {
         componentsObject.addEx(new Extension(key, components.getExtensions().get(key)));
         }
 
+        /* 3.1.0 features
+        if (components.getPathItems() != null) ...
+         */
+
         return componentsObject;
   }
 
-  public static PathItemObject PathItemObject.parsePath(Path path, OAIContext context, Map<Object, ASTNode> map) throws DecodeException {
-    PathItemObject pathItem = new PathItemObject();
-
-    if (path.getSummary() != null)
-      pathItem.setSummary(path.getSummary());
-    if (path.getDescription() != null)
-      pathItem.setDescription(path.getDescription());
-    if (path.getGet() != null) {
-      Get get = new Get();
-      get.setOperationObject(OperationObject.parseOperation(path.getGet(), context, map));
-      pathItem.setGet(get);
-    }
-    if (path.getPut() != null) {
-      Put put = new Put();
-      put.setOperationObject(OperationObject.parseOperation(path.getPut(), context, map));
-      pathItem.setPut(put);
-    }
-    if (path.getPost() != null) {
-      Post post = new Post();
-      post.setOperationObject(OperationObject.parseOperation(path.getPost(), context, map));
-      pathItem.setPost(post);
-    }
-    if (path.getDelete() != null) {
-      Delete delete = new Delete();
-      delete.setOperationObject(OperationObject.parseOperation(path.getDelete(), context, map));
-      pathItem.setDelete(delete);
-    }
-    if (path.getOptions() != null) {
-      Options options = new Options();
-      options.setOperationObject(OperationObject.parseOperation(path.getOptions(), context, map));
-      pathItem.setOptions(options);
-    }
-    if (path.getHead() != null) {
-      Head head = new Head();
-      head.setOperationObject(OperationObject.parseOperation(path.getHead(), context, map));
-      pathItem.setHead(head);
-    }
-    if (path.getPatch() != null) {
-      Patch patch = new Patch();
-      patch.setOperationObject(OperationObject.parseOperation(path.getPatch(), context, map));
-      pathItem.setPatch(patch);
-    }
-    if (path.getTrace() != null) {
-      Trace trace = new Trace();
-      trace.setOperationObject(OperationObject.parseOperation(path.getTrace(), context, map));
-      pathItem.setTrace(trace);
-    }
-    if (path.getServers() != null) {
-      for (Server s : path.getServers())
-        pathItem.addServerObject(ServerObject.parseServer(s, map));
-    }
-    if (path.getParameters() != null) {
-      for (Parameter p : path.getParameters())
-        pathItem.addParameterOb(ParameterOb.parseParameter(p, context, map));
-    }
-    if (path.getExtensions() != null) {
-      for (String key : path.getExtensions().keySet())
-        pathItem.addExtension(new Extension(key, path.getExtensions().get(key)));
-    }
+  public static PathItemOb PathItemOb.parsePath(PathItem path) {
+        PathItemObject pathItem = new PathItemObject();
+
+        if(path.get$ref() != null){
+        PathItemReference r = new PathItemReference();
+        r.setRef(path.get$ref());
+
+      /* 3.1.0 features
+      if (path.getSummary() != null) ...
+      if (path.getDescription() != null) ...
+      if (path.getPathItem() != null) ...
+       */
+
+        return r;
+        } else
+
+        if (path.getSummary() != null)
+        pathItem.setSummary(path.getSummary());
+        if (path.getDescription() != null)
+        pathItem.setDescription(path.getDescription());
+        if (path.getGet() != null) {
+        Get get = new Get();
+        get.set_impl_o(OperationObject.parseOperation(path.getGet()));
+        pathItem.setG(get);
+        }
+        if (path.getPut() != null) {
+        Put put = new Put();
+        put.set_impl_o(OperationObject.parseOperation(path.getPut()));
+        pathItem.setPut(put);
+        }
+        if (path.getPost() != null) {
+        Post post = new Post();
+        post.set_impl_o(OperationObject.parseOperation(path.getPost()));
+        pathItem.setPost(post);
+        }
+        if (path.getDelete() != null) {
+        Delete delete = new Delete();
+        delete.set_impl_o(OperationObject.parseOperation(path.getDelete()));
+        pathItem.set_impl_d(delete);
+        }
+        if (path.getOptions() != null) {
+        Options options = new Options();
+        options.set_impl_o(OperationObject.parseOperation(path.getOptions()));
+        pathItem.set_impl_o(options);
+        }
+        if (path.getHead() != null) {
+        Head head = new Head();
+        head.set_impl_o(OperationObject.parseOperation(path.getHead()));
+        pathItem.setH(head);
+        }
+        if (path.getPatch() != null) {
+        Patch patch = new Patch();
+        patch.set_impl_o(OperationObject.parseOperation(path.getPatch()));
+        pathItem.setP(patch);
+        }
+        if (path.getTrace() != null) {
+        Trace trace = new Trace();
+        trace.set_impl_o(OperationObject.parseOperation(path.getTrace()));
+        pathItem.setT(trace);
+        }
+        if (path.getServers() != null) {
+        for (Server s : path.getServers())
+        pathItem.addS(ServerObject.parseServer(s));
+        }
+        if (path.getParameters() != null) {
+        for (Parameter p : path.getParameters())
+        pathItem.addPo(ParameterOb.parseParameter(p));
+        }
+        if (path.getExtensions() != null) {
+        for (String key : path.getExtensions().keySet())
+        pathItem.addEx(new Extension(key, path.getExtensions().get(key)));
+        }
 
-    map.put(path, pathItem);
-    return pathItem;
+        return pathItem;
   }
 
-  public static OperationObject OperationObject.parseOperation(Operation operation, OAIContext context, Map<Object, ASTNode> map) throws DecodeException{
-    OperationObject operationObject = new OperationObject();
+  public static OperationObject OperationObject.parseOperation(Operation operation) {
+        OperationObject operationObject = new OperationObject();
 
-    if (operation.getDeprecated() != null)
-      operationObject.setDeprecatedBoolean(operation.getDeprecated());
-    if (operation.getTags() != null) {
-      for (String t : operation.getTags()) {
+        if (operation.getDeprecated() != null)
+        operationObject.setDeprecatedBoolean(operation.getDeprecated());
+        if (operation.getTags() != null) {
+        for (String t : operation.getTags()) {
         de.tudresden.inf.st.openapi.ast.Tag tag = new de.tudresden.inf.st.openapi.ast.Tag();
         tag.setTag(t);
-        operationObject.addTag(tag);
-      }
-    }
-    if (operation.getSummary() != null)
-      operationObject.setSummary(operation.getSummary());
-    if (operation.getDescription() != null)
-      operationObject.setDescription(operation.getDescription());
-    if (operation.getExternalDocs() != null)
-      operationObject.setExternalDocObject(ExternalDocObject.parseExternalDocs(operation.getExternalDocs(), map));
-    if (operation.getOperationId() != null)
-      operationObject.setOperationID(operation.getOperationId());
-    if (operation.getParameters() != null) {
-      for (Parameter p : operation.getParameters())
-        operationObject.addParameterOb(ParameterOb.parseParameter(p, context, map));
-    }
-    if (operation.getRequestBody() != null)
-      operationObject.setRequestBodyOb(RequestBodyOb.parseRequestBody(operation.getRequestBody(), context, map));
-    if (operation.getResponses() != null) {
-      for (String key : operation.getResponses().keySet())
-        operationObject.addResponseTuple(new ResponseTuple(key, ResponseObject.parseResponse(operation.getResponse(key), context, map)));
-    }
-    if (operation.getCallbacks() != null) {
-      for (String key : operation.getCallbacks().keySet())
-        operationObject.addCallbackTuple(new CallbackTuple(key, CallbackObject.parseCallback(operation.getCallback(key), context, map)));
-    }
-    if (operation.getSecurityRequirements() != null) {
-      for (SecurityRequirement s : operation.getSecurityRequirements())
-        operationObject.addSecurityRequirementObject(SecurityRequirementObject.parseSecurityRequirement(s, map));
-    }
-    if (operation.getServers() != null) {
-      for (Server s : operation.getServers())
-        operationObject.addServerObject(ServerObject.parseServer(s, map));
-    }
-    if (operation.getExtensions() != null) {
-      for (String key : operation.getExtensions().keySet())
-        operationObject.addExtension(new Extension(key, operation.getExtensions().get(key)));
-    }
+        operationObject.addT(tag);
+        }
+        }
+        if (operation.getSummary() != null)
+        operationObject.setSummary(operation.getSummary());
+        if (operation.getDescription() != null)
+        operationObject.setDescription(operation.getDescription());
+        if (operation.getExternalDocs() != null)
+        operationObject.set_impl_ed(ExternalDocObject.parseExternalDocs(operation.getExternalDocs()));
+        if (operation.getOperationId() != null)
+        operationObject.setOperationID(operation.getOperationId());
+        if (operation.getParameters() != null) {
+        for (Parameter p : operation.getParameters())
+        operationObject.addP(ParameterOb.parseParameter(p));
+        }
+        if (operation.getRequestBody() != null)
+        operationObject.set_impl_rb(RequestBodyOb.parseRequestBody(operation.getRequestBody()));
+        if (operation.getResponses().size() != 0) {
+        ResponsesObject r = new ResponsesObject();
+        for (String key : operation.getResponses().keySet())
+        r.addR(new ResponseTuple(key, ResponseObject.parseResponse(operation.getResponses().get(key))));
+        operationObject.set_impl_r(r);
+        }
+        if (operation.getCallbacks().size() != 0) {
+        for (String key : operation.getCallbacks().keySet())
+        operationObject.addC(new CallbackTuple(key, CallbackObject.parseCallback(operation.getCallbacks().get(key))));
+        }
+        if (operation.getSecurity().size() != 0) {
+        for (SecurityRequirement s : operation.getSecurity())
+        operationObject.addSr(SecurityRequirementObject.parseSecurityRequirement(s));
+        }
+        if (operation.getServers() != null) {
+        for (Server s : operation.getServers())
+        operationObject.addS(ServerObject.parseServer(s));
+        }
+        if (operation.getExtensions() != null) {
+        for (String key : operation.getExtensions().keySet())
+        operationObject.addEx(new Extension(key, operation.getExtensions().get(key)));
+        }
 
-    map.put(operation, operationObject);
-    return operationObject;
+        return operationObject;
   }
 
-  public static ExternalDocObject ExternalDocObject.parseExternalDocs(ExternalDocs externalDocs, Map<Object, ASTNode> map){
-    ExternalDocObject externalDocObject = new ExternalDocObject();
-
+  public static ExternalDocObject ExternalDocObject.parseExternalDocs(ExternalDocs externalDocs){
+        ExternalDocObject externalDocObject = new ExternalDocObject();
 
-    if (externalDocs.getDescription() != null)
-      externalDocObject.setDescription(externalDocs.getDescription());
-    if (externalDocs.getUrl() != null)
-      externalDocObject.setUrl(externalDocs.getUrl());
-    if (externalDocs.getExtensions() != null) {
-      for (String key : externalDocs.getExtensions().keySet())
-        externalDocObject.addExtension(new Extension(key, externalDocs.getExtensions().get(key)));
-    }
+        if (externalDocs.getDescription() != null)
+        externalDocObject.setDescription(externalDocs.getDescription());
+        if (externalDocs.getUrl() != null)
+        externalDocObject.setUrl(externalDocs.getUrl());
+        if (externalDocs.getVendorExtensions() != null) {
+        for (String key : externalDocs.getVendorExtensions().keySet())
+        externalDocObject.addEx(new Extension(key, externalDocs.getVendorExtensions().get(key)));
+        }
 
-    map.put(externalDocs, externalDocObject);
-    return externalDocObject;
+        return externalDocObject;
   }
 
   public static ParameterOb ParameterOb.parseParameter(Parameter parameter, OAIContext context, Map<Object, ASTNode> map) throws DecodeException {