diff --git a/src/assets/xterm_config/functionality.js b/src/assets/xterm_config/functionality.js
index 8a0f2ad..cadc65e 100644
--- a/src/assets/xterm_config/functionality.js
+++ b/src/assets/xterm_config/functionality.js
@@ -2,8 +2,10 @@ function optionGenericGet() { return this.el.querySelector("input").value; }
 function optionGenericSet(value) { this.el.querySelector("input").value = value; }
 function optionEnumGet() { return this.el.querySelector("select").value; }
 function optionEnumSet(value) { this.el.querySelector("select").value = value; }
-function optionBoolGet() { return this.el.querySelector("input").value === "true"; }
-function optionBoolSet(value) { this.el.querySelector("input").value = value ? "true" : "false"; }
+function optionBoolGet() { return this.el.querySelector("input").checked; }
+function optionBoolSet(value) { this.el.querySelector("input").checked = value; }
+function optionNumberGet() { return (this.float === true ? parseFloat : parseInt)(this.el.querySelector("input").value); }
+function optionNumberSet(value) { this.el.querySelector("input").value = value; }
 
 const allOptions = [];
 function inflateOptions(optionsSchema) {
@@ -47,6 +49,11 @@ function inflateOptions(optionsSchema) {
 
 			case "number":
 				el = numberOption.cloneNode(true);
+				if (option.float === true) el.querySelector("input").setAttribute("step", "0.001");
+				option.get = optionNumberGet.bind(option);
+				option.set = optionNumberSet.bind(option);
+				if (typeof option.min === "number") el.querySelector("input").setAttribute("min", option.min.toString());
+				if (typeof option.max === "number") el.querySelector("input").setAttribute("max", option.max.toString());
 				break;
 
 			case "color":
@@ -98,17 +105,16 @@ function saveConfig() {
 	const newConfig = {};
 	allOptions.forEach(option => {
 		let newValue = option.get();
-		if (option.nullable === true && option.type === "text" && newValue === "") newValue = undefined;
-		else if (option.nullable === true && option.type === "number" && newValue < 0) newValue = undefined;
+		if (option.nullable === true && ((option.type === "text" && newValue === "") || ( option.type === "number" && newValue < 0))) return;
 		if (option.json === true && option.type === "text") newValue = JSON.parse(newValue);
 		setItem(newConfig, option.path, newValue);
 	});
 	window.wetty_save_config(newConfig);
 };
 
-window.addEventListener("load", () => {
+window.addEventListener("input", () => {
 	const els = document.querySelectorAll("input, select");
-	for (let i = 0; i < els.length; i++) {
+	for (let i = 0; i < els.length; i += 1) {
 		els[i].addEventListener("input", saveConfig);
 	}
 });
diff --git a/src/assets/xterm_config/index.html b/src/assets/xterm_config/index.html
index 1a5953e..16cdf97 100644
--- a/src/assets/xterm_config/index.html
+++ b/src/assets/xterm_config/index.html
@@ -43,7 +43,7 @@
 					<b class="title"></b><br>
 					<span class="desc"></span>
 				</p>
-				<input type="number" size="10" step="0.01" />
+				<input type="number" size="10" />
 			</div>
 			<div class="error_reporting"></div>
 		</div>
diff --git a/src/assets/xterm_config/xterm_advanced_options.js b/src/assets/xterm_config/xterm_advanced_options.js
index 147a826..c99bda7 100644
--- a/src/assets/xterm_config/xterm_advanced_options.js
+++ b/src/assets/xterm_config/xterm_advanced_options.js
@@ -48,6 +48,7 @@ window.inflateOptions([
 		name: "Line Height",
 		description: "Line height, multiplied by the font size to get the height of terminal rows.",
 		path: ["xterm", "lineHeight"],
+		float: true,
 	},
 	{
 		type: "enum",
@@ -73,6 +74,7 @@ window.inflateOptions([
 		name: "Forced Contrast Ratio",
 		description: "Miminum contrast ratio for terminal text. This will alter the foreground color dynamically to ensure the ratio is met. Goes from 1 (do nothing) to 21 (strict black and white).",
 		path: ["xterm", "minimumContrastRatio"],
+		float: true,
 	},
 	{
 		type: "enum",
diff --git a/src/assets/xterm_config/xterm_color_theme.js b/src/assets/xterm_config/xterm_color_theme.js
index 2017b7c..7c1e44f 100644
--- a/src/assets/xterm_config/xterm_color_theme.js
+++ b/src/assets/xterm_config/xterm_color_theme.js
@@ -9,6 +9,9 @@ const selectionColorOpacityOption = {
 	name: "Selection Color Opacity",
 	description: "Opacity of the selection highlight. A value between 1 (fully opaque) and 0 (fully transparent).",
 	path: ["wetty_void"],
+	float: true,
+	min: 0,
+	max: 1,
 };
 
 window.inflateOptions([
@@ -131,7 +134,7 @@ window.inflateOptions([
 ]);
 
 selectionColorOption.get = function() {
-	return this.el.querySelector("input").value + (selectionColorOpacityOption.el.querySelector("input").value * 255).toString(16);
+	return this.el.querySelector("input").value + Math.round(selectionColorOpacityOption.el.querySelector("input").value * 255).toString(16);
 };
 selectionColorOption.set = function(value) {
 	this.el.querySelector("input").value = value.substring(0, 7);
diff --git a/src/assets/xterm_config/xterm_defaults.js b/src/assets/xterm_config/xterm_defaults.js
index 33e10aa..5d7dbb7 100644
--- a/src/assets/xterm_config/xterm_defaults.js
+++ b/src/assets/xterm_config/xterm_defaults.js
@@ -37,7 +37,6 @@ window.loadOptions({
 		windowOptions: {},
 		windowsMode: false,
 		wordSeparator: ' ()[]{}\',"`',
-		altClickMovesCursor: true,
 		convertEol: false,
 		termName: 'xterm',
 		cancelEvents: false,
diff --git a/src/assets/xterm_config/xterm_general_options.js b/src/assets/xterm_config/xterm_general_options.js
index 22df0a3..c4acd77 100644
--- a/src/assets/xterm_config/xterm_general_options.js
+++ b/src/assets/xterm_config/xterm_general_options.js
@@ -10,6 +10,7 @@ window.inflateOptions([
 		name: "Font Size",
 		description: "The font size in CSS pixels for terminal text.",
 		path: ["xterm", "fontSize"],
+		min: 4,
 	},
 	{
 		type: "enum",
@@ -75,6 +76,7 @@ window.inflateOptions([
 		name: "Scroll Sensitivity",
 		description: "The scroll speed multiplier for regular scrolling.",
 		path: ["xterm", "scrollSensitivity"],
+		float: true,
 	},
 	{
 		type: "enum",
@@ -88,6 +90,7 @@ window.inflateOptions([
 		name: "Fast Scroll Multiplier",
 		description: "The scroll speed multiplier used for fast scrolling.",
 		path: ["xterm", "fastScrollSensitivity"],
+		float: true,
 	},
 	{
 		type: "number",
diff --git a/src/client/wetty/term.ts b/src/client/wetty/term.ts
index 1a1582e..b98d89d 100644
--- a/src/client/wetty/term.ts
+++ b/src/client/wetty/term.ts
@@ -17,11 +17,13 @@ export function terminal(socket: typeof Socket): Term | undefined {
   term.loadAddon(fitAddon);
   term.open(termElement);
   term.resizeTerm = () => {
+    term.refresh(0, term.rows - 1);
     if (shouldFitTerm()) fitAddon.fit();
     socket.emit('resize', { cols: term.cols, rows: term.rows });
   };
   configureTerm(term);
   window.onresize = term.resizeTerm;
+  (window as any).wetty_term = term;
 
   return term;
 }
diff --git a/src/client/wetty/term/confiruragtion/editor.ts b/src/client/wetty/term/confiruragtion/editor.ts
index e0c1495..8b1e19b 100644
--- a/src/client/wetty/term/confiruragtion/editor.ts
+++ b/src/client/wetty/term/confiruragtion/editor.ts
@@ -1,28 +1,26 @@
 import type { Term } from '../../shared/type';
-// import { editor } from '../../../shared/elements';
+import { editor } from '../../../shared/elements';
 
 export const onInput = (term: Term, updated: any) => {
   try {
     const updatedConf = JSON.stringify(updated, null, 2);
     if (localStorage.options === updatedConf) return;
 	setOptions(term, updated);
-	requestAnimationFrame(() => {
-	  if (!updated.wetty_fit_terminal && updated.xterm.cols != null && updated.xterm.rows != null) term.resize(updated.xterm.cols, updated.xterm.rows);
-	  term.resizeTerm();
-	});
-    // editor.classList.remove('error');
+    if (!updated.wetty_fit_terminal && updated.xterm.cols != null && updated.xterm.rows != null) term.resize(updated.xterm.cols, updated.xterm.rows);
+    term.resizeTerm();
+    editor.classList.remove('error');
     localStorage.options = updatedConf;
   } catch (e) {
+    console.error("Configuration Error");
     console.error(e);
-    // skip
-    // editor.classList.add('error');
+    editor.classList.add('error');
   }
 };
 
 export function setOptions(term: Term, options: any) {
   Object.keys(options.xterm).forEach(key => {
     if (key === "cols" || key === "rows") return;
-    const value = options[key];
+    const value = options.xterm[key];
     term.setOption(key, value);
   });
 }