diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9efc2e0..dab0ab9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,21 +1,4 @@
 # v1.1.2
-## Updates
-*
-
-## Fixes
-*
-
-## Bundled Versions
-* [`P2Pool v3.0`](https://github.com/SChernykh/p2pool/releases/tag/v3.0)
-* [`XMRig v6.18.1`](https://github.com/xmrig/xmrig/releases/tag/v6.18.1)
-
----
-
-
-# v1.2.0
-## Updates
-*
-
 ## Fixes
 *
 
diff --git a/Cargo.lock b/Cargo.lock
index a40f2b3..bf95ca4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -91,9 +91,9 @@ dependencies = [
 
 [[package]]
 name = "anyhow"
-version = "1.0.68"
+version = "1.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
+checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
 
 [[package]]
 name = "arboard"
@@ -1271,9 +1271,9 @@ dependencies = [
 
 [[package]]
 name = "exr"
-version = "1.5.2"
+version = "1.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eb5f255b5980bb0c8cf676b675d1a99be40f316881444f44e0462eaf5df5ded"
+checksum = "e8af5ef47e2ed89d23d0ecbc1b681b30390069de70260937877514377fc24feb"
 dependencies = [
  "bit_field",
  "flume",
@@ -1282,6 +1282,7 @@ dependencies = [
  "miniz_oxide",
  "smallvec",
  "threadpool",
+ "zune-inflate",
 ]
 
 [[package]]
@@ -1798,7 +1799,7 @@ dependencies = [
 
 [[package]]
 name = "gupax"
-version = "1.1.1"
+version = "1.1.2"
 dependencies = [
  "anyhow",
  "arti-client",
@@ -1823,6 +1824,7 @@ dependencies = [
  "regex",
  "rfd",
  "serde",
+ "serde-xml-rs",
  "serde_json",
  "static_vcruntime",
  "sudo",
@@ -3026,9 +3028,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.50"
+version = "1.0.51"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
+checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
 dependencies = [
  "unicode-ident",
 ]
@@ -3434,6 +3436,18 @@ dependencies = [
  "serde_derive",
 ]
 
+[[package]]
+name = "serde-xml-rs"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782"
+dependencies = [
+ "log",
+ "serde",
+ "thiserror",
+ "xml-rs",
+]
+
 [[package]]
 name = "serde_derive"
 version = "1.0.152"
@@ -3456,9 +3470,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.91"
+version = "1.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883"
+checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a"
 dependencies = [
  "itoa",
  "ryu",
@@ -3646,6 +3660,12 @@ version = "1.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
 
+[[package]]
+name = "simd-adler32"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14a5df39617d7c8558154693a1bb8157a4aab8179209540cc0b10e5dc24e0b18"
+
 [[package]]
 name = "simple_asn1"
 version = "0.6.2"
@@ -5474,3 +5494,12 @@ dependencies = [
  "libc",
  "pkg-config",
 ]
+
+[[package]]
+name = "zune-inflate"
+version = "0.2.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c473377c11c4a3ac6a2758f944cd336678e9c977aa0abf54f6450cf77e902d6d"
+dependencies = [
+ "simd-adler32",
+]
diff --git a/Cargo.toml b/Cargo.toml
index 7648ace..18c5652 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "gupax"
-version = "1.2.0"
+version = "1.1.2"
 authors = ["hinto-janaiyo <hinto.janaiyo@protonmail.com>"]
 description = "GUI for P2Pool+XMRig"
 documentation = "https://github.com/hinto-janaiyo/gupax"
@@ -58,6 +58,7 @@ toml = { version = "0.5.9", features = ["preserve_order"] }
 tor-rtcompat = "0.7.0"
 walkdir = "2.3.2"
 zeroize = "1.5.7"
+serde-xml-rs = "0.6.0"
 
 # Unix dependencies
 [target.'cfg(unix)'.dependencies]
diff --git a/src/README.md b/src/README.md
index bff647f..032d426 100644
--- a/src/README.md
+++ b/src/README.md
@@ -18,6 +18,7 @@
 ## Structure
 | File/Folder  | Purpose |
 |--------------|---------|
+| benchmark.rs | Code for handling [XMRig's benchmark data](https://xmrig.com/docs/api/1/benchmark)
 | constants.rs | General constants used in Gupax
 | disk.rs      | Code for writing to disk: `state.toml/node.toml/pool.toml`; This holds the structs for the [State] struct
 | ferris.rs    | Cute crab bytes
diff --git a/src/benchmark.rs b/src/benchmark.rs
new file mode 100644
index 0000000..2bd3977
--- /dev/null
+++ b/src/benchmark.rs
@@ -0,0 +1,87 @@
+// Gupax - GUI Uniting P2Pool And XMRig
+//
+// Copyright (c) 2022 hinto-janaiyo
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+// This file contains backend code for handling XMRig's benchmark data:
+//     - HTTP(s) fetchs to [https://xmrig.com]
+//     - (De)serialization of JSON data
+//     - (De)serialization of CPU topology XML (./xmrig --export topology)
+
+use serde::{Serialize, Deserialize};
+use std::fmt::Write;
+
+// Input: Full [&str] of XMRig's [topology.xml] file
+// Output: The CPU name formatted so it's usable as the endpoint, e.g: [AMD+Ryzen+9+5950X+16-Core+Processor]
+fn cpu_name_from_xml(xml: &str) -> Option<String> {
+	// A minimal matching struct for the [CPUModel] <info> field in the XML file
+	#[derive(Debug, Serialize, Deserialize, PartialEq)]
+	struct Info {      // <info [...] />
+		name: String,  // name="CPUModel"
+		value: String, // value="Ryzen ..."
+	}
+
+	// Regex to find matching field
+	let regex = regex::Regex::new("\"CPUModel\"").unwrap();
+
+	for line in xml.lines() {
+		if !regex.is_match(&line) { continue }
+
+		// If found, attempt to serialize XML proper
+		if let Ok(info) = serde_xml_rs::from_str::<Info>(&line) {
+			// Return early if empty
+			if info.value.is_empty() {
+				return None
+			}
+			// If serialized, turn whitespaces into '+'
+			let words: Vec<&str> = info.value.split_whitespace().collect();
+			let last_word = words.len();
+			let mut result = String::new();
+			let mut n = 1;
+			for word in words.iter() {
+				match n == last_word {
+					false => write!(result, "{}+", word),
+					true  => write!(result, "{}", word),
+				};
+				n += 1;
+			}
+			return Some(result)
+		}
+	}
+
+	// If loop didn't return early, return none
+	None
+}
+
+//---------------------------------------------------------------------------------------------------- TESTS
+#[cfg(test)]
+mod test {
+	#[test]
+	fn get_cpu_from_xml() {
+		let string =
+r#"<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc2.dtd">
+<topology version="2.0">
+  <object type="Machine" os_index="0" cpuset="0xffffffff" complete_cpuset="0xffffffff" allowed_cpuset="0xffffffff" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x00000001" gp_index="1">
+    <info name="DMIBIOSVendor" value="American Megatrends International, LLC."/>
+    <info name="Backend" value="Linux"/>
+    <info name="LinuxCgroup" value="/"/>
+    <info name="OSName" value="Linux"/>
+    <info name="CPUModel" value="AMD Ryzen 9 5950X 16-Core Processor            "/>
+    <info name="CPUStepping" value="0"/>
+"#;
+		assert_eq!(crate::benchmark::cpu_name_from_xml(&string).unwrap(), "AMD+Ryzen+9+5950X+16-Core+Processor");
+	}
+}
diff --git a/src/helper.rs b/src/helper.rs
index 5dac7e5..d3e8f73 100644
--- a/src/helper.rs
+++ b/src/helper.rs
@@ -417,14 +417,15 @@ impl Helper {
 						_ => (),
 					}
 					if !mini { p2pool_image.mini = "P2Pool Main".to_string(); }
+					let arg = if arg == "localhost" { "127.0.0.1" } else { arg };
 					args.push(arg.to_string());
 					last = arg;
 				}
 			// Else, build the argument
 			} else {
-				let ip = if state.selected_ip == "localhost" { "127.0.0.1".to_string() } else { state.selected_ip.to_string() };
+				let ip = if state.selected_ip == "localhost" { "127.0.0.1" } else { &state.selected_ip };
 				args.push("--wallet".to_string());    args.push(state.address.clone());          // Wallet
-				args.push("--host".to_string());      args.push(ip);                             // IP
+				args.push("--host".to_string());      args.push(ip.to_string());                 // IP
 				args.push("--rpc-port".to_string());  args.push(state.selected_rpc.to_string()); // RPC
 				args.push("--zmq-port".to_string());  args.push(state.selected_zmq.to_string()); // ZMQ
 				args.push("--loglevel".to_string());  args.push(state.log_level.to_string());    // Log Level
@@ -799,9 +800,10 @@ impl Helper {
 			// Else, build the argument
 			} else {
 				// XMRig doesn't understand [localhost]
+				let ip = if state.selected_ip == "localhost" || state.selected_ip.is_empty() { "127.0.0.1" } else { &state.selected_ip };
 				api_ip = if state.api_ip == "localhost" || state.api_ip.is_empty() { "127.0.0.1".to_string() } else { state.api_ip.to_string() };
 				api_port = if state.api_port.is_empty() { "18088".to_string() } else { state.api_port.to_string() };
-				let url = format!("{}:{}", state.selected_ip, state.selected_port); // Combine IP:Port into one string
+				let url = format!("{}:{}", ip, state.selected_port); // Combine IP:Port into one string
 				args.push("--user".to_string()); args.push(state.address.clone());                // Wallet
 				args.push("--threads".to_string()); args.push(state.current_threads.to_string()); // Threads
 				args.push("--rig-id".to_string()); args.push(state.selected_rig.to_string());     // Rig ID
diff --git a/src/main.rs b/src/main.rs
index 9e93a18..fc1b395 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -52,6 +52,7 @@ use std::{
 // Sysinfo
 use sysinfo::SystemExt;
 // Modules
+//mod benchmark;
 mod ferris;
 mod constants;
 mod node;