diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java
index 2024b6b..abddf17 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/AbstractSocketServer.java
@@ -70,16 +70,35 @@
         @Option(names = {"--classes", "-C"}, description = "Additional classes to allow deserialization")
         private List<String> allowedClasses;
 
+        @Option(names = { "--wire-format", }, description = "Wire format, one of JSON, SERIALIZED, XML; defaults to JSON.")
+        private WireFormat wireFormat = WireFormat.JSON;
+
+        List<String> getAllowedClasses() {
+            return allowedClasses == null ? Collections.<String>emptyList() : allowedClasses;
+        }
+
         String getConfigLocation() {
             return configLocation;
         }
 
+        boolean getInteractive() {
+            return interactive;
+        }
+
+        InetAddress getLocalBindAddress() {
+            return localBindAddress;
+        }
+
         int getPort() {
             return port;
         }
 
-        protected boolean isInteractive() {
-            return interactive;
+        WireFormat getWireFormat() {
+            return wireFormat;
+        }
+
+        void setAllowedClasses(final List<String> allowedClasses) {
+            this.allowedClasses = allowedClasses;
         }
 
         void setConfigLocation(final String configLocation) {
@@ -90,24 +109,16 @@
             this.interactive = interactive;
         }
 
-        void setPort(final int port) {
-            this.port = port;
-        }
-
-        InetAddress getLocalBindAddress() {
-            return localBindAddress;
-        }
-
         void setLocalBindAddress(final InetAddress localBindAddress) {
             this.localBindAddress = localBindAddress;
         }
 
-        List<String> getAllowedClasses() {
-            return allowedClasses == null ? Collections.<String>emptyList() : allowedClasses;
+        void setPort(final int port) {
+            this.port = port;
         }
 
-        void setAllowedClasses(final List<String> allowedClasses) {
-            this.allowedClasses = allowedClasses;
+        void setWireFormat(final WireFormat wireFormat) {
+            this.wireFormat = Objects.requireNonNull(wireFormat, "wireFormat");
         }
     }
 
@@ -178,27 +189,6 @@
         this.logEventInput = Objects.requireNonNull(logEventInput, "LogEventInput");
     }
 
-    protected boolean isActive() {
-        return this.active;
-    }
-
-    protected void setActive(final boolean isActive) {
-        this.active = isActive;
-    }
-
-    /**
-     * Start this server in a new thread.
-     *
-     * @return the new thread that running this server.
-     */
-    public Thread startNewThread() {
-        final Thread thread = new Log4jThread(this);
-        thread.start();
-        return thread;
-    }
-
-    public abstract void shutdown() throws Exception;
-
     public void awaitTermination(final Thread serverThread) throws Exception {
         final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         while (true) {
@@ -214,4 +204,25 @@
         }
     }
 
+    protected boolean isActive() {
+        return this.active;
+    }
+
+    protected void setActive(final boolean isActive) {
+        this.active = isActive;
+    }
+
+    public abstract void shutdown() throws Exception;
+
+    /**
+     * Start this server in a new thread.
+     *
+     * @return the new thread that running this server.
+     */
+    public Thread startNewThread() {
+        final Thread thread = new Log4jThread(this);
+        thread.start();
+        return thread;
+    }
+
 }
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java
index 71e89e1..29d834b 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/TcpSocketServer.java
@@ -30,20 +30,32 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.parser.ParseException;
-import org.apache.logging.log4j.core.util.Closer;
-import org.apache.logging.log4j.core.util.Log4jThread;
 import org.apache.logging.log4j.core.tools.picocli.CommandLine;
 import org.apache.logging.log4j.core.tools.picocli.CommandLine.Command;
 import org.apache.logging.log4j.core.tools.picocli.CommandLine.Option;
