diff --git a/src/common.hpp b/src/common.hpp
index 91077ccd9193134dc1d81dc42a1e3102d36c146e..a6739ec1d4295a34bce342eb9135e57974831b0f 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -16,8 +16,14 @@ constexpr size_t DGRAM_BUFFER_SIZE = 20480;
 //   to the real openvpn server.
 constexpr size_t SERVER_ENCRYPT_CONNECTION_TIMEOUT_SECONDS = 60;
 
+#include <random> 
 // MAGIC PORT NUMBER! Warning! Used for Inbound - Outbound IPC talking. Windows wepoll doesn't support PIPE, so I have to use this. 
-constexpr uint16_t TCP_TMP_PORT_NUMBER = 50999;
+uint16_t get_tmp_tcp_port_number() {
+	std::random_device rd;
+    std::mt19937 mt(rd());
+    std::uniform_int_distribution<int> dist(40000, 60000);
+    return dist(mt);
+}
 
 #endif
 
diff --git a/src/filters/base.hpp b/src/filters/base.hpp
index e5b519f7dde1f19347fdab46425ed89bee2cf3e2..fbf5d8d0402e5935017576e51355e7545333a330 100644
--- a/src/filters/base.hpp
+++ b/src/filters/base.hpp
@@ -44,7 +44,7 @@ namespace Filters {
 		// Usually the decrypt/decode/de-obfs function.
 		virtual string convertBackward(string binaryDatagram) override {
 			for (auto iter = chainedFilters.rbegin(); iter != chainedFilters.rend(); ++iter) {
-				binaryDatagram = (*iter)->convertForward(binaryDatagram);
+				binaryDatagram = (*iter)->convertBackward(binaryDatagram);
 			}
 			return binaryDatagram;
 		}
diff --git a/src/filters/xor_encryption.hpp b/src/filters/xor_encryption.hpp
index 639acdd996c411eac43e7f75cedddfbfd160e675..2ab566146266eb580ad739892b4f6aabf903b3b2 100644
--- a/src/filters/xor_encryption.hpp
+++ b/src/filters/xor_encryption.hpp
@@ -21,7 +21,7 @@ namespace Filters {
 		virtual string convertForward(string datagram) override {
 			auto curr_key_digit = 0;
 			for (auto offset = 0; offset < datagram.size(); ++offset) {
-				datagram[0] ^= key[curr_key_digit++];
+				datagram[offset] ^= key[curr_key_digit++];
 			}
 			return datagram;
 		}
diff --git a/src/utils.hpp b/src/utils.hpp
index 89967f4d84dad1e09683615379db0eb588aafe97..d2f133d0fbc6137dee32e41ffbc9d8fb2ea853b2 100644
--- a/src/utils.hpp
+++ b/src/utils.hpp
@@ -79,12 +79,14 @@ inline auto mkpipe() {
 
 inline auto mk_tcp_pipe() {
     sockfd_t connfd_cli_side, connfd_srv_side;
-    auto listenfd = rlib::quick_listen("::1", TCP_TMP_PORT_NUMBER);
+    auto tmp_port = get_tmp_tcp_port_number();
+    auto listenfd = rlib::quick_listen("::1", tmp_port); // We have no UnixSocket on Windows.
     auto serverThread = std::thread([&] {
         connfd_srv_side = rlib::quick_accept(listenfd);
     });
-    connfd_cli_side = rlib::quick_connect("::1", TCP_TMP_PORT_NUMBER);
+    connfd_cli_side = rlib::quick_connect("::1", tmp_port);
     serverThread.join();
+    rlib::sockIO::close_ex(listenfd);
     return std::make_pair(connfd_cli_side, connfd_srv_side);
 }