diff --git a/worldeditadditions/lib/compat/saplingnames.lua b/worldeditadditions/lib/compat/saplingnames.lua
index 937702d..39a0ff3 100644
--- a/worldeditadditions/lib/compat/saplingnames.lua
+++ b/worldeditadditions/lib/compat/saplingnames.lua
@@ -1,3 +1,4 @@
+local wea_c = worldeditadditions_core
 --[[
 This file contains sapling alias definitions for a number of different mods.
 If your mod is not listed here, please open a pull request to add it :-)
@@ -7,15 +8,16 @@ This mod's repository can be found here: https://github.com/sbrl/Minetest-WorldE
 Adding support for your mod is a 2 step process:
 
 1. Update this file with your definitions
-2. Update depends.txt to add a soft dependency on your mod. Find that file here: https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/worldeditadditions/depends.txt - for example, add something line "my_awesome_mod?" (note the question mark at the end) on a new line(without quotes).
+2. Update depends.txt to add a soft dependency on your mod. Find that file here: https://github.com/sbrl/Minetest-WorldEditAdditions/blob/main/worldeditadditions/depends.txt - for example, add something line "my_awesome_mod?" (note the question mark at the end) on a new line(without quotes).
 
-Alternatively, you can register support in your mod directly. Do that by adding a soft dependency on worldeditadditions, and then calling worldeditadditions.normalise_saplingname if worldeditadditions is loaded.
+Alternatively, you can register support in your mod directly. Do that by adding a soft dependency on worldeditadditions_core, and then calling worldeditadditions_core.normalise_saplingname if worldeditadditions is loaded.
 ]]--
 
--- worldeditadditions.register_sapling_alias("")
+-- TODO: MOVE register_sapling_alias & register_sapling_alias_many back to worldeditadditions from worldeditadditions_core!!!!
+-- wea_c.register_sapling_alias("")
 
 if minetest.get_modpath("default") then