+import org.apache.logging.log4j.core.util.Closer;
+import org.apache.logging.log4j.core.util.Log4jThread;
 import org.apache.logging.log4j.message.EntryMessage;
 
 /**
  * Listens for Log4j events on a TCP server socket and passes them on to Log4j.
  *
- * @param <T>
- *        The kind of input stream read
+ * Example JVM command line:
+ * 
+ * <pre>
+ * -Dlog4j2.configurationFile=src/test/resources/org/apache/logging/log4j/server/log4j-console-debug.xml
+ * </pre>
+ *
+ * Example class arguments:
+ * 
+ * <pre>
+ * --wire-format SERIALIZED
+ * </pre>
+ *
+ * @param <T> The kind of input stream read
  * @see #main(String[])
  */
 public class TcpSocketServer<T extends InputStream> extends AbstractSocketServer<T> {
@@ -51,7 +63,7 @@
     @Command(name = "TcpSocketServer")
     protected static class CommandLineArguments extends AbstractSocketServer.CommandLineArguments {
 
-        @Option(names = { "--backlog", "-b" }, description = "Server socket backlog. Must be a positive integer.")
+        @Option(names = {"--backlog", "-b"}, description = "Server socket backlog. Must be a positive integer.")
         // Same default as ServerSocket
         private int backlog = 50;
 
@@ -118,146 +130,123 @@
     /**
      * Creates a socket server that reads JSON log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
+     * @param port The port number, or 0 to automatically allocate a port number.
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      */
     public static TcpSocketServer<InputStream> createJsonSocketServer(final int port) throws IOException {
         LOGGER.entry("createJsonSocketServer", port);
-        final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, new JsonInputStreamLogEventBridge());
+        final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port,
+            new JsonInputStreamLogEventBridge());
         return LOGGER.exit(socketServer);
     }
 
     /**
      * Creates a socket server that reads JSON log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
-     * @param backlog
-     *        The server socket backlog.
-     * @param localBindAddress
-     *        The local InetAddress the server will bind to
+     * @param port The port number, or 0 to automatically allocate a port number.
+     * @param backlog The server socket backlog.
+     * @param localBindAddress The local InetAddress the server will bind to
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      * @since 2.9
      */
     public static TcpSocketServer<InputStream> createJsonSocketServer(final int port, final int backlog,
-            final InetAddress localBindAddress) throws IOException {
+        final InetAddress localBindAddress) throws IOException {
         LOGGER.entry("createJsonSocketServer", port, backlog, localBindAddress);
         final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, backlog, localBindAddress,
-                new JsonInputStreamLogEventBridge());
+            new JsonInputStreamLogEventBridge());
         return LOGGER.exit(socketServer);
     }
 
     /**
      * Creates a socket server that reads serialized log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
+     * @param port The port number, or 0 to automatically allocate a port number.
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      */
     @Deprecated
     public static TcpSocketServer<ObjectInputStream> createSerializedSocketServer(final int port) throws IOException {
         LOGGER.entry(port);
-        final TcpSocketServer<ObjectInputStream> socketServer = new TcpSocketServer<>(port, new ObjectInputStreamLogEventBridge());
+        final TcpSocketServer<ObjectInputStream> socketServer = new TcpSocketServer<>(port,
+            new ObjectInputStreamLogEventBridge());
         return LOGGER.exit(socketServer);
     }
 
     /**
      * Creates a socket server that reads serialized log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
-     * @param backlog
-     *        The server socket backlog.
-     * @param localBindAddress
-     *        The local InetAddress the server will bind to
+     * @param port The port number, or 0 to automatically allocate a port number.
+     * @param backlog The server socket backlog.
+     * @param localBindAddress The local InetAddress the server will bind to
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      * @since 2.7
      */
     @Deprecated
     public static TcpSocketServer<ObjectInputStream> createSerializedSocketServer(final int port, final int backlog,
-            final InetAddress localBindAddress) throws IOException {
+        final InetAddress localBindAddress) throws IOException {
         return createSerializedSocketServer(port, backlog, localBindAddress, Collections.<String>emptyList());
     }
 
     /**
      * Creates a socket server that reads serialized log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
-     * @param backlog
-     *        The server socket backlog.
-     * @param localBindAddress
-     *        The local InetAddress the server will bind to
+     * @param port The port number, or 0 to automatically allocate a port number.
+     * @param backlog The server socket backlog.
+     * @param localBindAddress The local InetAddress the server will bind to
      * @param allowedClasses additional class names to allow for deserialization
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      * @since 2.8.2
      */
     @Deprecated
