diff --git a/src/MetadataExtractorCron.sln b/src/MetadataExtractorCron.sln
index 80cac292f3bfbb8f2444554141f60bc187b7558b..792e506fa06e77e39e9089a98c2afc3549f17829 100644
--- a/src/MetadataExtractorCron.sln
+++ b/src/MetadataExtractorCron.sln
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 17
 VisualStudioVersion = 17.1.32414.318
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MetadataExtractorCron", "MetadataExtractorCron\MetadataExtractorCron.csproj", "{B76A7422-1D0F-491F-B71C-D00E7C885C4A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MetadataExtractorCron", "MetadataExtractorCron\MetadataExtractorCron.csproj", "{B76A7422-1D0F-491F-B71C-D00E7C885C4A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenApiGeneratedConnector", "OpenApiGeneratedConnector\OpenApiGeneratedConnector.csproj", "{6FAAF00B-335B-4896-826F-06CA79CAA2E0}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +17,10 @@ Global
 		{B76A7422-1D0F-491F-B71C-D00E7C885C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B76A7422-1D0F-491F-B71C-D00E7C885C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{B76A7422-1D0F-491F-B71C-D00E7C885C4A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6FAAF00B-335B-4896-826F-06CA79CAA2E0}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/src/MetadataExtractorCron/Extractors/CoscineMetadataExtractor.cs b/src/MetadataExtractorCron/Extractors/CoscineMetadataExtractor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c79a593b8a9bf1706dc00007a7ae769a6a1ac6c0
--- /dev/null
+++ b/src/MetadataExtractorCron/Extractors/CoscineMetadataExtractor.cs
@@ -0,0 +1,387 @@
+using Coscine.Configuration;
+using Coscine.Database.Models;
+using Coscine.Metadata;
+using Coscine.ResourceTypes;
+using Coscine.ResourceTypes.Base;
+using Coscine.ResourceTypes.Base.Models;
+using Org.OpenAPITools.Api;
+using Org.OpenAPITools.Model;
+using VDS.RDF.Query;
+using VDS.RDF;
+using MetadataExtractorCron.Util;
+using VDS.RDF.Parsing;
+using System.Globalization;
+using System.Security.Cryptography;
+
+namespace MetadataExtractorCron.Extractors;
+
+public class CoscineMetadataExtractor : IMetadataExtractor
+{
+    private readonly string _resourceUrlPrefix = "https://purl.org/coscine/resources";
+
+    private readonly IConfiguration _configuration;
+    private readonly DefaultApi _apiClient;
+
+    private readonly RdfStoreConnector _rdfStoreConnector;
+    private readonly MetadataGraphsCreator _metadataGraphsCreator;
+
+    private const string metadataExtractionVersionUrl = "https://purl.org/coscine/terms/metatadataextraction#version";
+    private const string dcatdistributionUrl = "http://www.w3.org/ns/dcat#distribution";
+    private const string partOfUri = "http://purl.org/dc/terms/isPartOf";
+    private const string aUri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
+    private const string dctermsModifiedUri = "http://purl.org/dc/terms/modified";
+    private const string rdfSourceUri = "http://www.w3.org/ns/ldp#RDFSource";
+    private const string trellisGraphUri = "http://www.trellisldp.org/ns/trellis#PreferServerManaged";
+
+    public CoscineMetadataExtractor()
+    {
+        _configuration = new ConsulConfiguration();
+        _apiClient = new DefaultApi(
+            _configuration.GetStringAndWait(
+                "coscine/local/metadataextractor/url",
+                "https://metadataextractor.otc.coscine.dev/"
+            )
+        );
+        _rdfStoreConnector = new RdfStoreConnector(_configuration.GetStringAndWait("coscine/local/virtuoso/additional/url"));
+        _metadataGraphsCreator = new MetadataGraphsCreator(_rdfStoreConnector);
+    }
+
+    public async Task PerformExtraction()
+    {
+        var modelVersion = await _apiClient.GetVersionWorkerAsync();
+        var version = modelVersion._Version;
+
+        var metadataExtractionModel = new MetadataExtractionModel();
+        var resourceModel = new ResourceModel();
+
+        foreach (var extraction in metadataExtractionModel.GetAllWhere((extration) => extration.Activated))
+        {
+            var resourceId = extraction.ResourceId;
+            Console.WriteLine($"Working on resource {resourceId}");
+            var resource = resourceModel.GetByIdIncludingDeleted(resourceId);
+
+            var resourceTypeDefinition = ResourceTypeFactory.Instance.GetResourceType(resource);
+            if (resourceTypeDefinition == null)
+            {
+                Console.WriteLine($"Broken resource type for resource {resourceId}");
+                continue;
+            }
+            var resourceTypeOptions = resourceModel.GetResourceTypeOptions(resourceId);
+
+            var fileInfos = await ReceiveAllFiles(resourceTypeDefinition, resourceId.ToString(), resourceTypeOptions);
+
+            foreach (var file in fileInfos.Where((fileInfo) => fileInfo.HasBody))
+            {
+                if (file.BodyBytes > 16 * 1000 * 1000)
+                {
+                    Console.WriteLine($"Skipping {file.Key} on {resourceId} since it has a too large byte size");
+                    continue;
+                }
+                Console.WriteLine($"Iterating over {file.Key} on {resourceId}");
+                CreateMetadataSetsIfDontExist(resourceId.ToString(), file, fileInfos);
+                if (!HasCurrentMetadataExtracted(resourceId.ToString(), file))
+                {
+                    Console.WriteLine($"Extracting metadata for {file.Key} on {resourceId}");
+                    try
+                    {
+                        var extractedMetadata = await ExtractMetadata(resourceId.ToString(), file, resourceTypeDefinition, resourceTypeOptions);
+                        await StoreExtractedMetadata(resourceId.ToString(), file, extractedMetadata, resourceTypeDefinition, resourceTypeOptions);
+                    }
+                    catch (Exception e)
+                    {
+                        Console.WriteLine($"Error extracting metadata for {file.Key} on {resourceId} with error message: {e.Message}, Inner: {(e.InnerException != null ? e.InnerException.Message : "none")}");
+                    }
+                }
+                else
+                {
+                    Console.WriteLine($"Metadata for {file.Key} on {resourceId} already exists");
+                }
+            }
+        }
+    }
+
+    private async Task<IEnumerable<ResourceEntry>> ReceiveAllFiles(BaseResourceType resourceTypeDefinition, string resourceId, Dictionary<string, string>? resourceTypeOptions, string path = "")
+    {
+        var fileInfos = new List<ResourceEntry>();
+        var currentFileInfos = await resourceTypeDefinition.ListEntries(resourceId, path, resourceTypeOptions);
+        fileInfos.AddRange(currentFileInfos);
+        foreach (var currentFileInfo in currentFileInfos.Where((currentFileInfo) => !currentFileInfo.HasBody))
+        {
+            fileInfos.AddRange(await ReceiveAllFiles(resourceTypeDefinition, resourceId, resourceTypeOptions, currentFileInfo.Key));
+        }
+        return fileInfos;
+    }
+
+    private void CreateMetadataSetsIfDontExist(string resourceId, ResourceEntry entry, IEnumerable<ResourceEntry> fileInfos)
+    {
+        var resourceGraphName = $"{_resourceUrlPrefix}/{resourceId}";
+        var newFileGraphName = $"{resourceGraphName}/{entry.Key}";
+        if (!newFileGraphName.EndsWith("/"))
+        {
+            newFileGraphName += "/";
+        }
+
+        var existingGraphs = ListGraphs(newFileGraphName);
+        if (!existingGraphs.Any())
+        {
+            Console.WriteLine($"Creating graphs for {newFileGraphName} since they did not exist before!");
+            _metadataGraphsCreator.CreateGraphs(resourceId, entry, fileInfos);
+        }
+    }
+
+    private IEnumerable<Uri> ListGraphs(string id)
+    {
+        var cmdString = new SparqlParameterizedString
+        {
+            CommandText = @"SELECT DISTINCT ?g
+                WHERE { GRAPH ?g { ?s ?p ?o }
+                FILTER(contains(str(?g), @graph)) }"
+        };
+        cmdString.SetLiteral("graph", id);
+
+        var resultSet = _rdfStoreConnector.QueryEndpoint.QueryWithResultSet(cmdString.ToString());
+
+        var graphs = new List<Uri>();
+        foreach (SparqlResult r in resultSet)
+        {
+            var uriNode = r.Value("g") as UriNode;
+            if (uriNode is not null)
+            {
+                graphs.Add(uriNode.Uri);
+            }
+        }
+        return graphs;
+    }
+
+    private bool HasCurrentMetadataExtracted(string resourceId, ResourceEntry entry)
+    {
+        var resourceGraphName = $"{_resourceUrlPrefix}/{resourceId}";
+        var newFileGraphName = $"{resourceGraphName}/{entry.Key}";
+        if (!newFileGraphName.EndsWith("/"))
+        {
+            newFileGraphName += "/";
+        }
+
+        var existingGraphs = ListGraphs(newFileGraphName);
+        var recentDataVersion = VersionUtil.GetRecentDataVersion(existingGraphs);
+        var recentDataExtractedVersion = VersionUtil.GetRecentDataExtractedVersion(existingGraphs);
+
+        return
+            recentDataExtractedVersion != null
+            && recentDataVersion != null
+            && recentDataExtractedVersion.AbsoluteUri.Contains(recentDataVersion.AbsoluteUri)
+            && recentDataExtractedVersion.AbsoluteUri != recentDataVersion.AbsoluteUri;
+    }
+
+    private async Task<MetadataOutput> ExtractMetadata(string resourceId, ResourceEntry entry, BaseResourceType resourceTypeDefinition, Dictionary<string, string>? resourceTypeOptions)
+    {
+        var loadedEntry = await resourceTypeDefinition.LoadEntry(resourceId, entry.Key, resourceTypeOptions);
+
+        if (loadedEntry is null)
+        {
+            throw new NullReferenceException("The resulting stream of the loaded entry is null.");
+        }
+
+        var extractedOutputs = await _apiClient.PostMetadataExtractorWorkerAsync(
+            loadedEntry,
+            $"{resourceId}/{entry.Key}",
+            null,
+            entry.Created?.ToString("o", CultureInfo.InvariantCulture),
+            entry.Modified?.ToString("o", CultureInfo.InvariantCulture)
+        );
+
+        return extractedOutputs[0];
+    }
+
+    private async Task StoreExtractedMetadata(string resourceId, ResourceEntry entry, MetadataOutput extractedMetadata, BaseResourceType resourceTypeDefinition, Dictionary<string, string>? resourceTypeOptions)
+    {
+        var metadataExtractorVersion = (await _apiClient.GetVersionWorkerAsync())._Version;
+
+        var resourceGraphName = $"{_resourceUrlPrefix}/{resourceId}";
+        var newFileGraphName = $"{resourceGraphName}/{entry.Key}";
+        var newFileGraphNameAddon = newFileGraphName;
+        if (!newFileGraphNameAddon.EndsWith("/"))
+        {
+            newFileGraphNameAddon += "/";
+        }
+
+        var existingGraphs = ListGraphs(newFileGraphNameAddon);
+        var recentDataVersion = VersionUtil.GetRecentDataVersion(existingGraphs);
+        var recentMetadataVersion = VersionUtil.GetRecentMetadataVersion(existingGraphs);
+
+        await CreateHashData(resourceId, entry, resourceTypeDefinition, resourceTypeOptions, newFileGraphNameAddon, recentDataVersion);
+
+        if (recentDataVersion is null)
+        {
+            throw new NullReferenceException("The recent data version is null and can't be used.");
+        }
+
+        var recentDataExtractedVersion = new Uri(recentDataVersion.AbsoluteUri + "&extracted=true");
+
+        if (recentMetadataVersion is null)
+        {
+            throw new NullReferenceException("The recent metadata version is null and can't be used.");
+        }
+
+        var recentMetadataExtractedVersion = new Uri(recentMetadataVersion.AbsoluteUri + "&extracted=true");
+
+        var tripleStore = new TripleStore();
+        tripleStore.LoadFromString(extractedMetadata.Metadata, new TriGParser(TriGSyntax.Recommendation));
+
+        FormatResultMetadata(tripleStore, recentDataExtractedVersion, recentMetadataExtractedVersion);
+
+        GraphStorer.StoreGraphs(tripleStore.Graphs, _rdfStoreConnector);
+
+        var trellisGraph = _rdfStoreConnector.GetGraph(trellisGraphUri);
+        var triples = new List<Triple>();
+
+        AddToTrellis(trellisGraph, rdfSourceUri, newFileGraphName, recentDataExtractedVersion.AbsoluteUri, triples);
+        AddToTrellis(trellisGraph, rdfSourceUri, newFileGraphName, recentMetadataExtractedVersion.AbsoluteUri, triples);
+        GraphStorer.AddToGraph(trellisGraph, triples, _rdfStoreConnector);
+
+        var newDataFileGraphName = $"{newFileGraphName}/@type=data";
+        var newMetadataFileGraphName = $"{newFileGraphName}/@type=metadata";
+
+        var dataGraph = CreateOrGetGraph(newDataFileGraphName);
+        var metadataGraph = CreateOrGetGraph(newMetadataFileGraphName);
+
+        dataGraph.Assert(new Triple(
+            dataGraph.CreateUriNode(new Uri(newDataFileGraphName)),
+            dataGraph.CreateUriNode(new Uri(dcatdistributionUrl)),
+            dataGraph.CreateUriNode(recentDataExtractedVersion)
+        ));
+        dataGraph.Assert(new Triple(
+            dataGraph.CreateUriNode(recentDataExtractedVersion),
+            dataGraph.CreateUriNode(new Uri(metadataExtractionVersionUrl)),
+            dataGraph.CreateLiteralNode(metadataExtractorVersion)
+        ));
+
+        metadataGraph.Assert(new Triple(
+            metadataGraph.CreateUriNode(new Uri(newMetadataFileGraphName)),
+            metadataGraph.CreateUriNode(new Uri(dcatdistributionUrl)),
+            metadataGraph.CreateUriNode(recentMetadataExtractedVersion)
+        ));
+        metadataGraph.Assert(new Triple(
+            metadataGraph.CreateUriNode(recentMetadataExtractedVersion),
+            metadataGraph.CreateUriNode(new Uri(metadataExtractionVersionUrl)),
+            metadataGraph.CreateLiteralNode(metadataExtractorVersion)
+        ));
+        metadataGraph.Assert(new Triple(
+            metadataGraph.CreateUriNode(recentMetadataVersion),
+            metadataGraph.CreateUriNode(new Uri("http://purl.org/fdp/fdp-o#isMetadataOf")),
+            metadataGraph.CreateUriNode(recentDataVersion)
+        ));
+
+        var provenanceGraphs = new List<IGraph> { dataGraph, metadataGraph };
+        GraphStorer.StoreGraphs(provenanceGraphs, _rdfStoreConnector);
+    }
+
+    private async Task CreateHashData(string resourceId, ResourceEntry entry, BaseResourceType resourceTypeDefinition, Dictionary<string, string>? resourceTypeOptions, string newFileGraphNameAddon, Uri? recentDataVersion)
+    {
+        var dataGraphName = $"{newFileGraphNameAddon}@type=data";
+        var dataGraph = CreateOrGetGraph(dataGraphName);
+
+        var hashTriples = new List<Triple>();
+
+        var loadedEntry = await resourceTypeDefinition.LoadEntry(resourceId, entry.Key, resourceTypeOptions);
+
+        if (loadedEntry is null)
+        {
+            throw new NullReferenceException("The resulting stream of the loaded entry is null, when trying to hash the data.");
+        }
+
+        var sha512Hash = Convert.ToBase64String(HashUtil.HashData(loadedEntry, HashAlgorithmName.SHA512));
+
+        var dataGraphId = recentDataVersion;
+        var hashGraphId = new Uri($"{dataGraphId?.AbsoluteUri}&hash={Guid.NewGuid()}");
+
+        var dataGraphSubject = dataGraph.CreateUriNode(dataGraphId);
+        var hashSubject = dataGraph.CreateUriNode(hashGraphId);
+
+        hashTriples.Add(new Triple(dataGraphSubject,
+                        dataGraph.CreateUriNode(new Uri("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#hashType")),
+                        hashSubject));
+        hashTriples.Add(new Triple(hashSubject,
+                                    dataGraph.CreateUriNode(new Uri("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#hashFunction")),
+                                    dataGraph.CreateLiteralNode("SHA512")));
+        hashTriples.Add(new Triple(hashSubject,
+                                    dataGraph.CreateUriNode(new Uri("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#hashValue")),
+                                    dataGraph.CreateLiteralNode(sha512Hash, new Uri("http://www.w3.org/2001/XMLSchema#hexBinary"))));
+
+        GraphStorer.AddToGraph(dataGraph, hashTriples, _rdfStoreConnector);
+    }
+
+    private static void FormatResultMetadata(TripleStore tripleStore, Uri dataExtractGraph, Uri metadataExtractGraph)
+    {
+        foreach (var graph in tripleStore.Graphs.ToArray())
+        {
+            if (graph.BaseUri != dataExtractGraph && graph.BaseUri != metadataExtractGraph)
+            {
+                tripleStore.Remove(graph.BaseUri);
+                if (graph.BaseUri.AbsoluteUri.Contains("type=data"))
+                {
+                    graph.BaseUri = dataExtractGraph;
+                }
+                else
+                {
+                    graph.BaseUri = metadataExtractGraph;
+                }
+                tripleStore.Add(graph, true);
+            }
+        }
+    }
+
+    private static void AddToTrellis(IGraph trellisGraph, string ldpAssignment, string thePartUri, string graphUri, ICollection<Triple> triples)
+    {
+        var setGraphNode = trellisGraph.CreateUriNode(new Uri(graphUri));
+        var setThePartNode = trellisGraph.CreateUriNode(new Uri(thePartUri));
+        var triple = new Triple(
+            setGraphNode,
+            trellisGraph.CreateUriNode(new Uri(partOfUri)),
+            setThePartNode
+        );
+        if (!trellisGraph.ContainsTriple(triple))
+        {
+            triples.Add(triple);
+            trellisGraph.Assert(triple);
+            var assignmentTriple = new Triple(
+                setGraphNode,
+                trellisGraph.CreateUriNode(new Uri(aUri)),
+                trellisGraph.CreateUriNode(new Uri(ldpAssignment))
+            );
+            triples.Add(assignmentTriple);
+            trellisGraph.Assert(assignmentTriple);
+            AddModifiedDate(trellisGraph, graphUri, triples);
+        }
+    }
+
+    private IGraph CreateOrGetGraph(string graphUrl)
+    {
+        var entryAlreadyExists = _rdfStoreConnector.HasGraph(graphUrl);
+        return entryAlreadyExists
+            ? _rdfStoreConnector.GetGraph(graphUrl)
+            : new Graph()
+            {
+                BaseUri = new Uri(graphUrl)
+            };
+    }
+
+    private static void AddModifiedDate(IGraph graph, string root, ICollection<Triple> triples)
+    {
+        var dcTermsModifiedNode = graph.CreateUriNode(new Uri(dctermsModifiedUri));
+        var rootNode = graph.CreateUriNode(new Uri(root));
+        if (!graph.GetTriplesWithSubjectPredicate(rootNode, dcTermsModifiedNode).Any())
+        {
+            var triple = new Triple(
+                rootNode,
+                dcTermsModifiedNode,
+                graph.CreateLiteralNode(
+                    DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture),
+                    new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime)
+                )
+            );
+            triples.Add(triple);
+            graph.Assert(triple);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/MetadataExtractorCron/Extractors/IMetadataExtractor.cs b/src/MetadataExtractorCron/Extractors/IMetadataExtractor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..06e92d32dbc6da99a090e132f8025616faac2917
--- /dev/null
+++ b/src/MetadataExtractorCron/Extractors/IMetadataExtractor.cs
@@ -0,0 +1,6 @@
+namespace MetadataExtractorCron.Extractors;
+
+public interface IMetadataExtractor
+{
+    Task PerformExtraction();
+}
\ No newline at end of file
diff --git a/src/MetadataExtractorCron/MetadataExtractorCron.csproj b/src/MetadataExtractorCron/MetadataExtractorCron.csproj
index e87d93a3b1d1f7f7a4adccc3e79ac4ce1f792893..4a1c967f19720fa440f743250b60d5e5d90c8206 100644
--- a/src/MetadataExtractorCron/MetadataExtractorCron.csproj
+++ b/src/MetadataExtractorCron/MetadataExtractorCron.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
@@ -8,8 +8,14 @@
   <Version>0.1.0</Version></PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Coscine.Database" Version="2.*-*" />
+    <PackageReference Include="Coscine.Database" Version="2.15.0-issue-1788-extra0002" />
     <PackageReference Include="Coscine.Metadata" Version="2.*-*" />
+    <PackageReference Include="Coscine.ResourceTypes" Version="1.5.1" />
+    <PackageReference Include="dotNetRDF" Version="2.7.5" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\OpenApiGeneratedConnector\OpenApiGeneratedConnector.csproj" />
   </ItemGroup>
 
 </Project>
diff --git a/src/MetadataExtractorCron/Program.cs b/src/MetadataExtractorCron/Program.cs
index 7141c13161d4085c23a5342fbb0d84f7d9cb2c45..7913c0f2f241156ab1e76b62a1d75cd4457b19a3 100644
--- a/src/MetadataExtractorCron/Program.cs
+++ b/src/MetadataExtractorCron/Program.cs
@@ -1 +1,7 @@
-Console.WriteLine("\n Finished.");
+using MetadataExtractorCron.Extractors;
+
+var metadataExtractor = new CoscineMetadataExtractor();
+
+await metadataExtractor.PerformExtraction();
+
+Console.WriteLine("Finished.");
\ No newline at end of file
diff --git a/src/MetadataExtractorCron/Util/GraphStorer.cs b/src/MetadataExtractorCron/Util/GraphStorer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..438552b9ff6307e7a4a56ced6048ca536122bc5e
--- /dev/null
+++ b/src/MetadataExtractorCron/Util/GraphStorer.cs
@@ -0,0 +1,41 @@
+using Coscine.Metadata;
+using VDS.RDF;
+
+namespace MetadataExtractorCron.Util;
+
+public static class GraphStorer
+{
+    public static void StoreGraphs(IEnumerable<IGraph> graphUris, RdfStoreConnector rdfStoreConnector)
+    {
+        foreach (var graphUri in graphUris)
+        {
+            Console.WriteLine($" ({graphUri.BaseUri})");
+
+            if (rdfStoreConnector.HasGraph(graphUri.BaseUri))
+            {
+                Console.WriteLine($" - Graph {graphUri.BaseUri} exists");
+
+                // Clear the existing graph from the store
+                rdfStoreConnector.ClearGraph(graphUri.BaseUri);
+                Console.WriteLine($" - Cleared Graph {graphUri.BaseUri}");
+            }
+
+            // Chunking since the size otherwise can be too large
+            foreach (var triples in graphUri.Triples.Chunk(100))
+            {
+                rdfStoreConnector.ReadWriteSparqlConnector.UpdateGraph(graphUri.BaseUri, triples, Enumerable.Empty<Triple>());
+            }
+
+            Console.WriteLine($" - Graph {graphUri.BaseUri} added successfully");
+            Console.WriteLine();
+        }
+    }
+
+    public static void AddToGraph(IGraph graph, IEnumerable<Triple> triples, RdfStoreConnector rdfStoreConnector)
+    {
+        Console.WriteLine($" - Adding Triples to {graph.BaseUri}");
+        rdfStoreConnector.ReadWriteSparqlConnector.UpdateGraph(graph.BaseUri, triples, Enumerable.Empty<Triple>());
+        Console.WriteLine($" - Triples added to Graph {graph.BaseUri} successfully");
+        Console.WriteLine();
+    }
+}
\ No newline at end of file
diff --git a/src/MetadataExtractorCron/Util/HashUtil.cs b/src/MetadataExtractorCron/Util/HashUtil.cs
new file mode 100644
index 0000000000000000000000000000000000000000..315b2f8f4656fb1bca544033c95a241da1923297
--- /dev/null
+++ b/src/MetadataExtractorCron/Util/HashUtil.cs
@@ -0,0 +1,29 @@
+using System.Security.Cryptography;
+
+namespace MetadataExtractorCron.Util;
+
+public static class HashUtil
+{
+    private static HashAlgorithm GetHashAlgorithm(HashAlgorithmName hashAlgorithmName)
+    {
+        if (hashAlgorithmName == HashAlgorithmName.MD5)
+            return MD5.Create();
+        if (hashAlgorithmName == HashAlgorithmName.SHA1)
+            return SHA1.Create();
+        if (hashAlgorithmName == HashAlgorithmName.SHA256)
+            return SHA256.Create();
+        if (hashAlgorithmName == HashAlgorithmName.SHA384)
+            return SHA384.Create();
+        if (hashAlgorithmName == HashAlgorithmName.SHA512)
+            return SHA512.Create();
+
+        throw new CryptographicException($"Unknown hash algorithm \"{hashAlgorithmName.Name}\".");
+    }
+
+    public static byte[] HashData(Stream data,
+        HashAlgorithmName hashAlgorithm)
+    {
+        using var hashAlgorithmObject = GetHashAlgorithm(hashAlgorithm);
+        return hashAlgorithmObject.ComputeHash(data);
+    }
+}
\ No newline at end of file
diff --git a/src/MetadataExtractorCron/Util/MetadataGraphsCreator.cs b/src/MetadataExtractorCron/Util/MetadataGraphsCreator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..afbfe1aeef8db2acc4825e19fa0c03bf49b452b5
--- /dev/null
+++ b/src/MetadataExtractorCron/Util/MetadataGraphsCreator.cs
@@ -0,0 +1,319 @@
+using Coscine.Metadata;
+using Coscine.ResourceTypes.Base.Models;
+using System.Globalization;
+using VDS.RDF;
+using VDS.RDF.Parsing;
+using VDS.RDF.Query;
+
+namespace MetadataExtractorCron.Util;
+
+/// <summary>
+/// Derived from MetadataMigrator
+/// </summary>
+public class MetadataGraphsCreator
+{
+    private const string partOfUri = "http://purl.org/dc/terms/isPartOf";
+    private const string aUri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
+    private const string basicContainerUri = "http://www.w3.org/ns/ldp#BasicContainer";
+    private const string nonRdfSourceUri = "http://www.w3.org/ns/ldp#NonRDFSource";
+    private const string rdfSourceUri = "http://www.w3.org/ns/ldp#RDFSource";
+
+    private const string dcatcatalogUri = "http://www.w3.org/ns/dcat#catalog";
+    private const string dcatCatalogClassUri = "http://www.w3.org/ns/dcat#Catalog";
+
+    private const string dctermsIdentifierUri = "http://purl.org/dc/terms/identifier";
+    private const string dctermsModifiedUri = "http://purl.org/dc/terms/modified";
+
+    private const string fdpMetadataServiceUri = "http://purl.org/fdp/fdp-o#MetadataService";
+    private const string fdphasMetadataUri = "http://purl.org/fdp/fdp-o#hasMetadata";
+
+    private const string provEntityUri = "http://www.w3.org/ns/prov#Entity";
+    private const string provGeneratedAtTimeUri = "http://www.w3.org/ns/prov#generatedAtTime";
+    private const string provWasRevisionOfUri = "http://www.w3.org/ns/prov#wasRevisionOfNode";
+
+    private const string ldpDescribedByUri = "http://www.w3.org/ns/ldp#describedBy";
+
+    private const string resourceUrlPrefix = "https://purl.org/coscine/resources";
+
+    private const string trellisGraphUri = "http://www.trellisldp.org/ns/trellis#PreferServerManaged";
+
+    private RdfStoreConnector RdfStoreConnector { get; }
+
+    public MetadataGraphsCreator(RdfStoreConnector rdfStoreConnector)
+    {
+        RdfStoreConnector = rdfStoreConnector;
+    }
+
+    public void CreateGraphs(string resourceId, ResourceEntry entry, IEnumerable<ResourceEntry> fileInfos)
+    {
+        var trellisGraph = RdfStoreConnector.GetGraph(trellisGraphUri);
+
+        var graphs = new List<IGraph>();
+        var triples = new List<Triple>();
+
+        var resourceGraphName = $"{resourceUrlPrefix}/{resourceId}";
+
+        var fileGraphs = fileInfos.Select((entry) =>
+        {
+            var entryGraphName = $"{resourceGraphName}/{entry.Key}";
+            if (!entryGraphName.EndsWith("/"))
+            {
+                entryGraphName += "/";
+            }
+            return new Uri(entryGraphName);
+        });
+
+        var newFileGraphName = $"{resourceGraphName}/{entry.Key}";
+        Console.WriteLine($"Migrating {newFileGraphName}");
+
+        var version = VersionUtil.GetNewVersion();
+
+        var newMetadataFileGraphName = $"{newFileGraphName}/@type=metadata";
+        var newDataFileGraphName = $"{newFileGraphName}/@type=data";
+        var newMetadataVersionFileGraphName = $"{newFileGraphName}/@type=metadata&version={version}";
+        var newDataVersionFileGraphName = $"{newFileGraphName}/@type=data&version={version}";
+
+        var newFileGraph = CreateOrGetGraph(newFileGraphName);
+        var fileNode = newFileGraph.CreateUriNode(new Uri(newFileGraphName));
+        graphs.Add(newFileGraph);
+
+        // Set relation to resource, if a plain file in no folder
+        if (!entry.Key.Any((character) => character == '/'))
+        {
+            AddToTrellis(trellisGraph, basicContainerUri, resourceGraphName, newFileGraphName, triples);
+        }
+
+        newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(aUri)), newFileGraph.CreateUriNode(new Uri(dcatCatalogClassUri))));
+        newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(aUri)), newFileGraph.CreateUriNode(new Uri(fdpMetadataServiceUri))));
+        AddFilesToAFolder(trellisGraph, fileGraphs, new Uri(newFileGraphName), newFileGraph, newFileGraphName, triples);
+
+        var metadataFileGraph = SetMetadataGraph(trellisGraph, graphs, newMetadataFileGraphName, newFileGraph, newFileGraphName, triples);
+        var dataFileGraph = SetDataGraph(trellisGraph, graphs, newDataFileGraphName, newFileGraph, newFileGraphName, metadataFileGraph.BaseUri.AbsoluteUri, triples);
+
+        var existingGraphs = ListGraphs(newFileGraphName + "/");
+
+        SetDataVersionGraph(graphs, newDataVersionFileGraphName, dataFileGraph, existingGraphs, trellisGraph, newFileGraphName, triples);
+        SetMetadataVersionGraph(graphs, newMetadataVersionFileGraphName, metadataFileGraph, existingGraphs, trellisGraph, newFileGraphName, triples);
+
+        GraphStorer.StoreGraphs(graphs, RdfStoreConnector);
+        GraphStorer.AddToGraph(trellisGraph, triples, RdfStoreConnector);
+    }
+
+    private static void AddFilesToAFolder(IGraph trellisGraph, IEnumerable<Uri> fileGraphs, Uri fileGraph, IGraph newFileGraph, string fileUri, ICollection<Triple> triples)
+    {
+        // Add all files to a folder
+        foreach (var otherFileGraph in fileGraphs)
+        {
+            // TODO: Deal with multiple levels of files
+            if (otherFileGraph.AbsoluteUri != fileGraph.AbsoluteUri
+                && otherFileGraph.AbsoluteUri.Contains(fileGraph.AbsoluteUri + "/")
+                && !otherFileGraph.AbsoluteUri.Contains("&data")
+                && !otherFileGraph.AbsoluteUri.Contains("?type=")
+                && !otherFileGraph.AbsoluteUri.Contains("&type=")
+                && !otherFileGraph.AbsoluteUri.Contains("@type="))
+            {
+                var otherFileNode = newFileGraph.CreateUriNode(otherFileGraph);
+                newFileGraph.Assert(new Triple(newFileGraph.CreateUriNode(new Uri(fileUri)), newFileGraph.CreateUriNode(new Uri(dcatcatalogUri)), otherFileNode));
+                AddToTrellis(trellisGraph, basicContainerUri, fileUri, otherFileGraph.AbsoluteUri, triples);
+            }
+        }
+    }
+
+    private IGraph SetMetadataGraph(IGraph trellisGraph, List<IGraph> graphs, string newMetadataFileGraphName, IGraph newFileGraph, string fileUri, ICollection<Triple> triples)
+    {
+        var metadataFileNode = newFileGraph.CreateUriNode(new Uri(newMetadataFileGraphName));
+        var metadataFileGraph = CreateOrGetGraph(newMetadataFileGraphName);
+        graphs.Add(metadataFileGraph);
+        AddToTrellis(trellisGraph, rdfSourceUri, fileUri, newMetadataFileGraphName, triples);
+        var fileNode = newFileGraph.CreateUriNode(new Uri(fileUri));
+        newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(dcatcatalogUri)), metadataFileNode));
+        newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(fdphasMetadataUri)), metadataFileNode));
+        metadataFileGraph.Assert(new Triple(
+            Tools.CopyNode(metadataFileNode, metadataFileGraph),
+            metadataFileGraph.CreateUriNode(new Uri(aUri)),
+            metadataFileGraph.CreateUriNode(new Uri(dcatCatalogClassUri))
+        ));
+        return metadataFileGraph;
+    }
+
+    private IGraph SetDataGraph(IGraph trellisGraph, List<IGraph> graphs, string newDataFileGraphName, IGraph newFileGraph, string fileUri, string metadataFileUri, ICollection<Triple> triples)
+    {
+        var dataFileNode = newFileGraph.CreateUriNode(new Uri(newDataFileGraphName));
+        var dataFileGraph = CreateOrGetGraph(newDataFileGraphName);
+        graphs.Add(dataFileGraph);
+        AddToTrellis(trellisGraph, nonRdfSourceUri, fileUri, newDataFileGraphName, triples);
+        var fileNode = newFileGraph.CreateUriNode(new Uri(fileUri));
+        newFileGraph.Assert(new Triple(fileNode, newFileGraph.CreateUriNode(new Uri(dcatcatalogUri)), dataFileNode));
+        dataFileGraph.Assert(new Triple(Tools.CopyNode(dataFileNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(aUri)), dataFileGraph.CreateUriNode(new Uri(dcatCatalogClassUri))));
+        dataFileGraph.Assert(new Triple(Tools.CopyNode(dataFileNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(ldpDescribedByUri)), dataFileGraph.CreateUriNode(new Uri(metadataFileUri))));
+        return dataFileGraph;
+    }
+
+    private void SetDataVersionGraph(List<IGraph> graphs, string newDataVersionFileGraphName, IGraph dataFileGraph, IEnumerable<Uri> existingGraphs, IGraph trellisGraph, string fileUri, ICollection<Triple> triples)
+    {
+        var recentDataVersion = VersionUtil.GetRecentDataVersion(existingGraphs);
+
+        IGraph currentDataVersionGraph;
+        if (recentDataVersion == null)
+        {
+            currentDataVersionGraph = new Graph()
+            {
+                BaseUri = new Uri(newDataVersionFileGraphName),
+            };
+        }
+        else
+        {
+            currentDataVersionGraph = RdfStoreConnector.GetGraph(recentDataVersion);
+        }
+        var currentDataVersionNode = currentDataVersionGraph.CreateUriNode(currentDataVersionGraph.BaseUri);
+        currentDataVersionGraph.Assert(new Triple(currentDataVersionNode, currentDataVersionGraph.CreateUriNode(new Uri(dctermsIdentifierUri)), currentDataVersionGraph.CreateLiteralNode(
+            currentDataVersionGraph.BaseUri.AbsoluteUri,
+            new Uri(XmlSpecsHelper.XmlSchemaDataTypeString)
+        )));
+
+        // PROV Info
+        var provTriple = new Triple(Tools.CopyNode(currentDataVersionNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(aUri)), dataFileGraph.CreateUriNode(new Uri(provEntityUri)));
+        if (!dataFileGraph.ContainsTriple(provTriple))
+        {
+            dataFileGraph.Assert(provTriple);
+            dataFileGraph.Assert(new Triple(
+                dataFileGraph.CreateUriNode(dataFileGraph.BaseUri),
+                dataFileGraph.CreateUriNode(new Uri("http://www.w3.org/ns/dcat#dataset")),
+                Tools.CopyNode(currentDataVersionNode, dataFileGraph)
+            ));
+            dataFileGraph.Assert(new Triple(Tools.CopyNode(currentDataVersionNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(provGeneratedAtTimeUri)), dataFileGraph.CreateLiteralNode(
+                DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture),
+                new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime)
+            )));
+            AddToTrellis(trellisGraph, nonRdfSourceUri, fileUri, currentDataVersionGraph.BaseUri.AbsoluteUri, triples);
+        }
+        if (recentDataVersion != null && recentDataVersion.AbsoluteUri != currentDataVersionGraph.BaseUri.AbsoluteUri)
+        {
+            var recentDataVersionNode = dataFileGraph.CreateUriNode(recentDataVersion);
+            dataFileGraph.Assert(new Triple(Tools.CopyNode(currentDataVersionNode, dataFileGraph), dataFileGraph.CreateUriNode(new Uri(provWasRevisionOfUri)), recentDataVersionNode));
+        }
+
+        graphs.Add(currentDataVersionGraph);
+    }
+
+    private void SetMetadataVersionGraph(List<IGraph> graphs, string newMetadataVersionFileGraphName, IGraph metadataFileGraph, IEnumerable<Uri> existingGraphs, IGraph trellisGraph, string fileUri, ICollection<Triple> triples)
+    {
+        var recentMetadataVersion = VersionUtil.GetRecentMetadataVersion(existingGraphs);
+
+        IGraph currentMetadataVersionGraph;
+        if (recentMetadataVersion == null)
+        {
+            currentMetadataVersionGraph = new Graph()
+            {
+                BaseUri = new Uri(newMetadataVersionFileGraphName),
+            };
+        }
+        else
+        {
+            currentMetadataVersionGraph = RdfStoreConnector.GetGraph(recentMetadataVersion);
+        }
+        var currentMetadataVersionNode = currentMetadataVersionGraph.CreateUriNode(currentMetadataVersionGraph.BaseUri);
+
+        // PROV Info
+        var provTriple = new Triple(Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph), metadataFileGraph.CreateUriNode(new Uri(aUri)), metadataFileGraph.CreateUriNode(new Uri(provEntityUri)));
+        if (!metadataFileGraph.ContainsTriple(provTriple))
+        {
+            metadataFileGraph.Assert(provTriple);
+            metadataFileGraph.Assert(new Triple(
+                metadataFileGraph.CreateUriNode(metadataFileGraph.BaseUri),
+                metadataFileGraph.CreateUriNode(new Uri("http://purl.org/fdp/fdp-o#hasMetadata")),
+                Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph)
+            ));
+            metadataFileGraph.Assert(new Triple(Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph), metadataFileGraph.CreateUriNode(new Uri(provGeneratedAtTimeUri)), metadataFileGraph.CreateLiteralNode(
+                DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture),
+                new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime)
+            )));
+            AddToTrellis(trellisGraph, rdfSourceUri, fileUri, currentMetadataVersionGraph.BaseUri.AbsoluteUri, triples);
+        }
+        if (recentMetadataVersion != null && recentMetadataVersion.AbsoluteUri != currentMetadataVersionGraph.BaseUri.AbsoluteUri)
+        {
+            var recentMetadataVersionNode = metadataFileGraph.CreateUriNode(recentMetadataVersion);
+            metadataFileGraph.Assert(new Triple(Tools.CopyNode(currentMetadataVersionNode, metadataFileGraph), metadataFileGraph.CreateUriNode(new Uri(provWasRevisionOfUri)), recentMetadataVersionNode));
+        }
+
+        graphs.Add(currentMetadataVersionGraph);
+    }
+
+    private static void AddToTrellis(IGraph trellisGraph, string ldpAssignment, string thePartUri, string graphUri, ICollection<Triple> triples)
+    {
+        var setGraphNode = trellisGraph.CreateUriNode(new Uri(graphUri));
+        var setThePartNode = trellisGraph.CreateUriNode(new Uri(thePartUri));
+        var triple = new Triple(
+            setGraphNode,
+            trellisGraph.CreateUriNode(new Uri(partOfUri)),
+            setThePartNode
+        );
+        if (!trellisGraph.ContainsTriple(triple))
+        {
+            triples.Add(triple);
+            trellisGraph.Assert(triple);
+            var assignmentTriple = new Triple(
+                setGraphNode,
+                trellisGraph.CreateUriNode(new Uri(aUri)),
+                trellisGraph.CreateUriNode(new Uri(ldpAssignment))
+            );
+            triples.Add(assignmentTriple);
+            trellisGraph.Assert(assignmentTriple);
+            AddModifiedDate(trellisGraph, graphUri, triples);
+        }
+    }
+
+    private IGraph CreateOrGetGraph(string graphUrl)
+    {
+        var entryAlreadyExists = RdfStoreConnector.HasGraph(graphUrl);
+        return entryAlreadyExists
+            ? RdfStoreConnector.GetGraph(graphUrl)
+            : new Graph()
+            {
+                BaseUri = new Uri(graphUrl)
+            };
+    }
+
+    public IEnumerable<Uri> ListGraphs(string id)
+    {
+        var cmdString = new SparqlParameterizedString
+        {
+            CommandText = @"SELECT DISTINCT ?g
+                WHERE { GRAPH ?g { ?s ?p ?o }
+                FILTER(contains(str(?g), @graph)) }"
+        };
+        cmdString.SetLiteral("graph", id);
+
+        var resultSet = RdfStoreConnector.QueryEndpoint.QueryWithResultSet(cmdString.ToString());
+
+        var graphs = new List<Uri>();
+        foreach (SparqlResult r in resultSet)
+        {
+            var uriNode = r.Value("g") as UriNode;
+            if (uriNode is not null)
+            {
+                graphs.Add(uriNode.Uri);
+            }
+        }
+        return graphs;
+    }
+
+    private static void AddModifiedDate(IGraph graph, string root, ICollection<Triple> triples)
+    {
+        var dcTermsModifiedNode = graph.CreateUriNode(new Uri(dctermsModifiedUri));
+        var rootNode = graph.CreateUriNode(new Uri(root));
+        if (!graph.GetTriplesWithSubjectPredicate(rootNode, dcTermsModifiedNode).Any())
+        {
+            var triple = new Triple(
+                rootNode,
+                dcTermsModifiedNode,
+                graph.CreateLiteralNode(
+                    DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture),
+                    new Uri(XmlSpecsHelper.XmlSchemaDataTypeDateTime)
+                )
+            );
+            triples.Add(triple);
+            graph.Assert(triple);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/MetadataExtractorCron/VersionUtil.cs b/src/MetadataExtractorCron/VersionUtil.cs
index 474eaf6405bf203b58936c46af757fa157e0abf2..6c0105f5c1099f6c9b5aa9d6f0d92e000402f2e8 100644
--- a/src/MetadataExtractorCron/VersionUtil.cs
+++ b/src/MetadataExtractorCron/VersionUtil.cs
@@ -1,47 +1,53 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Web;
 
-namespace MetadataMigrator
+namespace MetadataExtractorCron;
+
+public static class VersionUtil
 {
-    public class VersionUtil
+    public static Uri? GetRecentVersion(IEnumerable<Uri> graphUris, string? filter = null, bool notFilterExtracted = true)
     {
-        public static Uri? GetRecentVersion(IEnumerable<Uri> graphs, string filter = null)
+        var currentBest = graphUris.FirstOrDefault();
+        var currentBestVersion = 0L;
+        foreach (var graphUri in graphUris)
         {
-            var currentBest = graphs.FirstOrDefault();
-            var currentBestVersion = 0L;
-            foreach (var graph in graphs)
+            var queryDictionary = HttpUtility.ParseQueryString(new Uri(graphUri.ToString().Replace("@", "?")).Query);
+            var version = queryDictionary["version"];
+            if (version == null || !long.TryParse(version, out long longVersion))
+            {
+                continue;
+            }
+            if (longVersion > currentBestVersion
+                && (filter == null || queryDictionary["type"] == filter)
+                &&
+                    ((notFilterExtracted && queryDictionary["extracted"] == null)
+                    || (!notFilterExtracted && queryDictionary["extracted"] != null))
+            )
             {
-                var queryDictionary = System.Web.HttpUtility.ParseQueryString(
-                    new Uri(graph.ToString().Replace("@", "?")).Query);
-                var version = queryDictionary["version"];
-                if (version == null || !long.TryParse(version, out long longVersion))
-                {
-                    continue;
-                }
-                if (longVersion > currentBestVersion && queryDictionary["extracted"] == null && (filter == null || queryDictionary[filter] != null))
-                {
-                    currentBestVersion = longVersion;
-                    currentBest = graph;
-                }
+                currentBestVersion = longVersion;
+                currentBest = graphUri;
             }
-            return currentBest;
         }
+        return currentBest;
+    }
 
-        public static Uri GetRecentDataVersion(IEnumerable<Uri> graphs)
-        {
-            return GetRecentVersion(graphs, "data");
-        }
+    public static Uri? GetRecentDataExtractedVersion(IEnumerable<Uri> graphUris)
+    {
+        return GetRecentVersion(graphUris, "data", false);
+    }
 
-        public static Uri GetRecentMetadataVersion(IEnumerable<Uri> graphs)
-        {
-            return GetRecentVersion(graphs, "metadata");
-        }
+    public static Uri? GetRecentDataVersion(IEnumerable<Uri> graphUris)
+    {
+        return GetRecentVersion(graphUris, "data");
+    }
 
-        public static long GetNewVersion()
-        {
-            // UTC Timestamp
-            return long.Parse(Convert.ToString((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds));
-        }
+    public static Uri? GetRecentMetadataVersion(IEnumerable<Uri> graphUris)
+    {
+        return GetRecentVersion(graphUris, "metadata");
+    }
+
+    public static long GetNewVersion()
+    {
+        // UTC Timestamp
+        return long.Parse(Convert.ToString((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds));
     }
-}
+}
\ No newline at end of file
diff --git a/src/OpenApiGeneratedConnector/.gitignore b/src/OpenApiGeneratedConnector/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1ee53850b84cd478da00264a919c8180a746056e
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/.gitignore
@@ -0,0 +1,362 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
diff --git a/src/OpenApiGeneratedConnector/.openapi-generator-ignore b/src/OpenApiGeneratedConnector/.openapi-generator-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..7484ee590a3894506cf063799b885428f95a71be
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/src/OpenApiGeneratedConnector/OpenApiGeneratedConnector.csproj b/src/OpenApiGeneratedConnector/OpenApiGeneratedConnector.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..806f3e4bc667b8ca729f0e29001d47c5b35a06ae
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/OpenApiGeneratedConnector.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+
+  <ItemGroup>
+	<PackageReference Include="JsonSubTypes" Version="1.9.0" />
+	<PackageReference Include="Polly" Version="7.2.3" />
+	<PackageReference Include="RestSharp" Version="108.0.2" />
+	<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/OpenApiGeneratedConnector/README.md b/src/OpenApiGeneratedConnector/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3a2117b74fbce1589377bde12c16da849bd3824a
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/README.md
@@ -0,0 +1,116 @@
+# Org.OpenAPITools - the C# library for the Metadata Extractor API
+
+This API extracts RDF triples from files
+
+This C# SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: 0.1.1
+- SDK version: 1.0.0
+- Build package: org.openapitools.codegen.languages.CSharpNetCoreClientCodegen
+
+<a name="frameworks-supported"></a>
+## Frameworks supported
+- .NET Core >=1.0
+- .NET Framework >=4.6
+- Mono/Xamarin >=vNext
+
+<a name="dependencies"></a>
+## Dependencies
+
+- [RestSharp](https://www.nuget.org/packages/RestSharp) - 106.13.0 or later
+- [Json.NET](https://www.nuget.org/packages/Newtonsoft.Json/) - 13.0.1 or later
+- [JsonSubTypes](https://www.nuget.org/packages/JsonSubTypes/) - 1.8.0 or later
+- [System.ComponentModel.Annotations](https://www.nuget.org/packages/System.ComponentModel.Annotations) - 5.0.0 or later
+
+The DLLs included in the package may not be the latest version. We recommend using [NuGet](https://docs.nuget.org/consume/installing-nuget) to obtain the latest version of the packages:
+```
+Install-Package RestSharp
+Install-Package Newtonsoft.Json
+Install-Package JsonSubTypes
+Install-Package System.ComponentModel.Annotations
+```
+
+NOTE: RestSharp versions greater than 105.1.0 have a bug which causes file uploads to fail. See [RestSharp#742](https://github.com/restsharp/RestSharp/issues/742).
+NOTE: RestSharp for .Net Core creates a new socket for each api call, which can lead to a socket exhaustion problem. See [RestSharp#1406](https://github.com/restsharp/RestSharp/issues/1406).
+
+<a name="installation"></a>
+## Installation
+Generate the DLL using your preferred tool (e.g. `dotnet build`)
+
+Then include the DLL (under the `bin` folder) in the C# project, and use the namespaces:
+```csharp
+using Org.OpenAPITools.Api;
+using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Model;
+```
+<a name="usage"></a>
+## Usage
+
+To use the API client with a HTTP proxy, setup a `System.Net.WebProxy`
+```csharp
+Configuration c = new Configuration();
+System.Net.WebProxy webProxy = new System.Net.WebProxy("http://myProxyUrl:80/");
+webProxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
+c.Proxy = webProxy;
+```
+
+<a name="getting-started"></a>
+## Getting Started
+
+```csharp
+using System.Collections.Generic;
+using System.Diagnostics;
+using Org.OpenAPITools.Api;
+using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Model;
+
+namespace Example
+{
+    public class Example
+    {
+        public static void Main()
+        {
+
+            Configuration config = new Configuration();
+            config.BasePath = "http://localhost";
+            var apiInstance = new DefaultApi(config);
+
+            try
+            {
+                apiInstance.GetConfigWorker();
+            }
+            catch (ApiException e)
+            {
+                Debug.Print("Exception when calling DefaultApi.GetConfigWorker: " + e.Message );
+                Debug.Print("Status Code: "+ e.ErrorCode);
+                Debug.Print(e.StackTrace);
+            }
+
+        }
+    }
+}
+```
+
+<a name="documentation-for-api-endpoints"></a>
+## Documentation for API Endpoints
+
+All URIs are relative to *http://localhost*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*DefaultApi* | [**GetConfigWorker**](docs/DefaultApi.md#getconfigworker) | **GET** /defaultConfig | 
+*DefaultApi* | [**GetVersionWorker**](docs/DefaultApi.md#getversionworker) | **GET** /version | 
+*DefaultApi* | [**PostMetadataExtractorWorker**](docs/DefaultApi.md#postmetadataextractorworker) | **POST** / | 
+
+
+<a name="documentation-for-models"></a>
+## Documentation for Models
+
+ - [Model.MetadataOutput](docs/MetadataOutput.md)
+ - [Model.ModelVersion](docs/ModelVersion.md)
+
+
+<a name="documentation-for-authorization"></a>
+## Documentation for Authorization
+
+All endpoints do not require authorization.
diff --git a/src/OpenApiGeneratedConnector/appveyor.yml b/src/OpenApiGeneratedConnector/appveyor.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f76f63cee506c8807857554d21b8d2693b9464d4
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/appveyor.yml
@@ -0,0 +1,9 @@
+# auto-generated by OpenAPI Generator (https://github.com/OpenAPITools/openapi-generator)
+#
+image: Visual Studio 2019
+clone_depth: 1
+build_script:
+- dotnet build -c Release
+- dotnet test -c Release
+after_build:
+- dotnet pack .\src\Org.OpenAPITools\Org.OpenAPITools.csproj -o ../../output -c Release --no-build
diff --git a/src/OpenApiGeneratedConnector/docs/DefaultApi.md b/src/OpenApiGeneratedConnector/docs/DefaultApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..7c97e8ce8fa7e123ef08cdda2c37ede803aacbcc
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/docs/DefaultApi.md
@@ -0,0 +1,266 @@
+# Org.OpenAPITools.Api.DefaultApi
+
+All URIs are relative to *http://localhost*
+
+| Method | HTTP request | Description |
+|--------|--------------|-------------|
+| [**GetConfigWorker**](DefaultApi.md#getconfigworker) | **GET** /defaultConfig |  |
+| [**GetVersionWorker**](DefaultApi.md#getversionworker) | **GET** /version |  |
+| [**PostMetadataExtractorWorker**](DefaultApi.md#postmetadataextractorworker) | **POST** / |  |
+
+<a name="getconfigworker"></a>
+# **GetConfigWorker**
+> void GetConfigWorker ()
+
+
+
+### Example
+```csharp
+using System.Collections.Generic;
+using System.Diagnostics;
+using Org.OpenAPITools.Api;
+using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Model;
+
+namespace Example
+{
+    public class GetConfigWorkerExample
+    {
+        public static void Main()
+        {
+            Configuration config = new Configuration();
+            config.BasePath = "http://localhost";
+            var apiInstance = new DefaultApi(config);
+
+            try
+            {
+                apiInstance.GetConfigWorker();
+            }
+            catch (ApiException  e)
+            {
+                Debug.Print("Exception when calling DefaultApi.GetConfigWorker: " + e.Message);
+                Debug.Print("Status Code: " + e.ErrorCode);
+                Debug.Print(e.StackTrace);
+            }
+        }
+    }
+}
+```
+
+#### Using the GetConfigWorkerWithHttpInfo variant
+This returns an ApiResponse object which contains the response data, status code and headers.
+
+```csharp
+try
+{
+    apiInstance.GetConfigWorkerWithHttpInfo();
+}
+catch (ApiException e)
+{
+    Debug.Print("Exception when calling DefaultApi.GetConfigWorkerWithHttpInfo: " + e.Message);
+    Debug.Print("Status Code: " + e.ErrorCode);
+    Debug.Print(e.StackTrace);
+}
+```
+
+### Parameters
+This endpoint does not need any parameter.
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Success |  -  |
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+<a name="getversionworker"></a>
+# **GetVersionWorker**
+> ModelVersion GetVersionWorker ()
+
+
+
+### Example
+```csharp
+using System.Collections.Generic;
+using System.Diagnostics;
+using Org.OpenAPITools.Api;
+using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Model;
+
+namespace Example
+{
+    public class GetVersionWorkerExample
+    {
+        public static void Main()
+        {
+            Configuration config = new Configuration();
+            config.BasePath = "http://localhost";
+            var apiInstance = new DefaultApi(config);
+
+            try
+            {
+                ModelVersion result = apiInstance.GetVersionWorker();
+                Debug.WriteLine(result);
+            }
+            catch (ApiException  e)
+            {
+                Debug.Print("Exception when calling DefaultApi.GetVersionWorker: " + e.Message);
+                Debug.Print("Status Code: " + e.ErrorCode);
+                Debug.Print(e.StackTrace);
+            }
+        }
+    }
+}
+```
+
+#### Using the GetVersionWorkerWithHttpInfo variant
+This returns an ApiResponse object which contains the response data, status code and headers.
+
+```csharp
+try
+{
+    ApiResponse<ModelVersion> response = apiInstance.GetVersionWorkerWithHttpInfo();
+    Debug.Write("Status Code: " + response.StatusCode);
+    Debug.Write("Response Headers: " + response.Headers);
+    Debug.Write("Response Body: " + response.Data);
+}
+catch (ApiException e)
+{
+    Debug.Print("Exception when calling DefaultApi.GetVersionWorkerWithHttpInfo: " + e.Message);
+    Debug.Print("Status Code: " + e.ErrorCode);
+    Debug.Print(e.StackTrace);
+}
+```
+
+### Parameters
+This endpoint does not need any parameter.
+### Return type
+
+[**ModelVersion**](ModelVersion.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Success |  -  |
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+<a name="postmetadataextractorworker"></a>
+# **PostMetadataExtractorWorker**
+> List&lt;MetadataOutput&gt; PostMetadataExtractorWorker (System.IO.Stream file, string identifier = null, string config = null, string creationDate = null, string modificationDate = null)
+
+
+
+### Example
+```csharp
+using System.Collections.Generic;
+using System.Diagnostics;
+using Org.OpenAPITools.Api;
+using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Model;
+
+namespace Example
+{
+    public class PostMetadataExtractorWorkerExample
+    {
+        public static void Main()
+        {
+            Configuration config = new Configuration();
+            config.BasePath = "http://localhost";
+            var apiInstance = new DefaultApi(config);
+            var file = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt"));  // System.IO.Stream | 
+            var identifier = "identifier_example";  // string | File Identifier (optional) 
+            var config = "config_example";  // string | Object defining the utilized configuration (try \\\"/defaultConfig\\\" to get the structure) (optional) 
+            var creationDate = "creationDate_example";  // string | Creation Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional) 
+            var modificationDate = "modificationDate_example";  // string | Modification Date (Time) (e.g. \\\"2022-09-15T09:27:17.3550000+02:00\\\") (optional) 
+
+            try
+            {
+                List<MetadataOutput> result = apiInstance.PostMetadataExtractorWorker(file, identifier, config, creationDate, modificationDate);
+                Debug.WriteLine(result);
+            }
+            catch (ApiException  e)
+            {
+                Debug.Print("Exception when calling DefaultApi.PostMetadataExtractorWorker: " + e.Message);
+                Debug.Print("Status Code: " + e.ErrorCode);
+                Debug.Print(e.StackTrace);
+            }
+        }
+    }
+}
+```
+
+#### Using the PostMetadataExtractorWorkerWithHttpInfo variant
+This returns an ApiResponse object which contains the response data, status code and headers.
+
+```csharp
+try
+{
+    ApiResponse<List<MetadataOutput>> response = apiInstance.PostMetadataExtractorWorkerWithHttpInfo(file, identifier, config, creationDate, modificationDate);
+    Debug.Write("Status Code: " + response.StatusCode);
+    Debug.Write("Response Headers: " + response.Headers);
+    Debug.Write("Response Body: " + response.Data);
+}
+catch (ApiException e)
+{
+    Debug.Print("Exception when calling DefaultApi.PostMetadataExtractorWorkerWithHttpInfo: " + e.Message);
+    Debug.Print("Status Code: " + e.ErrorCode);
+    Debug.Print(e.StackTrace);
+}
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+|------|------|-------------|-------|
+| **file** | **System.IO.Stream****System.IO.Stream** |  |  |
+| **identifier** | **string** | File Identifier | [optional]  |
+| **config** | **string** | Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) | [optional]  |
+| **creationDate** | **string** | Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) | [optional]  |
+| **modificationDate** | **string** | Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) | [optional]  |
+
+### Return type
+
+[**List&lt;MetadataOutput&gt;**](MetadataOutput.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: multipart/form-data
+ - **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Bad Request |  -  |
+| **200** | Success |  -  |
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/src/OpenApiGeneratedConnector/docs/MetadataOutput.md b/src/OpenApiGeneratedConnector/docs/MetadataOutput.md
new file mode 100644
index 0000000000000000000000000000000000000000..0897e68f7438c411cc6d2e94886748ecc20be545
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/docs/MetadataOutput.md
@@ -0,0 +1,12 @@
+# Org.OpenAPITools.Model.MetadataOutput
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Identifier** | **string** |  | [optional] 
+**Metadata** | **string** |  | [optional] 
+**Text** | **string** |  | [optional] 
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/src/OpenApiGeneratedConnector/docs/ModelVersion.md b/src/OpenApiGeneratedConnector/docs/ModelVersion.md
new file mode 100644
index 0000000000000000000000000000000000000000..2b00f35278a07628356c36fd7c3201905fd48890
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/docs/ModelVersion.md
@@ -0,0 +1,10 @@
+# Org.OpenAPITools.Model.ModelVersion
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**_Version** | **string** |  | [optional] 
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
diff --git a/src/OpenApiGeneratedConnector/git_push.sh b/src/OpenApiGeneratedConnector/git_push.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f53a75d4fabe760cce49eddfd62fcc702938ea90
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/git_push.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+git_host=$4
+
+if [ "$git_host" = "" ]; then
+    git_host="github.com"
+    echo "[INFO] No command line input provided. Set \$git_host to $git_host"
+fi
+
+if [ "$git_user_id" = "" ]; then
+    git_user_id="GIT_USER_ID"
+    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+    git_repo_id="GIT_REPO_ID"
+    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+    release_note="Minor update"
+    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=$(git remote)
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+    if [ "$GIT_TOKEN" = "" ]; then
+        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+        git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
+    else
+        git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git
+    fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Api/DefaultApi.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Api/DefaultApi.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5d5541c8dfe218eedea91d5ce8c89f5d474b3a2a
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Api/DefaultApi.cs
@@ -0,0 +1,729 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Model;
+
+namespace Org.OpenAPITools.Api
+{
+    /// <summary>
+    /// Represents a collection of functions to interact with the API endpoints
+    /// </summary>
+    public interface IDefaultApiSync : IApiAccessor
+    {
+        #region Synchronous Operations
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns></returns>
+        void GetConfigWorker(int operationIndex = 0);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ApiResponse of Object(void)</returns>
+        ApiResponse<Object> GetConfigWorkerWithHttpInfo(int operationIndex = 0);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ModelVersion</returns>
+        ModelVersion GetVersionWorker(int operationIndex = 0);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ApiResponse of ModelVersion</returns>
+        ApiResponse<ModelVersion> GetVersionWorkerWithHttpInfo(int operationIndex = 0);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>List&lt;MetadataOutput&gt;</returns>
+        List<MetadataOutput> PostMetadataExtractorWorker(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0);
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ApiResponse of List&lt;MetadataOutput&gt;</returns>
+        ApiResponse<List<MetadataOutput>> PostMetadataExtractorWorkerWithHttpInfo(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0);
+
+        #endregion Synchronous Operations
+    }
+
+    /// <summary>
+    /// Represents a collection of functions to interact with the API endpoints
+    /// </summary>
+    public interface IDefaultApiAsync : IApiAccessor
+    {
+        #region Asynchronous Operations
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of void</returns>
+        System.Threading.Tasks.Task GetConfigWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ApiResponse</returns>
+        System.Threading.Tasks.Task<ApiResponse<Object>> GetConfigWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ModelVersion</returns>
+        System.Threading.Tasks.Task<ModelVersion> GetVersionWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ApiResponse (ModelVersion)</returns>
+        System.Threading.Tasks.Task<ApiResponse<ModelVersion>> GetVersionWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of List&lt;MetadataOutput&gt;</returns>
+        System.Threading.Tasks.Task<List<MetadataOutput>> PostMetadataExtractorWorkerAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <remarks>
+        ///
+        /// </remarks>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ApiResponse (List&lt;MetadataOutput&gt;)</returns>
+        System.Threading.Tasks.Task<ApiResponse<List<MetadataOutput>>> PostMetadataExtractorWorkerWithHttpInfoAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        #endregion Asynchronous Operations
+    }
+
+    /// <summary>
+    /// Represents a collection of functions to interact with the API endpoints
+    /// </summary>
+    public interface IDefaultApi : IDefaultApiSync, IDefaultApiAsync
+    {
+    }
+
+    /// <summary>
+    /// Represents a collection of functions to interact with the API endpoints
+    /// </summary>
+    public partial class DefaultApi : IDefaultApi
+    {
+        private Org.OpenAPITools.Client.ExceptionFactory _exceptionFactory = (name, response) => null;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DefaultApi"/> class.
+        /// </summary>
+        /// <returns></returns>
+        public DefaultApi() : this((string)null)
+        {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DefaultApi"/> class.
+        /// </summary>
+        /// <returns></returns>
+        public DefaultApi(string basePath)
+        {
+            this.Configuration = Org.OpenAPITools.Client.Configuration.MergeConfigurations(
+                Org.OpenAPITools.Client.GlobalConfiguration.Instance,
+                new Org.OpenAPITools.Client.Configuration { BasePath = basePath }
+            );
+            this.Client = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath);
+            this.AsynchronousClient = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath);
+            this.ExceptionFactory = Org.OpenAPITools.Client.Configuration.DefaultExceptionFactory;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DefaultApi"/> class
+        /// using Configuration object
+        /// </summary>
+        /// <param name="configuration">An instance of Configuration</param>
+        /// <returns></returns>
+        public DefaultApi(Org.OpenAPITools.Client.Configuration configuration)
+        {
+            if (configuration == null) throw new ArgumentNullException("configuration");
+
+            this.Configuration = Org.OpenAPITools.Client.Configuration.MergeConfigurations(
+                Org.OpenAPITools.Client.GlobalConfiguration.Instance,
+                configuration
+            );
+            this.Client = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath);
+            this.AsynchronousClient = new Org.OpenAPITools.Client.ApiClient(this.Configuration.BasePath);
+            ExceptionFactory = Org.OpenAPITools.Client.Configuration.DefaultExceptionFactory;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DefaultApi"/> class
+        /// using a Configuration object and client instance.
+        /// </summary>
+        /// <param name="client">The client interface for synchronous API access.</param>
+        /// <param name="asyncClient">The client interface for asynchronous API access.</param>
+        /// <param name="configuration">The configuration object.</param>
+        public DefaultApi(Org.OpenAPITools.Client.ISynchronousClient client, Org.OpenAPITools.Client.IAsynchronousClient asyncClient, Org.OpenAPITools.Client.IReadableConfiguration configuration)
+        {
+            if (client == null) throw new ArgumentNullException("client");
+            if (asyncClient == null) throw new ArgumentNullException("asyncClient");
+            if (configuration == null) throw new ArgumentNullException("configuration");
+
+            this.Client = client;
+            this.AsynchronousClient = asyncClient;
+            this.Configuration = configuration;
+            this.ExceptionFactory = Org.OpenAPITools.Client.Configuration.DefaultExceptionFactory;
+        }
+
+        /// <summary>
+        /// The client for accessing this underlying API asynchronously.
+        /// </summary>
+        public Org.OpenAPITools.Client.IAsynchronousClient AsynchronousClient { get; set; }
+
+        /// <summary>
+        /// The client for accessing this underlying API synchronously.
+        /// </summary>
+        public Org.OpenAPITools.Client.ISynchronousClient Client { get; set; }
+
+        /// <summary>
+        /// Gets the base path of the API client.
+        /// </summary>
+        /// <value>The base path</value>
+        public string GetBasePath()
+        {
+            return this.Configuration.BasePath;
+        }
+
+        /// <summary>
+        /// Gets or sets the configuration object
+        /// </summary>
+        /// <value>An instance of the Configuration</value>
+        public Org.OpenAPITools.Client.IReadableConfiguration Configuration { get; set; }
+
+        /// <summary>
+        /// Provides a factory method hook for the creation of exceptions.
+        /// </summary>
+        public Org.OpenAPITools.Client.ExceptionFactory ExceptionFactory
+        {
+            get
+            {
+                if (_exceptionFactory != null && _exceptionFactory.GetInvocationList().Length > 1)
+                {
+                    throw new InvalidOperationException("Multicast delegate for ExceptionFactory is unsupported.");
+                }
+                return _exceptionFactory;
+            }
+            set { _exceptionFactory = value; }
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns></returns>
+        public void GetConfigWorker(int operationIndex = 0)
+        {
+            GetConfigWorkerWithHttpInfo();
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ApiResponse of Object(void)</returns>
+        public Org.OpenAPITools.Client.ApiResponse<Object> GetConfigWorkerWithHttpInfo(int operationIndex = 0)
+        {
+            Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions();
+
+            string[] _contentTypes = new string[] {
+            };
+
+            // to determine the Accept header
+            string[] _accepts = new string[] {
+            };
+
+            var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes);
+            if (localVarContentType != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
+            }
+
+            var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts);
+            if (localVarAccept != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
+            }
+
+            localVarRequestOptions.Operation = "DefaultApi.GetConfigWorker";
+            localVarRequestOptions.OperationIndex = operationIndex;
+
+            // make the HTTP request
+            var localVarResponse = this.Client.Get<Object>("/defaultConfig", localVarRequestOptions, this.Configuration);
+            if (this.ExceptionFactory != null)
+            {
+                Exception _exception = this.ExceptionFactory("GetConfigWorker", localVarResponse);
+                if (_exception != null)
+                {
+                    throw _exception;
+                }
+            }
+
+            return localVarResponse;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of void</returns>
+        public async System.Threading.Tasks.Task GetConfigWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            await GetConfigWorkerWithHttpInfoAsync(operationIndex, cancellationToken).ConfigureAwait(false);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ApiResponse</returns>
+        public async System.Threading.Tasks.Task<Org.OpenAPITools.Client.ApiResponse<Object>> GetConfigWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions();
+
+            string[] _contentTypes = new string[] {
+            };
+
+            // to determine the Accept header
+            string[] _accepts = new string[] {
+            };
+
+            var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes);
+            if (localVarContentType != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
+            }
+
+            var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts);
+            if (localVarAccept != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
+            }
+
+            localVarRequestOptions.Operation = "DefaultApi.GetConfigWorker";
+            localVarRequestOptions.OperationIndex = operationIndex;
+
+            // make the HTTP request
+            var localVarResponse = await this.AsynchronousClient.GetAsync<Object>("/defaultConfig", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false);
+
+            if (this.ExceptionFactory != null)
+            {
+                Exception _exception = this.ExceptionFactory("GetConfigWorker", localVarResponse);
+                if (_exception != null)
+                {
+                    throw _exception;
+                }
+            }
+
+            return localVarResponse;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ModelVersion</returns>
+        public ModelVersion GetVersionWorker(int operationIndex = 0)
+        {
+            Org.OpenAPITools.Client.ApiResponse<ModelVersion> localVarResponse = GetVersionWorkerWithHttpInfo();
+            return localVarResponse.Data;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ApiResponse of ModelVersion</returns>
+        public Org.OpenAPITools.Client.ApiResponse<ModelVersion> GetVersionWorkerWithHttpInfo(int operationIndex = 0)
+        {
+            Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions();
+
+            string[] _contentTypes = new string[] {
+            };
+
+            // to determine the Accept header
+            string[] _accepts = new string[] {
+                "application/json"
+            };
+
+            var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes);
+            if (localVarContentType != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
+            }
+
+            var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts);
+            if (localVarAccept != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
+            }
+
+            localVarRequestOptions.Operation = "DefaultApi.GetVersionWorker";
+            localVarRequestOptions.OperationIndex = operationIndex;
+
+            // make the HTTP request
+            var localVarResponse = this.Client.Get<ModelVersion>("/version", localVarRequestOptions, this.Configuration);
+            if (this.ExceptionFactory != null)
+            {
+                Exception _exception = this.ExceptionFactory("GetVersionWorker", localVarResponse);
+                if (_exception != null)
+                {
+                    throw _exception;
+                }
+            }
+
+            return localVarResponse;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ModelVersion</returns>
+        public async System.Threading.Tasks.Task<ModelVersion> GetVersionWorkerAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            Org.OpenAPITools.Client.ApiResponse<ModelVersion> localVarResponse = await GetVersionWorkerWithHttpInfoAsync(operationIndex, cancellationToken).ConfigureAwait(false);
+            return localVarResponse.Data;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ApiResponse (ModelVersion)</returns>
+        public async System.Threading.Tasks.Task<Org.OpenAPITools.Client.ApiResponse<ModelVersion>> GetVersionWorkerWithHttpInfoAsync(int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions();
+
+            string[] _contentTypes = new string[] {
+            };
+
+            // to determine the Accept header
+            string[] _accepts = new string[] {
+                "application/json"
+            };
+
+            var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes);
+            if (localVarContentType != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
+            }
+
+            var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts);
+            if (localVarAccept != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
+            }
+
+            localVarRequestOptions.Operation = "DefaultApi.GetVersionWorker";
+            localVarRequestOptions.OperationIndex = operationIndex;
+
+            // make the HTTP request
+            var localVarResponse = await this.AsynchronousClient.GetAsync<ModelVersion>("/version", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false);
+
+            if (this.ExceptionFactory != null)
+            {
+                Exception _exception = this.ExceptionFactory("GetVersionWorker", localVarResponse);
+                if (_exception != null)
+                {
+                    throw _exception;
+                }
+            }
+
+            return localVarResponse;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>List&lt;MetadataOutput&gt;</returns>
+        public List<MetadataOutput> PostMetadataExtractorWorker(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0)
+        {
+            Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>> localVarResponse = PostMetadataExtractorWorkerWithHttpInfo(file, identifier, config, creationDate, modificationDate);
+            return localVarResponse.Data;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <returns>ApiResponse of List&lt;MetadataOutput&gt;</returns>
+        public Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>> PostMetadataExtractorWorkerWithHttpInfo(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0)
+        {
+            // verify the required parameter 'file' is set
+            if (file == null)
+            {
+                throw new Org.OpenAPITools.Client.ApiException(400, "Missing required parameter 'file' when calling DefaultApi->PostMetadataExtractorWorker");
+            }
+
+            Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions();
+
+            string[] _contentTypes = new string[] {
+                "multipart/form-data"
+            };
+
+            // to determine the Accept header
+            string[] _accepts = new string[] {
+                "application/json"
+            };
+
+            var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes);
+            if (localVarContentType != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
+            }
+
+            var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts);
+            if (localVarAccept != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
+            }
+
+            if (identifier != null)
+            {
+                localVarRequestOptions.FormParameters.Add("identifier", Org.OpenAPITools.Client.ClientUtils.ParameterToString(identifier)); // form parameter
+            }
+            if (config != null)
+            {
+                localVarRequestOptions.FormParameters.Add("config", Org.OpenAPITools.Client.ClientUtils.ParameterToString(config)); // form parameter
+            }
+            if (creationDate != null)
+            {
+                localVarRequestOptions.FormParameters.Add("creation_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(creationDate)); // form parameter
+            }
+            if (modificationDate != null)
+            {
+                localVarRequestOptions.FormParameters.Add("modification_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(modificationDate)); // form parameter
+            }
+            localVarRequestOptions.FileParameters.Add("file", file);
+
+            localVarRequestOptions.Operation = "DefaultApi.PostMetadataExtractorWorker";
+            localVarRequestOptions.OperationIndex = operationIndex;
+
+            // make the HTTP request
+            var localVarResponse = this.Client.Post<List<MetadataOutput>>("/", localVarRequestOptions, this.Configuration);
+            if (this.ExceptionFactory != null)
+            {
+                Exception _exception = this.ExceptionFactory("PostMetadataExtractorWorker", localVarResponse);
+                if (_exception != null)
+                {
+                    throw _exception;
+                }
+            }
+
+            return localVarResponse;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of List&lt;MetadataOutput&gt;</returns>
+        public async System.Threading.Tasks.Task<List<MetadataOutput>> PostMetadataExtractorWorkerAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>> localVarResponse = await PostMetadataExtractorWorkerWithHttpInfoAsync(file, identifier, config, creationDate, modificationDate, operationIndex, cancellationToken).ConfigureAwait(false);
+            return localVarResponse.Data;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <exception cref="Org.OpenAPITools.Client.ApiException">Thrown when fails to make API call</exception>
+        /// <param name="file"></param>
+        /// <param name="identifier">File Identifier (optional)</param>
+        /// <param name="config">Object defining the utilized configuration (try \\\&quot;/defaultConfig\\\&quot; to get the structure) (optional)</param>
+        /// <param name="creationDate">Creation Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="modificationDate">Modification Date (Time) (e.g. \\\&quot;2022-09-15T09:27:17.3550000+02:00\\\&quot;) (optional)</param>
+        /// <param name="operationIndex">Index associated with the operation.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <returns>Task of ApiResponse (List&lt;MetadataOutput&gt;)</returns>
+        public async System.Threading.Tasks.Task<Org.OpenAPITools.Client.ApiResponse<List<MetadataOutput>>> PostMetadataExtractorWorkerWithHttpInfoAsync(System.IO.Stream file, string identifier = default(string), string config = default(string), string creationDate = default(string), string modificationDate = default(string), int operationIndex = 0, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            // verify the required parameter 'file' is set
+            if (file == null)
+            {
+                throw new Org.OpenAPITools.Client.ApiException(400, "Missing required parameter 'file' when calling DefaultApi->PostMetadataExtractorWorker");
+            }
+
+            Org.OpenAPITools.Client.RequestOptions localVarRequestOptions = new Org.OpenAPITools.Client.RequestOptions();
+
+            string[] _contentTypes = new string[] {
+                "multipart/form-data"
+            };
+
+            // to determine the Accept header
+            string[] _accepts = new string[] {
+                "application/json"
+            };
+
+            var localVarContentType = Org.OpenAPITools.Client.ClientUtils.SelectHeaderContentType(_contentTypes);
+            if (localVarContentType != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
+            }
+
+            var localVarAccept = Org.OpenAPITools.Client.ClientUtils.SelectHeaderAccept(_accepts);
+            if (localVarAccept != null)
+            {
+                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
+            }
+
+            if (identifier != null)
+            {
+                localVarRequestOptions.FormParameters.Add("identifier", Org.OpenAPITools.Client.ClientUtils.ParameterToString(identifier)); // form parameter
+            }
+            if (config != null)
+            {
+                localVarRequestOptions.FormParameters.Add("config", Org.OpenAPITools.Client.ClientUtils.ParameterToString(config)); // form parameter
+            }
+            if (creationDate != null)
+            {
+                localVarRequestOptions.FormParameters.Add("creation_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(creationDate)); // form parameter
+            }
+            if (modificationDate != null)
+            {
+                localVarRequestOptions.FormParameters.Add("modification_date", Org.OpenAPITools.Client.ClientUtils.ParameterToString(modificationDate)); // form parameter
+            }
+            localVarRequestOptions.FileParameters.Add("file", file);
+
+            localVarRequestOptions.Operation = "DefaultApi.PostMetadataExtractorWorker";
+            localVarRequestOptions.OperationIndex = operationIndex;
+
+            // make the HTTP request
+            var localVarResponse = await this.AsynchronousClient.PostAsync<List<MetadataOutput>>("/", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false);
+
+            if (this.ExceptionFactory != null)
+            {
+                Exception _exception = this.ExceptionFactory("PostMetadataExtractorWorker", localVarResponse);
+                if (_exception != null)
+                {
+                    throw _exception;
+                }
+            }
+
+            return localVarResponse;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiClient.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiClient.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fb7a6d931650b965202e39e2e03b8ed9dda59e64
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiClient.cs
@@ -0,0 +1,821 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Net;
+using System.Text.RegularExpressions;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+using RestSharp;
+using RestSharp.Serializers;
+using RestSharpMethod = RestSharp.Method;
+using Polly;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Allows RestSharp to Serialize/Deserialize JSON using our custom logic, but only when ContentType is JSON.
+    /// </summary>
+    internal class CustomJsonCodec : IRestSerializer, ISerializer, IDeserializer
+    {
+        private readonly IReadableConfiguration _configuration;
+        private static readonly string _contentType = "application/json";
+        private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings
+        {
+            // OpenAPI generated types generally hide default constructors.
+            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
+            ContractResolver = new DefaultContractResolver
+            {
+                NamingStrategy = new CamelCaseNamingStrategy
+                {
+                    OverrideSpecifiedNames = false
+                }
+            }
+        };
+
+        public CustomJsonCodec(IReadableConfiguration configuration)
+        {
+            _configuration = configuration;
+        }
+
+        public CustomJsonCodec(JsonSerializerSettings serializerSettings, IReadableConfiguration configuration)
+        {
+            _serializerSettings = serializerSettings;
+            _configuration = configuration;
+        }
+
+        /// <summary>
+        /// Serialize the object into a JSON string.
+        /// </summary>
+        /// <param name="obj">Object to be serialized.</param>
+        /// <returns>A JSON string.</returns>
+        public string Serialize(object obj)
+        {
+            if (obj != null && obj is Org.OpenAPITools.Model.AbstractOpenAPISchema)
+            {
+                // the object to be serialized is an oneOf/anyOf schema
+                return ((Org.OpenAPITools.Model.AbstractOpenAPISchema)obj).ToJson();
+            }
+            else
+            {
+                return JsonConvert.SerializeObject(obj, _serializerSettings);
+            }
+        }
+
+        public string Serialize(Parameter bodyParameter) => Serialize(bodyParameter.Value);
+
+        public T Deserialize<T>(RestResponse response)
+        {
+            var result = (T)Deserialize(response, typeof(T));
+            return result;
+        }
+
+        /// <summary>
+        /// Deserialize the JSON string into a proper object.
+        /// </summary>
+        /// <param name="response">The HTTP response.</param>
+        /// <param name="type">Object type.</param>
+        /// <returns>Object representation of the JSON string.</returns>
+        internal object Deserialize(RestResponse response, Type type)
+        {
+            if (type == typeof(byte[])) // return byte array
+            {
+                return response.RawBytes;
+            }
+
+            // TODO: ? if (type.IsAssignableFrom(typeof(Stream)))
+            if (type == typeof(Stream))
+            {
+                var bytes = response.RawBytes;
+                if (response.Headers != null)
+                {
+                    var filePath = string.IsNullOrEmpty(_configuration.TempFolderPath)
+                        ? Path.GetTempPath()
+                        : _configuration.TempFolderPath;
+                    var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$");
+                    foreach (var header in response.Headers)
+                    {
+                        var match = regex.Match(header.ToString());
+                        if (match.Success)
+                        {
+                            string fileName = filePath + ClientUtils.SanitizeFilename(match.Groups[1].Value.Replace("\"", "").Replace("'", ""));
+                            File.WriteAllBytes(fileName, bytes);
+                            return new FileStream(fileName, FileMode.Open);
+                        }
+                    }
+                }
+                var stream = new MemoryStream(bytes);
+                return stream;
+            }
+
+            if (type.Name.StartsWith("System.Nullable`1[[System.DateTime")) // return a datetime object
+            {
+                return DateTime.Parse(response.Content, null, System.Globalization.DateTimeStyles.RoundtripKind);
+            }
+
+            if (type == typeof(string) || type.Name.StartsWith("System.Nullable")) // return primitive type
+            {
+                return Convert.ChangeType(response.Content, type);
+            }
+
+            // at this point, it must be a model (json)
+            try
+            {
+                return JsonConvert.DeserializeObject(response.Content, type, _serializerSettings);
+            }
+            catch (Exception e)
+            {
+                throw new ApiException(500, e.Message);
+            }
+        }
+
+        public ISerializer Serializer => this;
+        public IDeserializer Deserializer => this;
+
+        public string[] AcceptedContentTypes => RestSharp.Serializers.ContentType.JsonAccept;
+
+        public SupportsContentType SupportsContentType => contentType =>
+            contentType.EndsWith("json", StringComparison.InvariantCultureIgnoreCase) ||
+            contentType.EndsWith("javascript", StringComparison.InvariantCultureIgnoreCase);
+
+        public string ContentType
+        {
+            get { return _contentType; }
+            set { throw new InvalidOperationException("Not allowed to set content type."); }
+        }
+
+        public DataFormat DataFormat => DataFormat.Json;
+    }
+    /// <summary>
+    /// Provides a default implementation of an Api client (both synchronous and asynchronous implementations),
+    /// encapsulating general REST accessor use cases.
+    /// </summary>
+    public partial class ApiClient : ISynchronousClient, IAsynchronousClient
+    {
+        private readonly string _baseUrl;
+
+        /// <summary>
+        /// Specifies the settings on a <see cref="JsonSerializer" /> object.
+        /// These settings can be adjusted to accommodate custom serialization rules.
+        /// </summary>
+        public JsonSerializerSettings SerializerSettings { get; set; } = new JsonSerializerSettings
+        {
+            // OpenAPI generated types generally hide default constructors.
+            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
+            ContractResolver = new DefaultContractResolver
+            {
+                NamingStrategy = new CamelCaseNamingStrategy
+                {
+                    OverrideSpecifiedNames = false
+                }
+            }
+        };
+
+        /// <summary>
+        /// Allows for extending request processing for <see cref="ApiClient"/> generated code.
+        /// </summary>
+        /// <param name="request">The RestSharp request object</param>
+        partial void InterceptRequest(RestRequest request);
+
+        /// <summary>
+        /// Allows for extending response processing for <see cref="ApiClient"/> generated code.
+        /// </summary>
+        /// <param name="request">The RestSharp request object</param>
+        /// <param name="response">The RestSharp response object</param>
+        partial void InterceptResponse(RestRequest request, RestResponse response);
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiClient" />, defaulting to the global configurations' base url.
+        /// </summary>
+        public ApiClient()
+        {
+            _baseUrl = Org.OpenAPITools.Client.GlobalConfiguration.Instance.BasePath;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiClient" />
+        /// </summary>
+        /// <param name="basePath">The target service's base path in URL format.</param>
+        /// <exception cref="ArgumentException"></exception>
+        public ApiClient(string basePath)
+        {
+            if (string.IsNullOrEmpty(basePath))
+                throw new ArgumentException("basePath cannot be empty");
+
+            _baseUrl = basePath;
+        }
+
+        /// <summary>
+        /// Constructs the RestSharp version of an http method
+        /// </summary>
+        /// <param name="method">Swagger Client Custom HttpMethod</param>
+        /// <returns>RestSharp's HttpMethod instance.</returns>
+        /// <exception cref="ArgumentOutOfRangeException"></exception>
+        private RestSharpMethod Method(HttpMethod method)
+        {
+            RestSharpMethod other;
+            switch (method)
+            {
+                case HttpMethod.Get:
+                    other = RestSharpMethod.Get;
+                    break;
+                case HttpMethod.Post:
+                    other = RestSharpMethod.Post;
+                    break;
+                case HttpMethod.Put:
+                    other = RestSharpMethod.Put;
+                    break;
+                case HttpMethod.Delete:
+                    other = RestSharpMethod.Delete;
+                    break;
+                case HttpMethod.Head:
+                    other = RestSharpMethod.Head;
+                    break;
+                case HttpMethod.Options:
+                    other = RestSharpMethod.Options;
+                    break;
+                case HttpMethod.Patch:
+                    other = RestSharpMethod.Patch;
+                    break;
+                default:
+                    throw new ArgumentOutOfRangeException("method", method, null);
+            }
+
+            return other;
+        }
+
+        /// <summary>
+        /// Provides all logic for constructing a new RestSharp <see cref="RestRequest"/>.
+        /// At this point, all information for querying the service is known. Here, it is simply
+        /// mapped into the RestSharp request.
+        /// </summary>
+        /// <param name="method">The http verb.</param>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>[private] A new RestRequest instance.</returns>
+        /// <exception cref="ArgumentNullException"></exception>
+        private RestRequest NewRequest(
+            HttpMethod method,
+            string path,
+            RequestOptions options,
+            IReadableConfiguration configuration)
+        {
+            if (path == null) throw new ArgumentNullException("path");
+            if (options == null) throw new ArgumentNullException("options");
+            if (configuration == null) throw new ArgumentNullException("configuration");
+
+            RestRequest request = new RestRequest(path, Method(method));
+
+            if (options.PathParameters != null)
+            {
+                foreach (var pathParam in options.PathParameters)
+                {
+                    request.AddParameter(pathParam.Key, pathParam.Value, ParameterType.UrlSegment);
+                }
+            }
+
+            if (options.QueryParameters != null)
+            {
+                foreach (var queryParam in options.QueryParameters)
+                {
+                    foreach (var value in queryParam.Value)
+                    {
+                        request.AddQueryParameter(queryParam.Key, value);
+                    }
+                }
+            }
+
+            if (configuration.DefaultHeaders != null)
+            {
+                foreach (var headerParam in configuration.DefaultHeaders)
+                {
+                    request.AddHeader(headerParam.Key, headerParam.Value);
+                }
+            }
+
+            if (options.HeaderParameters != null)
+            {
+                foreach (var headerParam in options.HeaderParameters)
+                {
+                    foreach (var value in headerParam.Value)
+                    {
+                        request.AddHeader(headerParam.Key, value);
+                    }
+                }
+            }
+
+            if (options.FormParameters != null)
+            {
+                foreach (var formParam in options.FormParameters)
+                {
+                    request.AddParameter(formParam.Key, formParam.Value);
+                }
+            }
+
+            if (options.Data != null)
+            {
+                if (options.Data is Stream stream)
+                {
+                    var contentType = "application/octet-stream";
+                    if (options.HeaderParameters != null)
+                    {
+                        var contentTypes = options.HeaderParameters["Content-Type"];
+                        contentType = contentTypes[0];
+                    }
+
+                    var bytes = ClientUtils.ReadAsBytes(stream);
+                    request.AddParameter(contentType, bytes, ParameterType.RequestBody);
+                }
+                else
+                {
+                    if (options.HeaderParameters != null)
+                    {
+                        var contentTypes = options.HeaderParameters["Content-Type"];
+                        if (contentTypes == null || contentTypes.Any(header => header.Contains("application/json")))
+                        {
+                            request.RequestFormat = DataFormat.Json;
+                        }
+                        else
+                        {
+                            // TODO: Generated client user should add additional handlers. RestSharp only supports XML and JSON, with XML as default.
+                        }
+                    }
+                    else
+                    {
+                        // Here, we'll assume JSON APIs are more common. XML can be forced by adding produces/consumes to openapi spec explicitly.
+                        request.RequestFormat = DataFormat.Json;
+                    }
+
+                    request.AddJsonBody(options.Data);
+                }
+            }
+
+            if (options.FileParameters != null)
+            {
+                foreach (var fileParam in options.FileParameters)
+                {
+                    foreach (var file in fileParam.Value)
+                    {
+                        var bytes = ClientUtils.ReadAsBytes(file);
+                        var fileStream = file as FileStream;
+                        if (fileStream != null)
+                            request.AddFile(fileParam.Key, bytes, System.IO.Path.GetFileName(fileStream.Name));
+                        else
+                            request.AddFile(fileParam.Key, bytes, "no_file_name_provided");
+                    }
+                }
+            }
+
+            return request;
+        }
+
+        private ApiResponse<T> ToApiResponse<T>(RestResponse<T> response)
+        {
+            T result = response.Data;
+            string rawContent = response.Content;
+
+            var transformed = new ApiResponse<T>(response.StatusCode, new Multimap<string, string>(), result, rawContent)
+            {
+                ErrorText = response.ErrorMessage,
+                Cookies = new List<Cookie>()
+            };
+
+            if (response.Headers != null)
+            {
+                foreach (var responseHeader in response.Headers)
+                {
+                    transformed.Headers.Add(responseHeader.Name, ClientUtils.ParameterToString(responseHeader.Value));
+                }
+            }
+
+            if (response.ContentHeaders != null)
+            {
+                foreach (var responseHeader in response.ContentHeaders)
+                {
+                    transformed.Headers.Add(responseHeader.Name, ClientUtils.ParameterToString(responseHeader.Value));
+                }
+            }
+
+            if (response.Cookies != null)
+            {
+                foreach (var responseCookies in response.Cookies.Cast<Cookie>())
+                {
+                    transformed.Cookies.Add(
+                        new Cookie(
+                            responseCookies.Name,
+                            responseCookies.Value,
+                            responseCookies.Path,
+                            responseCookies.Domain)
+                        );
+                }
+            }
+
+            return transformed;
+        }
+
+        private ApiResponse<T> Exec<T>(RestRequest req, RequestOptions options, IReadableConfiguration configuration)
+        {
+            var baseUrl = configuration.GetOperationServerUrl(options.Operation, options.OperationIndex) ?? _baseUrl;
+
+            var cookies = new CookieContainer();
+
+            if (options.Cookies != null && options.Cookies.Count > 0)
+            {
+                foreach (var cookie in options.Cookies)
+                {
+                    cookies.Add(new Cookie(cookie.Name, cookie.Value));
+                }
+            }
+
+            var clientOptions = new RestClientOptions(baseUrl)
+            {
+                ClientCertificates = configuration.ClientCertificates,
+                CookieContainer = cookies,
+                MaxTimeout = configuration.Timeout,
+                Proxy = configuration.Proxy,
+                UserAgent = configuration.UserAgent
+            };
+
+            RestClient client = new RestClient(clientOptions)
+                .UseSerializer(() => new CustomJsonCodec(SerializerSettings, configuration));
+
+            InterceptRequest(req);
+
+            RestResponse<T> response;
+            if (RetryConfiguration.RetryPolicy != null)
+            {
+                var policy = RetryConfiguration.RetryPolicy;
+                var policyResult = policy.ExecuteAndCapture(() => client.Execute(req));
+                response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize<T>(policyResult.Result) : new RestResponse<T>
+                {
+                    Request = req,
+                    ErrorException = policyResult.FinalException
+                };
+            }
+            else
+            {
+                response = client.Execute<T>(req);
+            }
+
+            // if the response type is oneOf/anyOf, call FromJSON to deserialize the data
+            if (typeof(Org.OpenAPITools.Model.AbstractOpenAPISchema).IsAssignableFrom(typeof(T)))
+            {
+                try
+                {
+                    response.Data = (T) typeof(T).GetMethod("FromJson").Invoke(null, new object[] { response.Content });
+                }
+                catch (Exception ex)
+                {
+                    throw ex.InnerException != null ? ex.InnerException : ex;
+                }
+            }
+            else if (typeof(T).Name == "Stream") // for binary response
+            {
+                response.Data = (T)(object)new MemoryStream(response.RawBytes);
+            }
+            else if (typeof(T).Name == "Byte[]") // for byte response
+            {
+                response.Data = (T)(object)response.RawBytes;
+            }
+            else if (typeof(T).Name == "String") // for string response
+            {
+                response.Data = (T)(object)response.Content;
+            }
+
+            InterceptResponse(req, response);
+
+            var result = ToApiResponse(response);
+            if (response.ErrorMessage != null)
+            {
+                result.ErrorText = response.ErrorMessage;
+            }
+
+            if (response.Cookies != null && response.Cookies.Count > 0)
+            {
+                if (result.Cookies == null) result.Cookies = new List<Cookie>();
+                foreach (var restResponseCookie in response.Cookies.Cast<Cookie>())
+                {
+                    var cookie = new Cookie(
+                        restResponseCookie.Name,
+                        restResponseCookie.Value,
+                        restResponseCookie.Path,
+                        restResponseCookie.Domain
+                    )
+                    {
+                        Comment = restResponseCookie.Comment,
+                        CommentUri = restResponseCookie.CommentUri,
+                        Discard = restResponseCookie.Discard,
+                        Expired = restResponseCookie.Expired,
+                        Expires = restResponseCookie.Expires,
+                        HttpOnly = restResponseCookie.HttpOnly,
+                        Port = restResponseCookie.Port,
+                        Secure = restResponseCookie.Secure,
+                        Version = restResponseCookie.Version
+                    };
+
+                    result.Cookies.Add(cookie);
+                }
+            }
+            return result;
+        }
+
+        private async Task<ApiResponse<T>> ExecAsync<T>(RestRequest req, RequestOptions options, IReadableConfiguration configuration, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var baseUrl = configuration.GetOperationServerUrl(options.Operation, options.OperationIndex) ?? _baseUrl;
+
+            var clientOptions = new RestClientOptions(baseUrl)
+            {
+                ClientCertificates = configuration.ClientCertificates,
+                MaxTimeout = configuration.Timeout,
+                Proxy = configuration.Proxy,
+                UserAgent = configuration.UserAgent
+            };
+
+            RestClient client = new RestClient(clientOptions)
+                .UseSerializer(() => new CustomJsonCodec(SerializerSettings, configuration));
+
+            InterceptRequest(req);
+
+            RestResponse<T> response;
+            if (RetryConfiguration.AsyncRetryPolicy != null)
+            {
+                var policy = RetryConfiguration.AsyncRetryPolicy;
+                var policyResult = await policy.ExecuteAndCaptureAsync((ct) => client.ExecuteAsync(req, ct), cancellationToken).ConfigureAwait(false);
+                response = (policyResult.Outcome == OutcomeType.Successful) ? client.Deserialize<T>(policyResult.Result) : new RestResponse<T>
+                {
+                    Request = req,
+                    ErrorException = policyResult.FinalException
+                };
+            }
+            else
+            {
+                response = await client.ExecuteAsync<T>(req, cancellationToken).ConfigureAwait(false);
+            }
+
+            // if the response type is oneOf/anyOf, call FromJSON to deserialize the data
+            if (typeof(Org.OpenAPITools.Model.AbstractOpenAPISchema).IsAssignableFrom(typeof(T)))
+            {
+                response.Data = (T) typeof(T).GetMethod("FromJson").Invoke(null, new object[] { response.Content });
+            }
+            else if (typeof(T).Name == "Stream") // for binary response
+            {
+                response.Data = (T)(object)new MemoryStream(response.RawBytes);
+            }
+            else if (typeof(T).Name == "Byte[]") // for byte response
+            {
+                response.Data = (T)(object)response.RawBytes;
+            }
+
+            InterceptResponse(req, response);
+
+            var result = ToApiResponse(response);
+            if (response.ErrorMessage != null)
+            {
+                result.ErrorText = response.ErrorMessage;
+            }
+
+            if (response.Cookies != null && response.Cookies.Count > 0)
+            {
+                if (result.Cookies == null) result.Cookies = new List<Cookie>();
+                foreach (var restResponseCookie in response.Cookies.Cast<Cookie>())
+                {
+                    var cookie = new Cookie(
+                        restResponseCookie.Name,
+                        restResponseCookie.Value,
+                        restResponseCookie.Path,
+                        restResponseCookie.Domain
+                    )
+                    {
+                        Comment = restResponseCookie.Comment,
+                        CommentUri = restResponseCookie.CommentUri,
+                        Discard = restResponseCookie.Discard,
+                        Expired = restResponseCookie.Expired,
+                        Expires = restResponseCookie.Expires,
+                        HttpOnly = restResponseCookie.HttpOnly,
+                        Port = restResponseCookie.Port,
+                        Secure = restResponseCookie.Secure,
+                        Version = restResponseCookie.Version
+                    };
+
+                    result.Cookies.Add(cookie);
+                }
+            }
+            return result;
+        }
+
+        #region IAsynchronousClient
+        /// <summary>
+        /// Make a HTTP GET request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> GetAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Get, path, options, config), options, config, cancellationToken);
+        }
+
+        /// <summary>
+        /// Make a HTTP POST request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> PostAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Post, path, options, config), options, config, cancellationToken);
+        }
+
+        /// <summary>
+        /// Make a HTTP PUT request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> PutAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Put, path, options, config), options, config, cancellationToken);
+        }
+
+        /// <summary>
+        /// Make a HTTP DELETE request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> DeleteAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Delete, path, options, config), options, config, cancellationToken);
+        }
+
+        /// <summary>
+        /// Make a HTTP HEAD request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> HeadAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Head, path, options, config), options, config, cancellationToken);
+        }
+
+        /// <summary>
+        /// Make a HTTP OPTION request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> OptionsAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Options, path, options, config), options, config, cancellationToken);
+        }
+
+        /// <summary>
+        /// Make a HTTP PATCH request (async).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <param name="cancellationToken">Token that enables callers to cancel the request.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public Task<ApiResponse<T>> PatchAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return ExecAsync<T>(NewRequest(HttpMethod.Patch, path, options, config), options, config, cancellationToken);
+        }
+        #endregion IAsynchronousClient
+
+        #region ISynchronousClient
+        /// <summary>
+        /// Make a HTTP GET request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Get<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Get, path, options, config), options, config);
+        }
+
+        /// <summary>
+        /// Make a HTTP POST request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Post<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Post, path, options, config), options, config);
+        }
+
+        /// <summary>
+        /// Make a HTTP PUT request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Put<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Put, path, options, config), options, config);
+        }
+
+        /// <summary>
+        /// Make a HTTP DELETE request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Delete<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Delete, path, options, config), options, config);
+        }
+
+        /// <summary>
+        /// Make a HTTP HEAD request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Head<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Head, path, options, config), options, config);
+        }
+
+        /// <summary>
+        /// Make a HTTP OPTION request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Options<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Options, path, options, config), options, config);
+        }
+
+        /// <summary>
+        /// Make a HTTP PATCH request (synchronous).
+        /// </summary>
+        /// <param name="path">The target path (or resource).</param>
+        /// <param name="options">The additional request options.</param>
+        /// <param name="configuration">A per-request configuration object. It is assumed that any merge with
+        /// GlobalConfiguration has been done before calling this method.</param>
+        /// <returns>A Task containing ApiResponse</returns>
+        public ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableConfiguration configuration = null)
+        {
+            var config = configuration ?? GlobalConfiguration.Instance;
+            return Exec<T>(NewRequest(HttpMethod.Patch, path, options, config), options, config);
+        }
+        #endregion ISynchronousClient
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiException.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiException.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7044ec96e8efba560fa3726d12fe984f927b59d7
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiException.cs
@@ -0,0 +1,65 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// API Exception
+    /// </summary>
+    public class ApiException : Exception
+    {
+        /// <summary>
+        /// Gets or sets the error code (HTTP status code)
+        /// </summary>
+        /// <value>The error code (HTTP status code).</value>
+        public int ErrorCode { get; set; }
+
+        /// <summary>
+        /// Gets or sets the error content (body json object)
+        /// </summary>
+        /// <value>The error content (Http response body).</value>
+        public object ErrorContent { get; private set; }
+
+        /// <summary>
+        /// Gets or sets the HTTP headers
+        /// </summary>
+        /// <value>HTTP headers</value>
+        public Multimap<string, string> Headers { get; private set; }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiException"/> class.
+        /// </summary>
+        public ApiException() { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiException"/> class.
+        /// </summary>
+        /// <param name="errorCode">HTTP status code.</param>
+        /// <param name="message">Error message.</param>
+        public ApiException(int errorCode, string message) : base(message)
+        {
+            this.ErrorCode = errorCode;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiException"/> class.
+        /// </summary>
+        /// <param name="errorCode">HTTP status code.</param>
+        /// <param name="message">Error message.</param>
+        /// <param name="errorContent">Error content.</param>
+        /// <param name="headers">HTTP Headers.</param>
+        public ApiException(int errorCode, string message, object errorContent = null, Multimap<string, string> headers = null) : base(message)
+        {
+            this.ErrorCode = errorCode;
+            this.ErrorContent = errorContent;
+            this.Headers = headers;
+        }
+    }
+
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiResponse.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiResponse.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e94761bc7c2c4698dfa95cf5be37f958f088de49
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ApiResponse.cs
@@ -0,0 +1,164 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Net;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Provides a non-generic contract for the ApiResponse wrapper.
+    /// </summary>
+    public interface IApiResponse
+    {
+        /// <summary>
+        /// The data type of <see cref="Content"/>
+        /// </summary>
+        Type ResponseType { get; }
+
+        /// <summary>
+        /// The content of this response
+        /// </summary>
+        Object Content { get; }
+
+        /// <summary>
+        /// Gets or sets the status code (HTTP status code)
+        /// </summary>
+        /// <value>The status code.</value>
+        HttpStatusCode StatusCode { get; }
+
+        /// <summary>
+        /// Gets or sets the HTTP headers
+        /// </summary>
+        /// <value>HTTP headers</value>
+        Multimap<string, string> Headers { get; }
+
+        /// <summary>
+        /// Gets or sets any error text defined by the calling client.
+        /// </summary>
+        string ErrorText { get; set; }
+
+        /// <summary>
+        /// Gets or sets any cookies passed along on the response.
+        /// </summary>
+        List<Cookie> Cookies { get; set; }
+
+        /// <summary>
+        /// The raw content of this response
+        /// </summary>
+        string RawContent { get; }
+    }
+
+    /// <summary>
+    /// API Response
+    /// </summary>
+    public class ApiResponse<T> : IApiResponse
+    {
+        #region Properties
+
+        /// <summary>
+        /// Gets or sets the status code (HTTP status code)
+        /// </summary>
+        /// <value>The status code.</value>
+        public HttpStatusCode StatusCode { get; }
+
+        /// <summary>
+        /// Gets or sets the HTTP headers
+        /// </summary>
+        /// <value>HTTP headers</value>
+        public Multimap<string, string> Headers { get; }
+
+        /// <summary>
+        /// Gets or sets the data (parsed HTTP body)
+        /// </summary>
+        /// <value>The data.</value>
+        public T Data { get; }
+
+        /// <summary>
+        /// Gets or sets any error text defined by the calling client.
+        /// </summary>
+        public string ErrorText { get; set; }
+
+        /// <summary>
+        /// Gets or sets any cookies passed along on the response.
+        /// </summary>
+        public List<Cookie> Cookies { get; set; }
+
+        /// <summary>
+        /// The content of this response
+        /// </summary>
+        public Type ResponseType
+        {
+            get { return typeof(T); }
+        }
+
+        /// <summary>
+        /// The data type of <see cref="Content"/>
+        /// </summary>
+        public object Content
+        {
+            get { return Data; }
+        }
+
+        /// <summary>
+        /// The raw content
+        /// </summary>
+        public string RawContent { get; }
+
+        #endregion Properties
+
+        #region Constructors
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class.
+        /// </summary>
+        /// <param name="statusCode">HTTP status code.</param>
+        /// <param name="headers">HTTP headers.</param>
+        /// <param name="data">Data (parsed HTTP body)</param>
+        /// <param name="rawContent">Raw content.</param>
+        public ApiResponse(HttpStatusCode statusCode, Multimap<string, string> headers, T data, string rawContent)
+        {
+            StatusCode = statusCode;
+            Headers = headers;
+            Data = data;
+            RawContent = rawContent;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class.
+        /// </summary>
+        /// <param name="statusCode">HTTP status code.</param>
+        /// <param name="headers">HTTP headers.</param>
+        /// <param name="data">Data (parsed HTTP body)</param>
+        public ApiResponse(HttpStatusCode statusCode, Multimap<string, string> headers, T data) : this(statusCode, headers, data, null)
+        {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class.
+        /// </summary>
+        /// <param name="statusCode">HTTP status code.</param>
+        /// <param name="data">Data (parsed HTTP body)</param>
+        /// <param name="rawContent">Raw content.</param>
+        public ApiResponse(HttpStatusCode statusCode, T data, string rawContent) : this(statusCode, null, data, rawContent)
+        {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ApiResponse{T}" /> class.
+        /// </summary>
+        /// <param name="statusCode">HTTP status code.</param>
+        /// <param name="data">Data (parsed HTTP body)</param>
+        public ApiResponse(HttpStatusCode statusCode, T data) : this(statusCode, data, null)
+        {
+        }
+
+        #endregion Constructors
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ClientUtils.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ClientUtils.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f18d4d0f263180f05c6d46e84d02b61821d06728
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ClientUtils.cs
@@ -0,0 +1,201 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+using System.Collections;
+using System.Globalization;
+using System.Text.RegularExpressions;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Utility functions providing some benefit to API client consumers.
+    /// </summary>
+    public static class ClientUtils
+    {
+        /// <summary>
+        /// Sanitize filename by removing the path
+        /// </summary>
+        /// <param name="filename">Filename</param>
+        /// <returns>Filename</returns>
+        public static string SanitizeFilename(string filename)
+        {
+            Match match = Regex.Match(filename, @".*[/\\](.*)$");
+            return match.Success ? match.Groups[1].Value : filename;
+        }
+
+        /// <summary>
+        /// Convert params to key/value pairs.
+        /// Use collectionFormat to properly format lists and collections.
+        /// </summary>
+        /// <param name="collectionFormat">The swagger-supported collection format, one of: csv, tsv, ssv, pipes, multi</param>
+        /// <param name="name">Key name.</param>
+        /// <param name="value">Value object.</param>
+        /// <returns>A multimap of keys with 1..n associated values.</returns>
+        public static Multimap<string, string> ParameterToMultiMap(string collectionFormat, string name, object value)
+        {
+            var parameters = new Multimap<string, string>();
+
+            if (value is ICollection collection && collectionFormat == "multi")
+            {
+                foreach (var item in collection)
+                {
+                    parameters.Add(name, ParameterToString(item));
+                }
+            }
+            else if (value is IDictionary dictionary)
+            {
+                if (collectionFormat == "deepObject")
+                {
+                    foreach (DictionaryEntry entry in dictionary)
+                    {
+                        parameters.Add(name + "[" + entry.Key + "]", ParameterToString(entry.Value));
+                    }
+                }
+                else
+                {
+                    foreach (DictionaryEntry entry in dictionary)
+                    {
+                        parameters.Add(entry.Key.ToString(), ParameterToString(entry.Value));
+                    }
+                }
+            }
+            else
+            {
+                parameters.Add(name, ParameterToString(value));
+            }
+
+            return parameters;
+        }
+
+        /// <summary>
+        /// If parameter is DateTime, output in a formatted string (default ISO 8601), customizable with Configuration.DateTime.
+        /// If parameter is a list, join the list with ",".
+        /// Otherwise just return the string.
+        /// </summary>
+        /// <param name="obj">The parameter (header, path, query, form).</param>
+        /// <param name="configuration">An optional configuration instance, providing formatting options used in processing.</param>
+        /// <returns>Formatted string.</returns>
+        public static string ParameterToString(object obj, IReadableConfiguration configuration = null)
+        {
+            if (obj is DateTime dateTime)
+                // Return a formatted date string - Can be customized with Configuration.DateTimeFormat
+                // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o")
+                // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8
+                // For example: 2009-06-15T13:45:30.0000000
+                return dateTime.ToString((configuration ?? GlobalConfiguration.Instance).DateTimeFormat);
+            if (obj is DateTimeOffset dateTimeOffset)
+                // Return a formatted date string - Can be customized with Configuration.DateTimeFormat
+                // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o")
+                // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8
+                // For example: 2009-06-15T13:45:30.0000000
+                return dateTimeOffset.ToString((configuration ?? GlobalConfiguration.Instance).DateTimeFormat);
+            if (obj is bool boolean)
+                return boolean ? "true" : "false";
+            if (obj is ICollection collection)
+                return string.Join(",", collection.Cast<object>());
+
+            return Convert.ToString(obj, CultureInfo.InvariantCulture);
+        }
+
+        /// <summary>
+        /// Serializes the given object when not null. Otherwise return null.
+        /// </summary>
+        /// <param name="obj">The object to serialize.</param>
+        /// <returns>Serialized string.</returns>
+        public static string Serialize(object obj)
+        {
+            return obj != null ? Newtonsoft.Json.JsonConvert.SerializeObject(obj) : null;
+        }
+
+        /// <summary>
+        /// Encode string in base64 format.
+        /// </summary>
+        /// <param name="text">string to be encoded.</param>
+        /// <returns>Encoded string.</returns>
+        public static string Base64Encode(string text)
+        {
+            return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text));
+        }
+
+        /// <summary>
+        /// Convert stream to byte array
+        /// </summary>
+        /// <param name="inputStream">Input stream to be converted</param>
+        /// <returns>Byte array</returns>
+        public static byte[] ReadAsBytes(Stream inputStream)
+        {
+            using (var ms = new MemoryStream())
+            {
+                inputStream.CopyTo(ms);
+                return ms.ToArray();
+            }
+        }
+
+        /// <summary>
+        /// Select the Content-Type header's value from the given content-type array:
+        /// if JSON type exists in the given array, use it;
+        /// otherwise use the first one defined in 'consumes'
+        /// </summary>
+        /// <param name="contentTypes">The Content-Type array to select from.</param>
+        /// <returns>The Content-Type header to use.</returns>
+        public static string SelectHeaderContentType(string[] contentTypes)
+        {
+            if (contentTypes.Length == 0)
+                return null;
+
+            foreach (var contentType in contentTypes)
+            {
+                if (IsJsonMime(contentType))
+                    return contentType;
+            }
+
+            return contentTypes[0]; // use the first content type specified in 'consumes'
+        }
+
+        /// <summary>
+        /// Select the Accept header's value from the given accepts array:
+        /// if JSON exists in the given array, use it;
+        /// otherwise use all of them (joining into a string)
+        /// </summary>
+        /// <param name="accepts">The accepts array to select from.</param>
+        /// <returns>The Accept header to use.</returns>
+        public static string SelectHeaderAccept(string[] accepts)
+        {
+            if (accepts.Length == 0)
+                return null;
+
+            if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase))
+                return "application/json";
+
+            return string.Join(",", accepts);
+        }
+
+        /// <summary>
+        /// Provides a case-insensitive check that a provided content type is a known JSON-like content type.
+        /// </summary>
+        public static readonly Regex JsonRegex = new Regex("(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$");
+
+        /// <summary>
+        /// Check if the given MIME is a JSON MIME.
+        /// JSON MIME examples:
+        ///    application/json
+        ///    application/json; charset=UTF8
+        ///    APPLICATION/JSON
+        ///    application/vnd.company+json
+        /// </summary>
+        /// <param name="mime">MIME</param>
+        /// <returns>Returns True if MIME type is json.</returns>
+        public static bool IsJsonMime(string mime)
+        {
+            if (string.IsNullOrWhiteSpace(mime)) return false;
+
+            return JsonRegex.IsMatch(mime) || mime.Equals("application/json-patch+json");
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Configuration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Configuration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5a8b348500da24ef95772f88c030019117e864c7
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Configuration.cs
@@ -0,0 +1,580 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Collections.Concurrent;
+using System.Net;
+using System.Security.Cryptography.X509Certificates;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Represents a set of configuration settings
+    /// </summary>
+    public class Configuration : IReadableConfiguration
+    {
+        #region Constants
+
+        /// <summary>
+        /// Version of the package.
+        /// </summary>
+        /// <value>Version of the package.</value>
+        public const string Version = "1.0.0";
+
+        /// <summary>
+        /// Identifier for ISO 8601 DateTime Format
+        /// </summary>
+        /// <remarks>See https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 for more information.</remarks>
+        // ReSharper disable once InconsistentNaming
+        public const string ISO8601_DATETIME_FORMAT = "o";
+
+        #endregion Constants
+
+        #region Static Members
+
+        /// <summary>
+        /// Default creation of exceptions for a given method name and response object
+        /// </summary>
+        public static readonly ExceptionFactory DefaultExceptionFactory = (methodName, response) =>
+        {
+            var status = (int)response.StatusCode;
+            if (status >= 400)
+            {
+                return new ApiException(status,
+                    string.Format("Error calling {0}: {1}", methodName, response.RawContent),
+                    response.RawContent, response.Headers);
+            }
+            return null;
+        };
+
+        #endregion Static Members
+
+        #region Private Members
+
+        /// <summary>
+        /// Defines the base path of the target API server.
+        /// Example: http://localhost:3000/v1/
+        /// </summary>
+        private string _basePath;
+
+        /// <summary>
+        /// Gets or sets the API key based on the authentication name.
+        /// This is the key and value comprising the "secret" for accessing an API.
+        /// </summary>
+        /// <value>The API key.</value>
+        private IDictionary<string, string> _apiKey;
+
+        /// <summary>
+        /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name.
+        /// </summary>
+        /// <value>The prefix of the API key.</value>
+        private IDictionary<string, string> _apiKeyPrefix;
+
+        private string _dateTimeFormat = ISO8601_DATETIME_FORMAT;
+        private string _tempFolderPath = Path.GetTempPath();
+
+        /// <summary>
+        /// Gets or sets the servers defined in the OpenAPI spec.
+        /// </summary>
+        /// <value>The servers</value>
+        private IList<IReadOnlyDictionary<string, object>> _servers;
+
+        /// <summary>
+        /// Gets or sets the operation servers defined in the OpenAPI spec.
+        /// </summary>
+        /// <value>The operation servers</value>
+        private IReadOnlyDictionary<string, List<IReadOnlyDictionary<string, object>>> _operationServers;
+
+        #endregion Private Members
+
+        #region Constructors
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Configuration" /> class
+        /// </summary>
+        [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")]
+        public Configuration()
+        {
+            Proxy = null;
+            UserAgent = WebUtility.UrlEncode("OpenAPI-Generator/1.0.0/csharp");
+            BasePath = "http://localhost";
+            DefaultHeaders = new ConcurrentDictionary<string, string>();
+            ApiKey = new ConcurrentDictionary<string, string>();
+            ApiKeyPrefix = new ConcurrentDictionary<string, string>();
+            Servers = new List<IReadOnlyDictionary<string, object>>()
+            {
+                {
+                    new Dictionary<string, object> {
+                        {"url", ""},
+                        {"description", "No description provided"},
+                    }
+                }
+            };
+            OperationServers = new Dictionary<string, List<IReadOnlyDictionary<string, object>>>()
+            {
+            };
+
+            // Setting Timeout has side effects (forces ApiClient creation).
+            Timeout = 100000;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Configuration" /> class
+        /// </summary>
+        [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")]
+        public Configuration(
+            IDictionary<string, string> defaultHeaders,
+            IDictionary<string, string> apiKey,
+            IDictionary<string, string> apiKeyPrefix,
+            string basePath = "http://localhost") : this()
+        {
+            if (string.IsNullOrWhiteSpace(basePath))
+                throw new ArgumentException("The provided basePath is invalid.", "basePath");
+            if (defaultHeaders == null)
+                throw new ArgumentNullException("defaultHeaders");
+            if (apiKey == null)
+                throw new ArgumentNullException("apiKey");
+            if (apiKeyPrefix == null)
+                throw new ArgumentNullException("apiKeyPrefix");
+
+            BasePath = basePath;
+
+            foreach (var keyValuePair in defaultHeaders)
+            {
+                DefaultHeaders.Add(keyValuePair);
+            }
+
+            foreach (var keyValuePair in apiKey)
+            {
+                ApiKey.Add(keyValuePair);
+            }
+
+            foreach (var keyValuePair in apiKeyPrefix)
+            {
+                ApiKeyPrefix.Add(keyValuePair);
+            }
+        }
+
+        #endregion Constructors
+
+        #region Properties
+
+        /// <summary>
+        /// Gets or sets the base path for API access.
+        /// </summary>
+        public virtual string BasePath {
+            get { return _basePath; }
+            set { _basePath = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the default header.
+        /// </summary>
+        [Obsolete("Use DefaultHeaders instead.")]
+        public virtual IDictionary<string, string> DefaultHeader
+        {
+            get
+            {
+                return DefaultHeaders;
+            }
+            set
+            {
+                DefaultHeaders = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the default headers.
+        /// </summary>
+        public virtual IDictionary<string, string> DefaultHeaders { get; set; }
+
+        /// <summary>
+        /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds.
+        /// </summary>
+        public virtual int Timeout { get; set; }
+
+        /// <summary>
+        /// Gets or sets the proxy
+        /// </summary>
+        /// <value>Proxy.</value>
+        public virtual WebProxy Proxy { get; set; }
+
+        /// <summary>
+        /// Gets or sets the HTTP user agent.
+        /// </summary>
+        /// <value>Http user agent.</value>
+        public virtual string UserAgent { get; set; }
+
+        /// <summary>
+        /// Gets or sets the username (HTTP basic authentication).
+        /// </summary>
+        /// <value>The username.</value>
+        public virtual string Username { get; set; }
+
+        /// <summary>
+        /// Gets or sets the password (HTTP basic authentication).
+        /// </summary>
+        /// <value>The password.</value>
+        public virtual string Password { get; set; }
+
+        /// <summary>
+        /// Gets the API key with prefix.
+        /// </summary>
+        /// <param name="apiKeyIdentifier">API key identifier (authentication scheme).</param>
+        /// <returns>API key with prefix.</returns>
+        public string GetApiKeyWithPrefix(string apiKeyIdentifier)
+        {
+            string apiKeyValue;
+            ApiKey.TryGetValue(apiKeyIdentifier, out apiKeyValue);
+            string apiKeyPrefix;
+            if (ApiKeyPrefix.TryGetValue(apiKeyIdentifier, out apiKeyPrefix))
+            {
+                return apiKeyPrefix + " " + apiKeyValue;
+            }
+
+            return apiKeyValue;
+        }
+
+        /// <summary>
+        /// Gets or sets certificate collection to be sent with requests.
+        /// </summary>
+        /// <value>X509 Certificate collection.</value>
+        public X509CertificateCollection ClientCertificates { get; set; }
+
+        /// <summary>
+        /// Gets or sets the access token for OAuth2 authentication.
+        ///
+        /// This helper property simplifies code generation.
+        /// </summary>
+        /// <value>The access token.</value>
+        public virtual string AccessToken { get; set; }
+
+        /// <summary>
+        /// Gets or sets the temporary folder path to store the files downloaded from the server.
+        /// </summary>
+        /// <value>Folder path.</value>
+        public virtual string TempFolderPath
+        {
+            get { return _tempFolderPath; }
+
+            set
+            {
+                if (string.IsNullOrEmpty(value))
+                {
+                    _tempFolderPath = Path.GetTempPath();
+                    return;
+                }
+
+                // create the directory if it does not exist
+                if (!Directory.Exists(value))
+                {
+                    Directory.CreateDirectory(value);
+                }
+
+                // check if the path contains directory separator at the end
+                if (value[value.Length - 1] == Path.DirectorySeparatorChar)
+                {
+                    _tempFolderPath = value;
+                }
+                else
+                {
+                    _tempFolderPath = value + Path.DirectorySeparatorChar;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the date time format used when serializing in the ApiClient
+        /// By default, it's set to ISO 8601 - "o", for others see:
+        /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx
+        /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
+        /// No validation is done to ensure that the string you're providing is valid
+        /// </summary>
+        /// <value>The DateTimeFormat string</value>
+        public virtual string DateTimeFormat
+        {
+            get { return _dateTimeFormat; }
+            set
+            {
+                if (string.IsNullOrEmpty(value))
+                {
+                    // Never allow a blank or null string, go back to the default
+                    _dateTimeFormat = ISO8601_DATETIME_FORMAT;
+                    return;
+                }
+
+                // Caution, no validation when you choose date time format other than ISO 8601
+                // Take a look at the above links
+                _dateTimeFormat = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name.
+        ///
+        /// Whatever you set here will be prepended to the value defined in AddApiKey.
+        ///
+        /// An example invocation here might be:
+        /// <example>
+        /// ApiKeyPrefix["Authorization"] = "Bearer";
+        /// </example>
+        /// … where ApiKey["Authorization"] would then be used to set the value of your bearer token.
+        ///
+        /// <remarks>
+        /// OAuth2 workflows should set tokens via AccessToken.
+        /// </remarks>
+        /// </summary>
+        /// <value>The prefix of the API key.</value>
+        public virtual IDictionary<string, string> ApiKeyPrefix
+        {
+            get { return _apiKeyPrefix; }
+            set
+            {
+                if (value == null)
+                {
+                    throw new InvalidOperationException("ApiKeyPrefix collection may not be null.");
+                }
+                _apiKeyPrefix = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the API key based on the authentication name.
+        /// </summary>
+        /// <value>The API key.</value>
+        public virtual IDictionary<string, string> ApiKey
+        {
+            get { return _apiKey; }
+            set
+            {
+                if (value == null)
+                {
+                    throw new InvalidOperationException("ApiKey collection may not be null.");
+                }
+                _apiKey = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the servers.
+        /// </summary>
+        /// <value>The servers.</value>
+        public virtual IList<IReadOnlyDictionary<string, object>> Servers
+        {
+            get { return _servers; }
+            set
+            {
+                if (value == null)
+                {
+                    throw new InvalidOperationException("Servers may not be null.");
+                }
+                _servers = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the operation servers.
+        /// </summary>
+        /// <value>The operation servers.</value>
+        public virtual IReadOnlyDictionary<string, List<IReadOnlyDictionary<string, object>>> OperationServers
+        {
+            get { return _operationServers; }
+            set
+            {
+                if (value == null)
+                {
+                    throw new InvalidOperationException("Operation servers may not be null.");
+                }
+                _operationServers = value;
+            }
+        }
+
+        /// <summary>
+        /// Returns URL based on server settings without providing values
+        /// for the variables
+        /// </summary>
+        /// <param name="index">Array index of the server settings.</param>
+        /// <return>The server URL.</return>
+        public string GetServerUrl(int index)
+        {
+            return GetServerUrl(Servers, index, null);
+        }
+
+        /// <summary>
+        /// Returns URL based on server settings.
+        /// </summary>
+        /// <param name="index">Array index of the server settings.</param>
+        /// <param name="inputVariables">Dictionary of the variables and the corresponding values.</param>
+        /// <return>The server URL.</return>
+        public string GetServerUrl(int index, Dictionary<string, string> inputVariables)
+        {
+            return GetServerUrl(Servers, index, inputVariables);
+        }
+
+        /// <summary>
+        /// Returns URL based on operation server settings.
+        /// </summary>
+        /// <param name="operation">Operation associated with the request path.</param>
+        /// <param name="index">Array index of the server settings.</param>
+        /// <return>The operation server URL.</return>
+        public string GetOperationServerUrl(string operation, int index)
+        {
+            return GetOperationServerUrl(operation, index, null);
+        }
+
+        /// <summary>
+        /// Returns URL based on operation server settings.
+        /// </summary>
+        /// <param name="operation">Operation associated with the request path.</param>
+        /// <param name="index">Array index of the server settings.</param>
+        /// <param name="inputVariables">Dictionary of the variables and the corresponding values.</param>
+        /// <return>The operation server URL.</return>
+        public string GetOperationServerUrl(string operation, int index, Dictionary<string, string> inputVariables)
+        {
+            if (OperationServers.TryGetValue(operation, out var operationServer))
+            {
+                return GetServerUrl(operationServer, index, inputVariables);
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// Returns URL based on server settings.
+        /// </summary>
+        /// <param name="servers">Dictionary of server settings.</param>
+        /// <param name="index">Array index of the server settings.</param>
+        /// <param name="inputVariables">Dictionary of the variables and the corresponding values.</param>
+        /// <return>The server URL.</return>
+        private string GetServerUrl(IList<IReadOnlyDictionary<string, object>> servers, int index, Dictionary<string, string> inputVariables)
+        {
+            if (index < 0 || index >= servers.Count)
+            {
+                throw new InvalidOperationException($"Invalid index {index} when selecting the server. Must be less than {servers.Count}.");
+            }
+
+            if (inputVariables == null)
+            {
+                inputVariables = new Dictionary<string, string>();
+            }
+
+            IReadOnlyDictionary<string, object> server = servers[index];
+            string url = (string)server["url"];
+
+            if (server.ContainsKey("variables"))
+            {
+                // go through each variable and assign a value
+                foreach (KeyValuePair<string, object> variable in (IReadOnlyDictionary<string, object>)server["variables"])
+                {
+
+                    IReadOnlyDictionary<string, object> serverVariables = (IReadOnlyDictionary<string, object>)(variable.Value);
+
+                    if (inputVariables.ContainsKey(variable.Key))
+                    {
+                        if (((List<string>)serverVariables["enum_values"]).Contains(inputVariables[variable.Key]))
+                        {
+                            url = url.Replace("{" + variable.Key + "}", inputVariables[variable.Key]);
+                        }
+                        else
+                        {
+                            throw new InvalidOperationException($"The variable `{variable.Key}` in the server URL has invalid value #{inputVariables[variable.Key]}. Must be {(List<string>)serverVariables["enum_values"]}");
+                        }
+                    }
+                    else
+                    {
+                        // use default value
+                        url = url.Replace("{" + variable.Key + "}", (string)serverVariables["default_value"]);
+                    }
+                }
+            }
+
+            return url;
+        }
+
+        #endregion Properties
+
+        #region Methods
+
+        /// <summary>
+        /// Returns a string with essential information for debugging.
+        /// </summary>
+        public static string ToDebugReport()
+        {
+            string report = "C# SDK (Org.OpenAPITools) Debug Report:\n";
+            report += "    OS: " + System.Environment.OSVersion + "\n";
+            report += "    .NET Framework Version: " + System.Environment.Version  + "\n";
+            report += "    Version of the API: 0.1.1\n";
+            report += "    SDK Package Version: 1.0.0\n";
+
+            return report;
+        }
+
+        /// <summary>
+        /// Add Api Key Header.
+        /// </summary>
+        /// <param name="key">Api Key name.</param>
+        /// <param name="value">Api Key value.</param>
+        /// <returns></returns>
+        public void AddApiKey(string key, string value)
+        {
+            ApiKey[key] = value;
+        }
+
+        /// <summary>
+        /// Sets the API key prefix.
+        /// </summary>
+        /// <param name="key">Api Key name.</param>
+        /// <param name="value">Api Key value.</param>
+        public void AddApiKeyPrefix(string key, string value)
+        {
+            ApiKeyPrefix[key] = value;
+        }
+
+        #endregion Methods
+
+        #region Static Members
+        /// <summary>
+        /// Merge configurations.
+        /// </summary>
+        /// <param name="first">First configuration.</param>
+        /// <param name="second">Second configuration.</param>
+        /// <return>Merged configuration.</return>
+        public static IReadableConfiguration MergeConfigurations(IReadableConfiguration first, IReadableConfiguration second)
+        {
+            if (second == null) return first ?? GlobalConfiguration.Instance;
+
+            Dictionary<string, string> apiKey = first.ApiKey.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
+            Dictionary<string, string> apiKeyPrefix = first.ApiKeyPrefix.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
+            Dictionary<string, string> defaultHeaders = first.DefaultHeaders.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
+
+            foreach (var kvp in second.ApiKey) apiKey[kvp.Key] = kvp.Value;
+            foreach (var kvp in second.ApiKeyPrefix) apiKeyPrefix[kvp.Key] = kvp.Value;
+            foreach (var kvp in second.DefaultHeaders) defaultHeaders[kvp.Key] = kvp.Value;
+
+            var config = new Configuration
+            {
+                ApiKey = apiKey,
+                ApiKeyPrefix = apiKeyPrefix,
+                DefaultHeaders = defaultHeaders,
+                BasePath = second.BasePath ?? first.BasePath,
+                Timeout = second.Timeout,
+                Proxy = second.Proxy ?? first.Proxy,
+                UserAgent = second.UserAgent ?? first.UserAgent,
+                Username = second.Username ?? first.Username,
+                Password = second.Password ?? first.Password,
+                AccessToken = second.AccessToken ?? first.AccessToken,
+                TempFolderPath = second.TempFolderPath ?? first.TempFolderPath,
+                DateTimeFormat = second.DateTimeFormat ?? first.DateTimeFormat,
+                ClientCertificates = second.ClientCertificates ?? first.ClientCertificates,
+            };
+            return config;
+        }
+        #endregion Static Members
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ExceptionFactory.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ExceptionFactory.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0d5fda82167a736d9261c94647262e1725710af4
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ExceptionFactory.cs
@@ -0,0 +1,19 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// A delegate to ExceptionFactory method
+    /// </summary>
+    /// <param name="methodName">Method name</param>
+    /// <param name="response">Response</param>
+    /// <returns>Exceptions</returns>
+    public delegate Exception ExceptionFactory(string methodName, IApiResponse response);
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/GlobalConfiguration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/GlobalConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..605aee5e073445cb2e1f7eadeafc54d2322c7cf5
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/GlobalConfiguration.cs
@@ -0,0 +1,64 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// <see cref="GlobalConfiguration"/> provides a compile-time extension point for globally configuring
+    /// API Clients.
+    /// </summary>
+    /// <remarks>
+    /// A customized implementation via partial class may reside in another file and may
+    /// be excluded from automatic generation via a .openapi-generator-ignore file.
+    /// </remarks>
+    public partial class GlobalConfiguration : Configuration
+    {
+        #region Private Members
+
+        private static readonly object GlobalConfigSync = new { };
+        private static IReadableConfiguration _globalConfiguration;
+
+        #endregion Private Members
+
+        #region Constructors
+
+        /// <inheritdoc />
+        private GlobalConfiguration()
+        {
+        }
+
+        /// <inheritdoc />
+        public GlobalConfiguration(IDictionary<string, string> defaultHeader, IDictionary<string, string> apiKey, IDictionary<string, string> apiKeyPrefix, string basePath = "http://localhost:3000/api") : base(defaultHeader, apiKey, apiKeyPrefix, basePath)
+        {
+        }
+
+        static GlobalConfiguration()
+        {
+            Instance = new GlobalConfiguration();
+        }
+
+        #endregion Constructors
+
+        /// <summary>
+        /// Gets or sets the default Configuration.
+        /// </summary>
+        /// <value>Configuration.</value>
+        public static IReadableConfiguration Instance
+        {
+            get { return _globalConfiguration; }
+            set
+            {
+                lock (GlobalConfigSync)
+                {
+                    _globalConfiguration = value;
+                }
+            }
+        }
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/HttpMethod.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/HttpMethod.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fc1a07fd952bc8bc54e8d5e27fbd171ea1333093
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/HttpMethod.cs
@@ -0,0 +1,33 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Http methods supported by swagger
+    /// </summary>
+    public enum HttpMethod
+    {
+        /// <summary>HTTP GET request.</summary>
+        Get,
+        /// <summary>HTTP POST request.</summary>
+        Post,
+        /// <summary>HTTP PUT request.</summary>
+        Put,
+        /// <summary>HTTP DELETE request.</summary>
+        Delete,
+        /// <summary>HTTP HEAD request.</summary>
+        Head,
+        /// <summary>HTTP OPTIONS request.</summary>
+        Options,
+        /// <summary>HTTP PATCH request.</summary>
+        Patch
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IApiAccessor.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IApiAccessor.cs
new file mode 100644
index 0000000000000000000000000000000000000000..927831c5c5a951ecbe29972562f419e59c4f152f
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IApiAccessor.cs
@@ -0,0 +1,34 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Represents configuration aspects required to interact with the API endpoints.
+    /// </summary>
+    public interface IApiAccessor
+    {
+        /// <summary>
+        /// Gets or sets the configuration object
+        /// </summary>
+        /// <value>An instance of the Configuration</value>
+        IReadableConfiguration Configuration { get; set; }
+
+        /// <summary>
+        /// Gets the base path of the API client.
+        /// </summary>
+        /// <value>The base path</value>
+        string GetBasePath();
+
+        /// <summary>
+        /// Provides a factory method hook for the creation of exceptions.
+        /// </summary>
+        ExceptionFactory ExceptionFactory { get; set; }
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IAsynchronousClient.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IAsynchronousClient.cs
new file mode 100644
index 0000000000000000000000000000000000000000..19cdcf1c5ec29f2919a3eb60d9f7255e1192a300
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IAsynchronousClient.cs
@@ -0,0 +1,96 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Contract for Asynchronous RESTful API interactions.
+    ///
+    /// This interface allows consumers to provide a custom API accessor client.
+    /// </summary>
+    public interface IAsynchronousClient
+    {
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the GET http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> GetAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the POST http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> PostAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the PUT http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> PutAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the DELETE http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> DeleteAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the HEAD http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> HeadAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the OPTIONS http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> OptionsAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+
+        /// <summary>
+        /// Executes a non-blocking call to some <paramref name="path"/> using the PATCH http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>A task eventually representing the response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        Task<ApiResponse<T>> PatchAsync<T>(string path, RequestOptions options, IReadableConfiguration configuration = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken));
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IReadableConfiguration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IReadableConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..99167b0135007010e69417eb4d7ff497287e915e
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/IReadableConfiguration.cs
@@ -0,0 +1,127 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Net;
+using System.Security.Cryptography.X509Certificates;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Represents a readable-only configuration contract.
+    /// </summary>
+    public interface IReadableConfiguration
+    {
+        /// <summary>
+        /// Gets the access token.
+        /// </summary>
+        /// <value>Access token.</value>
+        string AccessToken { get; }
+
+        /// <summary>
+        /// Gets the API key.
+        /// </summary>
+        /// <value>API key.</value>
+        IDictionary<string, string> ApiKey { get; }
+
+        /// <summary>
+        /// Gets the API key prefix.
+        /// </summary>
+        /// <value>API key prefix.</value>
+        IDictionary<string, string> ApiKeyPrefix { get; }
+
+        /// <summary>
+        /// Gets the base path.
+        /// </summary>
+        /// <value>Base path.</value>
+        string BasePath { get; }
+
+        /// <summary>
+        /// Gets the date time format.
+        /// </summary>
+        /// <value>Date time format.</value>
+        string DateTimeFormat { get; }
+
+        /// <summary>
+        /// Gets the default header.
+        /// </summary>
+        /// <value>Default header.</value>
+        [Obsolete("Use DefaultHeaders instead.")]
+        IDictionary<string, string> DefaultHeader { get; }
+
+        /// <summary>
+        /// Gets the default headers.
+        /// </summary>
+        /// <value>Default headers.</value>
+        IDictionary<string, string> DefaultHeaders { get; }
+
+        /// <summary>
+        /// Gets the temp folder path.
+        /// </summary>
+        /// <value>Temp folder path.</value>
+        string TempFolderPath { get; }
+
+        /// <summary>
+        /// Gets the HTTP connection timeout (in milliseconds)
+        /// </summary>
+        /// <value>HTTP connection timeout.</value>
+        int Timeout { get; }
+
+        /// <summary>
+        /// Gets the proxy.
+        /// </summary>
+        /// <value>Proxy.</value>
+        WebProxy Proxy { get; }
+
+        /// <summary>
+        /// Gets the user agent.
+        /// </summary>
+        /// <value>User agent.</value>
+        string UserAgent { get; }
+
+        /// <summary>
+        /// Gets the username.
+        /// </summary>
+        /// <value>Username.</value>
+        string Username { get; }
+
+        /// <summary>
+        /// Gets the password.
+        /// </summary>
+        /// <value>Password.</value>
+        string Password { get; }
+
+        /// <summary>
+        /// Get the servers associated with the operation.
+        /// </summary>
+        /// <value>Operation servers.</value>
+        IReadOnlyDictionary<string, List<IReadOnlyDictionary<string, object>>> OperationServers { get; }
+
+        /// <summary>
+        /// Gets the API key with prefix.
+        /// </summary>
+        /// <param name="apiKeyIdentifier">API key identifier (authentication scheme).</param>
+        /// <returns>API key with prefix.</returns>
+        string GetApiKeyWithPrefix(string apiKeyIdentifier);
+
+        /// <summary>
+        /// Gets the Operation server url at the provided index.
+        /// </summary>
+        /// <param name="operation">Operation server name.</param>
+        /// <param name="index">Index of the operation server settings.</param>
+        /// <returns></returns>
+        string GetOperationServerUrl(string operation, int index);
+
+        /// <summary>
+        /// Gets certificate collection to be sent with requests.
+        /// </summary>
+        /// <value>X509 Certificate collection.</value>
+        X509CertificateCollection ClientCertificates { get; }
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ISynchronousClient.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ISynchronousClient.cs
new file mode 100644
index 0000000000000000000000000000000000000000..faa8a6cef607d0ab7c27f70e5c76e55b7c7ef33f
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/ISynchronousClient.cs
@@ -0,0 +1,89 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Contract for Synchronous RESTful API interactions.
+    ///
+    /// This interface allows consumers to provide a custom API accessor client.
+    /// </summary>
+    public interface ISynchronousClient
+    {
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the GET http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Get<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the POST http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Post<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the PUT http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Put<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the DELETE http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Delete<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the HEAD http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Head<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the OPTIONS http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Options<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+
+        /// <summary>
+        /// Executes a blocking call to some <paramref name="path"/> using the PATCH http verb.
+        /// </summary>
+        /// <param name="path">The relative path to invoke.</param>
+        /// <param name="options">The request parameters to pass along to the client.</param>
+        /// <param name="configuration">Per-request configurable settings.</param>
+        /// <typeparam name="T">The return type.</typeparam>
+        /// <returns>The response data, decorated with <see cref="ApiResponse{T}"/></returns>
+        ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableConfiguration configuration = null);
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Multimap.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Multimap.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2c25243d9537df5db9b3675b4e2f96fa958ca7ee
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/Multimap.cs
@@ -0,0 +1,293 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Collections;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// A dictionary in which one key has many associated values.
+    /// </summary>
+    /// <typeparam name="TKey">The type of the key</typeparam>
+    /// <typeparam name="TValue">The type of the value associated with the key.</typeparam>
+    public class Multimap<TKey, TValue> : IDictionary<TKey, IList<TValue>>
+    {
+        #region Private Fields
+
+        private readonly Dictionary<TKey, IList<TValue>> _dictionary;
+
+        #endregion Private Fields
+
+        #region Constructors
+
+        /// <summary>
+        /// Empty Constructor.
+        /// </summary>
+        public Multimap()
+        {
+            _dictionary = new Dictionary<TKey, IList<TValue>>();
+        }
+
+        /// <summary>
+        /// Constructor with comparer.
+        /// </summary>
+        /// <param name="comparer"></param>
+        public Multimap(IEqualityComparer<TKey> comparer)
+        {
+            _dictionary = new Dictionary<TKey, IList<TValue>>(comparer);
+        }
+
+        #endregion Constructors
+
+        #region Enumerators
+
+        /// <summary>
+        /// To get the enumerator.
+        /// </summary>
+        /// <returns>Enumerator</returns>
+        public IEnumerator<KeyValuePair<TKey, IList<TValue>>> GetEnumerator()
+        {
+            return _dictionary.GetEnumerator();
+        }
+
+        /// <summary>
+        /// To get the enumerator.
+        /// </summary>
+        /// <returns>Enumerator</returns>
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            return _dictionary.GetEnumerator();
+        }
+
+        #endregion Enumerators
+
+        #region Public Members
+        /// <summary>
+        /// Add values to Multimap
+        /// </summary>
+        /// <param name="item">Key value pair</param>
+        public void Add(KeyValuePair<TKey, IList<TValue>> item)
+        {
+            if (!TryAdd(item.Key, item.Value))
+                throw new InvalidOperationException("Could not add values to Multimap.");
+        }
+
+        /// <summary>
+        /// Add Multimap to Multimap
+        /// </summary>
+        /// <param name="multimap">Multimap</param>
+        public void Add(Multimap<TKey, TValue> multimap)
+        {
+            foreach (var item in multimap)
+            {
+                if (!TryAdd(item.Key, item.Value))
+                    throw new InvalidOperationException("Could not add values to Multimap.");
+            }
+        }
+
+        /// <summary>
+        /// Clear Multimap
+        /// </summary>
+        public void Clear()
+        {
+            _dictionary.Clear();
+        }
+
+        /// <summary>
+        /// Determines whether Multimap contains the specified item.
+        /// </summary>
+        /// <param name="item">Key value pair</param>
+        /// <exception cref="NotImplementedException">Method needs to be implemented</exception>
+        /// <returns>true if the Multimap contains the item; otherwise, false.</returns>
+        public bool Contains(KeyValuePair<TKey, IList<TValue>> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        /// <summary>
+        ///  Copy items of the Multimap to an array,
+        ///     starting at a particular array index.
+        /// </summary>
+        /// <param name="array">The array that is the destination of the items copied
+        ///     from Multimap. The array must have zero-based indexing.</param>
+        /// <param name="arrayIndex">The zero-based index in array at which copying begins.</param>
+        /// <exception cref="NotImplementedException">Method needs to be implemented</exception>
+        public void CopyTo(KeyValuePair<TKey, IList<TValue>>[] array, int arrayIndex)
+        {
+            throw new NotImplementedException();
+        }
+
+        /// <summary>
+        /// Removes the specified item from the Multimap.
+        /// </summary>
+        /// <param name="item">Key value pair</param>
+        /// <returns>true if the item is successfully removed; otherwise, false.</returns>
+        /// <exception cref="NotImplementedException">Method needs to be implemented</exception>
+        public bool Remove(KeyValuePair<TKey, IList<TValue>> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        /// <summary>
+        /// Gets the number of items contained in the Multimap.
+        /// </summary>
+        public int Count => _dictionary.Count;
+
+        /// <summary>
+        /// Gets a value indicating whether the Multimap is read-only.
+        /// </summary>
+        public bool IsReadOnly => false;
+
+        /// <summary>
+        /// Adds an item with the provided key and value to the Multimap.
+        /// </summary>
+        /// <param name="key">The object to use as the key of the item to add.</param>
+        /// <param name="value">The object to use as the value of the item to add.</param>
+        /// <exception cref="InvalidOperationException">Thrown when couldn't add the value to Multimap.</exception>
+        public void Add(TKey key, IList<TValue> value)
+        {
+            if (value != null && value.Count > 0)
+            {
+                if (_dictionary.TryGetValue(key, out var list))
+                {
+                    foreach (var k in value) list.Add(k);
+                }
+                else
+                {
+                    list = new List<TValue>(value);
+                    if (!TryAdd(key, list))
+                        throw new InvalidOperationException("Could not add values to Multimap.");
+                }
+            }
+        }
+
+        /// <summary>
+        /// Determines whether the Multimap contains an item with the specified key.
+        /// </summary>
+        /// <param name="key">The key to locate in the Multimap.</param>
+        /// <returns>true if the Multimap contains an item with
+        ///     the key; otherwise, false.</returns>
+        public bool ContainsKey(TKey key)
+        {
+            return _dictionary.ContainsKey(key);
+        }
+
+        /// <summary>
+        /// Removes item with the specified key from the Multimap.
+        /// </summary>
+        /// <param name="key">The key to locate in the Multimap.</param>
+        /// <returns>true if the item is successfully removed; otherwise, false.</returns>
+        public bool Remove(TKey key)
+        {
+            return TryRemove(key, out var _);
+        }
+
+        /// <summary>
+        /// Gets the value associated with the specified key.
+        /// </summary>
+        /// <param name="key">The key whose value to get.</param>
+        /// <param name="value">When this method returns, the value associated with the specified key, if the
+        ///     key is found; otherwise, the default value for the type of the value parameter.
+        ///     This parameter is passed uninitialized.</param>
+        /// <returns> true if the object that implements Multimap contains
+        ///     an item with the specified key; otherwise, false.</returns>
+        public bool TryGetValue(TKey key, out IList<TValue> value)
+        {
+            return _dictionary.TryGetValue(key, out value);
+        }
+
+        /// <summary>
+        /// Gets or sets the item with the specified key.
+        /// </summary>
+        /// <param name="key">The key of the item to get or set.</param>
+        /// <returns>The value of the specified key.</returns>
+        public IList<TValue> this[TKey key]
+        {
+            get => _dictionary[key];
+            set => _dictionary[key] = value;
+        }
+
+        /// <summary>
+        /// Gets a System.Collections.Generic.ICollection containing the keys of the Multimap.
+        /// </summary>
+        public ICollection<TKey> Keys => _dictionary.Keys;
+
+        /// <summary>
+        /// Gets a System.Collections.Generic.ICollection containing the values of the Multimap.
+        /// </summary>
+        public ICollection<IList<TValue>> Values => _dictionary.Values;
+
+        /// <summary>
+        ///  Copy the items of the Multimap to an System.Array,
+        ///     starting at a particular System.Array index.
+        /// </summary>
+        /// <param name="array">The one-dimensional System.Array that is the destination of the items copied
+        ///     from Multimap. The System.Array must have zero-based indexing.</param>
+        /// <param name="index">The zero-based index in array at which copying begins.</param>
+        public void CopyTo(Array array, int index)
+        {
+            ((ICollection)_dictionary).CopyTo(array, index);
+        }
+
+        /// <summary>
+        /// Adds an item with the provided key and value to the Multimap.
+        /// </summary>
+        /// <param name="key">The object to use as the key of the item to add.</param>
+        /// <param name="value">The object to use as the value of the item to add.</param>
+        /// <exception cref="InvalidOperationException">Thrown when couldn't add value to Multimap.</exception>
+        public void Add(TKey key, TValue value)
+        {
+            if (value != null)
+            {
+                if (_dictionary.TryGetValue(key, out var list))
+                {
+                    list.Add(value);
+                }
+                else
+                {
+                    list = new List<TValue> { value };
+                    if (!TryAdd(key, list))
+                        throw new InvalidOperationException("Could not add value to Multimap.");
+                }
+            }
+        }
+
+        #endregion Public Members
+
+        #region Private Members
+
+        /**
+         * Helper method to encapsulate generator differences between dictionary types.
+         */
+        private bool TryRemove(TKey key, out IList<TValue> value)
+        {
+            _dictionary.TryGetValue(key, out value);
+            return _dictionary.Remove(key);
+        }
+
+        /**
+         * Helper method to encapsulate generator differences between dictionary types.
+         */
+        private bool TryAdd(TKey key, IList<TValue> value)
+        {
+            try
+            {
+                _dictionary.Add(key, value);
+            }
+            catch (ArgumentException)
+            {
+                return false;
+            }
+
+            return true;
+        }
+        #endregion Private Members
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bc559a6e692b9449bba56f7449cf2cad37214614
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
@@ -0,0 +1,29 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+using Newtonsoft.Json.Converters;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Formatter for 'date' openapi formats ss defined by full-date - RFC3339
+    /// see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#data-types
+    /// </summary>
+    public class OpenAPIDateConverter : IsoDateTimeConverter
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="OpenAPIDateConverter" /> class.
+        /// </summary>
+        public OpenAPIDateConverter()
+        {
+            // full-date   = date-fullyear "-" date-month "-" date-mday
+            DateTimeFormat = "yyyy-MM-dd";
+        }
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RequestOptions.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RequestOptions.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e4cdc9ac057acd8004a2c0330feca418953a6df5
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RequestOptions.cs
@@ -0,0 +1,81 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Net;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// A container for generalized request inputs. This type allows consumers to extend the request functionality
+    /// by abstracting away from the default (built-in) request framework (e.g. RestSharp).
+    /// </summary>
+    public class RequestOptions
+    {
+        /// <summary>
+        /// Parameters to be bound to path parts of the Request's URL
+        /// </summary>
+        public Dictionary<string, string> PathParameters { get; set; }
+
+        /// <summary>
+        /// Query parameters to be applied to the request.
+        /// Keys may have 1 or more values associated.
+        /// </summary>
+        public Multimap<string, string> QueryParameters { get; set; }
+
+        /// <summary>
+        /// Header parameters to be applied to to the request.
+        /// Keys may have 1 or more values associated.
+        /// </summary>
+        public Multimap<string, string> HeaderParameters { get; set; }
+
+        /// <summary>
+        /// Form parameters to be sent along with the request.
+        /// </summary>
+        public Dictionary<string, string> FormParameters { get; set; }
+
+        /// <summary>
+        /// File parameters to be sent along with the request.
+        /// </summary>
+        public Multimap<string, Stream> FileParameters { get; set; }
+
+        /// <summary>
+        /// Cookies to be sent along with the request.
+        /// </summary>
+        public List<Cookie> Cookies { get; set; }
+
+        /// <summary>
+        /// Operation associated with the request path.
+        /// </summary>
+        public string Operation { get; set; }
+
+        /// <summary>
+        /// Index associated with the operation.
+        /// </summary>
+        public int OperationIndex { get; set; }
+
+        /// <summary>
+        /// Any data associated with a request body.
+        /// </summary>
+        public Object Data { get; set; }
+
+        /// <summary>
+        /// Constructs a new instance of <see cref="RequestOptions"/>
+        /// </summary>
+        public RequestOptions()
+        {
+            PathParameters = new Dictionary<string, string>();
+            QueryParameters = new Multimap<string, string>();
+            HeaderParameters = new Multimap<string, string>();
+            FormParameters = new Dictionary<string, string>();
+            FileParameters = new Multimap<string, Stream>();
+            Cookies = new List<Cookie>();
+        }
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RetryConfiguration.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RetryConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a13875c9c7756b5f63349503eb04b6e6b0e484da
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Client/RetryConfiguration.cs
@@ -0,0 +1,31 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using Polly;
+using RestSharp;
+
+namespace Org.OpenAPITools.Client
+{
+    /// <summary>
+    /// Configuration class to set the polly retry policies to be applied to the requests.
+    /// </summary>
+    public static class RetryConfiguration
+    {
+        /// <summary>
+        /// Retry policy
+        /// </summary>
+        public static Policy<RestResponse> RetryPolicy { get; set; }
+
+        /// <summary>
+        /// Async retry policy
+        /// </summary>
+        public static AsyncPolicy<RestResponse> AsyncRetryPolicy { get; set; }
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3fe1ad38c50fe6dff4338d88d356d3a5dd3306f5
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
@@ -0,0 +1,75 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+
+namespace Org.OpenAPITools.Model
+{
+    /// <summary>
+    ///  Abstract base class for oneOf, anyOf schemas in the OpenAPI specification
+    /// </summary>
+    public abstract partial class AbstractOpenAPISchema
+    {
+        /// <summary>
+        ///  Custom JSON serializer
+        /// </summary>
+        static public readonly JsonSerializerSettings SerializerSettings = new JsonSerializerSettings
+        {
+            // OpenAPI generated types generally hide default constructors.
+            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
+            MissingMemberHandling = MissingMemberHandling.Error,
+            ContractResolver = new DefaultContractResolver
+            {
+                NamingStrategy = new CamelCaseNamingStrategy
+                {
+                    OverrideSpecifiedNames = false
+                }
+            }
+        };
+
+        /// <summary>
+        ///  Custom JSON serializer for objects with additional properties
+        /// </summary>
+        static public readonly JsonSerializerSettings AdditionalPropertiesSerializerSettings = new JsonSerializerSettings
+        {
+            // OpenAPI generated types generally hide default constructors.
+            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
+            MissingMemberHandling = MissingMemberHandling.Ignore,
+            ContractResolver = new DefaultContractResolver
+            {
+                NamingStrategy = new CamelCaseNamingStrategy
+                {
+                    OverrideSpecifiedNames = false
+                }
+            }
+        };
+
+        /// <summary>
+        /// Gets or Sets the actual instance
+        /// </summary>
+        public abstract Object ActualInstance { get; set; }
+
+        /// <summary>
+        /// Gets or Sets IsNullable to indicate whether the instance is nullable
+        /// </summary>
+        public bool IsNullable { get; protected set; }
+
+        /// <summary>
+        /// Gets or Sets the schema type, which can be either `oneOf` or `anyOf`
+        /// </summary>
+        public string SchemaType { get; protected set; }
+
+        /// <summary>
+        /// Converts the instance into JSON string.
+        /// </summary>
+        public abstract string ToJson();
+    }
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/MetadataOutput.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/MetadataOutput.cs
new file mode 100644
index 0000000000000000000000000000000000000000..88e64127018216dc768684db4454287d747a8a28
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/MetadataOutput.cs
@@ -0,0 +1,153 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Runtime.Serialization;
+using System.Text;
+using System.ComponentModel.DataAnnotations;
+
+namespace Org.OpenAPITools.Model
+{
+    /// <summary>
+    /// MetadataOutput
+    /// </summary>
+    [DataContract(Name = "MetadataOutput")]
+    public partial class MetadataOutput : IEquatable<MetadataOutput>, IValidatableObject
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MetadataOutput" /> class.
+        /// </summary>
+        /// <param name="identifier">identifier.</param>
+        /// <param name="metadata">metadata.</param>
+        /// <param name="text">text.</param>
+        public MetadataOutput(string identifier = default(string), string metadata = default(string), string text = default(string))
+        {
+            this.Identifier = identifier;
+            this.Metadata = metadata;
+            this.Text = text;
+        }
+
+        /// <summary>
+        /// Gets or Sets Identifier
+        /// </summary>
+        [DataMember(Name = "identifier", EmitDefaultValue = false)]
+        public string Identifier { get; set; }
+
+        /// <summary>
+        /// Gets or Sets Metadata
+        /// </summary>
+        [DataMember(Name = "metadata", EmitDefaultValue = false)]
+        public string Metadata { get; set; }
+
+        /// <summary>
+        /// Gets or Sets Text
+        /// </summary>
+        [DataMember(Name = "text", EmitDefaultValue = false)]
+        public string Text { get; set; }
+
+        /// <summary>
+        /// Returns the string presentation of the object
+        /// </summary>
+        /// <returns>String presentation of the object</returns>
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.Append("class MetadataOutput {\n");
+            sb.Append("  Identifier: ").Append(Identifier).Append("\n");
+            sb.Append("  Metadata: ").Append(Metadata).Append("\n");
+            sb.Append("  Text: ").Append(Text).Append("\n");
+            sb.Append("}\n");
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// Returns the JSON string presentation of the object
+        /// </summary>
+        /// <returns>JSON string presentation of the object</returns>
+        public virtual string ToJson()
+        {
+            return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
+        }
+
+        /// <summary>
+        /// Returns true if objects are equal
+        /// </summary>
+        /// <param name="input">Object to be compared</param>
+        /// <returns>Boolean</returns>
+        public override bool Equals(object input)
+        {
+            return this.Equals(input as MetadataOutput);
+        }
+
+        /// <summary>
+        /// Returns true if MetadataOutput instances are equal
+        /// </summary>
+        /// <param name="input">Instance of MetadataOutput to be compared</param>
+        /// <returns>Boolean</returns>
+        public bool Equals(MetadataOutput input)
+        {
+            if (input == null)
+            {
+                return false;
+            }
+            return 
+                (
+                    this.Identifier == input.Identifier ||
+                    (this.Identifier != null &&
+                    this.Identifier.Equals(input.Identifier))
+                ) && 
+                (
+                    this.Metadata == input.Metadata ||
+                    (this.Metadata != null &&
+                    this.Metadata.Equals(input.Metadata))
+                ) && 
+                (
+                    this.Text == input.Text ||
+                    (this.Text != null &&
+                    this.Text.Equals(input.Text))
+                );
+        }
+
+        /// <summary>
+        /// Gets the hash code
+        /// </summary>
+        /// <returns>Hash code</returns>
+        public override int GetHashCode()
+        {
+            unchecked // Overflow is fine, just wrap
+            {
+                int hashCode = 41;
+                if (this.Identifier != null)
+                {
+                    hashCode = (hashCode * 59) + this.Identifier.GetHashCode();
+                }
+                if (this.Metadata != null)
+                {
+                    hashCode = (hashCode * 59) + this.Metadata.GetHashCode();
+                }
+                if (this.Text != null)
+                {
+                    hashCode = (hashCode * 59) + this.Text.GetHashCode();
+                }
+                return hashCode;
+            }
+        }
+
+        /// <summary>
+        /// To validate all properties of the instance
+        /// </summary>
+        /// <param name="validationContext">Validation context</param>
+        /// <returns>Validation Result</returns>
+        public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext validationContext)
+        {
+            yield break;
+        }
+    }
+
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/ModelVersion.cs b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/ModelVersion.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9af8aa741dfbd60bfdd3d3788939f3a2218a6f20
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Model/ModelVersion.cs
@@ -0,0 +1,117 @@
+/*
+ * Metadata Extractor API
+ *
+ * This API extracts RDF triples from files
+ *
+ * The version of the OpenAPI document: 0.1.1
+ * Generated by: https://github.com/openapitools/openapi-generator.git
+ */
+
+
+using System.Runtime.Serialization;
+using System.Text;
+using System.ComponentModel.DataAnnotations;
+
+namespace Org.OpenAPITools.Model
+{
+    /// <summary>
+    /// ModelVersion
+    /// </summary>
+    [DataContract(Name = "_Version")]
+    public partial class ModelVersion : IEquatable<ModelVersion>, IValidatableObject
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ModelVersion" /> class.
+        /// </summary>
+        /// <param name="version">version.</param>
+        public ModelVersion(string version = default(string))
+        {
+            this._Version = version;
+        }
+
+        /// <summary>
+        /// Gets or Sets _Version
+        /// </summary>
+        [DataMember(Name = "version", EmitDefaultValue = false)]
+        public string _Version { get; set; }
+
+        /// <summary>
+        /// Returns the string presentation of the object
+        /// </summary>
+        /// <returns>String presentation of the object</returns>
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.Append("class ModelVersion {\n");
+            sb.Append("  _Version: ").Append(_Version).Append("\n");
+            sb.Append("}\n");
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// Returns the JSON string presentation of the object
+        /// </summary>
+        /// <returns>JSON string presentation of the object</returns>
+        public virtual string ToJson()
+        {
+            return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
+        }
+
+        /// <summary>
+        /// Returns true if objects are equal
+        /// </summary>
+        /// <param name="input">Object to be compared</param>
+        /// <returns>Boolean</returns>
+        public override bool Equals(object input)
+        {
+            return this.Equals(input as ModelVersion);
+        }
+
+        /// <summary>
+        /// Returns true if ModelVersion instances are equal
+        /// </summary>
+        /// <param name="input">Instance of ModelVersion to be compared</param>
+        /// <returns>Boolean</returns>
+        public bool Equals(ModelVersion input)
+        {
+            if (input == null)
+            {
+                return false;
+            }
+            return 
+                (
+                    this._Version == input._Version ||
+                    (this._Version != null &&
+                    this._Version.Equals(input._Version))
+                );
+        }
+
+        /// <summary>
+        /// Gets the hash code
+        /// </summary>
+        /// <returns>Hash code</returns>
+        public override int GetHashCode()
+        {
+            unchecked // Overflow is fine, just wrap
+            {
+                int hashCode = 41;
+                if (this._Version != null)
+                {
+                    hashCode = (hashCode * 59) + this._Version.GetHashCode();
+                }
+                return hashCode;
+            }
+        }
+
+        /// <summary>
+        /// To validate all properties of the instance
+        /// </summary>
+        /// <param name="validationContext">Validation context</param>
+        /// <returns>Validation Result</returns>
+        public IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> Validate(ValidationContext validationContext)
+        {
+            yield break;
+        }
+    }
+
+}
diff --git a/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Org.OpenAPITools.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..f29fbacc232b7d78d1b73e00dd1c09183d69b14a
--- /dev/null
+++ b/src/OpenApiGeneratedConnector/src/Org.OpenAPITools/Org.OpenAPITools.csproj
@@ -0,0 +1,36 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo><!-- setting GenerateAssemblyInfo to false causes this bug https://github.com/dotnet/project-system/issues/3934 -->
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <AssemblyName>Org.OpenAPITools</AssemblyName>
+    <PackageId>Org.OpenAPITools</PackageId>
+    <OutputType>Library</OutputType>
+    <Authors>OpenAPI</Authors>
+    <Company>OpenAPI</Company>
+    <AssemblyTitle>OpenAPI Library</AssemblyTitle>
+    <Description>A library generated from a OpenAPI doc</Description>
+    <Copyright>No Copyright</Copyright>
+    <RootNamespace>Org.OpenAPITools</RootNamespace>
+    <Version>1.0.0</Version>
+    <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\Org.OpenAPITools.xml</DocumentationFile>
+    <RepositoryUrl>https://github.com/GIT_USER_ID/GIT_REPO_ID.git</RepositoryUrl>
+    <RepositoryType>git</RepositoryType>
+    <PackageReleaseNotes>Minor update</PackageReleaseNotes>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="JsonSubTypes" Version="1.9.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageReference Include="RestSharp" Version="108.0.1" />
+    <PackageReference Include="Polly" Version="7.2.3" />
+    <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Remove="System.Web" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System.Web" />
+  </ItemGroup>
+</Project>