diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
new file mode 100644
index 0000000..a621982
--- /dev/null
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
@@ -0,0 +1,63 @@
+package org.cyclopsgroup.jmxterm.jdk9;
+
+import java.io.IOException;
+import org.apache.commons.lang3.Validate;
+import org.cyclopsgroup.jmxterm.JavaProcess;
+import org.cyclopsgroup.jmxterm.utils.WeakCastUtils;
+
+/**
+ * JDK9 specific implementation of {@link JavaProcess}
+ *
+ * @author nyg
+ */
+public class Jdk9JavaProcess implements JavaProcess {
+
+ private final StaticVirtualMachine staticVirtualMachine;
+ private final VirtualMachineDescriptor vmd;
+ private final String address;
+
+ /**
+ * @param staticVm Static VirtualMachine proxy
+ * @param vmd Local VM
+ * @param address Connector address, if any
+ */
+ Jdk9JavaProcess(StaticVirtualMachine staticVm, VirtualMachineDescriptor vmd, String address) {
+ Validate.notNull(vmd, "StaticVirtualMachine can't be NULL");
+ Validate.notNull(vmd, "VirtualMachineDescriptor can't be NULL");
+ this.staticVirtualMachine = staticVm;
+ this.vmd = vmd;
+ this.address = address;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return vmd.displayName();
+ }
+
+ @Override
+ public int getProcessId() {
+ return Integer.parseInt(vmd.id());
+ }
+
+ @Override
+ public boolean isManageable() {
+ return address != null;
+ }
+
+ @Override
+ public void startManagementAgent() throws IOException {
+ Object vm = staticVirtualMachine.attach(vmd.id());
+ try {
+ Class> originalVirtualMachine = Class.forName(VirtualMachine.ORIGINAL_CLASS_NAME);
+ VirtualMachine vmProxy = WeakCastUtils.cast(originalVirtualMachine, VirtualMachine.class);
+ vmProxy.startLocalManagementAgent();
+ } catch (ClassNotFoundException | SecurityException | NoSuchMethodException e) {
+ throw new RuntimeException("Can't cast " + vm + " to VirtualMachineDescriptor", e);
+ }
+ }
+
+ @Override
+ public String toUrl() {
+ return address;
+ }
+}
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
new file mode 100644
index 0000000..2f61353
--- /dev/null
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
@@ -0,0 +1,63 @@
+package org.cyclopsgroup.jmxterm.jdk9;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import org.apache.commons.lang3.Validate;
+import org.cyclopsgroup.jmxterm.JavaProcess;
+import org.cyclopsgroup.jmxterm.JavaProcessManager;
+import org.cyclopsgroup.jmxterm.utils.WeakCastUtils;
+
+/**
+ * JDK9 specific java process manager
+ *
+ * @author nyg
+ */
+public class Jdk9JavaProcessManager extends JavaProcessManager {
+ private final StaticVirtualMachine staticVirtualMachine;
+ private final Class> originalVirtualMachine;
+
+ public Jdk9JavaProcessManager(ClassLoader classLoader)
+ throws SecurityException, NoSuchMethodException, ClassNotFoundException {
+ Validate.notNull(classLoader, "ClassLoader can't be NULL");
+ originalVirtualMachine = classLoader.loadClass(VirtualMachine.ORIGINAL_CLASS_NAME);
+ staticVirtualMachine =
+ WeakCastUtils.staticCast(originalVirtualMachine, StaticVirtualMachine.class);
+ }
+
+ @Override
+ public JavaProcess get(int pid) {
+ return list().stream().filter(process -> process.getProcessId() == pid).findAny().orElse(null);
+ }
+
+ @Override
+ public List list() {
+ List