-	worldeditadditions.register_sapling_alias_many({
+	wea_c.register_sapling_alias_many({
 		{ "default:sapling", "apple" },
 		{ "default:bush_sapling", "bush" },
 		{ "default:pine_sapling", "pine" },
@@ -31,7 +33,7 @@ if minetest.get_modpath("default") then
 end
 
 if minetest.get_modpath("moretrees") then
-	worldeditadditions.register_sapling_alias_many({
+	wea_c.register_sapling_alias_many({
 		{ "moretrees:spruce_sapling_ongen", "spruce" },
 		{ "moretrees:rubber_tree_sapling_ongen", "rubber" },
 		{ "moretrees:beech_sapling_ongen", "beech" },
@@ -51,7 +53,7 @@ if minetest.get_modpath("moretrees") then
 end
 
 if minetest.get_modpath("ethereal") then
-	worldeditadditions.register_sapling_alias_many({
+	wea_c.register_sapling_alias_many({
 		{ "ethereal:mushroom_sapling", "mushroom" },
 		{ "ethereal:sakura_sapling", "sakura" },
 		{ "ethereal:birch_sapling", "birch" },
@@ -75,56 +77,56 @@ end
 --  ██████  ██████   ██████  ███████ ███████ ██    ██   ██ ███████ ███████ ███████
 
 if minetest.get_modpath("lemontree") then
-	worldeditadditions.register_sapling_alias("lemontree:sapling", "lemon")
+	wea_c.register_sapling_alias("lemontree:sapling", "lemon")
 end
 if minetest.get_modpath("pineapple") then
-	worldeditadditions.register_sapling_alias("pineapple:sapling", "pineapple")
+	wea_c.register_sapling_alias("pineapple:sapling", "pineapple")
 end
 if minetest.get_modpath("baldcypress") then
-	worldeditadditions.register_sapling_alias("baldcypress:sapling", "baldcypress")
+	wea_c.register_sapling_alias("baldcypress:sapling", "baldcypress")
 end
 if minetest.get_modpath("bamboo") then
-	worldeditadditions.register_sapling_alias("bamboo:sprout", "bamboo")
+	wea_c.register_sapling_alias("bamboo:sprout", "bamboo")
 end
 if minetest.get_modpath("birch") then
-	worldeditadditions.register_sapling_alias("birch:sapling", "birch")
+	wea_c.register_sapling_alias("birch:sapling", "birch")
 end
 if minetest.get_modpath("cherrytree") then
-	worldeditadditions.register_sapling_alias("cherrytree:sapling", "cherry")
+	wea_c.register_sapling_alias("cherrytree:sapling", "cherry")
 end
 if minetest.get_modpath("clementinetree") then
-	worldeditadditions.register_sapling_alias("clementinetree:sapling", "clementine")
+	wea_c.register_sapling_alias("clementinetree:sapling", "clementine")
 end
 if minetest.get_modpath("ebony") then
-	worldeditadditions.register_sapling_alias("ebony:sapling", "ebony")
+	wea_c.register_sapling_alias("ebony:sapling", "ebony")
 end
 if minetest.get_modpath("jacaranda") then
-	worldeditadditions.register_sapling_alias("jacaranda:sapling", "jacaranda")
+	wea_c.register_sapling_alias("jacaranda:sapling", "jacaranda")
 end
 if minetest.get_modpath("larch") then
-	worldeditadditions.register_sapling_alias("larch:sapling", "larch")
+	wea_c.register_sapling_alias("larch:sapling", "larch")
 end
 if minetest.get_modpath("maple") then
-	worldeditadditions.register_sapling_alias("maple:sapling", "maple")
+	wea_c.register_sapling_alias("maple:sapling", "maple")
 end
 if minetest.get_modpath("palm") then
-	worldeditadditions.register_sapling_alias("palm:sapling", "palm")
+	wea_c.register_sapling_alias("palm:sapling", "palm")
 end
 if minetest.get_modpath("plumtree") then
-	worldeditadditions.register_sapling_alias("plumtree:sapling", "plum")
+	wea_c.register_sapling_alias("plumtree:sapling", "plum")
 end
 if minetest.get_modpath("hollytree") then
-	worldeditadditions.register_sapling_alias("hollytree:sapling", "holly")
+	wea_c.register_sapling_alias("hollytree:sapling", "holly")
 end
 if minetest.get_modpath("pomegranate") then
-	worldeditadditions.register_sapling_alias("pomegranate:sapling", "pomegranate")
+	wea_c.register_sapling_alias("pomegranate:sapling", "pomegranate")
 end
 if minetest.get_modpath("willow") then
-	worldeditadditions.register_sapling_alias("willow:sapling", "willow")
+	wea_c.register_sapling_alias("willow:sapling", "willow")
 end
 if minetest.get_modpath("mahogany") then
-	worldeditadditions.register_sapling_alias("mahogany:sapling", "mahogany")
+	wea_c.register_sapling_alias("mahogany:sapling", "mahogany")
 end
 if minetest.get_modpath("chestnuttree") then
-	worldeditadditions.register_sapling_alias("chestnuttree:sapling", "chestnut")
+	wea_c.register_sapling_alias("chestnuttree:sapling", "chestnut")
 end
diff --git a/worldeditadditions/lib/conv/conv.lua b/worldeditadditions/lib/conv/conv.lua
index eec69b3..6a43996 100644
--- a/worldeditadditions/lib/conv/conv.lua
+++ b/worldeditadditions/lib/conv/conv.lua
@@ -1,5 +1,6 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 wea.conv = {}
 
@@ -62,8 +63,8 @@ function wea.convolve(pos1, pos2, kernel, kernel_size)
 	
 	local node_id_air = minetest.get_content_id("air")
 	
-	local heightmap, heightmap_size = wea.terrain.make_heightmap(pos1, pos2, manip, area, data)
-	local heightmap_conv = wea.table.shallowcopy(heightmap)
+	local heightmap, heightmap_size = wea_c.terrain.make_heightmap(pos1, pos2, manip, area, data)
+	local heightmap_conv = wea_c.table.shallowcopy(heightmap)
 	
 	wea.conv.convolve(
 		heightmap_conv,
@@ -77,7 +78,7 @@ function wea.convolve(pos1, pos2, kernel, kernel_size)
 	-- print("transformed")
 	-- wea.format.array_2d(heightmap_conv, (pos2.z - pos1.z) + 1)
 	
-	wea.terrain.apply_heightmap_changes(
+	wea_c.terrain.apply_heightmap_changes(
 		pos1, pos2, area, data,
 		heightmap, heightmap_conv, heightmap_size
 	)
diff --git a/worldeditadditions/lib/conv/convolve.lua b/worldeditadditions/lib/conv/convolve.lua
index 50b86d0..ae63c41 100644
--- a/worldeditadditions/lib/conv/convolve.lua
+++ b/worldeditadditions/lib/conv/convolve.lua
@@ -1,5 +1,5 @@
-local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 --[[
 Convolves over a given 2D heightmap with a given matrix.
 Note that this *mutates* the given heightmap.
@@ -17,7 +17,7 @@ function worldeditadditions.conv.convolve(heightmap, heightmap_size, matrix, mat
 	-- We need to reference a *copy* of the heightmap when convolving
 	-- This is because we need the original values when we perform a
 	-- convolution on a given pixel
-	local heightmap_copy = wea.table.shallowcopy(heightmap)
+	local heightmap_copy = wea_c.table.shallowcopy(heightmap)
 	
 	local border_size = Vector3.new(
 		(matrix_size.x-1) / 2,		-- x = height
diff --git a/worldeditadditions/lib/conv/kernel_gaussian.lua b/worldeditadditions/lib/conv/kernel_gaussian.lua
index 4df20c9..19fab0f 100644
--- a/worldeditadditions/lib/conv/kernel_gaussian.lua
+++ b/worldeditadditions/lib/conv/kernel_gaussian.lua
@@ -1,3 +1,4 @@
+local wea_c = worldeditadditions_core
 -- Ported from Javascript by Starbeamrainbowlabs
 -- Original source: https://github.com/sidorares/gaussian-convolution-kernel/
 -- From 
@@ -27,7 +28,7 @@ function worldeditadditions.conv.kernel_gaussian(dimension, sigma)
 	local sum = 0
 	for i = 0, dimension-1 do
 		for j = 0, dimension-1 do
-			local distance = worldeditadditions.hypotenuse(i, j, centre, centre)
+			local distance = wea_c.hypotenuse(i, j, centre, centre)
 
 			-- The following is an algorithm that came from the gaussian blur
 			-- wikipedia page [1].
diff --git a/worldeditadditions/lib/erode/erode.lua b/worldeditadditions/lib/erode/erode.lua
index be16a9a..ffd610b 100644
--- a/worldeditadditions/lib/erode/erode.lua
+++ b/worldeditadditions/lib/erode/erode.lua
@@ -1,4 +1,5 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
 wea.erode = {}
 
 dofile(wea.modpath.."/lib/erode/snowballs.lua")
@@ -18,12 +19,12 @@ function wea.erode.run(pos1, pos2, algorithm, params)
 	
 	local region_height = (pos2.y - pos1.y) + 1
 	
-	local heightmap = wea.terrain.make_heightmap(pos1, pos2, manip, area, data)
-	local heightmap_eroded = wea.table.shallowcopy(heightmap)
+	local heightmap = wea_c.terrain.make_heightmap(pos1, pos2, manip, area, data)
+	local heightmap_eroded = wea_c.table.shallowcopy(heightmap)
 	
 	-- print("[erode.run] algorithm: "..algorithm..", params:");
-	-- print(wea.format.map(params))
-	-- wea.format.array_2d(heightmap, heightmap_size.x)
+	-- print(wea_c.format.map(params))
+	-- wea_c.format.array_2d(heightmap, heightmap_size.x)
 	local success, msg, stats
 	if algorithm == "snowballs" then
 		success, msg = wea.erode.snowballs(
@@ -49,7 +50,7 @@ function wea.erode.run(pos1, pos2, algorithm, params)
 		return false, "Error: Unknown algorithm '"..algorithm.."'. Currently implemented algorithms: snowballs (2d; hydraulic-like), river (2d; cellular automata-like; fills potholes and lowers towers). Ideas for algorithms to implement are welcome!"
 	end
 	
-	success, stats = wea.terrain.apply_heightmap_changes(
+	success, stats = wea_c.terrain.apply_heightmap_changes(
 		pos1, pos2, area, data,
 		heightmap, heightmap_eroded, heightmap_size
 	)
diff --git a/worldeditadditions/lib/erode/river.lua b/worldeditadditions/lib/erode/river.lua
index 4d4fda8..a411753 100644
--- a/worldeditadditions/lib/erode/river.lua
+++ b/worldeditadditions/lib/erode/river.lua
@@ -1,12 +1,13 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
 
 --- Parses a comma-separated side numbers list out into a list of numbers.
 -- @param	list	string	The command separated list to parse.
 -- @returns	number[]		A list of side numbers.
 local function parse_sides_list(list)
 	list = list:gsub("%s", "")	-- Spaces are not permitted
-	return wea.table.unique(wea.table.map(
-		wea.split(list, ","),
+	return wea_c.table.unique(wea_c.table.map(
+		wea_c.split(list, ","),
 		function(value) return tonumber(value) end
 	))
 end
@@ -20,7 +21,7 @@ function worldeditadditions.erode.river(heightmap_initial, heightmap, heightmap_
 		dolower = true			-- Whether to do lower operations or not
 	}
 	-- Apply the custom settings
-	wea.table.apply(params_custom, params)
+	wea_c.table.apply(params_custom, params)
 	
 	params.lower_sides = parse_sides_list(params.lower_sides)
 	params.raise_sides = parse_sides_list(params.raise_sides)
@@ -30,8 +31,8 @@ function worldeditadditions.erode.river(heightmap_initial, heightmap, heightmap_
 	local removed = 0
 	for i=1,params.steps do
 		-- print("[DEBUG:river] step ", i)
-		-- wea.format.array_2d(heightmap, heightmap_size.x)
-		local time_start = wea.get_ms_time()
+		-- wea_c.format.array_2d(heightmap, heightmap_size.x)
+		local time_start = wea_c.get_ms_time()
 		
 		-- Store up changes to make and make them at the end of the step
 		-- This is important, because decisions 
@@ -105,7 +106,7 @@ function worldeditadditions.erode.river(heightmap_initial, heightmap, heightmap_
 					removed = removed + 1
 				end
 				-- print("[DEBUG:river] sides_higher", sides_higher, "sides_lower", sides_lower, "action", action)
-				-- wea.format.array_2d(heightmap, heightmap_size.x)
+				-- wea_c.format.array_2d(heightmap, heightmap_size.x)
 			end
 		end
 		
@@ -116,8 +117,8 @@ function worldeditadditions.erode.river(heightmap_initial, heightmap, heightmap_
 			heightmap[hi] = heightmap[hi] - 1
 		end
 		
-		table.insert(timings, wea.get_ms_time() - time_start)
+		table.insert(timings, wea_c.get_ms_time() - time_start)
 	end
 	
-	return true, params.steps.." steps made, raising "..filled.." and lowering "..removed.." columns in "..wea.format.human_time(wea.sum(timings)).." (~"..wea.format.human_time(wea.average(timings)).." per step)"
+	return true, params.steps.." steps made, raising "..filled.." and lowering "..removed.." columns in "..wea_c.format.human_time(wea_c.sum(timings)).." (~"..wea_c.format.human_time(wea_c.average(timings)).." per step)"
 end
diff --git a/worldeditadditions/lib/erode/snowballs.lua b/worldeditadditions/lib/erode/snowballs.lua
index cc10ba5..0e70890 100644
--- a/worldeditadditions/lib/erode/snowballs.lua
+++ b/worldeditadditions/lib/erode/snowballs.lua
@@ -1,16 +1,19 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
+
 
 -- Test command: //multi //fp set1 1313 6 5540 //fp set2 1338 17 5521 //erode snowballs
 
 local function snowball(heightmap, normalmap, heightmap_size, startpos, params)
 	local sediment = 0
-	local pos = { x = startpos.x, z = startpos.z }
-	local pos_prev = { x = pos.x, z = pos.z }
-	local velocity = {
-		x = (math.random() * 2 - 1) * params.init_velocity,
-		z = (math.random() * 2 - 1) * params.init_velocity
-	}
+	local pos = Vector3.new(startpos.x, 0, startpos.z) -- X/Z
+	local pos_prev = Vector3.new(pos.x, 0, pos.z) -- X/Z
+	local velocity = Vector3.new(
+		(math.random() * 2 - 1) * params.init_velocity,
+		0,
+		(math.random() * 2 - 1) * params.init_velocity
+	) -- X/Z
 	local heightmap_length = #heightmap
 	
 	-- print("[snowball] startpos ("..pos.x..", "..pos.z.."), velocity: ("..velocity.x..", "..velocity.z..")")
@@ -29,7 +32,7 @@ local function snowball(heightmap, normalmap, heightmap_size, startpos, params)
 		end
 		
 		if #hist_velocity > 0 and i > 5
-			and wea.average(hist_velocity) < 0.03 then
+			and wea_c.average(hist_velocity) < 0.03 then
 			-- print("[snowball] It looks like we've stopped")
 			return true, i
 		end
@@ -50,13 +53,13 @@ local function snowball(heightmap, normalmap, heightmap_size, startpos, params)
 		end
 		
 		velocity.x = params.friction * velocity.x + normalmap[hi].x * params.speed
+		velocity.y = 0 -- Just in case
 		velocity.z = params.friction * velocity.z + normalmap[hi].y * params.speed
-		
 		-- print("[snowball] now at ("..x..", "..z..") velocity "..wea.vector.lengthsquared(velocity)..", sediment "..sediment)
-		local new_vel_sq = wea.vector.lengthsquared(velocity)
+		local new_vel_sq = velocity:length_squared()
 		if new_vel_sq > 1 then
 			-- print("[snowball] velocity squared over 1, normalising")
-			velocity = wea.vector.normalize(velocity)
+			velocity = velocity:normalise()
 		end
 		table.insert(hist_velocity, new_vel_sq)
 		if #hist_velocity > params.velocity_hist_count then table.remove(hist_velocity, 1) end
@@ -89,12 +92,12 @@ function wea.erode.snowballs(heightmap_initial, heightmap, heightmap_size, regio
 		count = 25000
 	}
 	-- Apply the custom settings
-	wea.table.apply(params_custom, params)
+	wea_c.table.apply(params_custom, params)
 	
 	-- print("[erode/snowballs] params: ")
-	-- print(wea.format.map(params))
+	-- print(wea_c.format.map(params))
 	
-	local normals = wea.terrain.calculate_normals(heightmap, heightmap_size)
+	local normals = wea_c.terrain.calculate_normals(heightmap, heightmap_size)
 	
 	local stats_steps = {}
 	for i = 1, params.count do
@@ -142,5 +145,5 @@ function wea.erode.snowballs(heightmap_initial, heightmap, heightmap_size, regio
 		)
 	end
 	
-	return true, ""..#stats_steps.." snowballs simulated, max "..params.max_steps.." steps (averaged ~"..wea.average(stats_steps).." steps)"
+	return true, ""..#stats_steps.." snowballs simulated, max "..params.max_steps.." steps (averaged ~"..wea_c.average(stats_steps).." steps)"
 end
diff --git a/worldeditadditions/lib/metaballs/playerdata.lua b/worldeditadditions/lib/metaballs/playerdata.lua
index 4edf96f..18fe1a8 100644
--- a/worldeditadditions/lib/metaballs/playerdata.lua
+++ b/worldeditadditions/lib/metaballs/playerdata.lua
@@ -1,5 +1,7 @@
-local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
+
+
 
 local metaballdata = {}
 
@@ -9,7 +11,7 @@ local metaballdata = {}
 -- @param	radius		number	The radius of the metaball.
 -- @returns	bool,number	The number of metaballs now defined for the given player.
 local function add(player_name, pos, radius)
-	local pos = Vector3.clone(pos)
+	pos = Vector3.clone(pos)
 	
 	if type(player_name) ~= "string" then
 		return false, "Error: Invalid player name specified."
@@ -63,7 +65,7 @@ local function list_pretty(player_name)
 		})
 	end
 	
-	return true, wea.format.make_ascii_table(rows).."\n---------------------------\nTotal "..tostring(#metaball_list).." metaballs"
+	return true, wea_c.format.make_ascii_table(rows).."\n---------------------------\nTotal "..tostring(#metaball_list).." metaballs"
 end
 
 --- Removes the metaball with the specified index for a given player.
diff --git a/worldeditadditions/lib/metaballs/render.lua b/worldeditadditions/lib/metaballs/render.lua
index 660c3e6..555934c 100644
--- a/worldeditadditions/lib/metaballs/render.lua
+++ b/worldeditadditions/lib/metaballs/render.lua
@@ -1,5 +1,6 @@
-local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
+
 
 -- ███    ███ ███████ ████████  █████  ██████   █████  ██      ██      ███████
 -- ████  ████ ██         ██    ██   ██ ██   ██ ██   ██ ██      ██      ██
diff --git a/worldeditadditions/lib/noise/apply_2d.lua b/worldeditadditions/lib/noise/apply_2d.lua
index 1885871..884384f 100644
--- a/worldeditadditions/lib/noise/apply_2d.lua
+++ b/worldeditadditions/lib/noise/apply_2d.lua
@@ -1,9 +1,10 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
 
 
 --- Applies the given noise field to the given heightmap.
 -- Mutates the given heightmap.
--- @param	heightmap		number[]			A table of ZERO indexed numbers representing the heghtmap - see worldeditadditions.terrain.make_heightmap().
+-- @param	heightmap		number[]			A table of ZERO indexed numbers representing the heghtmap - see wea_c.terrain.make_heightmap().
 -- @param	noise			number[]			An table identical in structure to the heightmap containing the noise values to apply.
 -- @param	heightmap_size	{x:number,z:number}	A 2d vector representing the size of the heightmap.
 -- @param	region_height	number				The height of the defined region.
@@ -18,7 +19,7 @@ function wea.noise.apply_2d(heightmap, noise, heightmap_size, pos1, pos2, apply_
 	
 	
 	-- print("NOISE APPLY_2D\n")
-	wea.format.array_2d(noise, heightmap_size.x)
+	wea_c.format.array_2d(noise, heightmap_size.x)
 	
 	
 	local height = tonumber(apply_mode)
@@ -29,15 +30,15 @@ function wea.noise.apply_2d(heightmap, noise, heightmap_size, pos1, pos2, apply_
 			local i = (z * heightmap_size.x) + x
 			
 			if apply_mode == "add" then
-				heightmap[i] = wea.round(heightmap[i] + noise[i])
+				heightmap[i] = wea_c.round(heightmap[i] + noise[i])
 			elseif apply_mode == "multiply" then
-				heightmap[i] = wea.round(heightmap[i] * noise[i])
+				heightmap[i] = wea_c.round(heightmap[i] * noise[i])
 			elseif height then
 				-- Rescale from 0 - 1 to -1 - +1
 				local rescaled = (noise[i] * 2) - 1
 				-- Rescale to match the height specified
 				rescaled = rescaled * height
-				rescaled = math.floor(wea.clamp(
+				rescaled = math.floor(wea_c.clamp(
 					heightmap[i] + rescaled,
 					0, region_height
 				))
@@ -54,7 +55,7 @@ function wea.noise.apply_2d(heightmap, noise, heightmap_size, pos1, pos2, apply_
 	-- end
 	
 	-- print("HEIGHTMAP\n")
-	-- worldeditadditions.format.array_2d(heightmap, heightmap_size.x)
+	-- wea_c.format.array_2d(heightmap, heightmap_size.x)
 	
 	
 	return true
diff --git a/worldeditadditions/lib/noise/engines/infrared.lua b/worldeditadditions/lib/noise/engines/infrared.lua
index 469cec9..4b2ea7b 100644
--- a/worldeditadditions/lib/noise/engines/infrared.lua
+++ b/worldeditadditions/lib/noise/engines/infrared.lua
@@ -1,4 +1,6 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 local White = dofile(wea.modpath.."/lib/noise/engines/white.lua")
 
@@ -25,7 +27,7 @@ function Infrared:noise( x, y, z )
 			end
 		end
 	end
-	return wea.average(values)
+	return wea_c.average(values)
 end
 
 return Infrared
diff --git a/worldeditadditions/lib/noise/engines/perlin.lua b/worldeditadditions/lib/noise/engines/perlin.lua
index 3c4777f..a46717a 100644
--- a/worldeditadditions/lib/noise/engines/perlin.lua
+++ b/worldeditadditions/lib/noise/engines/perlin.lua
@@ -1,4 +1,6 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 --- Perlin noise generation engine.
 -- Original code by Ken Perlin: http://mrl.nyu.edu/~perlin/noise/
@@ -58,9 +60,9 @@ end
 function Perlin:noise( x, y, z )
 	y = y or 0
 	z = z or 0
-	local xi = wea.bit.band(math.floor(x), 255)
-	local yi = wea.bit.band(math.floor(y), 255)
-	local zi = wea.bit.band(math.floor(z), 255)
+	local xi = wea_c.bit.band(math.floor(x), 255)
+	local yi = wea_c.bit.band(math.floor(y), 255)
+	local zi = wea_c.bit.band(math.floor(z), 255)
 	
 	-- print("x", x, "y", y, "z", z, "xi", xi, "yi", yi, "zi", zi)
 	-- print("p[xi]", self.p[xi])
@@ -118,7 +120,7 @@ function Perlin:lerp(t, a, b)
 end
 
 function Perlin:grad(hash, x, y, z)
-	local h = wea.bit.band(hash, 15)
+	local h = wea_c.bit.band(hash, 15)
 	local u = h < 8 and x or y
 	local v = h < 4 and y or ((h == 12 or h == 14) and x or z)
 	return ((h and 1) == 0 and u or - u) + ((h and 2) == 0 and v or - v)
diff --git a/worldeditadditions/lib/noise/engines/perlinmt.lua b/worldeditadditions/lib/noise/engines/perlinmt.lua
index 711f429..300400f 100644
--- a/worldeditadditions/lib/noise/engines/perlinmt.lua
+++ b/worldeditadditions/lib/noise/engines/perlinmt.lua
@@ -1,4 +1,5 @@
-local wea = worldeditadditions
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 
 local PerlinMT = {}
@@ -25,7 +26,7 @@ function PerlinMT.new(seed, params)
 end
 
 function PerlinMT:noise( x, y, z )
-	local value = self.engine:get_3d(wea.Vector3.new(x, y, z))
+	local value = self.engine:get_3d(Vector3.new(x, y, z))
 	return value
 end
 
diff --git a/worldeditadditions/lib/noise/engines/red.lua b/worldeditadditions/lib/noise/engines/red.lua
index 3ff9e13..63e7530 100644
--- a/worldeditadditions/lib/noise/engines/red.lua
+++ b/worldeditadditions/lib/noise/engines/red.lua
@@ -1,4 +1,5 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
 
 local White = dofile(wea.modpath.."/lib/noise/engines/white.lua")
 
@@ -33,7 +34,7 @@ function Red:noise( x, y, z )
 		self.white:noise(x + 1, y + 1, z),
 		self.white:noise(x + 1, y + 1, z + 1),
 	}
-	return wea.average(values)
+	return wea_c.average(values)
 end
 
 return Red
diff --git a/worldeditadditions/lib/noise/engines/sin.lua b/worldeditadditions/lib/noise/engines/sin.lua
index 1db6b7e..3f30610 100644
--- a/worldeditadditions/lib/noise/engines/sin.lua
+++ b/worldeditadditions/lib/noise/engines/sin.lua
@@ -1,5 +1,3 @@
-local wea = worldeditadditions
-
 
 local Sin = {}
 Sin.__index = Sin
diff --git a/worldeditadditions/lib/noise/engines/white.lua b/worldeditadditions/lib/noise/engines/white.lua
index 773fd12..855f4ac 100644
--- a/worldeditadditions/lib/noise/engines/white.lua
+++ b/worldeditadditions/lib/noise/engines/white.lua
@@ -1,4 +1,3 @@
-local wea = worldeditadditions
 
 
 local White = {}
diff --git a/worldeditadditions/lib/noise/make_2d.lua b/worldeditadditions/lib/noise/make_2d.lua
index 2c69949..0658298 100644
--- a/worldeditadditions/lib/noise/make_2d.lua
+++ b/worldeditadditions/lib/noise/make_2d.lua
@@ -1,10 +1,11 @@
+local wea = worldeditadditions
+local wea_c = worldeditadditions_core
 
 -- ███    ███  █████  ██   ██ ███████         ██████  ██████
 -- ████  ████ ██   ██ ██  ██  ██                   ██ ██   ██
 -- ██ ████ ██ ███████ █████   █████            █████  ██   ██
 -- ██  ██  ██ ██   ██ ██  ██  ██              ██      ██   ██
 -- ██      ██ ██   ██ ██   ██ ███████ ███████ ███████ ██████
-local wea = worldeditadditions
 
 -- Generate a flat array of 2D noise.
 -- Written with help from https://www.redblobgames.com/maps/terrain-from-noise/
@@ -55,7 +56,7 @@ function worldeditadditions.noise.make_2d(size, start_pos, params)
 	
 	
 	print("NOISE MAKE_2D\n")
-	worldeditadditions.format.array_2d(result, size.x)
+	wea_c.format.array_2d(result, size.x)
 	
 	
 	-- We don't round here, because otherwise when we apply it it'll be inaccurate
diff --git a/worldeditadditions/lib/noise/params_apply_default.lua b/worldeditadditions/lib/noise/params_apply_default.lua
index a2bf2fd..c35ca19 100644
--- a/worldeditadditions/lib/noise/params_apply_default.lua
+++ b/worldeditadditions/lib/noise/params_apply_default.lua
@@ -1,4 +1,6 @@
 local wea = worldeditadditions
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 --- Makes sure that the default settings are all present in the given params table.
 -- This way not all params have to be specified by the user.
@@ -15,9 +17,9 @@ function worldeditadditions.noise.params_apply_default(params)
 		-- The backend noise algorithm to use
 		algorithm = "perlinmt",
 		-- Zooms in and out
-		scale = wea.Vector3.new(1, 1, 1),
+		scale = Vector3.new(1, 1, 1),
 		-- Offset the generated noise by this vector.
-		offset = wea.Vector3.new(0, 0, 0),
+		offset = Vector3.new(0, 0, 0),
 		-- Apply this exponent to the resulting noise value
 		exponent = 1,
 		-- Multiply the resulting noise value by this number. Changes the "strength" of the noise
@@ -34,7 +36,7 @@ function worldeditadditions.noise.params_apply_default(params)
 	-- If params[1] is thing, this is a list of params
 	-- This might be a thing if we're dealing with multiple octaves
 	for i,params_el in ipairs(params) do
-		local default_copy = wea.table.shallowcopy(params_default)
+		local default_copy = wea_c.table.shallowcopy(params_default)
 		
 		-- Keyword support
 		for _i, keyword in ipairs(wea.noise.engines.available) do
@@ -44,7 +46,7 @@ function worldeditadditions.noise.params_apply_default(params)
 		end
 		
 		-- Apply this table to fill in the gaps
-		wea.table.apply(
+		wea_c.table.apply(
 			params_el,
 			default_copy
 		)
diff --git a/worldeditadditions/lib/noise/run2d.lua b/worldeditadditions/lib/noise/run2d.lua
index c08657a..3657bf9 100644
--- a/worldeditadditions/lib/noise/run2d.lua
+++ b/worldeditadditions/lib/noise/run2d.lua
@@ -1,7 +1,10 @@
+local wea = worldeditadditions
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
+
 --- Applies a layer of 2D noise over the terrain in the defined region.
 -- @module worldeditadditions.noise2d
 
-local wea = worldeditadditions
 
 -- ███    ██  ██████  ██ ███████ ███████ ██████  ██████
 -- ████   ██ ██    ██ ██ ██      ██           ██ ██   ██
@@ -13,24 +16,24 @@ local wea = worldeditadditions
 -- @param	pos2			Vector	pos2 of the defined region
 -- @param	noise_params	table	A noise parameters table.
 function wea.noise.run2d(pos1, pos2, noise_params)
-	pos1, pos2 = worldedit.sort_pos(pos1, pos2)
+	pos1, pos2 = Vector3.sort(pos1, pos2)
 	-- pos2 will always have the highest co-ordinates now
 	
 	-- Fill in the default params
-	-- print("DEBUG noise_params_custom ", wea.format.map(noise_params))
+	-- print("DEBUG noise_params_custom ", wea_c.format.map(noise_params))
 	noise_params = wea.noise.params_apply_default(noise_params)
-	-- print("DEBUG noise_params[1] ", wea.format.map(noise_params[1]))
+	-- print("DEBUG noise_params[1] ", wea_c.format.map(noise_params[1]))
 	
 	-- Fetch the nodes in the specified area
 	local manip, area = worldedit.manip_helpers.init(pos1, pos2)
 	local data = manip:get_data()
 	
-	local heightmap_old, heightmap_size = wea.terrain.make_heightmap(
+	local heightmap_old, heightmap_size = wea_c.terrain.make_heightmap(
 		pos1, pos2,
 		manip, area,
 		data
 	)
-	local heightmap_new = wea.table.shallowcopy(heightmap_old)
+	local heightmap_new = wea_c.table.shallowcopy(heightmap_old)
 	
 	local success, noisemap = wea.noise.make_2d(
 		heightmap_size,
@@ -49,7 +52,7 @@ function wea.noise.run2d(pos1, pos2, noise_params)
 	if not success then return success, message end
 	
 	local stats
-	success, stats = wea.terrain.apply_heightmap_changes(
+	success, stats = wea_c.terrain.apply_heightmap_changes(
 		pos1, pos2,
 		area, data,
 		heightmap_old, heightmap_new,
diff --git a/worldeditadditions/lib/sculpt/apply.lua b/worldeditadditions/lib/sculpt/apply.lua
index a19a662..8af9a5d 100644
--- a/worldeditadditions/lib/sculpt/apply.lua
+++ b/worldeditadditions/lib/sculpt/apply.lua
@@ -1,5 +1,6 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 --- Applies the given brush with the given height and size to the given position.
 -- @param	pos1		Vector3		The position at which to apply the brush.
@@ -36,12 +37,12 @@ local function apply(pos1, brush_name, height, brush_size)
 	local manip, area = worldedit.manip_helpers.init(pos1_compute, pos2_compute)
 	local data = manip:get_data()
 	
-	local heightmap, heightmap_size = wea.terrain.make_heightmap(
+	local heightmap, heightmap_size = wea_c.terrain.make_heightmap(
 		pos1_compute, pos2_compute,
 		manip, area,
 		data
 	)
-	local heightmap_orig = wea.table.shallowcopy(heightmap)
+	local heightmap_orig = wea_c.table.shallowcopy(heightmap)
 	
 	local success2, added, removed = wea.sculpt.apply_heightmap(
 		brush, brush_size_actual,
@@ -52,7 +53,7 @@ local function apply(pos1, brush_name, height, brush_size)
 	if not success2 then return success2, added end
 	
 	-- 3: Save back to disk & return
-	local success3, stats = wea.terrain.apply_heightmap_changes(
+	local success3, stats = wea_c.terrain.apply_heightmap_changes(
 		pos1_compute, pos2_compute,
 		area, data,
 		heightmap_orig, heightmap,
diff --git a/worldeditadditions/lib/sculpt/apply_heightmap.lua b/worldeditadditions/lib/sculpt/apply_heightmap.lua
index dd66446..34e3ed4 100644
--- a/worldeditadditions/lib/sculpt/apply_heightmap.lua
+++ b/worldeditadditions/lib/sculpt/apply_heightmap.lua
@@ -1,5 +1,5 @@
-local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 --- Applies the given brush at the given x/z position to the given heightmap.
 -- Important: Where a Vector3 is mentioned in the parameter list, it reall MUST
@@ -26,6 +26,7 @@ local function apply_heightmap(brush, brush_size, height, position, heightmap, h
 	
 	local added = 0
 	local removed = 0
+	-- TODO: Make the strength of the brush depend on the height of the nodes in the heightmap?
 	
 	-- Iterate over the heightmap and apply the brush
 	-- Note that we do not iterate over the brush, because we don't know if the
diff --git a/worldeditadditions/lib/sculpt/brushes/__gaussian.lua b/worldeditadditions/lib/sculpt/brushes/__gaussian.lua
index 32ec007..2dc3f94 100644
--- a/worldeditadditions/lib/sculpt/brushes/__gaussian.lua
+++ b/worldeditadditions/lib/sculpt/brushes/__gaussian.lua
@@ -1,20 +1,22 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions
+local Vector3 = wea_c.Vector3
 
 --- Returns a smooth gaussian brush.
 -- @param	size	Vector3		The target size of the brush. Note that the actual size of the brush will be different, as the gaussian function has some limitations.
 -- @param	sigma=2	number		The 'smoothness' of the brush. Higher values are more smooth.
 return function(size, sigma)
-	local size = math.min(size.x, size.y)
-	if size % 2 == 0 then size = size - 1 end
+	size = math.min(size.x, size.y)
+	if size % 2 == 0 then size = size - 1 end -- Gaussian runs on odd numbers
 	if size < 1 then
-		return false, "Error: Invalid brush size."
+		return false, "Error: Invalid brush size (brushes must be at least 1 node in size)."
 	end
+	
 	local success, gaussian = wea.conv.kernel_gaussian(size, sigma)
 	
 	-- Normalise values to fill the range 0 - 1
 	-- By default, wea.conv.kernel_gaussian values add up to 1 in total
-	local max = wea.max(gaussian)
+	local max = wea_c.max(gaussian)
 	for i=0,size*size-1 do
 		gaussian[i] = gaussian[i] / max
 	end
diff --git a/worldeditadditions/lib/sculpt/brushes/circle.lua b/worldeditadditions/lib/sculpt/brushes/circle.lua
index 2d7de2f..2f3aa48 100644
--- a/worldeditadditions/lib/sculpt/brushes/circle.lua
+++ b/worldeditadditions/lib/sculpt/brushes/circle.lua
@@ -1,7 +1,9 @@
-local wea = worldeditadditions
-local Vector3 = wea.Vector3
-
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
+--- Makes a circle brush of a given size.
+-- @param	size	Vector3		The desired sizez of the brush (only X and Y are considered; Z is ignored).
+-- @returns	bool,brush,Vector3	Success bool, then the brush, then finally the actual size of the brush generated.
 return function(size)
 	local brush = {}
 	
diff --git a/worldeditadditions/lib/sculpt/brushes/circle_soft1.lua b/worldeditadditions/lib/sculpt/brushes/circle_soft1.lua
index 704b077..6ff6019 100644
--- a/worldeditadditions/lib/sculpt/brushes/circle_soft1.lua
+++ b/worldeditadditions/lib/sculpt/brushes/circle_soft1.lua
@@ -1,5 +1,6 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 
 return function(size)
@@ -30,14 +31,14 @@ return function(size)
 	local success, kernel = wea.conv.kernel_gaussian(kernel_size, 2)
 	if not success then return success, kernel end
 	
-	local success2, msg = worldeditadditions.conv.convolve(
+	local success2, msg = wea.conv.convolve(
 		brush, Vector3.new(size.x, 0, size.y),
 		kernel, Vector3.new(kernel_size, 0, kernel_size)
 	)
 	if not success2 then return success2, msg end
 	
 	-- Rescale to be between 0 and 1
-	local max_value = wea.max(brush)
+	local max_value = wea_c.max(brush)
 	for i,value in pairs(brush) do
 		brush[i] = brush[i] / max_value
 	end
diff --git a/worldeditadditions/lib/sculpt/import_static.lua b/worldeditadditions/lib/sculpt/import_static.lua
index 92f628a..0d28984 100644
--- a/worldeditadditions/lib/sculpt/import_static.lua
+++ b/worldeditadditions/lib/sculpt/import_static.lua
@@ -1,5 +1,4 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
 
 local parse_static = dofile(wea.modpath.."/lib/sculpt/parse_static.lua")
 
@@ -8,8 +7,9 @@ local parse_static = dofile(wea.modpath.."/lib/sculpt/parse_static.lua")
 -- @returns	true,table,Vector3|false,string		A success boolean, followed either by an error message as a string or the brush (as a table) and it's size (as an X/Y Vector3)
 return function(filepath)
 	local handle = io.open(filepath)
+	
 	if not handle then
-		handle:close()
+		if handle ~= nil then handle:close() end
 		return false, "Error: Failed to open the static brush file at '"..filepath.."'."
 	end
 	
diff --git a/worldeditadditions/lib/sculpt/init.lua b/worldeditadditions/lib/sculpt/init.lua
index 5dfffbb..33dca39 100644
--- a/worldeditadditions/lib/sculpt/init.lua
+++ b/worldeditadditions/lib/sculpt/init.lua
@@ -12,7 +12,6 @@ local sculpt = {
 	make_brush = dofile(wea.modpath.."/lib/sculpt/make_brush.lua"),
 	make_preview = dofile(wea.modpath.."/lib/sculpt/make_preview.lua"),
 	preview_brush = dofile(wea.modpath.."/lib/sculpt/preview_brush.lua"),
-	read_brush_static = dofile(wea.modpath.."/lib/sculpt/read_brush_static.lua"),
 	apply_heightmap = dofile(wea.modpath.."/lib/sculpt/apply_heightmap.lua"),
 	apply = dofile(wea.modpath.."/lib/sculpt/apply.lua"),
 	scan_static = dofile(wea.modpath.."/lib/sculpt/scan_static.lua"),
diff --git a/worldeditadditions/lib/sculpt/make_preview.lua b/worldeditadditions/lib/sculpt/make_preview.lua
index 2b29d17..59ea9e2 100644
--- a/worldeditadditions/lib/sculpt/make_preview.lua
+++ b/worldeditadditions/lib/sculpt/make_preview.lua
@@ -1,5 +1,4 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
 
 local make_brush = dofile(wea.modpath.."/lib/sculpt/make_brush.lua")
 
diff --git a/worldeditadditions/lib/sculpt/parse_static.lua b/worldeditadditions/lib/sculpt/parse_static.lua
index 4570ea1..a1a8a29 100644
--- a/worldeditadditions/lib/sculpt/parse_static.lua
+++ b/worldeditadditions/lib/sculpt/parse_static.lua
@@ -1,5 +1,6 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 --- Parses a static brush definition.
 -- @param	source	string	The source string that contains the static brush, formatted as TSV.
@@ -11,12 +12,12 @@ return function(source)
 	
 	-- Parse out the TSV into a table of tables, while also parsing values as numbers
 	-- Also keeps track of the maximum/minimum values found for rescaling later.
-	local values = wea.table.map(
-		wea.split(source, "\n", false),
+	local values = wea_c.table.map(
+		wea_c.split(source, "\n", false),
 		function(line)
-			local row = wea.split(line, "%s+", false)
+			local row = wea_c.split(line, "%s+", false)
 			width = math.max(width, #row)
-			return wea.table.map(
+			return wea_c.table.map(
 				row,
 				function(pixel)
 					local value = tonumber(pixel)
diff --git a/worldeditadditions/lib/sculpt/preview_brush.lua b/worldeditadditions/lib/sculpt/preview_brush.lua
index 13b07df..8aaab9c 100644
--- a/worldeditadditions/lib/sculpt/preview_brush.lua
+++ b/worldeditadditions/lib/sculpt/preview_brush.lua
@@ -1,5 +1,6 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 local make_brush = dofile(wea.modpath.."/lib/sculpt/make_brush.lua")
 local make_preview = dofile(wea.modpath.."/lib/sculpt/make_preview.lua")
diff --git a/worldeditadditions/lib/sculpt/read_brush_static.lua b/worldeditadditions/lib/sculpt/read_brush_static.lua
deleted file mode 100644
index df87f8c..0000000
--- a/worldeditadditions/lib/sculpt/read_brush_static.lua
+++ /dev/null
@@ -1,11 +0,0 @@
-
-return function(filepath)
-	local brush_size = { x = 0, y = 0 }
-	local brush = { }
-	
-	-- TODO: Import brush here
-	
-	return false, "Error: Not implemented yet"
-	
-	-- return true, brush, brush_size
-end
diff --git a/worldeditadditions/lib/sculpt/scan_static.lua b/worldeditadditions/lib/sculpt/scan_static.lua
index a300ee6..5f455dd 100644
--- a/worldeditadditions/lib/sculpt/scan_static.lua
+++ b/worldeditadditions/lib/sculpt/scan_static.lua
@@ -1,5 +1,6 @@
 local wea = worldeditadditions
-local Vector3 = wea.Vector3
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
 
 local import_static = dofile(wea.modpath.."/lib/sculpt/import_static.lua")
 
@@ -25,14 +26,14 @@ end
 -- @returns	bool,loaded,errors	A success boolean, followed by the number of brushes loaded, followed by the number of errors encountered while loading brushes (errors are logged as warnings with Minetest)
 return function(dirpath, overwrite_existing)
 	if overwrite_existing == nil then overwrite_existing = false end
-	local files = wea.io.scandir_files(dirpath)
+	local files = wea_c.io.scandir_files(dirpath)
 	
 	local brushes_loaded = 0
 	local errors = 0
 	
 	
 	for i, filename in pairs(files) do
-		if wea.str_ends(filename, ".brush.tsv") then
+		if wea_c.str_ends(filename, ".brush.tsv") then
 			local filepath = dirpath.."/"..filename
 			local name = filename:gsub(".brush.tsv", "")
 			
diff --git a/worldeditadditions/lib/wireframe/corner_set.lua b/worldeditadditions/lib/wireframe/corner_set.lua
index 9a6acef..b67f58d 100644
--- a/worldeditadditions/lib/wireframe/corner_set.lua
+++ b/worldeditadditions/lib/wireframe/corner_set.lua
@@ -1,3 +1,6 @@
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
+
 --  ██████  ██████  ██████  ███    ██ ███████ ██████      ███████ ███████ ████████
 -- ██      ██    ██ ██   ██ ████   ██ ██      ██   ██     ██      ██         ██
 -- ██      ██    ██ ██████  ██ ██  ██ █████   ██████      ███████ █████      ██
@@ -5,21 +8,21 @@
 --  ██████  ██████  ██   ██ ██   ████ ███████ ██   ██     ███████ ███████    ██
 
 --- Puts a node at each corner of selection box.
--- @param	{Position}	pos1	The 1st position defining the WorldEdit selection
--- @param	{Position}	pos2	The 2nd positioon defining the WorldEdit selection
--- @param	{string}	node	Name of the node to place
-function worldeditadditions.corner_set(pos1,pos2,node)
-	
-	-- z y x is the preferred loop order (because CPU cache I'd guess, since then we're iterating linearly through the data array)
-	local counts = { replaced = 0 }
-	for i,z in pairs({pos1.z,pos2.z}) do
-		for j,y in pairs({pos1.y,pos2.y}) do
-			for k,x in pairs({pos1.x,pos2.x}) do
-				minetest.set_node(vector.new(x,y,z), {name=node})
-				counts.replaced = counts.replaced + 1
-			end
-		end
-	end
-	
-	return true, counts.replaced
+-- @param	pos1	Vector3		The 1st position defining the WorldEdit selection
+-- @param	pos2	Vector3		The 2nd positioon defining the WorldEdit selection
+-- @param	node	string		Name of the node to place
+function worldeditadditions.corner_set(pos1, pos2, node)
+
+    -- z y x is the preferred loop order (because CPU cache I'd guess, since then we're iterating linearly through the data array)
+    local counts = {replaced = 0}
+    for i, z in pairs({pos1.z, pos2.z}) do
+        for j, y in pairs({pos1.y, pos2.y}) do
+            for k, x in pairs({pos1.x, pos2.x}) do
+                minetest.set_node(Vector3.new(x, y, z), {name = node})
+                counts.replaced = counts.replaced + 1
+            end
+        end
+    end
+
+    return true, counts.replaced
 end
diff --git a/worldeditadditions/lib/wireframe/make_compass.lua b/worldeditadditions/lib/wireframe/make_compass.lua
index a272df7..9ccd973 100644
--- a/worldeditadditions/lib/wireframe/make_compass.lua
+++ b/worldeditadditions/lib/wireframe/make_compass.lua
@@ -1,3 +1,6 @@
+local wea_c = worldeditadditions_core
+local Vector3 = wea_c.Vector3
+
 -- ███    ███  █████  ██   ██ ███████      ██████  ██████  ███    ███ ██████   █████  ███████ ███████
 -- ████  ████ ██   ██ ██  ██  ██          ██      ██    ██ ████  ████ ██   ██ ██   ██ ██      ██
 -- ██ ████ ██ ███████ █████   █████       ██      ██    ██ ██ ████ ██ ██████  ███████ ███████ ███████
@@ -9,20 +12,20 @@
 -- @param	{string}	node1	Name of the node to place
 -- @param	{string}	node2	Name of the node of the bead
 function worldeditadditions.make_compass(pos1,node1,node2)
-	
-	minetest.set_node(vector.add(pos1,vector.new(0,1,3)), {name=node2})
+	pos1 = Vector3.clone(pos1)
+	minetest.set_node(pos1 + Vector3.new(0,1,3), { name = node2 })
 	local counts = { replaced = 1 }
 	
 	-- z y x is the preferred loop order (because CPU cache I'd guess, since then we're iterating linearly through the data array)
 	for z = -3,3 do
 		if z ~= 0 then
 			for k,x in pairs({math.floor(-3/math.abs(z)),0,math.ceil(3/math.abs(z))}) do
-				minetest.set_node(vector.new(pos1.x+x,pos1.y,pos1.z+z), {name=node1})
+				minetest.set_node(Vector3.new(pos1.x+x,pos1.y,pos1.z+z), {name=node1})
 				counts.replaced = counts.replaced + 1
 			end
 		else
 			for x = -3,3 do
-				minetest.set_node(vector.new(pos1.x+x,pos1.y,pos1.z), {name=node1})
+				minetest.set_node(Vector3.new(pos1.x+x,pos1.y,pos1.z), {name=node1})
 				counts.replaced = counts.replaced + 1
 			end
 		end
diff --git a/worldeditadditions/lib/wireframe/wire_box.lua b/worldeditadditions/lib/wireframe/wire_box.lua
index fc24b04..cf8dea1 100644
--- a/worldeditadditions/lib/wireframe/wire_box.lua
+++ b/worldeditadditions/lib/wireframe/wire_box.lua
@@ -1,3 +1,5 @@
+local v3 = worldeditadditions_core.Vector3
+
 -- ██     ██ ██ ██████  ███████     ██████   ██████  ██   ██
 -- ██     ██ ██ ██   ██ ██          ██   ██ ██    ██  ██ ██
 -- ██  █  ██ ██ ██████  █████       ██████  ██    ██   ███
@@ -8,7 +10,6 @@
 -- @param	{Position}	pos1	The 1st position defining the WorldEdit selection
 -- @param	{Position}	pos2	The 2nd positioon defining the WorldEdit selection
 -- @param	{string}	node	Name of the node to place
-local v3 = worldeditadditions.Vector3
 function worldeditadditions.wire_box(pos1,pos2,node)
 	local node_id_replace = minetest.get_content_id(node)
 	local ps1, ps2 = v3.sort(pos1,pos2)
diff --git a/worldeditadditions_commands/commands/convolve.lua b/worldeditadditions_commands/commands/convolve.lua
index b10cecc..6154ead 100644
--- a/worldeditadditions_commands/commands/convolve.lua
+++ b/worldeditadditions_commands/commands/convolve.lua
@@ -56,7 +56,7 @@ worldeditadditions_core.register_command("convolve", {
 	func = function(name, kernel_name, kernel_width, kernel_height, sigma)
 		local start_time = wea_c.get_ms_time()
 		
-		local success, kernel = wea_c.get_conv_kernel(
+		local success, kernel = wea.get_conv_kernel(
 			kernel_name,
 			kernel_width, kernel_height,
 			sigma