-    public static TcpSocketServer<ObjectInputStream> createSerializedSocketServer(
-        final int port, final int backlog, final InetAddress localBindAddress, final List<String> allowedClasses
-    ) throws IOException {
+    public static TcpSocketServer<ObjectInputStream> createSerializedSocketServer(final int port, final int backlog,
+        final InetAddress localBindAddress, final List<String> allowedClasses) throws IOException {
         LOGGER.entry(port);
         final TcpSocketServer<ObjectInputStream> socketServer = new TcpSocketServer<>(port, backlog, localBindAddress,
-                new ObjectInputStreamLogEventBridge(allowedClasses));
+            new ObjectInputStreamLogEventBridge(allowedClasses));
         return LOGGER.exit(socketServer);
     }
 
     /**
      * Creates a socket server that reads XML log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
+     * @param port The port number, or 0 to automatically allocate a port number.
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      */
     public static TcpSocketServer<InputStream> createXmlSocketServer(final int port) throws IOException {
         LOGGER.entry(port);
-        final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, new XmlInputStreamLogEventBridge());
+        final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port,
+            new XmlInputStreamLogEventBridge());
         return LOGGER.exit(socketServer);
     }
 
     /**
      * Creates a socket server that reads XML log events.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
-     * @param backlog
-     *        The server socket backlog.
-     * @param localBindAddress
-     *        The local InetAddress the server will bind to
+     * @param port The port number, or 0 to automatically allocate a port number.
+     * @param backlog The server socket backlog.
+     * @param localBindAddress The local InetAddress the server will bind to
      * @return a new a socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @throws IOException if an I/O error occurs when opening the socket.
      * @since 2.9
      */
-    public static TcpSocketServer<InputStream> createXmlSocketServer(final int port,
-        final int backlog, final InetAddress localBindAddress
-    ) throws IOException {
+    public static TcpSocketServer<InputStream> createXmlSocketServer(final int port, final int backlog,
+        final InetAddress localBindAddress) throws IOException {
         LOGGER.entry(port);
         final TcpSocketServer<InputStream> socketServer = new TcpSocketServer<>(port, backlog, localBindAddress,
-                new XmlInputStreamLogEventBridge());
+            new XmlInputStreamLogEventBridge());
         return LOGGER.exit(socketServer);
     }
 
     /**
      * Main startup for the server. Run with "--help" for to print command line help on the console.
      *
-     * @param args
-     *        The command line arguments.
-     * @throws Exception
-     *         if an error occurs.
+     * @param args The command line arguments.
+     * @throws Exception if an error occurs.
      */
     public static void main(final String[] args) throws Exception {
         CommandLineArguments cla = CommandLine.populateCommand(new CommandLineArguments(), args);
@@ -265,13 +254,30 @@
             CommandLine.usage(cla, System.err);
             return;
         }
+        final TcpSocketServer<? extends InputStream> socketServer;
+        switch (cla.getWireFormat()) {
+        case JSON:
+            socketServer = TcpSocketServer.createJsonSocketServer(cla.getPort(), cla.getBacklog(),
+                cla.getLocalBindAddress());
+            break;
+        case SERIALIZED:
+            socketServer = TcpSocketServer.createSerializedSocketServer(cla.getPort(), cla.getBacklog(),
+                cla.getLocalBindAddress());
+            break;
+        case XML:
+            socketServer = TcpSocketServer.createXmlSocketServer(cla.getPort(), cla.getBacklog(),
+                cla.getLocalBindAddress());
+            break;
+        default:
+            CommandLine.usage(cla, System.err);
+            return;
+        }
         if (cla.getConfigLocation() != null) {
             ConfigurationFactory.setConfigurationFactory(new ServerConfigurationFactory(cla.getConfigLocation()));
         }
