diff --git a/include/class.validator.php b/include/class.validator.php
index d41bf027fe826c855893146dfee680c578598feb..2cec3fa3f2f83d92e9a1a8e04a4174f78b3cc2ca 100644
--- a/include/class.validator.php
+++ b/include/class.validator.php
@@ -172,10 +172,15 @@ class Validator {
             return false;
       
         $ip=trim($ip);
-        if(preg_match("/^[0-9]{1,3}(.[0-9]{1,3}){3}$/",$ip)) {
-            foreach(explode(".", $ip) as $block)
-                if($block<0 || $block>255 )
-                    return false;
+        # Thanks to http://stackoverflow.com/a/1934546
+        if (function_exists('inet_pton')) { # PHP 5.1.0
+            # Let the built-in library parse the IP address
+            return @inet_pton($ip) !== false;
+        } else if (preg_match(
+            '/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){7,})'
+            .'((?1)(?>:(?1)){0,5})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){5,})'
+            .'(?3)?::(?>((?1)(?>:(?1)){0,3}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])'
+            .'(?>\.(?4)){3}))$/iD', $ip)) {
             return true;
         }
         return false;
diff --git a/include/upgrader/patches/aa4664af-b19dc97d.patch.sql b/include/upgrader/patches/aa4664af-b19dc97d.patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..8b5ce9eb37fd24d4257f7e14ed1f7f4f962e1597
--- /dev/null
+++ b/include/upgrader/patches/aa4664af-b19dc97d.patch.sql
@@ -0,0 +1,23 @@
+/**
+ * Change IP address columns to have sufficient room to store IPv6 address
+ *
+ * @version 1.7-rc1 ipv6-addresses
+ */
+
+ALTER TABLE `%TABLE_PREFIX%api_key`
+    CHANGE `ipaddr` `ipaddr` varchar(64) NOT NULL;
+
+ALTER TABLE `%TABLE_PREFIX%session`
+    CHANGE `user_id` `user_id` int(10) unsigned NOT NULL default '0'
+        COMMENT 'osTicket staff ID',
+    CHANGE `user_ip` `user_ip` varchar(64) NOT NULL;
+
+ALTER TABLE `%TABLE_PREFIX%syslog`
+    CHANGE `ip_address` `ip_address` varchar(64) NOT NULL;
+
+ALTER TABLE `%TABLE_PREFIX%ticket`
+    CHANGE `ip_address` `ip_address` varchar(64) NOT NULL default '';
+
+-- Finished with patch
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='b19dc97d19f7a30f59663c812d1f3ddc';
diff --git a/main.inc.php b/main.inc.php
index 8ada794f952c5528c2cb9529157a85eff082f311..d4d44fde7d72738d3b4e404f1e713b3e0ae9f01d 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -63,7 +63,7 @@
 
     #Current version && schema signature (Changes from version to version)
     define('THIS_VERSION','1.7-DPR4'); //Shown on admin panel
-    define('SCHEMA_SIGNATURE','aa4664afc3b43d4068eb2e82684fc28e'); //MD5 signature of the db schema. (used to trigger upgrades)
+    define('SCHEMA_SIGNATURE','b19dc97d19f7a30f59663c812d1f3ddc'); //MD5 signature of the db schema. (used to trigger upgrades)
 
     #load config info
     $configfile='';
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql b/setup/inc/sql/osticket-v1.7-mysql.sql
index b8bb7ce263dfbcb7442fda8b2e15b9edebdbb48c..7f29d024f38ae354614e51a083eec9a148968df7 100644
--- a/setup/inc/sql/osticket-v1.7-mysql.sql
+++ b/setup/inc/sql/osticket-v1.7-mysql.sql
@@ -3,7 +3,7 @@ DROP TABLE IF EXISTS `%TABLE_PREFIX%api_key`;
 CREATE TABLE `%TABLE_PREFIX%api_key` (
   `id` int(10) unsigned NOT NULL auto_increment,
   `isactive` tinyint(1) NOT NULL default '1',
-  `ipaddr` varchar(16) NOT NULL,
+  `ipaddr` varchar(64) NOT NULL,
   `apikey` varchar(255) NOT NULL,
   `notes` text,
   `updated` datetime NOT NULL,
@@ -423,9 +423,8 @@ CREATE TABLE `%TABLE_PREFIX%session` (
   `session_data` longtext collate utf8_unicode_ci,
   `session_expire` datetime default NULL,
   `session_updated` datetime default NULL,
-  `user_id` int(10) unsigned NOT NULL default '0' COMMENT 'osTicket staff
-ID',
-  `user_ip` varchar(32) collate utf8_unicode_ci NOT NULL,
+  `user_id` int(10) unsigned NOT NULL default '0' COMMENT 'osTicket staff ID',
+  `user_ip` varchar(64) NOT NULL,
   `user_agent` varchar(255) collate utf8_unicode_ci NOT NULL,
   PRIMARY KEY  (`session_id`),
   KEY `updated` (`session_updated`),
@@ -497,7 +496,7 @@ CREATE TABLE `%TABLE_PREFIX%syslog` (
   `title` varchar(255) NOT NULL,
   `log` text NOT NULL,
   `logger` varchar(64) NOT NULL,
-  `ip_address` varchar(16) NOT NULL,
+  `ip_address` varchar(64) NOT NULL,
   `created` datetime NOT NULL,
   `updated` datetime NOT NULL,
   PRIMARY KEY  (`log_id`),
@@ -546,7 +545,7 @@ CREATE TABLE `%TABLE_PREFIX%ticket` (
   `subject` varchar(64) NOT NULL default '[no subject]',
   `phone` varchar(16) default NULL,
   `phone_ext` varchar(8) default NULL,
-  `ip_address` varchar(16) NOT NULL default '',
+  `ip_address` varchar(64) NOT NULL default '',
   `status` enum('open','closed') NOT NULL default 'open',
   `source` enum('Web','Email','Phone','API','Other') NOT NULL default
 'Other',
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql.md5 b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
index 4bdfcd1ce270c2ca67c9c9f461bef15d010936f6..a1d99aa526afd9af5d19e5bd1d8c98ea7608ab91 100644
--- a/setup/inc/sql/osticket-v1.7-mysql.sql.md5
+++ b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
@@ -1 +1 @@
-aa4664afc3b43d4068eb2e82684fc28e
+b19dc97d19f7a30f59663c812d1f3ddc