Repository: mageddo/dns-proxy-server
Pull request #268 (2023-01-30 11:55:39)

DPS 3 - Features
Based on #267 

* Docker Solver
  * Solve names based on HOSTNAMES env and container hostname to bridge network IP 
* Remote Solver
* UDP Server




Patch:
diff --git a/.editorconfig b/.editorconfig
index b5463130..5f8702cf 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -4,13 +4,9 @@
 root = true
 
 # Unix-style newlines with a newline ending every file
-[*.go]
+[*]
 end_of_line = lf
 insert_final_newline = true
 charset = utf-8
-indent_style = tab
-indent_size = 2
-
-[{*.java, *.gradle, *.yml, app/*package.json}]
 indent_style = space
 indent_size = 2
diff --git a/README.alpha.md b/README.alpha.md
index fd3dea54..ae59a15d 100644
--- a/README.alpha.md
+++ b/README.alpha.md
@@ -6,9 +6,25 @@ $ ./gradlew build nativeCompile &&\
  build/native/nativeCompile/dns-proxy-server
 ```
 
+
+## Run a container  for testing
+
+```
+docker run --rm -it  --hostname nginx.dev -e 'HOSTNAMES=nginx.com.br' nginx:1.15 bash
+```
 ## x
 ```bash
 docker-compose -f docker-compose-alpha.yml rm &&\
 docker-compose -f docker-compose-alpha.yml build &&\
 docker-compose -f docker-compose-alpha.yml run -T --rm arm7x86
 ```
+
+Generate json reflect for all project 
+
+```
+$ ./gradlew shadowJar
+
+$ mkdir reflect &&\
+  $JAVA_HOME/bin/java -agentlib:native-image-agent=config-output-dir=./reflect -jar build/libs/dns-proxy-server*all.jar
+```
+
diff --git a/build.gradle b/build.gradle
index fbf7cc5c..e8965c24 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,6 +8,7 @@ buildscript {
 plugins {
   id "java"
   id 'org.graalvm.buildtools.native' version '0.9.19'
+  id "com.github.johnrengelman.shadow" version "7.1.2"
 }
 
 repositories {
@@ -44,15 +45,24 @@ dependencies {
   compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.+'
   annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.+'
 
-  compileOnly(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.3.+")
-  annotationProcessor(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.3.+")
+
+  implementation 'com.google.dagger:dagger:2.44.+'
+  annotationProcessor 'com.google.dagger:dagger-compiler:2.44.+'
 
   implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.+'
-  implementation group: 'com.mageddo.tinyserver', name: 'tinyserver', version: '1.0.+'
   implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.+'
   implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.+"
+
+  implementation group: 'com.mageddo.tinyserver', name: 'tinyserver', version: '1.0.+'
+
   implementation group: 'dnsjava', name: 'dnsjava', version: '3.5.2'
 
+  implementation group: 'com.github.docker-java', name: 'docker-java-core', version: '3.2.14'
+  implementation group: 'com.github.docker-java', name: 'docker-java-transport-httpclient5', version: '3.2.14'
+
+  compileOnly(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.4.+")
+  annotationProcessor(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.4.+")
+
   testCompileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.+'
   testAnnotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.+'
   testImplementation(group: "org.junit.jupiter", name: "junit-jupiter", version: "5.8.+")
@@ -65,3 +75,21 @@ test {
     events "passed", "skipped", "failed"
   }
 }
+
+
+def mainClassName = "com.mageddo.dnsproxyserver.App"
+
+jar {
+  manifest {
+    attributes(
+      "Main-Class": mainClassName
+    )
+  }
+}
+
+shadowJar {
+  mergeServiceFiles()
+  transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) {
+    mergeStrategy = "append"
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/App.java b/src/main/java/com/mageddo/dnsproxyserver/App.java
index 74de405a..6385f17a 100644
--- a/src/main/java/com/mageddo/dnsproxyserver/App.java
+++ b/src/main/java/com/mageddo/dnsproxyserver/App.java
@@ -1,17 +1,23 @@
 package com.mageddo.dnsproxyserver;
 
-public class App {
-  public static void main(String[] args) {
-    System.out.println("Hello World");
+import com.mageddo.dnsproxyserver.dagger.Factory;
 
-    // start webserver
+public class App {
+  public static void main(String[] args) throws InterruptedException {
+    final var factory = Factory.factory();
 
     // start dns server
+    factory.dnsServerStarter().start();
+
+    // start webserver
 
     // configurations
 
     //  setup as default dns
+
     //  install as service
 
+    Thread.currentThread().join();
+
   }
 }
diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/Configs.java b/src/main/java/com/mageddo/dnsproxyserver/config/Configs.java
new file mode 100644
index 00000000..bcbca5d3
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/config/Configs.java
@@ -0,0 +1,20 @@
+package com.mageddo.dnsproxyserver.config;
+
+import com.mageddo.dnsproxyserver.server.dns.solver.RemoteSolverConfig;
+import com.mageddo.dnsproxyserver.server.dns.SimpleServer;
+
+public class Configs {
+  public static int findDnsServerPort() {
+    return 8053;
+  }
+
+  public static SimpleServer.Protocol findDnsServerProtocol() {
+    return SimpleServer.Protocol.BOTH;
+  }
+
+  public static RemoteSolverConfig findRemoverSolverConfig() {
+    return new RemoteSolverConfig()
+        .setIp(new byte[]{8, 8, 8, 8})
+        .setPort((short) 53);
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/dagger/DockerModule.java b/src/main/java/com/mageddo/dnsproxyserver/dagger/DockerModule.java
new file mode 100644
index 00000000..4af26f3c
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/dagger/DockerModule.java
@@ -0,0 +1,46 @@
+package com.mageddo.dnsproxyserver.dagger;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.core.DefaultDockerClientConfig;
+import com.github.dockerjava.core.DockerClientImpl;
+import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
+import com.mageddo.dnsproxyserver.docker.DockerRepository;
+import com.mageddo.dnsproxyserver.docker.DockerRepositoryDefault;
+import dagger.Binds;
+import dagger.Module;
+import dagger.Provides;
+
+import java.time.Duration;
+
+@Module
+public interface DockerModule {
+
+
+  @Binds
+  DockerRepository bind(DockerRepositoryDefault m);
+
+  @Provides
+  static DockerClient dockerClient() {
+    final var config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+      .withDockerHost("unix:///var/run/docker.sock")
+      .withDockerTlsVerify(false)
+//      .withDockerCertPath("/home/user/.docker")
+//      .withRegistryUsername(registryUser)
+//      .withRegistryPassword(registryPass)
+//      .withRegistryEmail(registryMail)
+//      .withRegistryUrl(registryUrl)
+      .build();
+
+    final var httpClient = new ApacheDockerHttpClient.Builder()
+      .dockerHost(config.getDockerHost())
+      .sslConfig(config.getSSLConfig())
+      .maxConnections(5)
+      .connectionTimeout(Duration.ofMillis(300))
+      .responseTimeout(Duration.ofSeconds(3))
+      .build();
+
+    return DockerClientImpl.getInstance(config, httpClient);
+  }
+
+
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/dagger/Factory.java b/src/main/java/com/mageddo/dnsproxyserver/dagger/Factory.java
new file mode 100644
index 00000000..1d4b9a84
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/dagger/Factory.java
@@ -0,0 +1,24 @@
+package com.mageddo.dnsproxyserver.dagger;
+
+import com.mageddo.dnsproxyserver.server.dns.ServerStarter;
+import com.mageddo.dnsproxyserver.server.dns.solver.Solver;
+import dagger.Component;
+
+import javax.inject.Singleton;
+import java.util.Set;
+
+@Singleton
+@Component(modules = {MainModule.class, DockerModule.class})
+public interface Factory {
+
+  ServerStarter dnsServerStarter();
+
+  Set<Solver> solvers();
+
+  static Factory factory() {
+    return DaggerFactory
+        .builder()
+        .build()
+        ;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/dagger/MainModule.java b/src/main/java/com/mageddo/dnsproxyserver/dagger/MainModule.java
new file mode 100644
index 00000000..4f3aa135
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/dagger/MainModule.java
@@ -0,0 +1,30 @@
+package com.mageddo.dnsproxyserver.dagger;
+
+import com.mageddo.dnsproxyserver.config.Configs;
+import com.mageddo.dnsproxyserver.server.dns.solver.DockerSolver;
+import com.mageddo.dnsproxyserver.server.dns.solver.RemoteSolver;
+import com.mageddo.dnsproxyserver.server.dns.solver.Solver;
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.ElementsIntoSet;
+import org.xbill.DNS.Resolver;
+import org.xbill.DNS.SimpleResolver;
+
+import java.util.Set;
+
+@Module
+public interface MainModule {
+
+  @ElementsIntoSet
+  @Provides
+  static Set<Solver> solvers(
+      RemoteSolver a, DockerSolver b
+  ) {
+    return Set.of(a, b);
+  }
+
+  @Provides
+  static Resolver simpleResolver() {
+    return new SimpleResolver(Configs.findRemoverSolverConfig().toSocketAddress());
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/Docker.java b/src/main/java/com/mageddo/dnsproxyserver/docker/Docker.java
new file mode 100644
index 00000000..4d472aa2
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/docker/Docker.java
@@ -0,0 +1,41 @@
+package com.mageddo.dnsproxyserver.docker;
+
+import com.github.dockerjava.api.model.ContainerConfig;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class Docker {
+
+  public static final String HOSTNAME_ENV = "HOSTNAMES=";
+
+  public static String findContainerHostname(ContainerConfig config) {
+    final var hostname = config.getHostName();
+    if (StringUtils.isBlank(hostname)) {
+      return null;
+    }
+    final var domainName = config.getDomainName();
+    if (StringUtils.isBlank(domainName)) {
+      return hostname;
+    }
+    return String.format("%s.%s", hostname, domainName);
+  }
+
+  public static Set<String> findHostnameFromEnv(String[] envs) {
+    if (envs == null) {
+      return Collections.emptySet();
+    }
+    for (String env : envs) {
+      if (env.startsWith(HOSTNAME_ENV)) {
+        final var hosts = env.substring(HOSTNAME_ENV.length()).split("\s,\s");
+        return Arrays
+          .stream(hosts)
+          .collect(Collectors.toSet());
+      }
+    }
+    return Collections.emptySet();
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerNetworks.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerNetworks.java
new file mode 100644
index 00000000..c43d6548
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerNetworks.java
@@ -0,0 +1,23 @@
+package com.mageddo.dnsproxyserver.docker;
+
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+
+@Slf4j
+public class DockerNetworks {
+  public static String findBestIpMatching(InspectContainerResponse c, String... networksNames) {
+    final var networks = c.getNetworkSettings().getNetworks();
+    for (final var name : networksNames) {
+      if (!networks.containsKey(name)) {
+        continue;
+      }
+      final var ip = networks.get(name).getIpAddress();
+      log.debug("status=foundIp, network={}, container={}, ip={}", name, c.getName(), ip);
+      return ip;
+    }
+    log.debug("status=noIpFound, searchedNetworks={}, container={}", Arrays.toString(networksNames), c.getName());
+    return null;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepository.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepository.java
new file mode 100644
index 00000000..a97a8ac0
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepository.java
@@ -0,0 +1,11 @@
+package com.mageddo.dnsproxyserver.docker;
+
+public interface DockerRepository {
+  /**
+   *
+   * @param host
+   * @return the host ip
+   */
+  String findHostIp(String host);
+
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryDefault.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryDefault.java
new file mode 100644
index 00000000..bf109b50
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryDefault.java
@@ -0,0 +1,59 @@
+package com.mageddo.dnsproxyserver.docker;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.StopWatch;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Predicate;
+
+import static com.mageddo.dnsproxyserver.docker.Docker.findContainerHostname;
+import static com.mageddo.dnsproxyserver.docker.Docker.findHostnameFromEnv;
+
+@Slf4j
+@Singleton
+@AllArgsConstructor(onConstructor = @__({@Inject}))
+public class DockerRepositoryDefault implements DockerRepository {
+
+  public static final String RUNNING_STATUS = "running";
+  private final DockerClient dockerClient;
+
+  @Override
+  public String findHostIp(String host) {
+    final var stopWatch = StopWatch.createStarted();
+    final var activeContainers = this.dockerClient
+      .listContainersCmd()
+      .withStatusFilter(Set.of(RUNNING_STATUS))
+      .withLimit(1024)
+//      .withNetworkFilter()
+      .exec();
+
+    final var foundIp = activeContainers
+      .stream()
+      .map(it -> this.dockerClient.inspectContainerCmd(it.getId()).exec())
+      .filter(matchingHostName(host))
+      .map(c -> DockerNetworks.findBestIpMatching(c, buildNetworks(c)))
+      .findFirst()
+      .orElse(null);
+    log.debug("status=findDone, host={}, found={}, time={}", host, foundIp, stopWatch.getTime());
+    return foundIp;
+  }
+
+  String[] buildNetworks(InspectContainerResponse c) {
+    return new String[]{"bridge"};
+  }
+
+  static Predicate<InspectContainerResponse> matchingHostName(String host) {
+    return it -> {
+      if (Objects.equals(findContainerHostname(it.getConfig()), host)) {
+        return true;
+      }
+      return findHostnameFromEnv(it.getConfig().getEnv()).contains(host);
+    };
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryMock.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryMock.java
new file mode 100644
index 00000000..367142b0
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryMock.java
@@ -0,0 +1,19 @@
+package com.mageddo.dnsproxyserver.docker;
+
+import lombok.AllArgsConstructor;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.util.Objects;
+
+@Singleton
+@AllArgsConstructor(onConstructor = @__({@Inject}))
+public class DockerRepositoryMock implements DockerRepository {
+  @Override
+  public String findHostIp(String host) {
+    if (Objects.equals("acme.com", host)) {
+      return "192.168.0.1";
+    }
+    return null;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java
new file mode 100644
index 00000000..3bc3c91b
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java
@@ -0,0 +1,9 @@
+package com.mageddo.dnsproxyserver.server.dns;
+
+import org.xbill.DNS.Message;
+
+public class Messages {
+  public static String simplePrint(Message message){
+    return message.toString().substring(0, 10);
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/README.md b/src/main/java/com/mageddo/dnsproxyserver/server/dns/README.md
new file mode 100644
index 00000000..ae45f851
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/README.md
@@ -0,0 +1,4 @@
+```
+nslookup -po=8053 google.com 127.0.0.1
+-Djava.net.preferIPv4Stack=true
+```
\ No newline at end of file
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java
new file mode 100644
index 00000000..85b95ee0
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java
@@ -0,0 +1,34 @@
+package com.mageddo.dnsproxyserver.server.dns;
+
+import com.mageddo.dnsproxyserver.config.Configs;
+import com.mageddo.dnsproxyserver.server.dns.solver.Solver;
+import com.mageddo.dnsproxyserver.server.dns.solver.Solvers;
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
+import javax.inject.Inject;
+import java.util.List;
+import java.util.Set;
+
+@Getter
+@Accessors(fluent = true)
+public class ServerStarter {
+  private final List<Solver> solvers;
+  private final SimpleServer server;
+
+  @Inject
+  public ServerStarter(Set<Solver> solvers, SimpleServer server) {
+    this.solvers = Solvers.sorted(solvers);
+    this.server = server;
+  }
+
+  public ServerStarter start(){
+    this.server.start(
+        Configs.findDnsServerPort(),
+        Configs.findDnsServerProtocol(),
+        this.solvers,
+        null
+    );
+    return this;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/SimpleServer.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/SimpleServer.java
new file mode 100644
index 00000000..5d2bc155
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/SimpleServer.java
@@ -0,0 +1,33 @@
+package com.mageddo.dnsproxyserver.server.dns;
+
+import com.mageddo.dnsproxyserver.server.dns.solver.Solver;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.inject.Inject;
+import java.net.InetAddress;
+import java.util.List;
+
+@Slf4j
+@AllArgsConstructor(onConstructor = @__({@Inject}))
+public class SimpleServer {
+
+  public SimpleServer start(
+      int port, Protocol protocol, List<Solver> solvers, InetAddress bindAddress
+  ) {
+
+    // fixme create tcp server
+    final var udpServer = new UDPServer();
+    solvers.forEach(udpServer::bind);
+    udpServer.start(port, bindAddress);
+
+    return new SimpleServer();
+  }
+
+  public enum Protocol {
+    UDP,
+    TCP,
+    BOTH
+  }
+
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServer.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServer.java
new file mode 100644
index 00000000..f4028f26
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServer.java
@@ -0,0 +1,92 @@
+package com.mageddo.dnsproxyserver.server.dns;
+
+import com.mageddo.dnsproxyserver.server.dns.solver.Solver;
+import com.mageddo.dnsproxyserver.threads.ThreadPool;
+import com.mageddo.dnsproxyserver.utils.Classes;
+import lombok.extern.slf4j.Slf4j;
+import org.xbill.DNS.Message;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+
+import static com.mageddo.dnsproxyserver.server.dns.Messages.simplePrint;
+
+@Slf4j
+public class UDPServer {
+  public static final short BUFFER_SIZE = 512;
+  private final List<Solver> solvers;
+  private final ExecutorService pool;
+
+  public UDPServer() {
+    this.solvers = new ArrayList<>();
+    this.pool = ThreadPool.create(5);
+  }
+
+  public UDPServer bind(Solver solver) {
+    this.solvers.add(solver);
+    return this;
+  }
+
+  public void start(int port, InetAddress bindAddress) {
+    this.pool.submit(() -> this.start0(port, bindAddress));
+    log.info("status=starting.., port={}, bindAddress={}", port, bindAddress);
+  }
+
+  private void start0(int port, InetAddress bindAddress) {
+    try {
+      final var server = new DatagramSocket(port, bindAddress);
+      final byte[] buff = new byte[BUFFER_SIZE];
+      while (!server.isClosed()) {
+
+        final var in = new DatagramPacket(buff, 0, buff.length);
+        server.receive(in);
+        final var reqMsg = new Message(in.getData());
+
+        this.pool.submit(() -> this.res(server, this.solve(reqMsg), in.getAddress(), in.getPort()));
+
+      }
+    } catch (IOException e) {
+      throw new UncheckedIOException(e);
+    }
+  }
+
+  Message solve(Message reqMsg) {
+    for (final var solver : this.solvers) {
+      final var solverName = Classes.findSimpleName(solver);
+      try {
+        final var reqStr = simplePrint(reqMsg);
+        log.debug("status=trySolve, solver={}, req={}", solverName, reqStr);
+        final var res = solver.handle(reqMsg);
+        if(res == null){
+          log.debug("status=notSolved, solver={}, req={}", solverName, reqStr);
+          continue;
+        }
+        log.debug("status=solved, solver={}, req={}, res={}", solverName, reqStr, simplePrint(res));
+        return res;
+      } catch (Exception e) {
+        log.warn("status=solverFailed, solver={}, msg={}", solverName, e.getMessage(), e);
+      }
+    }
+    return null;
+  }
+
+  void res(DatagramSocket server, Message handle, InetAddress address, int port) {
+    try {
+      final var response = handle.toWire();
+      final var out = new DatagramPacket(response, response.length);
+      out.setAddress(address);
+      out.setPort(port);
+
+      server.send(out);
+
+    } catch (IOException e) {
+      throw new UncheckedIOException(e);
+    }
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/DockerSolver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/DockerSolver.java
new file mode 100644
index 00000000..8a3d7ac7
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/DockerSolver.java
@@ -0,0 +1,103 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+import com.mageddo.dnsproxyserver.docker.DockerRepository;
+import com.mageddo.dnsproxyserver.utils.Ips;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.xbill.DNS.ARecord;
+import org.xbill.DNS.DClass;
+import org.xbill.DNS.Message;
+import org.xbill.DNS.Section;
+
+import javax.inject.Inject;
+
+@Slf4j
+@AllArgsConstructor(onConstructor = @__({@Inject}))
+public class DockerSolver implements Solver {
+
+  private final DockerRepository dockerRepository;
+
+  @Override
+  public Message handle(Message reqMsg) {
+
+//    questionName := question.Name[:len(question.Name)-1]
+    final var question = reqMsg.getQuestion();
+    final var questionName = question.getName().toString(true);
+
+//    for _, host := range getAllHosts("." + questionName) {
+//      if s.c.ContainsKey(host) {
+//        return s.doSolve(ctx, host, question)
+//      }
+//    }
+    for (final var host : Wildcards.buildHostAndWildcards(questionName)) {
+      final var ip = this.dockerRepository.findHostIp(host);
+      if (ip == null) {
+        return null;
+      }
+      return this.toMsg(reqMsg, ip);
+    }
+
+
+//    func (s DockerDnsSolver) doSolve(ctx context.Context, k string, q dns.Question) (*dns.Msg, error) {
+//      logging.Debugf("solver=docker, status=solved-key, question=%s, hostname=%s, ip=%+v", ctx, q.Name, k, s.c.Get(k))
+//      return s.getMsg(k, q), nil
+//    }
+//
+//    func NewDockerSolver(c cache.Cache) DockerDnsSolver {
+//      return DockerDnsSolver{c}
+//    }
+//
+//    func (s DockerDnsSolver) getMsg(key string, question dns.Question) *dns.Msg {
+//      ip := s.c.Get(key).(string)
+//          ipArr := strings.Split(ip, ".")
+//      i1, _ := strconv.Atoi(ipArr[0])
+//      i2, _ := strconv.Atoi(ipArr[1])
+//      i3, _ := strconv.Atoi(ipArr[2])
+//      i4, _ := strconv.Atoi(ipArr[3])
+//
+//      rr := &dns.A{
+//        Hdr: dns.RR_Header{Name: question.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0},
+//        A:   net.IPv4(byte(i1), byte(i2), byte(i3), byte(i4)),
+//      }
+//
+//      m := new(dns.Msg)
+//          m.Answer = append(m.Answer, rr)
+//      return m
+//    }
+
+
+    return null;
+  }
+
+  Message toMsg(Message reqMsg, String ip) {
+    final var res = new Message(reqMsg.getHeader().getID());
+//     = Record.newRecord(reqMsg.getQuestion().getName(), Type.A, DClass.IN, 30, Ips.toBytes(ip));
+    final var answer = new ARecord(reqMsg.getQuestion().getName(), DClass.IN, 30L, Ips.toAddress(ip));
+    res.addRecord(answer, Section.ANSWER);
+    return res;
+  }
+
+//  func (s DockerDnsSolver) getMsg(key string, question dns.Question) *dns.Msg {
+//    ip := s.c.Get(key).(string)
+//        ipArr := strings.Split(ip, ".")
+//    i1, _ := strconv.Atoi(ipArr[0])
+//    i2, _ := strconv.Atoi(ipArr[1])
+//    i3, _ := strconv.Atoi(ipArr[2])
+//    i4, _ := strconv.Atoi(ipArr[3])
+//
+//    rr := &dns.A{
+//      Hdr: dns.RR_Header{Name: question.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0},
+//      A:   net.IPv4(byte(i1), byte(i2), byte(i3), byte(i4)),
+//    }
+//
+//    m := new(dns.Msg)
+//        m.Answer = append(m.Answer, rr)
+//    return m
+//  }
+
+
+  @Override
+  public byte priority() {
+    return Priority.ZERO;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Priority.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Priority.java
new file mode 100644
index 00000000..0d122ec1
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Priority.java
@@ -0,0 +1,11 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+public class Priority {
+  public static final byte ZERO = 1;
+
+  public static final byte ONE = 1;
+  public static final byte TWO = 2;
+  public static final byte THREE = 3;
+
+  public static final byte FOUR = 4;
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolver.java
new file mode 100644
index 00000000..bc1f5312
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolver.java
@@ -0,0 +1,28 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.xbill.DNS.Message;
+import org.xbill.DNS.Resolver;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+
+@Slf4j
+@AllArgsConstructor(onConstructor = @__({@Inject}))
+public class RemoteSolver implements Solver {
+
+  private final Resolver delegate;
+
+  @Override
+  public Message handle(Message req) {
+    try {
+      final var res = this.delegate.send(req);
+      log.info("status=handled, req={}, res={}", req, res);
+      return res;
+    } catch (IOException e) {
+      throw new UncheckedIOException(e);
+    }
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolverConfig.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolverConfig.java
new file mode 100644
index 00000000..f5926b2b
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolverConfig.java
@@ -0,0 +1,18 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+import com.mageddo.dnsproxyserver.utils.Ips;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.net.InetSocketAddress;
+
+@Data
+@Accessors(chain = true)
+public class RemoteSolverConfig {
+  private byte[] ip;
+  private short port;
+
+  public InetSocketAddress toSocketAddress() {
+    return new InetSocketAddress(Ips.toAddress(this.ip), this.port);
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java
new file mode 100644
index 00000000..1269c927
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java
@@ -0,0 +1,11 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+import org.xbill.DNS.Message;
+
+public interface Solver {
+  Message handle(Message reqMsg);
+
+  default byte priority(){
+    return Byte.MAX_VALUE;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solvers.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solvers.java
new file mode 100644
index 00000000..0c5597b4
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solvers.java
@@ -0,0 +1,14 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+
+public class Solvers {
+  public static List<Solver> sorted(Set<Solver> source) {
+    final var solvers = new ArrayList<>(source);
+    solvers.sort(Comparator.comparing(Solver::priority));
+    return solvers;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Wildcards.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Wildcards.java
new file mode 100644
index 00000000..544ec689
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Wildcards.java
@@ -0,0 +1,26 @@
+package com.mageddo.dnsproxyserver.server.dns.solver;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Wildcards {
+  public static List<String> buildHostAndWildcards(String hostname) {
+
+    final var query = "." + hostname;
+    final var hostnames = new ArrayList<String>();
+    hostnames.add(query.substring(1));
+
+    int fromIndex = 0, actual = 0;
+    while (true) {
+      final var str = query.substring(fromIndex);
+      actual = str.indexOf('.');
+
+      if (actual == -1 || actual + 1 >= str.length()) {
+        break;
+      }
+      hostnames.add(str.substring(actual));
+      fromIndex += actual + 1;
+    }
+    return hostnames;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/threads/ThreadPool.java b/src/main/java/com/mageddo/dnsproxyserver/threads/ThreadPool.java
new file mode 100644
index 00000000..0e0805c0
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/threads/ThreadPool.java
@@ -0,0 +1,23 @@
+package com.mageddo.dnsproxyserver.threads;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+public class ThreadPool {
+  private static final ScheduledExecutorService pool = create(5);
+
+  public static ScheduledExecutorService create(int size) {
+    return Executors.newScheduledThreadPool(
+        size,
+        ThreadPool::createDaemonThread
+    );
+  }
+  public static Thread createDaemonThread(Runnable r) {
+    final var t = new Thread(r);
+    t.setDaemon(true);
+    return t;
+  }
+  public static ScheduledExecutorService main() {
+    return pool;
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/utils/Classes.java b/src/main/java/com/mageddo/dnsproxyserver/utils/Classes.java
new file mode 100644
index 00000000..534ae516
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/utils/Classes.java
@@ -0,0 +1,7 @@
+package com.mageddo.dnsproxyserver.utils;
+
+public class Classes {
+  public static String findSimpleName(Object o) {
+    return o.getClass().getSimpleName();
+  }
+}
diff --git a/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java
new file mode 100644
index 00000000..a42abd9a
--- /dev/null
+++ b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java
@@ -0,0 +1,31 @@
+package com.mageddo.dnsproxyserver.utils;
+
+import org.apache.commons.lang3.Validate;
+
+import java.io.UncheckedIOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class Ips {
+  public static byte[] toBytes(String ip) {
+    final var tokens = ip.split("\\.");
+    Validate.isTrue(tokens.length == 4, "Wrong number of tokens: %d", tokens.length);
+    final var bytes = new byte[4];
+    for (int i = 0; i < tokens.length; i++) {
+      bytes[i] = (byte)Integer.parseInt(tokens[i]);
+    }
+    return bytes;
+  }
+
+  public static InetAddress toAddress(String ip) {
+    return toAddress(toBytes(ip));
+  }
+
+  public static InetAddress toAddress(byte[] ip) {
+    try {
+      return InetAddress.getByAddress(ip);
+    } catch (UnknownHostException e) {
+      throw new UncheckedIOException(e);
+    }
+  }
+}
diff --git a/src/main/resources/META-INF/native-image/graal-generated/jni-config.json b/src/main/resources/META-INF/native-image/graal-generated/jni-config.json
new file mode 100644
index 00000000..8b4e4170
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/graal-generated/jni-config.json
@@ -0,0 +1,6 @@
+[
+{
+  "name":"java.lang.Boolean",
+  "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
+}
+]
diff --git a/src/main/resources/META-INF/native-image/graal-generated/reflect-config.json b/src/main/resources/META-INF/native-image/graal-generated/reflect-config.json
new file mode 100644
index 00000000..41b2ebd2
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/graal-generated/reflect-config.json
@@ -0,0 +1,520 @@
+[
+{
+  "name":"[Lcom.fasterxml.jackson.databind.deser.BeanDeserializerModifier;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.Bind;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.Capability;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.ContainerPort;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.Device;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.ExposedPort;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.Link;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.LxcConf;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.PortBinding;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.Ports$Binding;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.Ulimit;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.VolumeBind;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.VolumeRW;"
+},
+{
+  "name":"[Lcom.github.dockerjava.api.model.VolumesFrom;"
+},
+{
+  "name":"[Ljava.lang.String;"
+},
+{
+  "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder",
+  "queryAllPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.DateConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.LevelConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.LineOfCallerConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.LineSeparatorConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.LoggerConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.MessageConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.MethodOfCallerConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.classic.pattern.ThreadConverter",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.core.ConsoleAppender",
+  "queryAllPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"ch.qos.logback.core.OutputStreamAppender",
+  "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }]
+},
+{
+  "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder",
+  "methods":[
+    {"name":"setCharset","parameterTypes":["java.nio.charset.Charset"] }, 
+    {"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }
+  ]
+},
+{
+  "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase",
+  "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"com.fasterxml.jackson.databind.ext.Java7HandlersImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.command.GraphData",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.command.GraphDriver",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.command.HealthState",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.command.HealthStateLog",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.command.InspectContainerResponse",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.command.InspectContainerResponse$ContainerState",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "queryAllPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":["com.github.dockerjava.api.command.InspectContainerResponse"] }]
+},
+{
+  "name":"com.github.dockerjava.api.command.InspectContainerResponse$Mount",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.command.InspectContainerResponse$Node",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "queryAllPublicConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.AccessMode",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Bind",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.BindOptions",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.BindPropagation",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Binds",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"fromPrimitive","parameterTypes":["java.lang.String[]"] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.BlkioRateDevice",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.BlkioWeightDevice",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Capability",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Container",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerConfig",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerHostConfig",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerMount",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerNetwork",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerNetwork$Ipam",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerNetworkSettings",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.ContainerPort",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.Device",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.DeviceRequest",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.DockerObject",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Driver",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.ExposedPort",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.ExposedPorts",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"fromPrimitive","parameterTypes":["java.util.Map"] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.HealthCheck",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.HostConfig",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.InternetProtocol",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Isolation",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.Link",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Links",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.LogConfig",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[
+    {"name":"<init>","parameterTypes":[] }, 
+    {"name":"setType","parameterTypes":["com.github.dockerjava.api.model.LogConfig$LoggingType"] }
+  ]
+},
+{
+  "name":"com.github.dockerjava.api.model.LogConfig$LoggingType",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.LxcConf",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Mount",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.MountType",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.NetworkSettings",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.Ports",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"fromPrimitive","parameterTypes":["java.util.Map"] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.Ports$Binding",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.PropagationMode",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.RestartPolicy",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.SELContext",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"com.github.dockerjava.api.model.TmpfsOptions",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Ulimit",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.Volume",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"com.github.dockerjava.api.model.VolumeBind",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.VolumeBinds",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.VolumeOptions",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.VolumeRW",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.VolumesFrom",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.github.dockerjava.api.model.VolumesRW",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
+},
+{
+  "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"java.io.FilePermission"
+},
+{
+  "name":"java.io.Serializable",
+  "queryAllDeclaredMethods":true
+},
+{
+  "name":"java.lang.RuntimePermission"
+},
+{
+  "name":"java.net.NetPermission"
+},
+{
+  "name":"java.net.SocketPermission"
+},
+{
+  "name":"java.net.URLPermission",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+  "name":"java.net.UnixDomainSocketAddress",
+  "methods":[{"name":"of","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.security.AllPermission"
+},
+{
+  "name":"java.security.SecureRandomParameters"
+},
+{
+  "name":"java.security.SecurityPermission"
+},
+{
+  "name":"java.util.PropertyPermission"
+},
+{
+  "name":"javax.management.ObjectName"
+},
+{
+  "name":"sun.security.provider.NativePRNG",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.NativePRNG$NonBlocking",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+}
+]
diff --git a/src/main/resources/META-INF/native-image/native-image.properties b/src/main/resources/META-INF/native-image/native-image.properties
new file mode 100644
index 00000000..bda581df
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/native-image.properties
@@ -0,0 +1,10 @@
+Args=-H:ReflectionConfigurationResources=${.}/reflection-config.json \
+  -H:ReflectionConfigurationResources=${.}/reflection-docker-java-command.json,${.}/reflection-docker-java-model.json \
+  -H:ReflectionConfigurationResources=${.}/graal-generated/jni-config.json \
+  -H:ReflectionConfigurationResources=${.}/graal-generated/reflect-config.json \
+  -H:IncludeResources=.*.yml|.*.properties|cacerts|logback.xml|org/apache/hc/client5/version.properties|org/slf4j/impl/StaticLoggerBinder.class \
+  -H:+AddAllCharsets \
+  -H:EnableURLProtocols=http,https \
+  --enable-all-security-services \
+  -Dfile.encoding=UTF-8 \
+  -Djavax.net.ssl.trustStore=cacerts
diff --git a/src/main/resources/META-INF/native-image/reflection-config.json b/src/main/resources/META-INF/native-image/reflection-config.json
new file mode 100644
index 00000000..98f24c30
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/reflection-config.json
@@ -0,0 +1,7 @@
+[
+  {
+    "name": "ch.qos.logback.core.ConsoleAppender",
+    "allDeclaredConstructors": true,
+    "allPublicConstructors": true
+  }
+]
diff --git a/src/main/resources/META-INF/native-image/reflection-docker-java-command.json b/src/main/resources/META-INF/native-image/reflection-docker-java-command.json
new file mode 100644
index 00000000..13de6a1e
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/reflection-docker-java-command.json
@@ -0,0 +1,272 @@
+[
+  {
+    "name" : "com.github.dockerjava.api.command.PullImageResultCallback",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.PushImageCmd$1",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateContainerResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.HealthState",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectContainerResponse$ContainerState",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateSecretResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.GraphData",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectExecResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateImageResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectContainerResponse$Node",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateConfigResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectExecResponse$Container",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectContainerResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.ExecCreateCmdResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectVolumeResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateNetworkResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.ListVolumesResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.HealthStateLog",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.GraphDriver",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectContainerResponse$Mount",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectImageResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.TopContainerResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.RootFS",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateServiceResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.InspectExecResponse$ProcessConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.CreateVolumeResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.DelegatingDockerCmdExecFactory",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.LoadImageCallback",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.BuildImageResultCallback",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.command.WaitContainerResultCallback",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  }
+]
diff --git a/src/main/resources/META-INF/native-image/reflection-docker-java-model.json b/src/main/resources/META-INF/native-image/reflection-docker-java-model.json
new file mode 100644
index 00000000..21206103
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/reflection-docker-java-model.json
@@ -0,0 +1,1568 @@
+[
+  {
+    "name" : "com.github.dockerjava.api.model.DockerObject",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResponseItem",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.GenericResource",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ClusterInfo",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.NetworkSettings",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Node",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceUpdateStatus",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Link",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmOrchestration",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceReplicatedModeOptions",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.NetworkAttachmentConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.UpdateConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Ulimit",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PidsStatsConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResponseItem$AuxDetail",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BlkioWeightDevice",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ConfigSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.AuthConfigurations",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerNetworkSettings",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.DeviceRequest",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Secret",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpecPrivileges",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeEngineDescription",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerNetwork$Ipam",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ExternalCA",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.EventActor",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Statistics",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Endpoint",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpecSecret",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodePlatform",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.WaitResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.InfoRegistryConfig$IndexConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerMount",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpecFile",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Version",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.DriverStatus",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmVersion",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Device",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResourceSpecs",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodePluginDescription",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ObjectVersion",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResourceVersion",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.TmpfsOptions",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.EndpointVirtualIP",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.HostConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.StatisticNetworksConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BlkioStatEntry",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Service",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerHostConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ThrottlingDataConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.MemoryStatsConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ErrorDetail",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VersionPlatform",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceRestartPolicy",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmCAConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeResources",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VolumeBind",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Network",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Network$Ipam",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.StatsConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.TaskDefaults",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeVersion",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.InfoRegistryConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerNetwork",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResponseItem$ProgressDetail",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Ports$Binding",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Task",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PortConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceGlobalModeOptions",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Container",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeStatus",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmJoinTokens",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PeerNode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Mount",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SecretSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.TaskSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServicePlacement",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Network$ContainerNetworkConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmDispatcherConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PortBinding",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Identifier",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BlkioStatsConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResourceRequirements",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ResponseItem$ErrorDetail",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeManagerStatus",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Network$Ipam$Config",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeDescription",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SearchItem",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.EndpointSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.RestartPolicy",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.TaskStatus",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.HealthCheck",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Config",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerPort",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Repository",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmInfo",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Info",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Bind",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ChangeLog",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VolumeOptions",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceModeConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VersionComponent",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.TaskStatusContainerStatus",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Frame",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BindOptions",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Driver",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.AuthConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Event",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BlkioRateDevice",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpecPrivilegesSELinuxContext",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.LogConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.CpuUsageConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.CpuStatsConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerDNSConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.AuthResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Image",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmRaftConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpecPrivilegesCredential",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ContainerSpecConfig",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.LxcConf",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PruneResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BuildResponseItem",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PullResponseItem",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PushResponseItem",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.LoadResponseItem",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.UpdateContainerResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceRestartCondition",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeRole",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.EndpointResolutionMode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.UpdateFailureAction",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.StreamType",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ExternalCAProtocol",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PortConfigProtocol",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Reachability",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Isolation",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PropagationMode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.TaskState",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.InternetProtocol",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.UpdateOrder",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.LogConfig$LoggingType",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.MountType",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SELContext",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.AccessMode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.BindPropagation",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeAvailability",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.SwarmNodeState",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PruneType",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Capability",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.PortConfig$PublishMode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceMode",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.LocalNodeState",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.EventType",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ServiceUpdateState",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.NamedResourceSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.DiscreteResourceSpec",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Swarm",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VolumesRW",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VolumesFrom",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ExposedPort",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Volumes",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Volume",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Links",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ExposedPorts",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VolumeRW",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.VolumeBinds",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Ports",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.ErrorResponse",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  },
+  {
+    "name" : "com.github.dockerjava.api.model.Binds",
+    "allDeclaredConstructors" : true,
+    "allPublicConstructors" : true,
+    "allDeclaredMethods" : true,
+    "allPublicMethods" : true,
+    "allPublicFields" : true,
+    "allDeclaredFields" : true
+  }
+]
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
index eb5eef98..36f2398b 100644
--- a/src/main/resources/logback.xml
+++ b/src/main/resources/logback.xml
@@ -1,17 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
-  <property
-    name="log_pattern"
-    value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-15.15thread] %3.-3level \${PID:- } %-0.70logger{35} m=%method l=%line %msg%n}"
-  />
-  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-    <encoder>
-      <pattern>${log_pattern}</pattern>
-      <charset>utf8</charset>
-    </encoder>
-  </appender>
+    <property
+            name="log_pattern"
+            value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-15.15thread] %3.-3level \${PID:- } %-0.70logger{35} m=%method l=%line %msg%n}"
+    />
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log_pattern}</pattern>
+            <charset>utf8</charset>
+        </encoder>
+    </appender>
 
-  <root level="INFO">
-    <appender-ref ref="console"/>
-  </root>
+    <root level="INFO">
+        <appender-ref ref="console"/>
+
+    </root>
+    <logger name="com.mageddo" level="DEBUG"/>
 </configuration>
+
diff --git a/src/main/resources/native-image/native-image.properties b/src/main/resources/native-image/native-image.properties
deleted file mode 100644
index afc0da32..00000000
--- a/src/main/resources/native-image/native-image.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-Args=-H:ReflectionConfigurationResources=${.}/reflection-config.json \
-  -H:IncludeResources=.*.yml|.*.properties|cacerts \
-  -H:+AddAllCharsets \
-  -H:EnableURLProtocols=http,https \
-  --enable-all-security-services \
-  -Dfile.encoding=UTF-8 \
-  -Djavax.net.ssl.trustStore=cacerts
diff --git a/src/main/resources/native-image/reflection-config.json b/src/main/resources/native-image/reflection-config.json
deleted file mode 100644
index fe51488c..00000000
--- a/src/main/resources/native-image/reflection-config.json
+++ /dev/null
@@ -1,1 +0,0 @@
-[]


Test patch:
diff --git a/src/test/java/com/mageddo/dnsproxyserver/dns/server/solver/WildcardsTest.java b/src/test/java/com/mageddo/dnsproxyserver/dns/server/solver/WildcardsTest.java
new file mode 100644
index 00000000..7d08c0bd
--- /dev/null
+++ b/src/test/java/com/mageddo/dnsproxyserver/dns/server/solver/WildcardsTest.java
@@ -0,0 +1,23 @@
+package com.mageddo.dnsproxyserver.dns.server.solver;
+
+import org.junit.jupiter.api.Test;
+
+import static com.mageddo.dnsproxyserver.server.dns.solver.Wildcards.buildHostAndWildcards;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class WildcardsTest {
+  @Test
+  void mustGenerateHostsAndWildcardsTo(){
+    // arrange
+    final var hostname = "bookmarks.mageddo.com";
+
+    // act
+    final var result = buildHostAndWildcards(hostname);
+
+    // assert
+    assertEquals(
+        "[bookmarks.mageddo.com, .bookmarks.mageddo.com, .mageddo.com, .com]",
+        result.toString()
+    );
+  }
+}