diff --git a/README.md b/README.md
index a42a4ea7b98212c161d027a93e0d97225bc27c42..8aa4c5e535b1a2dab76c1736980f63b082057722 100755
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ to be able to display javascript quickly and correctly.
 phpIPAM has been developed and tested on the following PHP versions.\
 The use of untested PHP versions is unsupported and may result in compatibility issues.
 
-- MASTER: PHP versions 5.4 to 8.1 (8.x support work-in-progress)
+- MASTER: PHP versions 5.4 to 8.2 (8.x support work-in-progress)
 - 1.5.x: PHP versions 5.4 to 7.4
 - 1.4.x: PHP versions 5.4 to 7.4
 - 1.3.x: PHP versions 5.4 to 7.1
diff --git a/api/controllers/Addresses.php b/api/controllers/Addresses.php
index dbeac60b253ebfec0f4321454e37b233abac676f..43cffbe14dd9df39f565782e1cb9293f750eb37d 100644
--- a/api/controllers/Addresses.php
+++ b/api/controllers/Addresses.php
@@ -28,9 +28,10 @@ class Addresses_controller extends Common_api_functions  {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
@@ -612,4 +613,4 @@ class Addresses_controller extends Common_api_functions  {
 			$this->_params->state = 2;
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/api/controllers/Circuits.php b/api/controllers/Circuits.php
index 261ac5b6079347c97fcf4ac411258b1486dca0cf..18a23a4d623a77ccc68b793dd15bf8f866ea3119 100644
--- a/api/controllers/Circuits.php
+++ b/api/controllers/Circuits.php
@@ -26,10 +26,10 @@ class Circuits_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
-	 * @param class $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/Common.php b/api/controllers/Common.php
index 42878822ad58f5f8313e021bbe45e0b9f07a8cc7..76df0182665f2ea16b95fc409cbad66e24233eb1 100644
--- a/api/controllers/Common.php
+++ b/api/controllers/Common.php
@@ -1,4 +1,35 @@
 <?php
+/**
+ *  API Parameter class
+ */
+#[AllowDynamicProperties]
+class API_params extends stdClass {
+
+	public $controller = null;
+
+	public $id = null;
+
+	public $id2 = null;
+
+	public $id3 = null;
+
+	/**
+	 * Read array of arguments
+	 *
+	 * @param array $args
+	 * @return void
+	 */
+	public function read($args)
+	{
+		foreach ($args as $i => $v) {
+			if ($i === "controller") {
+				$this->{$i} = strtolower($v);
+			} else {
+				$this->{$i} = $v;
+			}
+		}
+	}
+}
 
 /**
  *	phpIPAM API class for common functions
@@ -522,10 +553,9 @@ class Common_api_functions {
 			$result["slaves"]           = array ("GET");
 			$result["slaves_recursive"] = array ("GET");
 			$result["truncate"]         = array ("DELETE");
-			$result["permissions"]      = array ("DELETE");
+			$result["permissions"]      = array ("DELETE", "PATCH");
 			$result["resize"]           = array ("PATCH");
 			$result["split"]            = array ("PATCH");
-			$result["permissions"]      = array ("PATCH");
 			// return
 			return $result;
 		}
@@ -626,6 +656,8 @@ class Common_api_functions {
 	 * @return void
 	 */
 	protected function transform_address ($result) {
+		$result_is_object = false;
+
 		if (is_object($result)) {
 			$result_is_object = true;
 			$result = [$result];
@@ -812,7 +844,7 @@ class Common_api_functions {
 					if($result->isFolder!="1")			{ unset($result); }
 			}
 			# return
-			if($result===NULL)	{ $this->Response->throw_exception(404, "No folders found"); }
+			if($result===null)	{ $this->Response->throw_exception(404, "No folders found"); }
 			else				{ return $result; }
 	}	}
 
@@ -1085,7 +1117,7 @@ class Common_api_functions {
 				if (array_key_exists($key, $this->custom_fields)) {
 					$this->_params->$key = $value;
 				} else {
-					$this->Response->throw_exception(400, "${key} is not a valid custom field");
+					$this->Response->throw_exception(400, "{$key} is not a valid custom field");
 				}
 			}
 			unset($this->_params->custom_fields);
diff --git a/api/controllers/Devices.php b/api/controllers/Devices.php
index 9d264d989604f64832612f2e41e87e4a97823bba..f1fd53839d149506423fe66d91fe74a11dd1ddbf 100644
--- a/api/controllers/Devices.php
+++ b/api/controllers/Devices.php
@@ -18,10 +18,11 @@ class Devices_controller extends Common_api_functions {
     /**
      * __construct function.
      *
-     * @param class $Database
-     * @param class $Tools
-     * @param mixed $params   // post/get values
-     * @param class $Response
+	 * @access public
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
      */
     public function __construct($Database, $Tools, $params, $Response) {
         $this->Database = $Database;
diff --git a/api/controllers/L2domains.php b/api/controllers/L2domains.php
index 800c7ba10df13f343e1dff2b4a6afa55a2450605..7c2942556ce881be6992308e9022660ef883288e 100644
--- a/api/controllers/L2domains.php
+++ b/api/controllers/L2domains.php
@@ -12,9 +12,10 @@ class L2domains_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/Prefix.php b/api/controllers/Prefix.php
index aeacda66507d68e7dcf7bb5a6a7e42b8c3334958..98d2b7bb0795c0ed516b17e84ff8e79d55d301cb 100644
--- a/api/controllers/Prefix.php
+++ b/api/controllers/Prefix.php
@@ -244,10 +244,10 @@ class Prefix_controller extends Common_api_functions {
      * __construct function
      *
      * @access public
-     * @param class $Database
-     * @param class $Tools
-     * @param mixed $params
-     * @param mixed $Response
+     * @param PDO_Database $Database
+     * @param Tools $Tools
+     * @param API_params $params
+     * @param Response $Response
      */
     public function __construct($Database, $Tools, $params, $Response) {
         $this->Database  = $Database;
diff --git a/api/controllers/Search.php b/api/controllers/Search.php
index 9996a7327d27fa0bb72202ce52c9ba79e560ac67..16bb54a23de433fe2c0b54bbb8959106117364b2 100755
--- a/api/controllers/Search.php
+++ b/api/controllers/Search.php
@@ -22,10 +22,10 @@ class Search_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params
-	 * @param mixed $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/Sections.php b/api/controllers/Sections.php
index 9d35453a89171fe412842e928d249dbe2ffd5f1c..83b4f2ba089ec8e5648ae89c81d8063e648ac97f 100755
--- a/api/controllers/Sections.php
+++ b/api/controllers/Sections.php
@@ -11,10 +11,10 @@ class Sections_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params
-	 * @param mixed $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/Subnets.php b/api/controllers/Subnets.php
index c82c72f26d4bca8d97be775f0b1e3c4900ca3672..bb34a64ef61ec32798ac5d6bc6e0c64e5610bbc9 100644
--- a/api/controllers/Subnets.php
+++ b/api/controllers/Subnets.php
@@ -20,9 +20,10 @@ class Subnets_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/Tools.php b/api/controllers/Tools.php
index 68c91d039ea76acf2106397ab5e261bee15697fe..525479ed045a610f3b838839a3a2cb4c4997ef78 100644
--- a/api/controllers/Tools.php
+++ b/api/controllers/Tools.php
@@ -37,10 +37,10 @@ class Tools_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
-	 * @param class $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/User.php b/api/controllers/User.php
index 07400b43c0c58b7b092aa67b3c2a542da4294978..db31de87fe9730d70b66b10e22039e6131d9b6d6 100644
--- a/api/controllers/User.php
+++ b/api/controllers/User.php
@@ -63,13 +63,14 @@ class User_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param mixed $Database
-	 * @param mixed $Tools
-	 * @param mixed $params
-	 * @param mixed $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
-	public function __construct ($Database, $Tools=null, $params=null, $Response) {
+	public function __construct ($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
+		$this->Tools = $Tools;
 		$this->Response = $Response;
 		$this->_params = $params;
 		// init required objects
@@ -455,7 +456,7 @@ class User_controller extends Common_api_functions {
 	 * @return void
 	 */
 	private function validate_requested_token () {
-		return $this->_params->controller=="user" ? $this->validate_requested_token_user () : $this->validate_requested_token_general ();
+		$this->_params->controller=="user" ? $this->validate_requested_token_user () : $this->validate_requested_token_general ();
 	}
 
 	/**
diff --git a/api/controllers/Vlans.php b/api/controllers/Vlans.php
index c1056e7bda2c25fefb6e69179c78fda704ba5ed0..c82b7f7a9e94050c8e21ddff1d5869399efe725a 100755
--- a/api/controllers/Vlans.php
+++ b/api/controllers/Vlans.php
@@ -21,10 +21,10 @@ class Vlans_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
-	 * @param class $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/controllers/Vrfs.php b/api/controllers/Vrfs.php
index 1c92f98a9315d2bc5bcb91dd08196e80332a5e5a..cd070649a7833c04e38c456500f9607ab0de96f9 100755
--- a/api/controllers/Vrfs.php
+++ b/api/controllers/Vrfs.php
@@ -12,10 +12,10 @@ class Vrfs_controller extends Common_api_functions {
 	 * __construct function
 	 *
 	 * @access public
-	 * @param class $Database
-	 * @param class $Tools
-	 * @param mixed $params		// post/get values
-	 * @param class $Response
+	 * @param PDO_Database $Database
+	 * @param Tools $Tools
+	 * @param API_params $params
+	 * @param Response $response
 	 */
 	public function __construct($Database, $Tools, $params, $Response) {
 		$this->Database = $Database;
diff --git a/api/index.php b/api/index.php
index 94ed2d4529eadc8c63eda80d2130a9900bdfc479..ee00f335a0e1aee4d8bea445fa73860f4df600c7 100755
--- a/api/index.php
+++ b/api/index.php
@@ -34,6 +34,7 @@ $Database = new Database_PDO;
 $Tools    = new Tools ($Database);
 $User     = new User ($Database);
 $Response = new Responses ();
+$Params   = new API_params ();
 
 # get phpipam settings
 $settings = $Tools->get_settings();
@@ -63,19 +64,21 @@ try {
 
 
 	/* Check app security and prepare request parameters ---------- */
+	$content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
 
 	// crypt check
 	if($app->app_security=="crypt") {
 		$encryption_method = Config::ValueOf('api_crypt_encryption_library', 'openssl-128-cbc');
 
 		// decrypt request - form_encoded
-		if(strpos($_SERVER['CONTENT_TYPE'], "application/x-www-form-urlencoded")!==false) {
+		if(strpos($content_type, "application/x-www-form-urlencoded")!==false) {
 			$decoded = $User->Crypto->decrypt($_GET['enc_request'], $app->app_code, $encryption_method);
 			if ($decoded === false) $Response->throw_exception(503, 'Invalid enc_request');
 			$decoded = $decoded[0]=="?" ? substr($decoded, 1) : $decoded;
 			parse_str($decoded, $encrypted_params);
 			$encrypted_params['app_id'] = $_GET['app_id'];
-			$params = (object) $encrypted_params;
+
+			$Params->read($encrypted_params);
 		}
 		// json_encoded
 		else {
@@ -83,7 +86,8 @@ try {
 			if ($encrypted_params === false) $Response->throw_exception(503, 'Invalid enc_request');
 			$encrypted_params = pf_json_decode($encrypted_params, true);
 			$encrypted_params['app_id'] = $_GET['app_id'];
-			$params = (object) $encrypted_params;
+
+			$Params->read($encrypted_params);
 		}
 	}
 	// SSL checks
@@ -94,7 +98,7 @@ try {
 		}
 
 		// save request parameters
-		$params = (object) $_GET;
+		$Params->read($_GET);
 	}
 	// no security
 	elseif($app->app_security=="none") {
@@ -104,7 +108,7 @@ try {
 		}
 
 		// save request parameters
-		$params = (object) $_GET;
+		$Params->read($_GET);
 	}
 	// error, invalid security
 	else {
@@ -115,33 +119,32 @@ try {
 	// Append Global API parameters / POST parameters if POST,PATCH or DELETE
 	if($_SERVER['REQUEST_METHOD']=="GET" || $_SERVER['REQUEST_METHOD']=="POST" || $_SERVER['REQUEST_METHOD']=="PATCH" || $_SERVER['REQUEST_METHOD']=="DELETE") {
 		// if application tupe is JSON (application/json)
-		if(strpos($_SERVER['CONTENT_TYPE'], "application/json")!==false){
+		if(strpos($content_type, "application/json")!==false){
 			$rawPostData = file_get_contents('php://input');
 			if (is_string($rawPostData) && !is_blank($rawPostData)) {
 				$json = pf_json_decode($rawPostData, true);
 				if(!is_array($json)) {
 					$Response->throw_exception(400, 'Invalid JSON: '.json_last_error_msg());
 				}
-				$params = array_merge((array) $params, $json);
+
+				$Params->read($json);
 			}
-			$params = (object) $params;
 		}
 		// if application tupe is XML (application/json)
-		elseif(strpos($_SERVER['CONTENT_TYPE'], "application/xml")!==false){
+		elseif(strpos($content_type, "application/xml")!==false){
 			$rawPostData = file_get_contents('php://input');
 			if (is_string($rawPostData) && !is_blank($rawPostData)) {
 				$xml = $Response->xml_to_array($rawPostData);
 				if(!is_array($xml)) {
 					$Response->throw_exception(400, 'Invalid XML');
 				}
-				$params = array_merge((array) $params, $xml);
+
+				$Params->read($xml);
 			}
-			$params = (object) $params;
 		}
 		//if application type is default (application/x-www-form-urlencoded)
         elseif(sizeof(@$_POST)>0) {
-            $params = array_merge((array) $params, $_POST);
-            $params = (object) $params;
+            $Params->read($_POST);
         }
         //url encoded input
         else {
@@ -150,24 +153,20 @@ try {
             if (!is_blank($input)) {
                 parse_str($input, $out);
                 if(is_array($out)) {
-                    $params = array_merge((array) $params, $out);
-                    $params = (object) $params;
+                    $Params->read($out);
                 }
             }
         }
     }
 
-	/* Sanitise input ---------- (user/User/USER) */
-	if (isset($params->controller)) $params->controller = strtolower($params->controller);
-
 	/* Authentication ---------- */
 
 	// authenticate user if required
-	if (@$params->controller != "user") {
+	if ($Params->controller != "user") {
 		if($app->app_security=="ssl_token" || $app->app_security=="none") {
 			// start auth class and validate connection
 			require_once( dirname(__FILE__) . '/controllers/User.php');				// authentication and token handling
-			$Authentication = new User_controller ($Database, $Tools, $params, $Response);
+			$Authentication = new User_controller ($Database, $Tools, $Params, $Response);
 			$Authentication->check_auth ();
 		}
 
@@ -175,7 +174,7 @@ try {
 		if($app->app_security=="ssl_code") {
 			// start auth class and validate connection
 			require_once( dirname(__FILE__) . '/controllers/User.php');				// authentication and token handling
-			$Authentication = new User_controller ($Database, $Tools, $params, $Response);
+			$Authentication = new User_controller ($Database, $Tools, $Params, $Response);
 			$Authentication->check_auth_code ($app->app_id);
 		}
 	}
@@ -185,7 +184,7 @@ try {
 		if($app->app_security=="ssl_code" && $_SERVER['REQUEST_METHOD']!="GET") {
 			// start auth class and validate connection
 			require_once( dirname(__FILE__) . '/controllers/User.php');				// authentication and token handling
-			$Authentication = new User_controller ($Database, $Tools, $params, $Response);
+			$Authentication = new User_controller ($Database, $Tools, $Params, $Response);
 			$Authentication->check_auth_code ($app->app_id);
 
 			// passwd
@@ -196,11 +195,11 @@ try {
 	/* verify request ---------- */
 
 	// check if the request is valid by checking if it's an array and looking for the controller and action
-	if( $params == false || isset($params->controller) == false ) {
+	if( empty($Params->controller) ) {
 		$Response->throw_exception(400, 'Request is not valid');
 	}
 	// verify permissions for delete/create/edit if controller is not user (needed for auth)
-	if (@$params->controller != "user") {
+	if ($Params->controller != "user") {
     	if( ($_SERVER['REQUEST_METHOD']=="POST" || $_SERVER['REQUEST_METHOD']=="PATCH"
     	  || $_SERVER['REQUEST_METHOD']=="PUT"  || $_SERVER['REQUEST_METHOD']=="DELETE"
     	  )
@@ -215,8 +214,8 @@ try {
 	/* Initialize controller ---------- */
 
 	// get the controller and format it correctly
-	$controller 	 = ucfirst(strtolower($params->controller))."_controller";
-	$controller_file = ucfirst(strtolower($params->controller));
+	$controller_name = ucfirst($Params->controller)."_controller";
+	$controller_file = ucfirst($Params->controller);
 
 	// check if the controller exists. if not, throw an exception
 	if( file_exists( dirname(__FILE__) . "/controllers/$controller_file.php") ) {
@@ -232,7 +231,7 @@ try {
 
 	// create a new instance of the controller, and pass
 	// it the parameters from the request and Database object
-	$controller = new $controller($Database, $Tools, $params, $Response);
+	$controller = new $controller_name($Database, $Tools, $Params, $Response);
 
 	// pass app params for links result
 	$controller->app = $app;
@@ -294,7 +293,7 @@ try {
 	}
 
     // remove transaction lock
-    if(is_object($controller) && $app->app_lock==1 && strtoupper($_SERVER['REQUEST_METHOD'])=="POST") {
+    if(isset($controller) && $app->app_lock==1 && strtoupper($_SERVER['REQUEST_METHOD'])=="POST") {
         if($controller->is_transaction_locked ()) {
             $controller->remove_transaction_lock ();
         }
@@ -309,8 +308,9 @@ if($time_response) {
     $time = $stop - $start;
 }
 
+$customFields = isset($controller) ? $controller->custom_fields : [];
 //output result
-echo $Response->formulate_result ($result, $time, $app->app_nest_custom_fields, $controller->custom_fields);
+echo $Response->formulate_result ($result, $time, $app->app_nest_custom_fields, $customFields);
 
 // update access time
 try { $Database->updateObject("api", ["app_id"=>$app->app_id, "app_last_access"=>date("Y-m-d H:i:s")], 'app_id'); }
diff --git a/app/tools/devices/all-devices-filter.php b/app/tools/devices/all-devices-filter.php
index ea84bdaa924d3371b343452975c10a985b35ee36..3190c2a611be8f841ccf2efcfe556747579bc15d 100644
--- a/app/tools/devices/all-devices-filter.php
+++ b/app/tools/devices/all-devices-filter.php
@@ -91,7 +91,7 @@ print "<div class='btn-group' style='margin-bottom:7px;'>";
 		if($Racks->all_racks!==false) {
 			print "		<li role='separator' class='divider'></li>";
 			foreach ($Racks->all_racks as $r) {
-				$selected = $r->name==$_GET['sPage'] ? "class='active'" : "";
+				$selected = isset($_GET['sPage']) && $r->name==$_GET['sPage'] ? "class='active'" : "";
 				print "   <li $selected><a href='".create_link("tools","devices","rack", $r->name)."'>".$r->name."</a></li>";
 			}
 		}
@@ -111,7 +111,7 @@ print "<div class='btn-group' style='margin-bottom:7px;'>";
 		if($all_locations!==false) {
 			print "		<li role='separator' class='divider'></li>";
 			foreach ($all_locations as $l) {
-				$selected = $l->name==$_GET['sPage'] ? "class='active'" : "";
+				$selected = isset($_GET['sPage']) && $l->name==$_GET['sPage'] ? "class='active'" : "";
 				print "   <li $selected><a href='".create_link("tools","devices","location", $l->name)."'>".$l->name."</a></li>";
 			}
 		}
diff --git a/functions/PEAR/OLE/ChainedBlockStream.php b/functions/PEAR/OLE/ChainedBlockStream.php
index 129b77b4c163d713309eed513f6c4c712f0d6abb..87481c05d9b948ed4f49fff20785905df2776fe4 100755
--- a/functions/PEAR/OLE/ChainedBlockStream.php
+++ b/functions/PEAR/OLE/ChainedBlockStream.php
@@ -38,6 +38,7 @@ require_once 'functions/PEAR/OLE.php';
  * @link       http://pear.php.net/package/OLE
  * @since      Class available since Release 0.6.0
  */
+#[AllowDynamicProperties]
 class OLE_ChainedBlockStream extends PEAR
 {
     /**
diff --git a/functions/PEAR/OLE/OLE.php b/functions/PEAR/OLE/OLE.php
index a30b886e2032d6844c8ad47eb2b0bc7f8cdc020d..cfa2798a1c3ed44de9e1f88179fc4bc63c65d53f 100755
--- a/functions/PEAR/OLE/OLE.php
+++ b/functions/PEAR/OLE/OLE.php
@@ -47,6 +47,7 @@ $GLOBALS['_OLE_INSTANCES'] = array();
 * @author   Xavier Noguer <xnoguer@php.net>
 * @author   Christian Schmidt <schmidt@php.net>
 */
+#[AllowDynamicProperties]
 class OLE extends PEAR
 {
 
diff --git a/functions/PEAR/OLE/PPS.php b/functions/PEAR/OLE/PPS.php
index 353c338c41b6139b9b6294355d6fd130c762d44d..9b9dcc42154601615baeb019b2c7d9719d0c7e34 100755
--- a/functions/PEAR/OLE/PPS.php
+++ b/functions/PEAR/OLE/PPS.php
@@ -30,6 +30,7 @@ require_once 'OLE.php';
 * @category Structures
 * @package  OLE
 */
+#[AllowDynamicProperties]
 class OLE_PPS extends PEAR
 {
     /**
diff --git a/functions/PEAR/Spreadsheet/Excel/Writer/BIFFwriter.php b/functions/PEAR/Spreadsheet/Excel/Writer/BIFFwriter.php
index b6a251c84e6bd3e8497176f37055febd26ae80be..3b18adf4dec6f799aa2b80c0a7c23212f51f5d60 100755
--- a/functions/PEAR/Spreadsheet/Excel/Writer/BIFFwriter.php
+++ b/functions/PEAR/Spreadsheet/Excel/Writer/BIFFwriter.php
@@ -50,7 +50,7 @@ require_once 'PEAR.php';
 * @category FileFormats
 * @package  Spreadsheet_Excel_Writer
 */
-
+#[AllowDynamicProperties]
 class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR
 {
     /**
diff --git a/functions/PEAR/Spreadsheet/Excel/Writer/Format.php b/functions/PEAR/Spreadsheet/Excel/Writer/Format.php
index 13c61d0aa789c98d7061b04348b6905bb2c26d2a..8403af5d7e8b540acb50bdcd39e3e1f1f403e830 100755
--- a/functions/PEAR/Spreadsheet/Excel/Writer/Format.php
+++ b/functions/PEAR/Spreadsheet/Excel/Writer/Format.php
@@ -42,6 +42,7 @@ require_once 'PEAR.php';
 * @package  Spreadsheet_Excel_Writer
 */
 
+#[AllowDynamicProperties]
 class Spreadsheet_Excel_Writer_Format extends PEAR
 {
     /**
diff --git a/functions/PEAR/Spreadsheet/Excel/Writer/Parser.php b/functions/PEAR/Spreadsheet/Excel/Writer/Parser.php
index c5e404546af4d8dfe341b7e5c6865de72ce3a075..808b51259837cb3846d5f54610b7d42a973d399f 100755
--- a/functions/PEAR/Spreadsheet/Excel/Writer/Parser.php
+++ b/functions/PEAR/Spreadsheet/Excel/Writer/Parser.php
@@ -107,6 +107,7 @@ require_once 'PEAR.php';
 * @package  Spreadsheet_Excel_Writer
 */
 
+#[AllowDynamicProperties]
 class Spreadsheet_Excel_Writer_Parser extends PEAR
 {
     /**
diff --git a/functions/checks/check_php_build.php b/functions/checks/check_php_build.php
index b88cd21eb5f9b2e7cad8850e0832e09cceda6627..54c364c510b8639fa0abccea14c36177c97bcb6e 100755
--- a/functions/checks/check_php_build.php
+++ b/functions/checks/check_php_build.php
@@ -15,7 +15,7 @@ if(!defined('PHPIPAM_PHP_MIN'))
 define('PHPIPAM_PHP_MIN', "5.4");
 
 if(!defined('PHPIPAM_PHP_UNTESTED'))
-define('PHPIPAM_PHP_UNTESTED', "8.2");  // PHP 8.2 or greater is untested & unsupported
+define('PHPIPAM_PHP_UNTESTED', "8.3");  // PHP 8.3 or greater is untested & unsupported
 
 
 # Empty missing arrays to prevent errors
diff --git a/functions/classes/class.Common.php b/functions/classes/class.Common.php
index 5a39d0c53f8bcbcd4fab95555e31b196d9c1bf9a..d36fe48d556cab659153e4eea49d760a42de9ef2 100644
--- a/functions/classes/class.Common.php
+++ b/functions/classes/class.Common.php
@@ -1731,7 +1731,7 @@ class Common_functions  {
 	 */
 	public function print_custom_field ($type, $value, $delimiter = false, $replacement = false) {
 		// escape
-		$value = str_replace("'", "&#39;", $value);
+		$value = str_replace("'", "&#39;", $value ?: '');
 		// create links
 		$value = $this->create_links ($value, $type);
 
diff --git a/functions/classes/class.Rackspace.php b/functions/classes/class.Rackspace.php
index 59dfdcd5032f395dcee343e4938ad7023898001a..c3217dc0264a82caa2c375d8b2fccddbcfa2254a 100755
--- a/functions/classes/class.Rackspace.php
+++ b/functions/classes/class.Rackspace.php
@@ -605,7 +605,7 @@ class RackDrawer extends Common_functions {
         $x = imagesx($img) - $width - 8;
         $y = Imagesy($img) +9;
         // imagestring($img, $font, $x/2, $y/2, $text, $color);
-        imagettftext($img, 8, 0, $x/2, $y/2, $color, dirname(__FILE__)."/../../css/fonts/MesloLGS-Regular.ttf", $text );
+        imagettftext($img, 8, 0, (int) $x/2, (int) $y/2, $color, dirname(__FILE__)."/../../css/fonts/MesloLGS-Regular.ttf", $text );
     }
 
     /**
diff --git a/functions/classes/class.SubnetsTable.php b/functions/classes/class.SubnetsTable.php
index 2784cb36684b67463f6220dd33403e371254c2fd..46daa78e26e0a4180637a370cb261c86de05739b 100644
--- a/functions/classes/class.SubnetsTable.php
+++ b/functions/classes/class.SubnetsTable.php
@@ -105,7 +105,7 @@ class SubnetsTable {
 
 		//vlan
 		if (isset($this->all_vlans[$subnet->vlanId]->number)) {
-			$tr['vlan'] = $this->all_vlans[$subnet->vlanId]->domainId==1 ? $this->all_vlans[$subnet->vlanId]->number : $this->all_vlans[$subnet->vlanId]->number." <span class='badge badge1 badge5' rel='tooltip' title='"._('VLAN is in domain'). ".$this->all_vlans[$subnet->vlanId]->domainName.'>".$this->all_vlans[$subnet->vlanId]->domainName."</span>";
+			$tr['vlan'] = $this->all_vlans[$subnet->vlanId]->domainId == 1 ? $this->all_vlans[$subnet->vlanId]->number : $this->all_vlans[$subnet->vlanId]->number . " <span class='badge badge1 badge5' rel='tooltip' title='" . _('VLAN is in domain') . escape_input($this->all_vlans[$subnet->vlanId]->domainName) . "'>" . escape_input($this->all_vlans[$subnet->vlanId]->domainName) . "</span>";
 		} else {
 			$tr['vlan'] = _('Default');
 		}