-        final TcpSocketServer<InputStream> socketServer = TcpSocketServer.createJsonSocketServer(
-                cla.getPort(), cla.getBacklog(), cla.getLocalBindAddress());
+        LogManager.getLogger().info("Listening on {}", socketServer);
         final Thread serverThread = socketServer.startNewThread();
-        if (cla.isInteractive()) {
+        if (cla.getInteractive()) {
             socketServer.awaitTermination(serverThread);
         }
     }
@@ -283,32 +289,25 @@
     /**
      * Constructor.
      *
-     * @param port
-     *        The port number, or 0 to automatically allocate a port number.
-     * @param backlog
-     *        The server socket backlog.
-     * @param localBindAddress
-     *        The local InetAddress the server will bind to
-     * @param logEventInput
-     *        the log even input
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @param port The port number, or 0 to automatically allocate a port number.
+     * @param backlog The server socket backlog.
+     * @param localBindAddress The local InetAddress the server will bind to
+     * @param logEventInput the log even input
+     * @throws IOException if an I/O error occurs when opening the socket.
      * @since 2.7
      */
     @SuppressWarnings("resource")
-    public TcpSocketServer(final int port, final int backlog, final InetAddress localBindAddress, final LogEventBridge<T> logEventInput) throws IOException {
+    public TcpSocketServer(final int port, final int backlog, final InetAddress localBindAddress,
+        final LogEventBridge<T> logEventInput) throws IOException {
         this(port, logEventInput, new ServerSocket(port, backlog, localBindAddress));
     }
 
     /**
      * Constructor.
      *
-     * @param port
-     *         The port number, or 0 to automatically allocate a port number.
-     * @param logEventInput
-     *        the log even input
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @param port The port number, or 0 to automatically allocate a port number.
+     * @param logEventInput the log even input
+     * @throws IOException if an I/O error occurs when opening the socket.
      */
     @SuppressWarnings("resource")
     public TcpSocketServer(final int port, final LogEventBridge<T> logEventInput) throws IOException {
@@ -318,17 +317,11 @@
     /**
      * Constructor.
      *
-     * @param port
-     *        to listen.
-     * @param logEventInput
-     *        the log even input
-     * @param serverSocket
-     *        the socket server
-     * @throws IOException
-     *         if an I/O error occurs when opening the socket.
+     * @param port to listen.
+     * @param logEventInput the log even input
+     * @param serverSocket the socket server
      */
-    public TcpSocketServer(final int port, final LogEventBridge<T> logEventInput, final ServerSocket serverSocket)
-            throws IOException {
+    public TcpSocketServer(final int port, final LogEventBridge<T> logEventInput, final ServerSocket serverSocket) {
         super(port, logEventInput);
         this.serverSocket = serverSocket;
     }
@@ -389,7 +382,7 @@
     public void shutdown() throws IOException {
         final EntryMessage entry = logger.traceEntry();
         setActive(false);
-        //Thread.currentThread().interrupt();
+        // Thread.currentThread().interrupt();
         serverSocket.close();
         logger.traceExit(entry);
     }
@@ -397,6 +390,6 @@
     @Override
     public String toString() {
         return "TcpSocketServer [serverSocket=" + serverSocket + ", handlers=" + handlers + ", logEventInput="
-                + logEventInput + "]";
+            + logEventInput + "]";
     }
 }
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java
index 17a7cdd..b6b4ada 100644
--- a/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/UdpSocketServer.java
@@ -115,7 +115,7 @@
         final UdpSocketServer<InputStream> socketServer = UdpSocketServer
                 .createJsonSocketServer(cla.getPort());
         final Thread serverThread = socketServer.startNewThread();
-        if (cla.isInteractive()) {
+        if (cla.getInteractive()) {
             socketServer.awaitTermination(serverThread);
         }
     }
diff --git a/log4j-server/src/main/java/org/apache/logging/log4j/server/WireFormat.java b/log4j-server/src/main/java/org/apache/logging/log4j/server/WireFormat.java
new file mode 100644
index 0000000..ff6f078
--- /dev/null
+++ b/log4j-server/src/main/java/org/apache/logging/log4j/server/WireFormat.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+
+package org.apache.logging.log4j.server;
+
+/**
+ * Defines the wire format.
+ * 
+ * @since 2.14.1
+ */
+public enum WireFormat {
+
+    JSON, SERIALIZED, XML
+}
diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/ExampleLoggingProvider.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/ExampleLoggingProvider.java
new file mode 100644
index 0000000..0bd9d76
--- /dev/null
+++ b/log4j-server/src/test/java/org/apache/logging/log4j/server/ExampleLoggingProvider.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.server;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * Example log event provider you can run provided a TCPSocketServer is running first.
+ * 
+ * Example JVM command line:
+ * 
+ * <pre>
+ * -Dlog4j2.configurationFile=src/test/resources/org/apache/logging/log4j/server/log4j-socket-ser-options.xml -DSocketAppender.port=4664
+ * </pre>
+ */
+public class ExampleLoggingProvider {
+
+    public static void main(String[] args) {
+        Logger logger = LogManager.getLogger();
+        long i = 0;
+        while (true) {
+            logger.info("i = {}", i);
+            i++;
+            try {
+                Thread.sleep(200);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                break;
+            }
+        }
+    }
+}
diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java
index 42a9e9e..5717a59 100644
--- a/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java
+++ b/log4j-server/src/test/java/org/apache/logging/log4j/server/SslXmlSocketServerTest.java
@@ -29,7 +29,6 @@
 import org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
 import org.apache.logging.log4j.core.net.ssl.StoreConfigurationException;
-import org.apache.logging.log4j.core.net.ssl.TestConstants;
 import org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
diff --git a/log4j-server/src/test/java/org/apache/logging/log4j/server/TestConstants.java b/log4j-server/src/test/java/org/apache/logging/log4j/server/TestConstants.java
new file mode 100644
index 0000000..f537bb4
--- /dev/null
+++ b/log4j-server/src/test/java/org/apache/logging/log4j/server/TestConstants.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.server;
+
+public class TestConstants {
+
+    public static final String SOURCE_FOLDER = "src/test/resources/";
+    public static final String RESOURCE_ROOT = "org/apache/logging/log4j/server/ssl/";
+
+    public static final String PATH = SOURCE_FOLDER + RESOURCE_ROOT;
+    public static final String TRUSTSTORE_PATH = PATH;
+    public static final String TRUSTSTORE_RESOURCE = RESOURCE_ROOT;
+    public static final String TRUSTSTORE_FILE = TRUSTSTORE_PATH + "truststore.jks";
+    public static final String TRUSTSTORE_FILE_RESOURCE = TRUSTSTORE_RESOURCE + "truststore.jks";
+
+    public static final char[] TRUSTSTORE_PWD() {
+        return "changeit".toCharArray();
+    }
+
+    public static final String TRUSTSTORE_TYPE = "JKS";
+
+    public static final String KEYSTORE_PATH = PATH;
+    public static final String KEYSTORE_RESOURCE = RESOURCE_ROOT;
+    public static final String KEYSTORE_FILE = KEYSTORE_PATH + "client.log4j2-keystore.jks";
+    public static final String KEYSTORE_FILE_RESOURCE = KEYSTORE_RESOURCE + "client.log4j2-keystore.jks";
+
+    public static final char[] KEYSTORE_PWD() {
+        return "changeit".toCharArray();
+    }
+
+    public static final String KEYSTORE_TYPE = "JKS";
+
+    public static final char[] NULL_PWD = null;
+}
diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-console-debug.xml b/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-console-debug.xml
new file mode 100644
index 0000000..6751a52
--- /dev/null
+++ b/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-console-debug.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License. You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="WARN" monitorInterval="5">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <!-- For a color log in the Eclipse console: -->
+      <!-- - Install http://www.mihai-nita.net/eclipse -->
+      <!-- - Use noConsoleNoAnsi="false" -->
+      <PatternLayout noConsoleNoAnsi="false"
+        pattern="%style{%d}{white} %highlight{%-5level}{TRACE=white} %style{[%t]}{yellow}%style{[%logger{1.}]%notEmpty{[%markerSimpleName]}}{white} %highlight{%msg%n%xThrowable}{TRACE=white}" />
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="DEBUG">
+      <AppenderRef ref="Console" />
+    </Root>
+  </Loggers>
+</Configuration>
diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-socket-json-options.xml b/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-socket-json-options.xml
new file mode 100644
index 0000000..d721616
--- /dev/null
+++ b/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-socket-json-options.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License. You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="OFF" name="MyApp">
+  <Appenders>
+    <Socket name="socket" host="localhost" port="${sys:SocketAppender.port}" protocol="TCP" ignoreExceptions="false">
+      <JsonLayout properties="true"/>
+      <SocketOptions keepAlive="false" oobInline="false" receiveBufferSize="10000" reuseAddress="false"
+        rfc1349TrafficClass="IPTOS_LOWCOST" sendBufferSize="8000" soLinger="12345" soTimeout="54321" tcpNoDelay="false">
+        <SocketPerformancePreferences bandwidth="100" connectionTime="100" latency="100" />
+      </SocketOptions>
+    </Socket>
+  </Appenders>
+  <Loggers>
+    <Root level="debug">
+      <AppenderRef ref="socket" />
+    </Root>
+  </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-socket-ser-options.xml b/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-socket-ser-options.xml
new file mode 100644
index 0000000..b17acc9
--- /dev/null
+++ b/log4j-server/src/test/resources/org/apache/logging/log4j/server/log4j-socket-ser-options.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements. See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License. You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<Configuration status="OFF" name="MyApp">
+  <Appenders>
+    <Socket name="socket" host="localhost" port="${sys:SocketAppender.port}" protocol="TCP"
+      ignoreExceptions="false">
+      <SerializedLayout />
+      <SocketOptions keepAlive="false" oobInline="false" receiveBufferSize="10000" reuseAddress="false"
+        rfc1349TrafficClass="IPTOS_LOWCOST" sendBufferSize="8000" soLinger="12345" soTimeout="54321" tcpNoDelay="false">
+        <SocketPerformancePreferences bandwidth="100" connectionTime="100" latency="100" />
+      </SocketOptions>
+    </Socket>
+  </Appenders>
+  <Loggers>
+    <Root level="debug">
+      <AppenderRef ref="socket" />
+    </Root>
+  </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/client.log4j2-keystore.jks b/log4j-server/src/test/resources/org/apache/logging/log4j/server/ssl/client.log4j2-keystore.jks
similarity index 100%
rename from log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/client.log4j2-keystore.jks
rename to log4j-server/src/test/resources/org/apache/logging/log4j/server/ssl/client.log4j2-keystore.jks
Binary files differ
diff --git a/log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/truststore.jks b/log4j-server/src/test/resources/org/apache/logging/log4j/server/ssl/truststore.jks
similarity index 100%
rename from log4j-server/src/test/resources/org/apache/logging/log4j/core/net/ssl/truststore.jks
rename to log4j-server/src/test/resources/org/apache/logging/log4j/server/ssl/truststore.jks
Binary files differ
