diff --git a/bootstrap.php b/bootstrap.php
index d91679af855da07e45a6f0b94e3d18b8b7fb859e..7c2f1135ac00c12ee4b696ac1819049260c45509 100644
--- a/bootstrap.php
+++ b/bootstrap.php
@@ -112,6 +112,8 @@ class Bootstrap {
         define('FILTER_TABLE', $prefix.'filter');
         define('FILTER_RULE_TABLE', $prefix.'filter_rule');
 
+        define('PLUGIN_TABLE', $prefix.'plugin');
+
         define('API_KEY_TABLE',$prefix.'api_key');
         define('TIMEZONE_TABLE',$prefix.'timezone');
     }
@@ -170,8 +172,7 @@ class Bootstrap {
 
     function loadCode() {
         #include required files
-        require(INCLUDE_DIR.'class.ostsession.php');
-        require(INCLUDE_DIR.'class.usersession.php');
+        require(INCLUDE_DIR.'class.auth.php');
         require(INCLUDE_DIR.'class.pagenate.php'); //Pagenate helper!
         require(INCLUDE_DIR.'class.log.php');
         require(INCLUDE_DIR.'class.crypto.php');
diff --git a/include/ajax.users.php b/include/ajax.users.php
index a1096d6f5604f3f749311de45fb0b8ca5f92b343..e73c0b054894af1bdecf2a0f2af2d2a514ec0ce8 100644
--- a/include/ajax.users.php
+++ b/include/ajax.users.php
@@ -106,5 +106,26 @@ class UsersAjaxAPI extends AjaxController {
         return $resp;
     }
 
+    function searchStaff() {
+        global $thisstaff;
+
+        if (!$thisstaff)
+            Http::response(403, 'Login required for searching');
+        elseif (!$thisstaff->isAdmin())
+            Http::response(403,
+                'Administrative privilege is required for searching');
+        elseif (!isset($_REQUEST['q']))
+            Http::response(400, 'Query argument is required');
+
+        $users = array();
+        foreach (AuthenticationBackend::allRegistered() as $ab) {
+            if (!$ab->supportsSearch())
+                continue;
+
+            foreach ($ab->search($_REQUEST['q']) as $u)
+                $users[] = $u;
+        }
+        return $this->json_encode($users);
+    }
 }
 ?>
diff --git a/include/class.auth.php b/include/class.auth.php
new file mode 100644
index 0000000000000000000000000000000000000000..51474a5f6158c9b4357a35e9b656eca6fd1c4c5f
--- /dev/null
+++ b/include/class.auth.php
@@ -0,0 +1,295 @@
+<?php
+require(INCLUDE_DIR.'class.ostsession.php');
+require(INCLUDE_DIR.'class.usersession.php');
+
+class AuthenticatedUser {
+    // How the user was authenticated
+    var $backend;
+
+    // Get basic information
+    function getId() {}
+    function getUsername() {}
+}
+
+/**
+ * Authentication backend
+ *
+ * Authentication provides the basis of abstracting the link between the
+ * login page with a username and password and the staff member,
+ * administrator, or client using the system.
+ *
+ * The system works by allowing the AUTH_BACKENDS setting from
+ * ost-config.php to determine the list of authentication backends or
+ * providers and also specify the order they should be evaluated in.
+ *
+ * The authentication backend should define a authenticate() method which
+ * receives a username and optional password. If the authentication
+ * succeeds, an instance deriving from <User> should be returned.
+ */
+class AuthenticationBackend {
+    static private $registry = array();
+    static $name;
+    static $id;
+
+    /* static */
+    static function register($class) {
+        if (is_string($class))
+            $class = new $class();
+        static::$registry[] = $class;
+    }
+
+    static function allRegistered() {
+        return static::$registry;
+    }
+
+    /* static */
+    function process($username, $password=null, &$errors) {
+        if (!$username)
+            return false;
+
+        $backend = static::_getAllowedBackends($username);
+
+        foreach (static::$registry as $bk) {
+            if ($backend && $bk->supportsAuthentication() && $bk::$id != $backend)
+                // User cannot be authenticated against this backend
+                continue;
+            // All backends are queried here, even if they don't support
+            // authentication so that extensions like lockouts and audits
+            // can be supported.
+            $result = $bk->authenticate($username, $password);
+            if ($result instanceof AuthenticatedUser) {
+                static::_login($result, $username, $bk);
+                $result->backend = $bk;
+                return $result;
+            }
+            // TODO: Handle permission denied, for instance
+            elseif ($result instanceof AccessDenied) {
+                $errors['err'] = $result->reason;
+                break;
+            }
+        }
+        $info = array('username'=>$username, 'password'=>$password);
+        Signal::send('auth.login.failed', null, $info);
+    }
+
+    function singleSignOn(&$errors) {
+        global $ost;
+
+        foreach (static::$registry as $bk) {
+            // All backends are queried here, even if they don't support
+            // authentication so that extensions like lockouts and audits
+            // can be supported.
+            $result = $bk->signOn();
+            if ($result instanceof AuthenticatedUser) {
+                // Ensure staff members are allowed to be authenticated
+                // against this backend
+                if ($result instanceof Staff
+                        && !static::_isBackendAllowed($result, $bk))
+                    continue;
+                static::_login($result, $result->getUserName(), $bk);
+                $result->backend = $bk;
+                return $result;
+            }
+            // TODO: Handle permission denied, for instance
+            elseif ($result instanceof AccessDenied) {
+                $errors['err'] = $result->reason;
+                break;
+            }
+        }
+    }
+
+    function _isBackendAllowed($staff, $bk) {
+        $sql = 'SELECT backend FROM '.STAFF_TABLE
+            .' WHERE staff_id='.db_input($staff->getId());
+        $backend = db_result(db_query($sql));
+        return !$backend || strcasecmp($bk, $backend) === 0;
+    }
+
+    function _getAllowedBackends($username) {
+        $username = trim($_POST['userid']);
+        $sql = 'SELECT backend FROM '.STAFF_TABLE
+            .' WHERE username='.db_input($username)
+            .' OR email='.db_input($username);
+        return db_result(db_query($sql));
+    }
+
+    function _login($user, $username, $bk) {
+        global $ost;
+
+        if ($user instanceof Staff) {
+            //Log debug info.
+            $ost->logDebug('Staff login',
+                sprintf("%s logged in [%s], via %s", $user->getUserName(),
+                    $_SERVER['REMOTE_ADDR'], get_class($bk))); //Debug.
+
+            $sql='UPDATE '.STAFF_TABLE.' SET lastlogin=NOW() '
+                .' WHERE staff_id='.db_input($user->getId());
+            db_query($sql);
+            //Now set session crap and lets roll baby!
+            $_SESSION['_staff'] = array(); //clear.
+            $_SESSION['_staff']['userID'] = $username;
+
+            $user->refreshSession(); //set the hash.
+
+            $_SESSION['TZ_OFFSET'] = $user->getTZoffset();
+            $_SESSION['TZ_DST'] = $user->observeDaylight();
+        }
+
+        //Regenerate session id.
+        $sid = session_id(); //Current id
+        session_regenerate_id(true);
+        // Destroy old session ID - needed for PHP version < 5.1.0
+        // DELME: remove when we move to php 5.3 as min. requirement.
+        if(($session=$ost->getSession()) && is_object($session)
+                && $sid!=session_id())
+            $session->destroy($sid);
+
+        Signal::send('auth.login.succeeded', $user);
+
+        $user->cancelResetTokens();
+    }
+
+    /**
+     * Fetches the friendly name of the backend
+     */
+    function getName() {
+        return static::$name;
+    }
+
+    /**
+     * Indicates if the backed supports authentication. Useful if the
+     * backend is used for logging or lockout only
+     */
+    function supportsAuthentication() {
+        return true;
+    }
+
+    /**
+     * Indicates if the backend can be used to search for user information.
+     * Lookup is performed to find user information based on a unique
+     * identifier.
+     */
+    function supportsLookup() {
+        return false;
+    }
+
+    /**
+     * Indicates if the backend supports searching for usernames. This is
+     * distinct from information lookup in that lookup is intended to lookup
+     * information based on a unique identifier
+     */
+    function supportsSearch() {
+        return false;
+    }
+
+    /**
+     * Indicates if the backend supports changing a user's password. This
+     * would be done in two fashions. Either the currently-logged in user
+     * want to change its own password or a user requests to have their
+     * password reset. This requires an administrative privilege which this
+     * backend might not possess, so it's defined in supportsPasswordReset()
+     */
+    function supportsPasswordChange() {
+        return false;
+    }
+
+    function supportsPasswordReset() {
+        return false;
+    }
+
+    /* abstract */
+    function authenticate($username, $password) {
+        return false;
+    }
+
+    /* abstract */
+    function signOn() {
+        return false;
+    }
+}
+
+class RemoteAuthenticationBackend {
+    var $create_unknown_user = false;
+}
+
+/**
+ * This will be an exception in later versions of PHP
+ */
+class AccessDenied {
+    function AccessDenied() {
+        call_user_func_array(array($this, '__construct'), func_get_args());
+    }
+    function __construct($reason) {
+        $this->reason = $reason;
+    }
+}
+
+/**
+ * Simple authentication backend which will lock the login form after a
+ * configurable number of attempts
+ */
+class AuthLockoutBackend extends AuthenticationBackend {
+
+    function authenticate($username, $password=null) {
+        global $cfg, $ost;
+
+        if($_SESSION['_staff']['laststrike']) {
+            if((time()-$_SESSION['_staff']['laststrike'])<$cfg->getStaffLoginTimeout()) {
+                $_SESSION['_staff']['laststrike'] = time(); //reset timer.
+                return new AccessDenied('Max. failed login attempts reached');
+            } else { //Timeout is over.
+                //Reset the counter for next round of attempts after the timeout.
+                $_SESSION['_staff']['laststrike']=null;
+                $_SESSION['_staff']['strikes']=0;
+            }
+        }
+
+        $_SESSION['_staff']['strikes']+=1;
+        if($_SESSION['_staff']['strikes']>$cfg->getStaffMaxLogins()) {
+            $_SESSION['_staff']['laststrike']=time();
+            $alert='Excessive login attempts by a staff member?'."\n".
+                   'Username: '.$username."\n"
+                   .'IP: '.$_SERVER['REMOTE_ADDR']."\n"
+                   .'TIME: '.date('M j, Y, g:i a T')."\n\n"
+                   .'Attempts #'.$_SESSION['_staff']['strikes']."\n"
+                   .'Timeout: '.($cfg->getStaffLoginTimeout()/60)." minutes \n\n";
+            $ost->logWarning('Excessive login attempts ('.$username.')', $alert,
+                    $cfg->alertONLoginError());
+            return new AccessDenied('Forgot your login info? Contact Admin.');
+        //Log every other failed login attempt as a warning.
+        } elseif($_SESSION['_staff']['strikes']%2==0) {
+            $alert='Username: '.$username."\n"
+                    .'IP: '.$_SERVER['REMOTE_ADDR']."\n"
+                    .'TIME: '.date('M j, Y, g:i a T')."\n\n"
+                    .'Attempts #'.$_SESSION['_staff']['strikes'];
+            $ost->logWarning('Failed staff login attempt ('.$username.')', $alert, false);
+        }
+    }
+
+    function supportsAuthentication() {
+        return false;
+    }
+}
+AuthenticationBackend::register(AuthLockoutBackend);
+
+class osTicketAuthentication extends AuthenticationBackend {
+    static $name = "Local Authenication";
+    static $id = "local";
+
+    function authenticate($username, $password) {
+        if (($user = new StaffSession($username)) && $user->getId() &&
+                $user->check_passwd($password)) {
+
+            //update last login && password reset stuff.
+            $sql='UPDATE '.STAFF_TABLE.' SET lastlogin=NOW() ';
+            if($user->isPasswdResetDue() && !$user->isAdmin())
+                $sql.=',change_passwd=1';
+            $sql.=' WHERE staff_id='.db_input($user->getId());
+            db_query($sql);
+
+            return $user;
+        }
+    }
+}
+AuthenticationBackend::register(osTicketAuthentication);
+?>
diff --git a/include/class.config.php b/include/class.config.php
index ac60110e8f2ad06423f2fd551ac109247b8e425d..6930bf14e656ff937e50bce2b78b9c21e53761e0 100644
--- a/include/class.config.php
+++ b/include/class.config.php
@@ -14,8 +14,6 @@
     vim: expandtab sw=4 ts=4 sts=4:
 **********************************************************************/
 
-require_once(INCLUDE_DIR.'class.email.php');
-
 class Config {
     var $config = array();
 
@@ -105,7 +103,9 @@ class Config {
     }
 
     function update($key, $value) {
-        if (!isset($this->config[$key]))
+        if (!$key)
+            return false;
+        elseif (!isset($this->config[$key]))
             return $this->create($key, $value);
 
         $setting = &$this->config[$key];
diff --git a/include/class.cron.php b/include/class.cron.php
index 3aa0357c198ce61e25a22dae6bc9ea982954877e..999bf437dd60b281d00d8c9e2c6c55e1ef220dd4 100644
--- a/include/class.cron.php
+++ b/include/class.cron.php
@@ -3,7 +3,7 @@
     class.cron.php
 
     Nothing special...just a central location for all cron calls.
-    
+
     Peter Rotich <peter@osticket.com>
     Copyright (c)  2006-2013 osTicket
     http://www.osticket.com
@@ -12,10 +12,12 @@
     See LICENSE.TXT for details.
 
     TODO: The plan is to make cron jobs db based.
-    
+
     vim: expandtab sw=4 ts=4 sts=4:
 **********************************************************************/
 //TODO: Make it DB based!
+require_once INCLUDE_DIR.'class.signal.php';
+
 class Cron {
 
     function MailFetcher() {
@@ -27,7 +29,7 @@ class Cron {
         require_once(INCLUDE_DIR.'class.ticket.php');
         require_once(INCLUDE_DIR.'class.lock.php');
         Ticket::checkOverdue(); //Make stale tickets overdue
-        TicketLock::cleanup(); //Remove expired locks 
+        TicketLock::cleanup(); //Remove expired locks
     }
 
     function PurgeLogs() {
@@ -55,6 +57,8 @@ class Cron {
         self::PurgeLogs();
         self::CleanOrphanedFiles();
         self::PurgeDrafts();
+
+        Signal::send('cron');
     }
 }
 ?>
diff --git a/include/class.forms.php b/include/class.forms.php
index 0654a2648c9d1cb2438e35c0357927dc7d2588b7..67b05e16ddf8aaae0f6e37056b2cade65b5595db 100644
--- a/include/class.forms.php
+++ b/include/class.forms.php
@@ -82,9 +82,12 @@ class Form {
         if (!$this->_clean) {
             $this->_clean = array();
             foreach ($this->getFields() as $key=>$field) {
+                if (!$field->hasData())
+                    continue;
                 $this->_clean[$key] = $this->_clean[$field->get('name')]
                     = $field->getClean();
             }
+            unset($this->_clean[""]);
         }
         return $this->_clean;
     }
@@ -129,14 +132,14 @@ class FormField {
 
     static $types = array(
         'Basic Fields' => array(
-            'text'  => array('Short Answer', TextboxField),
-            'memo' => array('Long Answer', TextareaField),
-            'thread' => array('Thread Entry', ThreadEntryField, false),
-            'datetime' => array('Date and Time', DatetimeField),
-            'phone' => array('Phone Number', PhoneField),
-            'bool' => array('Checkbox', BooleanField),
-            'choices' => array('Choices', ChoiceField),
-            'break' => array('Section Break', SectionBreakField),
+            'text'  => array('Short Answer', 'TextboxField'),
+            'memo' => array('Long Answer', 'TextareaField'),
+            'thread' => array('Thread Entry', 'ThreadEntryField', false),
+            'datetime' => array('Date and Time', 'DatetimeField'),
+            'phone' => array('Phone Number', 'PhoneField'),
+            'bool' => array('Checkbox', 'BooleanField'),
+            'choices' => array('Choices', 'ChoiceField'),
+            'break' => array('Section Break', 'SectionBreakField'),
         ),
     );
     static $more_types = array();
@@ -441,7 +444,8 @@ class FormField {
         if (!static::$widget)
             throw new Exception('Widget not defined for this field');
         if (!isset($this->_widget)) {
-            $this->_widget = new static::$widget($this);
+            $wc = $this->get('widget') ? $this->get('widget') : static::$widget;
+            $this->_widget = new $wc($this);
             $this->_widget->parseValue();
         }
         return $this->_widget;
@@ -500,6 +504,18 @@ class TextboxField extends FormField {
     }
 }
 
+class PasswordField extends TextboxField {
+    static $widget = 'PasswordWidget';
+
+    function to_database($value) {
+        return Crypto::encrypt($value, SECRET_SALT, $this->getFormName());
+    }
+
+    function to_php($value) {
+        return Crypto::decrypt($value, SECRET_SALT, $this->getFormName());
+    }
+}
+
 class TextareaField extends FormField {
     static $widget = 'TextareaWidget';
 
@@ -841,6 +857,8 @@ class Widget {
 }
 
 class TextboxWidget extends Widget {
+    static $input_type = 'text';
+
     function render() {
         $config = $this->field->getConfiguration();
         if (isset($config['size']))
@@ -853,7 +871,8 @@ class TextboxWidget extends Widget {
             $autocomplete = 'autocomplete="'.($config['autocomplete']?'on':'off').'"';
         ?>
         <span style="display:inline-block">
-        <input type="text" id="<?php echo $this->name; ?>"
+        <input type="<?php echo static::$input_type; ?>"
+            id="<?php echo $this->name; ?>"
             <?php echo $size . " " . $maxlength; ?>
             <?php echo $classes.' '.$autocomplete; ?>
             name="<?php echo $this->name; ?>"
@@ -863,6 +882,19 @@ class TextboxWidget extends Widget {
     }
 }
 
+class PasswordWidget extends TextboxWidget {
+    static $input_type = 'password';
+
+    function parseValue() {
+        // Show empty box unless failed POST
+        if ($_SERVER['REQUEST_METHOD'] == 'POST'
+                && $this->field->getForm()->isValid())
+            parent::parseValue();
+        else
+            $this->value = '';
+    }
+}
+
 class TextareaWidget extends Widget {
     function render() {
         $config = $this->field->getConfiguration();
diff --git a/include/class.nav.php b/include/class.nav.php
index 5a391ff553967c1338828ab6796ea079a615a6dd..799c76a8b4dc0a78b74374c2b2aa673cf74c5132 100644
--- a/include/class.nav.php
+++ b/include/class.nav.php
@@ -213,6 +213,7 @@ class AdminNav extends StaffNav{
                     $subnav[]=array('desc'=>'Pages', 'href'=>'pages.php','title'=>'Pages','iconclass'=>'pages');
                     $subnav[]=array('desc'=>'Forms','href'=>'forms.php','iconclass'=>'forms');
                     $subnav[]=array('desc'=>'Lists','href'=>'lists.php','iconclass'=>'lists');
+                    $subnav[]=array('desc'=>'Plugins','href'=>'plugins.php','iconclass'=>'api');
                     break;
                 case 'emails':
                     $subnav[]=array('desc'=>'Emails','href'=>'emails.php', 'title'=>'Email Addresses', 'iconclass'=>'emailSettings');
diff --git a/include/class.osticket.php b/include/class.osticket.php
index 875dc13bf8e2e6217a881db22448c0251a019cc5..0e76fe3e6f4f02c6c79b72081182e90d2c002c91 100644
--- a/include/class.osticket.php
+++ b/include/class.osticket.php
@@ -20,6 +20,7 @@
 
 require_once(INCLUDE_DIR.'class.csrf.php'); //CSRF token class.
 require_once(INCLUDE_DIR.'class.migrater.php');
+require_once(INCLUDE_DIR.'class.plugin.php');
 
 define('LOG_WARN',LOG_WARNING);
 
@@ -46,6 +47,7 @@ class osTicket {
     var $session;
     var $csrf;
     var $company;
+    var $plugins;
 
     function osTicket() {
 
@@ -59,6 +61,8 @@ class osTicket {
         $this->csrf = new CSRF('__CSRFToken__');
 
         $this->company = new Company();
+
+        $this->plugins = new PluginManager();
     }
 
     function isSystemOnline() {
@@ -432,6 +436,9 @@ class osTicket {
         $_SESSION['TZ_OFFSET'] = $ost->getConfig()->getTZoffset();
         $_SESSION['TZ_DST'] = $ost->getConfig()->observeDaylightSaving();
 
+        // Bootstrap installed plugins
+        $ost->plugins->bootstrap();
+
         return $ost;
     }
 }
diff --git a/include/class.plugin.php b/include/class.plugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..107ff4f46d8b451c038ae4b850f4731a6ada8b7e
--- /dev/null
+++ b/include/class.plugin.php
@@ -0,0 +1,351 @@
+<?php
+
+require_once(INCLUDE_DIR.'/class.config.php');
+class PluginConfig extends Config {
+    var $table = CONFIG_TABLE;
+    var $form;
+
+    function __construct($name) {
+        // Use parent constructor to place configurable information into the
+        // central config table in a namespace of "plugin.<id>"
+        parent::Config("plugin.$name");
+    }
+
+    /* abstract */
+    function getOptions() {
+        return array();
+    }
+
+    /**
+     * Retreive a Form instance for the configurable options offered in
+     * ::getOptions
+     */
+    function getForm() {
+        if (!isset($this->form)) {
+            $this->form = new Form($this->getOptions());
+            if ($_SERVER['REQUEST_METHOD'] != 'POST')
+                $this->form->data($this->getInfo());
+        }
+        return $this->form;
+    }
+
+    /**
+     * commit
+     *
+     * Used in the POST request of the configuration process. The
+     * ::getForm() method should be used to retrieve a configuration form
+     * for this plugin. That form should be submitted via a POST request,
+     * and this method should be called in that request. The data from the
+     * POST request will be interpreted and will adjust the configuration of
+     * this field
+     *
+     * Parameters:
+     * errors - (OUT array) receives validation errors of the parsed
+     *      configuration form
+     *
+     * Returns:
+     * (bool) true if the configuration was updated, false if there were
+     * errors. If false, the errors were written into the received errors
+     * array.
+     */
+    function commit(&$errors=array()) {
+        $f = $this->getForm();
+        $commit = false;
+        if ($f->isValid()) {
+            $config = $f->getClean();
+            $commit = $this->pre_save($config, $errors);
+        }
+        $errors += $f->errors();
+        if ($commit && count($errors) === 0)
+            return $this->updateAll($config);
+        return false;
+    }
+
+    /**
+     * Pre-save hook to check configuration for errors (other than obvious
+     * validation errors) prior to saving. Add an error to the errors list
+     * or return boolean FALSE if the config commit should be aborted.
+     */
+    function pre_save($config, &$errors) {
+        return true;
+    }
+
+    /**
+     * Remove all configuration for this plugin -- used when the plugin is
+     * uninstalled
+     */
+    function purge() {
+        $sql = 'DELETE FROM '.$this->table
+            .' WHERE `namespace`='.db_input($this->getNamespace());
+        return (db_query($sql) && db_affected_rows());
+    }
+}
+
+class PluginManager {
+    static private $plugin_info = array();
+    static private $plugin_list = array();
+
+    /**
+     * boostrap
+     *
+     * Used to bootstrap the plugin subsystem and initialize all the plugins
+     * currently enabled.
+     */
+    function bootstrap() {
+        foreach ($this->allActive() as $p)
+            $p->bootstrap();
+    }
+
+    /**
+     * allActive
+     *
+     * Scans the plugin registry to find all installed and active plugins.
+     * Those plugins are included, instanciated, and cached in a list.
+     *
+     * Returns:
+     * Array<Plugin> a cached list of instanciated plugins for all installed
+     * and active plugins
+     */
+    static function allInstalled() {
+        if (static::$plugin_list)
+            return static::$plugin_list;
+
+        $sql = 'SELECT * FROM '.PLUGIN_TABLE;
+        if (!($res = db_query($sql)))
+            return static::$plugin_list;
+
+        $infos = static::allInfos();
+        while ($ht = db_fetch_array($res)) {
+            // XXX: Only read active plugins here. allInfos() will
+            //      read all plugins
+            if (isset($infos[$ht['install_path']])) {
+                $info = $infos[$ht['install_path']];
+                if ($ht['isactive']) {
+                    list($path, $class) = explode(':', $info['plugin']);
+                    if (!$class)
+                        $class = $path;
+                    else
+                        require_once(INCLUDE_DIR . $ht['install_path']
+                            . '/' . $path);
+                    static::$plugin_list[$ht['install_path']]
+                        = new $class($ht['id']);
+                }
+                else {
+                    static::$plugin_list[$ht['install_path']] = $ht;
+                }
+            }
+        }
+        return static::$plugin_list;
+    }
+
+    static function allActive() {
+        $plugins = array();
+        foreach (static::allInstalled() as $p)
+            if ($p instanceof Plugin && $p->isActive())
+                $plugins[] = $p;
+        return $plugins;
+    }
+
+    /**
+     * allInfos
+     *
+     * Scans the plugin folders for installed plugins. For each one, the
+     * plugin.php file is included and the info array returned in added to
+     * the list returned.
+     *
+     * Returns:
+     * Information about all available plugins. The registry will have to be
+     * queried to determine if the plugin is installed
+     */
+    static function allInfos() {
+        static $defaults = array(
+            'include' => 'include/',
+            'stream' => false,
+        );
+
+        if (static::$plugin_info)
+            return static::$plugin_info;
+
+        foreach (glob(INCLUDE_DIR . 'plugins/*', GLOB_ONLYDIR) as $p) {
+            if (!is_file($p . '/plugin.php'))
+                // Invalid plugin -- must define "/plugin.php"
+                continue;
+            // plugin.php is require to return an array of informaiton about
+            // the plugin.
+            $info = array_merge($defaults, (include $p . '/plugin.php'));
+            $info['install_path'] = str_replace(INCLUDE_DIR, '', $p);
+
+            // XXX: Ensure 'id' key isset
+            static::$plugin_info[$info['install_path']] = $info;
+        }
+        return static::$plugin_info;
+    }
+
+    static function getInfoForPath($path) {
+        $infos = static::allInfos();
+        if (isset($infos[$path]))
+            return $infos[$path];
+        return null;
+    }
+
+    function getInstance($path) {
+        static $instances = array();
+        if (!isset($instances[$path])
+                && ($ps = static::allInstalled())
+                && ($ht = $ps[$path])
+                && ($info = static::getInfoForPath($path))) {
+            // $ht may be the plugin instance
+            if ($ht instanceof Plugin)
+                return $ht;
+            // Usually this happens when the plugin is being enabled
+            list($path, $class) = explode(':', $info['plugin']);
+            if (!$class)
+                $class = $path;
+            else
+                require_once(INCLUDE_DIR . $info['install_path'] . '/' . $path);
+            $instances[$path] = new $class($ht['id']);
+        }
+        return $instances[$path];
+    }
+
+    /**
+     * install
+     *
+     * Used to install a plugin that is in-place on the filesystem, but not
+     * registered in the plugin registry -- the %plugin table.
+     */
+    function install($path) {
+        if (!($info = $this->getInfoForPath($path)))
+            return false;
+
+        $sql='INSERT INTO '.PLUGIN_TABLE.' SET installed=NOW() '
+            .', install_path='.db_input($path)
+            .', name='.db_input($info['name']);
+        if (!db_query($sql) || !db_affected_rows())
+            return false;
+
+        static::$plugin_list = array();
+        return true;
+    }
+}
+
+/**
+ * Class: Plugin (abstract)
+ *
+ * Base class for plugins. Plugins should inherit from this class and define
+ * the useful pieces of the
+ */
+class Plugin {
+    /**
+     * Configuration manager for the plugin. Should be the name of a class
+     * that inherits from PluginConfig. This is abstract and must be defined
+     * by the plugin subclass.
+     */
+    var $config_class = null;
+    var $id;
+    var $info;
+
+    function Plugin($id) {
+        $this->id = $id;
+        $this->load();
+    }
+
+    function load() {
+        $sql = 'SELECT * FROM '.PLUGIN_TABLE.' WHERE
+            `id`='.db_input($this->id);
+        if (($res = db_query($sql)) && ($ht=db_fetch_array($res)))
+            $this->ht = $ht;
+        $this->info = PluginManager::getInfoForPath($this->ht['install_path']);
+    }
+
+    function getId() { return $this->id; }
+    function getName() { return $this->info['name']; }
+    function isActive() { return $this->ht['isactive']; }
+    function isPhar() { return $this->ht['isphar']; }
+    function getInstallDate() { return $this->ht['installed']; }
+
+    function getIncludePath() {
+        return realpath(INCLUDE_DIR . $this->info['install_path'] . '/'
+            . $this->info['include_path']) . '/';
+    }
+
+    /**
+     * uninstall
+     *
+     * Removes the plugin from the plugin registry. The files remain on the
+     * filesystem which would allow the plugin to be reinstalled. The
+     * configuration for the plugin is also removed. If the plugin is
+     * reinstalled, it will have to be reconfigured.
+     */
+    function uninstall() {
+        if ($this->pre_uninstall() === false)
+            return false;
+
+        $sql = 'DELETE FROM '.PLUGIN_TABLE
+            .' WHERE id='.db_input($this->getId());
+        if (db_query($sql) && db_affected_rows())
+            return $this->getConfig()->purge();
+        return false;
+    }
+
+    /**
+     * pre_uninstall
+     *
+     * Hook function to veto the uninstallation request. Return boolean
+     * FALSE if the uninstall operation should be aborted.
+     * TODO: Recommend a location to stash an error message if aborting
+     */
+    function pre_uninstall() {
+        return true;
+    }
+
+    function enable() {
+        $sql = 'UPDATE '.PLUGIN_TABLE
+            .' SET isactive=1 WHERE id='.db_input($this->getId());
+        return (db_query($sql) && db_affected_rows());
+    }
+
+    function disable() {
+        $sql = 'UPDATE '.PLUGIN_TABLE
+            .' SET isactive=0 WHERE id='.db_input($this->getId());
+        return (db_query($sql) && db_affected_rows());
+    }
+
+    /**
+     * upgrade
+     *
+     * Upgrade the plugin. This is used to migrate the database pieces of
+     * the plugin using the database migration stream packaged with the
+     * plugin.
+     */
+    function upgrade() {
+    }
+
+    function getConfig() {
+        static $config = null;
+        if ($config === null && $this->config_class)
+            $config = new $this->config_class($this->getId());
+
+        return $config;
+    }
+
+    function source($what) {
+        $what = str_replace('\\', '/', $what);
+        if ($what && $what[0] != '/')
+            $what = $this->getIncludePath() . $what;
+        include_once $what;
+    }
+
+    static function lookup($id) { //Assuming local ID is the only lookup used!
+        $path = false;
+        if ($id && is_numeric($id)) {
+            $sql = 'SELECT install_path FROM '.PLUGIN_TABLE
+                .' WHERE id='.db_input($id);
+            $path = db_result(db_query($sql));
+        }
+        if ($path)
+           return PluginManager::getInstance($path);
+    }
+}
+
+?>
diff --git a/include/class.staff.php b/include/class.staff.php
index 93708bc0cccfbd71120f321f22e722f7af98834e..f2e3d6b384fbc5b846155d3108792aff24c6021e 100644
--- a/include/class.staff.php
+++ b/include/class.staff.php
@@ -20,8 +20,9 @@ include_once(INCLUDE_DIR.'class.team.php');
 include_once(INCLUDE_DIR.'class.group.php');
 include_once(INCLUDE_DIR.'class.passwd.php');
 include_once(INCLUDE_DIR.'class.user.php');
+include_once(INCLUDE_DIR.'class.auth.php');
 
-class Staff {
+class Staff extends AuthenticatedUser {
 
     var $ht;
     var $id;
@@ -762,13 +763,17 @@ class Staff {
             $errors['mobile']='Valid number required';
 
         if($vars['passwd1'] || $vars['passwd2'] || !$id) {
-            if(!$vars['passwd1'] && !$id) {
+            if($vars['passwd1'] && strcmp($vars['passwd1'], $vars['passwd2'])) {
+                $errors['passwd2']='Password(s) do not match';
+            }
+            elseif ($vars['backend'] != 'local') {
+                // Password can be omitted
+            }
+            elseif(!$vars['passwd1'] && !$id) {
                 $errors['passwd1']='Temp. password required';
                 $errors['temppasswd']='Required';
             } elseif($vars['passwd1'] && strlen($vars['passwd1'])<6) {
                 $errors['passwd1']='Must be at least 6 characters';
-            } elseif($vars['passwd1'] && strcmp($vars['passwd1'], $vars['passwd2'])) {
-                $errors['passwd2']='Password(s) do not match';
             }
         }
 
@@ -798,6 +803,7 @@ class Staff {
             .' ,firstname='.db_input($vars['firstname'])
             .' ,lastname='.db_input($vars['lastname'])
             .' ,email='.db_input($vars['email'])
+            .' ,backend='.db_input($vars['backend'])
             .' ,phone="'.db_input(Format::phone($vars['phone']),false).'"'
             .' ,phone_ext='.db_input($vars['phone_ext'])
             .' ,mobile="'.db_input(Format::phone($vars['mobile']),false).'"'
diff --git a/include/pear/Net/DNS2.php b/include/pear/Net/DNS2.php
new file mode 100644
index 0000000000000000000000000000000000000000..bffe0d45eb72d195e7bfc62504eb69bca1efd943
--- /dev/null
+++ b/include/pear/Net/DNS2.php
@@ -0,0 +1,1228 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates.
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors
+ *     may be used to endorse or promote products derived from this
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: DNS2.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/*
+ * register the auto-load function
+ *
+ */
+spl_autoload_register('Net_DNS2::autoload');
+
+/**
+ * This is the base class for the Net_DNS2_Resolver and Net_DNS2_Updater
+ * classes.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Resolver, Net_DNS2_Updater
+ *
+ */
+class Net_DNS2
+{
+    /*
+     * the current version of this library
+     */
+    const VERSION = '1.3.1';
+
+    /*
+     * the default path to a resolv.conf file
+     */
+    const RESOLV_CONF = '/etc/resolv.conf';
+
+    /*
+     * use TCP only (true/false)
+     */
+    public $use_tcp = false;
+
+    /*
+     * DNS Port to use (53)
+     */
+    public $dns_port = 53;
+
+    /*
+     * the ip/port for use as a local socket
+     */
+    public $local_host = '';
+    public $local_port = 0;
+
+    /*
+     * timeout value for socket connections
+     */
+    public $timeout = 5;
+
+    /*
+     * randomize the name servers list
+     */
+    public $ns_random = false;
+
+    /*
+     * default domains
+     */
+    public $domain = '';
+
+    /*
+     * domain search list - not actually used right now
+     */
+    public $search_list = array();
+
+    /*
+     * enable cache; either "shared", "file" or "none"
+     */
+    public $cache_type = 'none';
+
+    /*
+     * file name to use for shared memory segment or file cache
+     */
+    public $cache_file = '/tmp/net_dns2.cache';
+
+    /*
+     * the max size of the cache file (in bytes)
+     */
+    public $cache_size = 10000;
+
+    /*
+     * the method to use for storing cache data; either "serialize" or "json"
+     *
+     * json is faster, but can't remember the class names (everything comes back
+     * as a "stdClass Object"; all the data is the same though. serialize is
+     * slower, but will have all the class info.
+     *
+     * defaults to 'serialize'
+     */
+    public $cache_serializer = 'serialize';
+
+    /*
+     * by default, according to RFC 1034
+     *
+     * CNAME RRs cause special action in DNS software.  When a name server
+     * fails to find a desired RR in the resource set associated with the
+     * domain name, it checks to see if the resource set consists of a CNAME
+     * record with a matching class.  If so, the name server includes the CNAME
+     * record in the response and restarts the query at the domain name
+     * specified in the data field of the CNAME record.
+     *
+     * this can cause "unexpected" behavious, since i'm sure *most* people
+     * don't know DNS does this; there may be cases where Net_DNS2 returns a
+     * positive response, even though the hostname the user looked up did not
+     * actually exist.
+     *
+     * strict_query_mode means that if the hostname that was looked up isn't
+     * actually in the answer section of the response, Net_DNS2 will return an
+     * empty answer section, instead of an answer section that could contain
+     * CNAME records.
+     *
+     */
+    public $strict_query_mode = false;
+
+    /*
+     * if we should set the recursion desired bit to 1 or 0.
+     *
+     * by default this is set to true, we want the DNS server to perform a recursive
+     * request. If set to false, the RD bit will be set to 0, and the server will
+     * not perform recursion on the request.
+     */
+    public $recurse = true;
+
+    /*
+     * request DNSSEC values, by setting the DO flag to 1; this actually makes
+     * the resolver add a OPT RR to the additional section, and sets the DO flag
+     * in this RR to 1
+     *
+     */
+    public $dnssec = false;
+
+    /*
+     * set the DNSSEC AD (Authentic Data) bit on/off; the AD bit on the request
+     * side was previously undefined, and resolvers we instructed to always clear
+     * the AD bit when sending a request.
+     *
+     * RFC6840 section 5.7 defines setting the AD bit in the query as a signal to
+     * the server that it wants the value of the AD bit, without needed to request
+     * all the DNSSEC data via the DO bit.
+     *
+     */
+    public $dnssec_ad_flag = false;
+
+    /*
+     * set the DNSSEC CD (Checking Disabled) bit on/off; turning this off, means
+     * that the DNS resolver will perform it's own signature validation- so the DNS
+     * servers simply pass through all the details.
+     *
+     */
+    public $dnssec_cd_flag = false;
+
+    /*
+     * the EDNS(0) UDP payload size to use when making DNSSEC requests
+     * see RFC 2671 section 6.2.3 for more details
+     *
+     * http://tools.ietf.org/html/draft-ietf-dnsext-rfc2671bis-edns0-10
+     *
+     */
+    public $dnssec_payload_size = 1280;
+
+    /*
+     * local sockets
+     */
+    protected $sock = array('udp' => array(), 'tcp' => array());
+
+    /*
+     * name server list
+     */
+    protected $nameservers = array();
+
+    /*
+     * if the socket extension is loaded
+     */
+    protected $sockets_enabled = false;
+
+    /*
+     * the TSIG or SIG RR object for authentication
+     */
+    protected $auth_signature = null;
+
+    /*
+     * the shared memory segment id for the local cache
+     */
+    protected $cache = null;
+
+    /*
+     * internal setting for enabling cache
+     */
+    protected $use_cache = false;
+
+    /*
+     * the last erro message returned by the sockets class
+     */
+    private $_last_socket_error = '';
+
+    /**
+     * Constructor - base constructor for the Resolver and Updater
+     *
+     * @param mixed $options array of options or null for none
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct(array $options = null)
+    {
+        //
+        // check for the sockets extension
+        //
+        $this->sockets_enabled = extension_loaded('sockets');
+
+        //
+        // load any options that were provided
+        //
+        if (!empty($options)) {
+
+            foreach ($options as $key => $value) {
+
+                if ($key == 'nameservers') {
+
+                    $this->setServers($value);
+                } else {
+
+                    $this->$key = $value;
+                }
+            }
+        }
+
+        //
+        // if we're set to use the local shared memory cache, then
+        // make sure it's been initialized
+        //
+        switch($this->cache_type) {
+        case 'shared':
+            if (extension_loaded('shmop')) {
+
+                $this->cache = new Net_DNS2_Cache_Shm;
+                $this->use_cache = true;
+            } else {
+
+                throw new Net_DNS2_Exception(
+                    'shmop library is not available for cache',
+                    Net_DNS2_Lookups::E_CACHE_SHM_UNAVAIL
+                );
+            }
+            break;
+        case 'file':
+
+            $this->cache = new Net_DNS2_Cache_File;
+            $this->use_cache = true;
+
+            break;
+        case 'none':
+            $this->use_cache = false;
+            break;
+        default:
+
+            throw new Net_DNS2_Exception(
+                'un-supported cache type: ' . $this->cache_type,
+                Net_DNS2_Lookups::E_CACHE_UNSUPPORTED
+            );
+        }
+    }
+
+    /**
+     * autoload call-back function; used to auto-load classes
+     *
+     * @param string $name the name of the class
+     *
+     * @return void
+     * @access public
+     *
+     */
+    static public function autoload($name)
+    {
+        //
+        // only auto-load our classes
+        //
+        if (strncmp($name, 'Net_DNS2', 8) == 0) {
+
+            include str_replace('_', '/', $name) . '.php';
+        }
+
+        return;
+    }
+
+    /**
+     * sets the name servers to be used
+     *
+     * @param mixed $nameservers either an array of name servers, or a file name
+     *                           to parse, assuming it's in the resolv.conf format
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function setServers($nameservers)
+    {
+        //
+        // if it's an array, then use it directly
+        //
+        // otherwise, see if it's a path to a resolv.conf file and if so, load it
+        //
+        if (is_array($nameservers)) {
+
+            $this->nameservers = $nameservers;
+
+        } else {
+
+            //
+            // check to see if the file is readable
+            //
+            if (is_readable($nameservers) === true) {
+
+                $data = file_get_contents($nameservers);
+                if ($data === false) {
+                    throw new Net_DNS2_Exception(
+                        'failed to read contents of file: ' . $nameservers,
+                        Net_DNS2_Lookups::E_NS_INVALID_FILE
+                    );
+                }
+
+                $lines = explode("\n", $data);
+
+                foreach ($lines as $line) {
+
+                    $line = trim($line);
+
+                    //
+                    // ignore empty lines, and lines that are commented out
+                    //
+                    if ( (strlen($line) == 0)
+                        || ($line[0] == '#')
+                        || ($line[0] == ';')
+                    ) {
+                        continue;
+                    }
+
+                    list($key, $value) = preg_split('/\s+/', $line, 2);
+
+                    $key    = trim(strtolower($key));
+                    $value  = trim(strtolower($value));
+
+                    switch($key) {
+                    case 'nameserver':
+
+                        //
+                        // nameserver can be a IPv4 or IPv6 address
+                        //
+                        if ( (self::isIPv4($value) == true)
+                            || (self::isIPv6($value) == true)
+                        ) {
+
+                            $this->nameservers[] = $value;
+                        } else {
+
+                            throw new Net_DNS2_Exception(
+                                'invalid nameserver entry: ' . $value,
+                                Net_DNS2_Lookups::E_NS_INVALID_ENTRY
+                            );
+                        }
+                        break;
+
+                    case 'domain':
+                        $this->domain = $value;
+                        break;
+
+                    case 'search':
+                        $this->search_list = preg_split('/\s+/', $value);
+                        break;
+
+                    default:
+                        ;
+                    }
+                }
+
+                //
+                // if we don't have a domain, but we have a search list, then
+                // take the first entry on the search list as the domain
+                //
+                if ( (strlen($this->domain) == 0)
+                    && (count($this->search_list) > 0)
+                ) {
+                    $this->domain = $this->search_list[0];
+                }
+
+            } else {
+                throw new Net_DNS2_Exception(
+                    'resolver file file provided is not readable: ' . $nameservers,
+                    Net_DNS2_Lookups::E_NS_INVALID_FILE
+                );
+            }
+        }
+
+        //
+        // check the name servers
+        //
+        $this->checkServers();
+
+        return true;
+    }
+
+    /**
+     * checks the list of name servers to make sure they're set
+     *
+     * @param mixed $default a path to a resolv.conf file or an array of servers.
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access protected
+     *
+     */
+    protected function checkServers($default = null)
+    {
+        if (empty($this->nameservers)) {
+
+            if (isset($default)) {
+
+                $this->setServers($default);
+            } else {
+
+                throw new Net_DNS2_Exception(
+                    'empty name servers list; you must provide a list of name '.
+                    'servers, or the path to a resolv.conf file.',
+                    Net_DNS2_Lookups::E_NS_INVALID_ENTRY
+                );
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * adds a TSIG RR object for authentication
+     *
+     * @param string $keyname   the key name to use for the TSIG RR
+     * @param string $signature the key to sign the request.
+     * @param string $algorithm the algorithm to use
+     *
+     * @return boolean
+     * @access public
+     * @since  function available since release 1.1.0
+     *
+     */
+    public function signTSIG(
+        $keyname, $signature = '', $algorithm = Net_DNS2_RR_TSIG::HMAC_MD5
+    ) {
+        //
+        // if the TSIG was pre-created and passed in, then we can just used
+        // it as provided.
+        //
+        if ($keyname instanceof Net_DNS2_RR_TSIG) {
+
+            $this->auth_signature = $keyname;
+
+        } else {
+
+            //
+            // otherwise create the TSIG RR, but don't add it just yet; TSIG needs
+            // to be added as the last additional entry- so we'll add it just
+            // before we send.
+            //
+            $this->auth_signature = Net_DNS2_RR::fromString(
+                strtolower(trim($keyname)) .
+                ' TSIG '. $signature
+            );
+
+            //
+            // set the algorithm to use
+            //
+            $this->auth_signature->algorithm = $algorithm;
+        }
+
+        return true;
+    }
+
+    /**
+     * adds a SIG RR object for authentication
+     *
+     * @param string $filename the name of a file to load the signature from.
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     * @since  function available since release 1.1.0
+     *
+     */
+    public function signSIG0($filename)
+    {
+        //
+        // check for OpenSSL
+        //
+        if (extension_loaded('openssl') === false) {
+
+            throw new Net_DNS2_Exception(
+                'the OpenSSL extension is required to use SIG(0).',
+                Net_DNS2_Lookups::E_OPENSSL_UNAVAIL
+            );
+        }
+
+        //
+        // if the SIG was pre-created, then use it as-is
+        //
+        if ($filename instanceof Net_DNS2_RR_SIG) {
+
+            $this->auth_signature = $filename;
+
+        } else {
+
+            //
+            // otherwise, it's filename which needs to be parsed and processed.
+            //
+            $private = new Net_DNS2_PrivateKey($filename);
+
+            //
+            // create a new Net_DNS2_RR_SIG object
+            //
+            $this->auth_signature = new Net_DNS2_RR_SIG();
+
+            //
+            // reset some values
+            //
+            $this->auth_signature->name         = $private->signname;
+            $this->auth_signature->ttl          = 0;
+            $this->auth_signature->class        = 'ANY';
+
+            //
+            // these values are pulled from the private key
+            //
+            $this->auth_signature->algorithm    = $private->algorithm;
+            $this->auth_signature->keytag       = $private->keytag;
+            $this->auth_signature->signname     = $private->signname;
+
+            //
+            // these values are hard-coded for SIG0
+            //
+            $this->auth_signature->typecovered  = 'SIG0';
+            $this->auth_signature->labels       = 0;
+            $this->auth_signature->origttl      = 0;
+
+            //
+            // generate the dates
+            //
+            $t = time();
+
+            $this->auth_signature->sigincep     = gmdate('YmdHis', $t);
+            $this->auth_signature->sigexp       = gmdate('YmdHis', $t + 500);
+
+            //
+            // store the private key in the SIG object for later.
+            //
+            $this->auth_signature->private_key  = $private;
+        }
+
+        //
+        // only RSAMD5 and RSASHA1 are supported for SIG(0)
+        //
+        switch($this->auth_signature->algorithm) {
+        case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSAMD5:
+        case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA1:
+            break;
+        default:
+            throw new Net_DNS2_Exception(
+                'only asymmetric algorithms work with SIG(0)!',
+                Net_DNS2_Lookups::E_OPENSSL_INV_ALGO
+            );
+        }
+
+        return true;
+    }
+
+    /**
+     * a simple function to determine if the RR type is cacheable
+     *
+     * @param stream $_type the RR type string
+     *
+     * @return bool returns true/false if the RR type if cachable
+     * @access public
+     *
+     */
+    public function cacheable($_type)
+    {
+        switch($_type) {
+        case 'AXFR':
+        case 'OPT':
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * PHP doesn't support unsigned integers, but many of the RR's return
+     * unsigned values (like SOA), so there is the possibility that the
+     * value will overrun on 32bit systems, and you'll end up with a
+     * negative value.
+     *
+     * 64bit systems are not affected, as their PHP_IN_MAX value should
+     * be 64bit (ie 9223372036854775807)
+     *
+     * This function returns a negative integer value, as a string, with
+     * the correct unsigned value.
+     *
+     * @param string $_int the unsigned integer value to check
+     *
+     * @return string returns the unsigned value as a string.
+     * @access public
+     *
+     */
+    public static function expandUint32($_int)
+    {
+        if ( ($_int < 0) && (PHP_INT_MAX == 2147483647) ) {
+            return sprintf('%u', $_int);
+        } else {
+            return $_int;
+        }
+    }
+
+    /**
+     * returns true/false if the given address is a valid IPv4 address
+     *
+     * @param string $_address the IPv4 address to check
+     *
+     * @return boolean returns true/false if the address is IPv4 address
+     * @access public
+     *
+     */
+    public static function isIPv4($_address)
+    {
+        //
+        // use filter_var() if it's available; it's faster than preg
+        //
+        if (extension_loaded('filter') == true) {
+
+            if (filter_var(
+                $_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4
+            ) == false) {
+                return false;
+            }
+        } else {
+
+            //
+            // do the main check here;
+            //
+            if (inet_pton($_address) === false) {
+                return false;
+            }
+
+            //
+            // then make sure we're not a IPv6 address
+            //
+            if (preg_match(
+                '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',
+                $_address
+            ) == 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * returns true/false if the given address is a valid IPv6 address
+     *
+     * @param string $_address the IPv6 address to check
+     *
+     * @return boolean returns true/false if the address is IPv6 address
+     * @access public
+     *
+     */
+    public static function isIPv6($_address)
+    {
+        //
+        // use filter_var() if it's available; it's faster than preg
+        //
+        if (extension_loaded('filter') == true) {
+            if (filter_var(
+                $_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6
+            ) == false) {
+                return false;
+            }
+        } else {
+
+            //
+            // do the main check here
+            //
+            if (inet_pton($_address) === false) {
+                return false;
+            }
+
+            //
+            // then make sure it doesn't match a IPv4 address
+            //
+            if (preg_match(
+                '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $_address
+            ) == 1) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * formats the given IPv6 address as a fully expanded IPv6 address
+     *
+     * @param string $_address the IPv6 address to expand
+     *
+     * @return string the fully expanded IPv6 address
+     * @access public
+     *
+     */
+    public static function expandIPv6($_address)
+    {
+        if (strpos($_address, '::') !== false) {
+
+            $part       = explode('::', $_address);
+            $part[0]    = explode(':', $part[0]);
+            $part[1]    = explode(':', $part[1]);
+
+            $missing = array();
+
+            $x = (8 - (count($part[0]) + count($part[1])));
+            for ($i = 0; $i < $x; $i++) {
+
+                array_push($missing, '0000');
+            }
+
+            $missing    = array_merge($part[0], $missing);
+            $part       = array_merge($missing, $part[1]);
+
+        } else {
+
+            $part = explode(':', $_address);
+        }
+
+        foreach ($part as &$p) {
+            while (strlen($p) < 4) {
+                $p = '0' . $p;
+            }
+        }
+
+        unset($p);
+
+        $result = implode(':', $part);
+
+        if (strlen($result) == 39) {
+            return $result;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * sends a standard Net_DNS2_Packet_Request packet
+     *
+     * @param Net_DNS2_Packet $request a Net_DNS2_Packet_Request object
+     * @param boolean         $use_tcp true/false if the function should
+     *                                 use TCP for the request
+     *
+     * @return mixed returns a Net_DNS2_Packet_Response object, or false on error
+     * @throws Net_DNS2_Exception
+     * @access protected
+     *
+     */
+    protected function sendPacket(Net_DNS2_Packet $request, $use_tcp)
+    {
+        //
+        // get the data from the packet
+        //
+        $data = $request->get();
+        if (strlen($data) < Net_DNS2_Lookups::DNS_HEADER_SIZE) {
+
+            throw new Net_DNS2_Exception(
+                'invalid or empty packet for sending!',
+                Net_DNS2_Lookups::E_PACKET_INVALID,
+                null,
+                $request
+            );
+        }
+
+        reset($this->nameservers);
+
+        //
+        // randomize the name server list if it's asked for
+        //
+        if ($this->ns_random == true) {
+
+            shuffle($this->nameservers);
+        }
+
+        //
+        // loop so we can handle server errors
+        //
+        $response = null;
+        $ns = '';
+        $socket_type = null;
+        $tcp_fallback = false;
+
+        while (1) {
+
+            //
+            // grab the next DNS server
+            //
+            if ($tcp_fallback == false) {
+
+                $ns = each($this->nameservers);
+                if ($ns === false) {
+
+                    throw new Net_DNS2_Exception(
+                        'every name server provided has failed: ' .
+                        $this->_last_socket_error,
+                        Net_DNS2_Lookups::E_NS_FAILED
+                    );
+                }
+
+                $ns = $ns[1];
+            }
+
+            //
+            // if the use TCP flag (force TCP) is set, or the packet is bigger
+            // than 512 bytes, use TCP for sending the packet
+            //
+            if ( ($use_tcp == true)
+                || (strlen($data) > Net_DNS2_Lookups::DNS_MAX_UDP_SIZE)
+                || ($tcp_fallback == true)
+            ) {
+                $tcp_fallback = false;
+                $socket_type = Net_DNS2_Socket::SOCK_STREAM;
+
+                //
+                // create the socket object
+                //
+                if ( (!isset($this->sock['tcp'][$ns]))
+                    || (!($this->sock['tcp'][$ns] instanceof Net_DNS2_Socket))
+                ) {
+                    if ($this->sockets_enabled === true) {
+
+                        $this->sock['tcp'][$ns] = new Net_DNS2_Socket_Sockets(
+                            Net_DNS2_Socket::SOCK_STREAM,
+                            $ns,
+                            $this->dns_port,
+                            $this->timeout
+                        );
+                    } else {
+
+                        $this->sock['tcp'][$ns] = new Net_DNS2_Socket_Streams(
+                            Net_DNS2_Socket::SOCK_STREAM,
+                            $ns,
+                            $this->dns_port,
+                            $this->timeout
+                        );
+                    }
+                }
+
+                //
+                // if a local IP address / port is set, then add it
+                //
+                if (strlen($this->local_host) > 0) {
+
+                    $this->sock['tcp'][$ns]->bindAddress(
+                        $this->local_host, $this->local_port
+                    );
+                }
+
+                //
+                // open it; if it fails, continue in the while loop
+                //
+                if ($this->sock['tcp'][$ns]->open() === false) {
+
+                    $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error;
+                    continue;
+                }
+
+                //
+                // write the data to the socket; if it fails, continue on
+                // the while loop
+                //
+                if ($this->sock['tcp'][$ns]->write($data) === false) {
+
+                    $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error;
+                    continue;
+                }
+
+                //
+                // read the content, using select to wait for a response
+                //
+                $size = 0;
+                $result = null;
+
+                //
+                // handle zone transfer requests differently than other requests.
+                //
+                if ($request->question[0]->qtype == 'AXFR') {
+
+                    $soa_count = 0;
+
+                    while (1) {
+
+                        //
+                        // read the data off the socket
+                        //
+                        $result = $this->sock['tcp'][$ns]->read($size);
+                        if ( ($result === false)
+                            ||  ($size < Net_DNS2_Lookups::DNS_HEADER_SIZE)
+                        ) {
+                            $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error;
+                            break;
+                        }
+
+                        //
+                        // parse the first chunk as a packet
+                        //
+                        $chunk = new Net_DNS2_Packet_Response($result, $size);
+
+                        //
+                        // if this is the first packet, then clone it directly, then
+                        // go through it to see if there are two SOA records
+                        // (indicating that it's the only packet)
+                        //
+                        if (is_null($response) == true) {
+
+                            $response = clone $chunk;
+
+                            //
+                            // look for a failed response; if the zone transfer
+                            // failed, then we don't need to do anything else at this
+                            // point, and we should just break out.
+                            //
+                            if ($response->header->rcode != Net_DNS2_Lookups::RCODE_NOERROR) {
+                                break;
+                            }
+
+                            //
+                            // go through each answer
+                            //
+                            foreach ($response->answer as $index => $rr) {
+
+                                //
+                                // count the SOA records
+                                //
+                                if ($rr->type == 'SOA') {
+                                    $soa_count++;
+                                }
+                            }
+
+                            //
+                            // if we have 2 or more SOA records, then we're done;
+                            // otherwise continue out so we read the rest of the
+                            // packets off the socket
+                            //
+                            if ($soa_count >= 2) {
+                                break;
+                            } else {
+                                continue;
+                            }
+
+                        } else {
+
+                            //
+                            // go through all these answers, and look for SOA records
+                            //
+                            foreach ($chunk->answer as $index => $rr) {
+
+                                //
+                                // count the number of SOA records we find
+                                //
+                                if ($rr->type == 'SOA') {
+                                    $soa_count++;
+                                }
+
+                                //
+                                // add the records to a single response object
+                                //
+                                $response->answer[] = $rr;
+                            }
+
+                            //
+                            // if we've found the second SOA record, we're done
+                            //
+                            if ($soa_count >= 2) {
+                                break;
+                            }
+                        }
+                    }
+
+                } else {
+
+                    $result = $this->sock['tcp'][$ns]->read($size);
+                    if ( ($result === false)
+                        ||  ($size < Net_DNS2_Lookups::DNS_HEADER_SIZE)
+                    ) {
+                        $this->_last_socket_error = $this->sock['tcp'][$ns]->last_error;
+                        continue;
+                    }
+
+                    //
+                    // create the packet object
+                    //
+                    $response = new Net_DNS2_Packet_Response($result, $size);
+                }
+
+                break;
+
+            } else {
+
+                $socket_type = Net_DNS2_Socket::SOCK_DGRAM;
+
+                //
+                // create the socket object
+                //
+                if ( (!isset($this->sock['udp'][$ns]))
+                    || (!($this->sock['udp'][$ns] instanceof Net_DNS2_Socket))
+                ) {
+                    if ($this->sockets_enabled === true) {
+
+                        $this->sock['udp'][$ns] = new Net_DNS2_Socket_Sockets(
+                            Net_DNS2_Socket::SOCK_DGRAM, $ns, $this->dns_port, $this->timeout
+                        );
+                    } else {
+
+                        $this->sock['udp'][$ns] = new Net_DNS2_Socket_Streams(
+                            Net_DNS2_Socket::SOCK_DGRAM, $ns, $this->dns_port, $this->timeout
+                        );
+                    }
+                }
+
+                //
+                // if a local IP address / port is set, then add it
+                //
+                if (strlen($this->local_host) > 0) {
+
+                    $this->sock['udp'][$ns]->bindAddress(
+                        $this->local_host, $this->local_port
+                    );
+                }
+
+                //
+                // open it
+                //
+                if ($this->sock['udp'][$ns]->open() === false) {
+
+                    $this->_last_socket_error = $this->sock['udp'][$ns]->last_error;
+                    continue;
+                }
+
+                //
+                // write the data to the socket
+                //
+                if ($this->sock['udp'][$ns]->write($data) === false) {
+
+                    $this->_last_socket_error = $this->sock['udp'][$ns]->last_error;
+                    continue;
+                }
+
+                //
+                // read the content, using select to wait for a response
+                //
+                $size = 0;
+
+                $result = $this->sock['udp'][$ns]->read($size);
+                if (( $result === false)
+                    || ($size < Net_DNS2_Lookups::DNS_HEADER_SIZE)
+                ) {
+                    $this->_last_socket_error = $this->sock['udp'][$ns]->last_error;
+                    continue;
+                }
+
+                //
+                // create the packet object
+                //
+                $response = new Net_DNS2_Packet_Response($result, $size);
+                if (is_null($response)) {
+
+                    throw new Net_DNS2_Exception(
+                        'empty response object',
+                        Net_DNS2_Lookups::E_NS_FAILED,
+                        null,
+                        $request
+                    );
+                }
+
+                //
+                // check the packet header for a trucated bit; if it was truncated,
+                // then re-send the request as TCP.
+                //
+                if ($response->header->tc == 1) {
+
+                    $tcp_fallback = true;
+                    continue;
+                }
+
+                break;
+            }
+        }
+
+        //
+        // if $response is null, then we didn't even try once; which shouldn't
+        // actually ever happen
+        //
+        if (is_null($response)) {
+
+            throw new Net_DNS2_Exception(
+                'empty response object',
+                Net_DNS2_Lookups::E_NS_FAILED,
+                null,
+                $request
+            );
+        }
+
+        //
+        // add the name server that the response came from to the response object,
+        // and the socket type that was used.
+        //
+        $response->answer_from = $ns;
+        $response->answer_socket_type = $socket_type;
+
+        //
+        // make sure header id's match between the request and response
+        //
+        if ($request->header->id != $response->header->id) {
+
+            throw new Net_DNS2_Exception(
+                'invalid header: the request and response id do not match.',
+                Net_DNS2_Lookups::E_HEADER_INVALID,
+                null,
+                $request,
+                $response
+            );
+        }
+
+        //
+        // make sure the response is actually a response
+        //
+        // 0 = query, 1 = response
+        //
+        if ($response->header->qr != Net_DNS2_Lookups::QR_RESPONSE) {
+
+            throw new Net_DNS2_Exception(
+                'invalid header: the response provided is not a response packet.',
+                Net_DNS2_Lookups::E_HEADER_INVALID,
+                null,
+                $request,
+                $response
+            );
+        }
+
+        //
+        // make sure the response code in the header is ok
+        //
+        if ($response->header->rcode != Net_DNS2_Lookups::RCODE_NOERROR) {
+
+            throw new Net_DNS2_Exception(
+                'DNS request failed: ' .
+                Net_DNS2_Lookups::$result_code_messages[$response->header->rcode],
+                $response->header->rcode,
+                null,
+                $request,
+                $response
+            );
+        }
+
+        return $response;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/BitMap.php b/include/pear/Net/DNS2/BitMap.php
new file mode 100644
index 0000000000000000000000000000000000000000..cdc0934a3432e9f7de869a0f59d1013cdd5c89bc
--- /dev/null
+++ b/include/pear/Net/DNS2/BitMap.php
@@ -0,0 +1,254 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: BitMap.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * a class to handle converting RR bitmaps to arrays and back; used on NSEC
+ * and NSEC3 RR's
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ *
+ */
+class Net_DNS2_BitMap
+{
+    /**
+     * parses a RR bitmap field defined in RFC3845, into an array of RR names.
+     *
+     * Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) +
+     *
+     * @param string $data a bitmap stringto parse
+     *
+     * @return array
+     * @access public
+     *
+     */
+    public static function bitMapToArray($data)
+    {
+        if (strlen($data) == 0) {
+            return null;
+        }
+
+        $output = array();
+        $offset = 0;
+        $length = strlen($data);
+
+        while ($offset < $length) {
+            
+            //
+            // unpack the window and length values
+            //
+            $x = unpack('@' . $offset . '/Cwindow/Clength', $data);
+            $offset += 2;
+
+            //
+            // copy out the bitmap value
+            //
+            $bitmap = unpack('C*', substr($data, $offset, $x['length']));
+            $offset += $x['length'];
+
+            //
+            // I'm not sure if there's a better way of doing this, but PHP doesn't
+            // have a 'B' flag for unpack()
+            //
+            $bitstr = '';
+            foreach ($bitmap as $r) {
+                
+                $bitstr .= sprintf('%08b', $r);
+            }
+
+            $blen = strlen($bitstr);
+            for ($i=0; $i<$blen; $i++) {
+
+                if ($bitstr[$i] == '1') {
+                
+                    $type = $x['window'] * 256 + $i;
+
+                    if (isset(Net_DNS2_Lookups::$rr_types_by_id[$type])) {
+
+                        $output[] = Net_DNS2_Lookups::$rr_types_by_id[$type];
+                    } else {
+
+                        $output[] = 'TYPE' . $type;
+                    }
+                }
+            }
+        }
+
+        return $output;
+    }
+
+    /**
+     * builds a RR Bit map from an array of RR type names
+     *
+     * @param array $data a list of RR names
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public static function arrayToBitMap(array $data)
+    {
+        if (count($data) == 0) {
+            return null;
+        }
+
+        $current_window = 0;
+
+        //
+        // go through each RR
+        //
+        $max = 0;
+        $bm = array();
+
+        foreach ($data as $rr) {
+        
+            $rr = strtoupper($rr);
+
+            //
+            // get the type id for the RR
+            //
+            $type = @Net_DNS2_Lookups::$rr_types_by_name[$rr];
+            if (isset($type)) {
+
+                //
+                // skip meta types or qtypes
+                //  
+                if ( (isset(Net_DNS2_Lookups::$rr_qtypes_by_id[$type]))
+                    || (isset(Net_DNS2_Lookups::$rr_metatypes_by_id[$type]))
+                ) {
+                    continue;
+                }
+
+            } else {
+
+                //
+                // if it's not found, then it must be defined as TYPE<id>, per
+                // RFC3845 section 2.2, if it's not, we ignore it.
+                //
+                list($name, $type) = explode('TYPE', $rr);
+                if (!isset($type)) {
+
+                    continue;
+                }
+            }
+
+            //
+            // build the current window
+            //
+            $current_window = (int)($type / 256);
+            
+            $val = $type - $current_window * 256.0;
+            if ($val > $max) {
+                $max = $val;
+            }
+
+            $bm[$current_window][$val] = 1;
+            $bm[$current_window]['length'] = ceil(($max + 1) / 8);
+        }
+
+        $output = '';
+
+        foreach ($bm as $window => $bitdata) {
+
+            $bitstr = '';
+
+            for ($i=0; $i<$bm[$window]['length'] * 8; $i++) {
+                if (isset($bm[$window][$i])) {
+                    $bitstr .= '1';
+                } else {
+                    $bitstr .= '0';
+                }
+            }
+
+            $output .= pack('CC', $window, $bm[$window]['length']);
+            $output .= pack('H*', self::bigBaseConvert($bitstr));
+        }
+
+        return $output;
+    }
+
+    /**
+     * a base_convert that handles large numbers; forced to 2/16
+     *
+     * @param string $number a bit string
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public static function bigBaseConvert($number)
+    {
+        $result = '';
+
+        $bin = substr(chunk_split(strrev($number), 4, '-'), 0, -1);
+        $temp = preg_split('[-]', $bin, -1, PREG_SPLIT_DELIM_CAPTURE);
+        
+        for ($i = count($temp)-1;$i >= 0;$i--) {
+            
+            $result = $result . base_convert(strrev($temp[$i]), 2, 16);
+        }
+        
+        return strtoupper($result);
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Cache.php b/include/pear/Net/DNS2/Cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..b375ca2fa5bdc395834ae5ddc6999eeea626a356
--- /dev/null
+++ b/include/pear/Net/DNS2/Cache.php
@@ -0,0 +1,290 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Cache.php 160 2012-07-18 03:57:32Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.1.0
+ *
+ */
+
+/**
+ * A class to provide simple dns lookup caching.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ *
+ */
+class Net_DNS2_Cache
+{
+    /*
+     * the filename of the cache file
+     */
+    protected $cache_file = '';
+
+    /*
+     * the local data store for the cache
+     */
+    protected $cache_data = array();
+
+    /*
+     * the size of the cache to use
+     */
+    protected $cache_size = 0;
+
+    /*
+     * the cache serializer
+     */
+    protected $cache_serializer;
+
+    /**
+     * returns true/false if the provided key is defined in the cache
+     * 
+     * @param string $key the key to lookup in the local cache
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function has($key)
+    {
+        return isset($this->cache_data[$key]);
+    }
+
+    /**
+     * returns the value for the given key
+     * 
+     * @param string $key the key to lookup in the local cache
+     *
+     * @return mixed returns the cache data on sucess, false on error
+     * @access public
+     *
+     */
+    public function get($key)
+    {
+        if (isset($this->cache_data[$key])) {
+
+            if ($this->cache_serializer == 'json') {
+                return json_decode($this->cache_data[$key]['object']);
+            } else {
+                return unserialize($this->cache_data[$key]['object']);
+            }
+        } else {
+
+            return false;
+        }
+    }
+
+    /**
+     * adds a new key/value pair to the cache
+     * 
+     * @param string $key  the key for the new cache entry
+     * @param mixed  $data the data to store in cache
+     *
+     * @return void
+     * @access public
+     *
+     */
+    public function put($key, $data)
+    {
+        $ttl = 86400 * 365;
+
+        //
+        // find the lowest TTL, and use that as the TTL for the whole cached 
+        // object. The downside to using one TTL for the whole object, is that
+        // we'll invalidate entries before they actuall expire, causing a
+        // real lookup to happen.
+        //
+        // The upside is that we don't need to require() each RR type in the
+        // cache, so we can look at their individual TTL's on each run- we only
+        // unserialize the actual RR object when it's get() from the cache.
+        //
+        foreach ($data->answer as $index => $rr) {
+                    
+            if ($rr->ttl < $ttl) {
+                $ttl = $rr->ttl;
+            }
+        }
+        foreach ($data->authority as $index => $rr) {
+                    
+            if ($rr->ttl < $ttl) {
+                $ttl = $rr->ttl;
+            }
+        }
+        foreach ($data->additional as $index => $rr) {
+                    
+            if ($rr->ttl < $ttl) {
+                $ttl = $rr->ttl;
+            }
+        }
+
+        $this->cache_data[$key] = array(
+
+            'cache_date'    => time(),
+            'ttl'           => $ttl
+        );
+
+        if ($this->cache_serializer == 'json') {
+            $this->cache_data[$key]['object'] = json_encode($data);
+        } else {
+            $this->cache_data[$key]['object'] = serialize($data);
+        }
+    }
+
+    /**
+     * runs a clean up process on the cache data
+     *
+     * @return void
+     * @access protected
+     *
+     */
+    protected function clean()
+    {
+        if (count($this->cache_data) > 0) {
+
+            //
+            // go through each entry and adjust their TTL, and remove entries that 
+            // have expired
+            //
+            $now = time();
+
+            foreach ($this->cache_data as $key => $data) {
+
+                $diff = $now - $data['cache_date'];
+
+                if ($data['ttl'] <= $diff) {
+
+                    unset($this->cache_data[$key]);
+                } else {
+
+                    $this->cache_data[$key]['ttl'] -= $diff;
+                    $this->cache_data[$key]['cache_date'] = $now;
+                }
+            }
+        }
+    }
+
+    /**
+     * runs a clean up process on the cache data
+     *
+     * @return mixed
+     * @access protected
+     *
+     */
+    protected function resize()
+    {
+        if (count($this->cache_data) > 0) {
+        
+            //
+            // serialize the cache data
+            //
+            if ($this->cache_serializer == 'json') {
+                $cache = json_encode($this->cache_data);
+            } else {
+                $cache = serialize($this->cache_data);
+            }
+
+            //
+            // only do this part if the size allocated to the cache storage
+            // is smaller than the actual cache data
+            //
+            if (strlen($cache) > $this->cache_size) {
+
+                while (strlen($cache) > $this->cache_size) {
+
+                    //
+                    // go through the data, and remove the entries closed to
+                    // their expiration date.
+                    //
+                    $smallest_ttl = time();
+                    $smallest_key = null;
+
+                    foreach ($this->cache_data as $key => $data) {
+
+                        if ($data['ttl'] < $smallest_ttl) {
+
+                            $smallest_ttl = $data['ttl'];
+                            $smallest_key = $key;
+                        }
+                    }
+
+                    //
+                    // unset the key with the smallest TTL
+                    //
+                    unset($this->cache_data[$smallest_key]);
+
+                    //
+                    // re-serialize
+                    //
+                    if ($this->cache_serializer == 'json') {
+                        $cache = json_encode($this->cache_data);
+                    } else {
+                        $cache = serialize($this->cache_data);
+                    }
+                }
+            }
+
+            if ( ($cache == 'a:0:{}') || ($cache == '{}') ) {
+                return null;
+            } else {
+                return $cache;
+            }
+        }
+
+        return null;
+    }
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Cache/File.php b/include/pear/Net/DNS2/Cache/File.php
new file mode 100644
index 0000000000000000000000000000000000000000..0de797747b11841ccd490f106838b37e971bcb17
--- /dev/null
+++ b/include/pear/Net/DNS2/Cache/File.php
@@ -0,0 +1,242 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: File.php 160 2012-07-18 03:57:32Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.1.0
+ *
+ */
+
+/**
+ * File-based caching for the Net_DNS2_Cache class
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ *
+ */
+class Net_DNS2_Cache_File extends Net_DNS2_Cache
+{
+    /**
+     * open a cache object
+     *
+     * @param string  $cache_file path to a file to use for cache storage
+     * @param integer $size       the size of the shared memory segment to create
+     * @param string  $serializer the name of the cache serialize to use
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     * @return void
+     *
+     */
+    public function open($cache_file, $size, $serializer)
+    {
+        $this->cache_size       = $size;
+        $this->cache_file       = $cache_file;
+        $this->cache_serializer = $serializer;
+
+        //
+        // check that the file exists first
+        //
+        if ( (file_exists($this->cache_file) == true) 
+            && (filesize($this->cache_file) > 0)
+        ) {
+
+            //
+            // open the file for reading
+            //
+            $fp = @fopen($this->cache_file, 'r');
+            if ($fp !== false) {
+                
+                //
+                // lock the file just in case
+                //
+                flock($fp, LOCK_EX);
+
+                //
+                // read the file contents
+                //
+                $data = fread($fp, filesize($this->cache_file));
+
+                $decoded = null;
+                    
+                if ($this->cache_serializer == 'json') {
+
+                    $decoded = json_decode($data, true);         
+                } else {
+
+                    $decoded = unserialize($data);                
+                }
+
+                if (is_array($decoded) == true) {
+
+                    $this->cache_data = $decoded;
+                } else {
+
+                    $this->cache_data = array();
+                }
+
+                //
+                // unlock
+                //
+                flock($fp, LOCK_UN);
+
+                //
+                // close the file
+                //
+                fclose($fp);
+
+                //
+                // clean up the data
+                //
+                $this->clean();
+            }
+        }
+    }
+
+    /**
+     * Destructor
+     *
+     * @access public
+     *
+     */
+    public function __destruct()
+    {
+        //
+        // if there's no cache file set, then there's nothing to do
+        //
+        if (strlen($this->cache_file) == 0) {
+            return;
+        }
+
+        //
+        // open the file for reading/writing
+        //
+        $fp = fopen($this->cache_file, 'a+');
+        if ($fp !== false) {
+                
+            //
+            // lock the file just in case
+            //
+            flock($fp, LOCK_EX);
+        
+            //
+            // seek to the start of the file to read
+            //
+            fseek($fp, 0, SEEK_SET);
+
+            //
+            // read the file contents
+            //
+            $data = @fread($fp, filesize($this->cache_file));
+            if ( ($data !== false) && (strlen($data) > 0) ) {
+
+                //
+                // unserialize and store the data
+                //
+                $c = $this->cache_data;
+
+                $decoded = null;
+
+                if ($this->cache_serializer == 'json') {
+
+                    $decoded = json_decode($data, true);
+                } else {
+
+                    $decoded = unserialize($data);
+                }
+                
+                if (is_array($decoded) == true) {
+
+                    $this->cache_data = array_merge($c, $decoded);
+                }
+            }
+
+            //
+            // trucate the file
+            //
+            ftruncate($fp, 0);
+
+            //
+            // clean the data
+            //
+            $this->clean();
+
+            //
+            // resize the data
+            //
+            $data = $this->resize();
+            if (!is_null($data)) {
+
+                //
+                // write the file contents
+                //
+                fwrite($fp, $data);
+            }
+
+            //
+            // unlock
+            //
+            flock($fp, LOCK_UN);
+
+            //
+            // close the file
+            //
+            fclose($fp);
+        }
+    }
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Cache/Shm.php b/include/pear/Net/DNS2/Cache/Shm.php
new file mode 100644
index 0000000000000000000000000000000000000000..5737efe71708adce07ad0ec8076c7d9990c759e0
--- /dev/null
+++ b/include/pear/Net/DNS2/Cache/Shm.php
@@ -0,0 +1,305 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Shm.php 160 2012-07-18 03:57:32Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.1.0
+ *
+ */
+
+/**
+ * Shared Memory-based caching for the Net_DNS2_Cache class
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ *
+ */
+class Net_DNS2_Cache_Shm extends Net_DNS2_Cache
+{
+    /*
+     * resource id of the shared memory cache
+     */
+    private $_cache_id = false;
+
+    /*
+     * the IPC key
+     */
+    private $_cache_file_tok = -1;
+
+    /**
+     * open a cache object
+     *
+     * @param string  $cache_file path to a file to use for cache storage
+     * @param integer $size       the size of the shared memory segment to create
+     * @param string  $serializer the name of the cache serialize to use
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     * @return void
+     *
+     */
+    public function open($cache_file, $size, $serializer)
+    {
+        $this->cache_size       = $size;
+        $this->cache_file       = $cache_file;
+        $this->cache_serializer = $serializer;
+
+        //
+        // make sure the file exists first
+        //
+        if (!file_exists($cache_file)) {
+
+            if (file_put_contents($cache_file, '') === false) {
+        
+                throw new Net_DNS2_Exception(
+                    'failed to create empty SHM file: ' . $cache_file,
+                    Net_DNS2_Lookups::E_CACHE_SHM_FILE
+                );
+            }
+        }
+
+        //
+        // convert the filename to a IPC key
+        //
+        $this->_cache_file_tok = ftok($cache_file, 't');
+        if ($this->_cache_file_tok == -1) {
+
+            throw new Net_DNS2_Exception(
+                'failed on ftok() file: ' . $this->_cache_file_tok,
+                Net_DNS2_Lookups::E_CACHE_SHM_FILE
+            );
+        }
+
+        //
+        // try to open an existing cache; if it doesn't exist, then there's no
+        // cache, and nothing to do.
+        //
+        $this->_cache_id = @shmop_open($this->_cache_file_tok, 'w', 0, 0);
+        if ($this->_cache_id !== false) {
+
+            //
+            // this returns the size allocated, and not the size used, but it's
+            // still a good check to make sure there's space allocated.
+            //
+            $allocated = shmop_size($this->_cache_id);
+            if ($allocated > 0) {
+            
+                //
+                // read the data from the shared memory segment
+                //
+                $data = trim(shmop_read($this->_cache_id, 0, $allocated));
+                if ( ($data !== false) && (strlen($data) > 0) ) {
+
+                    //
+                    // unserialize and store the data
+                    //
+                    $decoded = null;
+
+                    if ($this->cache_serializer == 'json') {
+
+                        $decoded = json_decode($data, true);
+                    } else {
+
+                        $decoded = unserialize($data);
+                    }
+
+                    if (is_array($decoded) == true) {
+
+                        $this->cache_data = $decoded;
+                    } else {
+
+                        $this->cache_data = array();
+                    }
+
+                    //
+                    // call clean to clean up old entries
+                    //
+                    $this->clean();
+                }
+            }
+        }
+    }
+
+    /**
+     * Destructor
+     *
+     * @access public
+     *
+     */
+    public function __destruct()
+    {
+        //
+        // if there's no cache file set, then there's nothing to do
+        //
+        if (strlen($this->cache_file) == 0) {
+            return;
+        }
+
+        $fp = fopen($this->cache_file, 'r');
+        if ($fp !== false) {
+
+            //
+            // lock the file
+            //
+            flock($fp, LOCK_EX);
+
+            //
+            // check to see if we have an open shm segment
+            //
+            if ($this->_cache_id === false) {
+
+                //
+                // try opening it again, incase it was created by another
+                // process in the mean time
+                //
+                $this->_cache_id = @shmop_open(
+                    $this->_cache_file_tok, 'w', 0, 0
+                );
+                if ($this->_cache_id === false) {
+
+                    //
+                    // otherwise, create it.
+                    //
+                    $this->_cache_id = @shmop_open(
+                        $this->_cache_file_tok, 'c', 0, $this->cache_size
+                    );
+                }
+            }
+
+            //
+            // get the size allocated to the segment
+            //
+            $allocated = shmop_size($this->_cache_id);
+
+            //
+            // read the contents
+            //
+            $data = trim(shmop_read($this->_cache_id, 0, $allocated));
+
+            //
+            // if there was some data
+            //    
+            if ( ($data !== false) && (strlen($data) > 0) ) {
+
+                //
+                // unserialize and store the data
+                //
+                $c = $this->cache_data;
+
+                $decoded = null;
+  
+                if ($this->cache_serializer == 'json') {
+                
+                    $decoded = json_decode($data, true);
+                } else {
+                        
+                    $decoded = unserialize($data);
+                }   
+                         
+                if (is_array($decoded) == true) {
+                
+                    $this->cache_data = array_merge($c, $decoded);
+                }
+            }
+
+            //
+            // delete the segment
+            //
+            shmop_delete($this->_cache_id);
+
+            //
+            // clean the data
+            //
+            $this->clean();
+
+            //
+            // clean up and write the data
+            //
+            $data = $this->resize();
+            if (!is_null($data)) {
+
+                //
+                // re-create segment
+                //
+                $this->_cache_id = @shmop_open(
+                    $this->_cache_file_tok, 'c', 0644, $this->cache_size
+                );
+                if ($this->_cache_id === false) {
+                    return;
+                }
+
+                $o = shmop_write($this->_cache_id, $data, 0);
+            }
+
+            //
+            // close the segment
+            //
+            shmop_close($this->_cache_id);
+
+            //
+            // unlock
+            //
+            flock($fp, LOCK_UN);
+
+            //
+            // close the file
+            //
+            fclose($fp);
+        }
+    }
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Exception.php b/include/pear/Net/DNS2/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3f809b7f73a39d35f231416de87dcfca48a018c
--- /dev/null
+++ b/include/pear/Net/DNS2/Exception.php
@@ -0,0 +1,132 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Exception.php 197 2013-04-22 00:28:00Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ */
+
+/**
+ * Exception handler used by Net_DNS2
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * 
+ */
+class Net_DNS2_Exception extends Exception
+{
+    private $_request;
+    private $_response;
+
+    /**
+     * Constructor - overload the constructor so we can pass in the request
+     *               and response object (when it's available)
+     *
+     * @param string $message  the exception message
+     * @param int    $code     the exception code
+     * @param object $previous the previous Exception object
+     * @param object $request  the Net_DNS2_Packet_Request object for this request
+     * @param object $response the Net_DNS2_Packet_Response object for this request
+     *
+     * @access public
+     *
+     */
+    public function __construct(
+        $message = '', 
+        $code = 0, 
+        $previous = null, 
+        Net_DNS2_Packet_Request $request = null,
+        Net_DNS2_Packet_Response $response = null
+    ) {
+        //
+        // store the request/response objects (if passed)
+        //
+        $this->_request = $request;
+        $this->_response = $response;
+
+        //
+        // call the parent constructor
+        //
+        parent::__construct($message, $code, $previous);
+    }
+
+    /**
+     * returns the Net_DNS2_Packet_Request object (if available)
+     *
+     * @return Net_DNS2_Packet_Request object
+     * @access public
+     * @since  function available since release 1.3.1
+     *
+     */
+    public function getRequest()
+    {
+        return $this->_request;
+    }
+
+    /**
+     * returns the Net_DNS2_Packet_Response object (if available)
+     *
+     * @return Net_DNS2_Packet_Response object
+     * @access public
+     * @since  function available since release 1.3.1
+     *
+     */
+    public function getResponse()
+    {
+        return $this->_response;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Header.php b/include/pear/Net/DNS2/Header.php
new file mode 100644
index 0000000000000000000000000000000000000000..3831d75b55e0d40150de1d8673911d4cf21ae678
--- /dev/null
+++ b/include/pear/Net/DNS2/Header.php
@@ -0,0 +1,282 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Header.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+
+/**
+ * DNS Packet Header class
+ *
+ * This class handles parsing and constructing DNS Packet Headers as defined
+ * by section 4.1.1 of RFC1035.
+ * 
+ *  DNS header format - RFC1035 section 4.1.1
+ *  DNS header format - RFC4035 section 3.2
+ *
+ *      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                      ID                       |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |QR|   Opcode  |AA|TC|RD|RA| Z|AD|CD|   RCODE   |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    QDCOUNT                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    ANCOUNT                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    NSCOUNT                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    ARCOUNT                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ *
+ */
+class Net_DNS2_Header
+{
+    public $id;         // 16 bit - identifier
+    public $qr;         //  1 bit - 0 = query, 1 = response
+    public $opcode;     //  4 bit - op code
+    public $aa;         //  1 bit - Authoritative Answer
+    public $tc;         //  1 bit - TrunCation
+    public $rd;         //  1 bit - Recursion Desired
+    public $ra;         //  1 bit - Recursion Available
+    public $z;          //  1 bit - Reserved
+    public $ad;         //  1 bit - Authentic Data (RFC4035)
+    public $cd;         //  1 bit - Checking Disabled (RFC4035)
+    public $rcode;      //  4 bit - Response code
+    public $qdcount;    // 16 bit - entries in the question section
+    public $ancount;    // 16 bit - resource records in the answer section
+    public $nscount;    // 16 bit - name server rr in the authority records section
+    public $arcount;    // 16 bit - rr's in the additional records section
+
+    /**
+     * Constructor - builds a new Net_DNS2_Header object
+     *
+     * @param mixed &$packet either a Net_DNS2_Packet object or null
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct(Net_DNS2_Packet &$packet = null)
+    {
+        if (!is_null($packet)) {
+
+            $this->set($packet);
+        } else {
+
+            $this->id       = $this->nextPacketId();
+            $this->qr       = Net_DNS2_Lookups::QR_QUERY;
+            $this->opcode   = Net_DNS2_Lookups::OPCODE_QUERY;
+            $this->aa       = 0;
+            $this->tc       = 0;
+            $this->rd       = 1;
+            $this->ra       = 0;
+            $this->z        = 0;
+            $this->ad       = 0;
+            $this->cd       = 0;
+            $this->rcode    = Net_DNS2_Lookups::RCODE_NOERROR;
+            $this->qdcount  = 1;
+            $this->ancount  = 0;
+            $this->nscount  = 0;
+            $this->arcount  = 0;
+        }
+    }
+
+    /**
+     * returns the next available packet id
+     *
+     * @return    integer
+     * @access    public
+     *
+     */
+    public function nextPacketId()
+    {
+        if (++Net_DNS2_Lookups::$next_packet_id > 65535) {
+
+            Net_DNS2_Lookups::$next_packet_id = 1;
+        }
+
+        return Net_DNS2_Lookups::$next_packet_id;
+    }
+
+    /**
+     * magic __toString() method to return the header as a string
+     *
+     * @return    string
+     * @access    public
+     *
+     */
+    public function __toString()
+    {
+        $output = ";;\n;; Header:\n";
+
+        $output .= ";;\t id         = " . $this->id . "\n";
+        $output .= ";;\t qr         = " . $this->qr . "\n";
+        $output .= ";;\t opcode     = " . $this->opcode . "\n";
+        $output .= ";;\t aa         = " . $this->aa . "\n";
+        $output .= ";;\t tc         = " . $this->tc . "\n";
+        $output .= ";;\t rd         = " . $this->rd . "\n";
+        $output .= ";;\t ra         = " . $this->ra . "\n";
+        $output .= ";;\t z          = " . $this->z . "\n";
+        $output .= ";;\t ad         = " . $this->ad . "\n";
+        $output .= ";;\t cd         = " . $this->cd . "\n";
+        $output .= ";;\t rcode      = " . $this->rcode . "\n";
+        $output .= ";;\t qdcount    = " . $this->qdcount . "\n";
+        $output .= ";;\t ancount    = " . $this->ancount . "\n";
+        $output .= ";;\t nscount    = " . $this->nscount . "\n";
+        $output .= ";;\t arcount    = " . $this->arcount . "\n";
+
+        return $output;
+    }
+
+    /**
+     * constructs a Net_DNS2_Header from a Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet Object
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function set(Net_DNS2_Packet &$packet)
+    {
+        //
+        // the header must be at least 12 bytes long.
+        //
+        if ($packet->rdlength < Net_DNS2_Lookups::DNS_HEADER_SIZE) {
+
+            throw new Net_DNS2_Exception(
+                'invalid header data provided; to small',
+                Net_DNS2_Lookups::E_HEADER_INVALID
+            );
+        }
+
+        $offset = 0;
+
+        //
+        // parse the values
+        //
+        $this->id       = ord($packet->rdata[$offset]) << 8 | 
+            ord($packet->rdata[++$offset]);
+
+        ++$offset;
+        $this->qr       = (ord($packet->rdata[$offset]) >> 7) & 0x1;
+        $this->opcode   = (ord($packet->rdata[$offset]) >> 3) & 0xf;
+        $this->aa       = (ord($packet->rdata[$offset]) >> 2) & 0x1;
+        $this->tc       = (ord($packet->rdata[$offset]) >> 1) & 0x1;
+        $this->rd       = ord($packet->rdata[$offset]) & 0x1;
+
+        ++$offset;
+        $this->ra       = (ord($packet->rdata[$offset]) >> 7) & 0x1;
+        $this->z        = (ord($packet->rdata[$offset]) >> 6) & 0x1;
+        $this->ad       = (ord($packet->rdata[$offset]) >> 5) & 0x1;
+        $this->cd       = (ord($packet->rdata[$offset]) >> 4) & 0x1;
+        $this->rcode    = ord($packet->rdata[$offset]) & 0xf;
+            
+        $this->qdcount  = ord($packet->rdata[++$offset]) << 8 | 
+            ord($packet->rdata[++$offset]);
+        $this->ancount  = ord($packet->rdata[++$offset]) << 8 | 
+            ord($packet->rdata[++$offset]);
+        $this->nscount  = ord($packet->rdata[++$offset]) << 8 | 
+            ord($packet->rdata[++$offset]);
+        $this->arcount  = ord($packet->rdata[++$offset]) << 8 | 
+            ord($packet->rdata[++$offset]);
+
+        //
+        // increment the internal offset
+        //
+        $packet->offset += Net_DNS2_Lookups::DNS_HEADER_SIZE;
+
+        return true;
+    }
+
+    /**
+     * returns a binary packed DNS Header
+     *
+     * @param Net_DNS2_Packet &$packet Object
+     *
+     * @return    string
+     * @access    public
+     *
+     */
+    public function get(Net_DNS2_Packet &$packet)
+    {
+        $data = pack('n', $this->id) . 
+            chr(
+                ($this->qr << 7) | ($this->opcode << 3) | 
+                ($this->aa << 2) | ($this->tc << 1) | ($this->rd)
+            ) .
+            chr(
+                ($this->ra << 7) | ($this->ad << 5) | ($this->cd << 4) | $this->rcode
+            ) .
+            chr($this->qdcount << 8) . chr($this->qdcount) .
+            chr($this->ancount << 8) . chr($this->ancount) . 
+            chr($this->nscount << 8) . chr($this->nscount) .
+            chr($this->arcount << 8) . chr($this->arcount);
+
+        $packet->offset += Net_DNS2_Lookups::DNS_HEADER_SIZE;
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Lookups.php b/include/pear/Net/DNS2/Lookups.php
new file mode 100644
index 0000000000000000000000000000000000000000..082ce205002bf4913746d6bdb81049f967856b8d
--- /dev/null
+++ b/include/pear/Net/DNS2/Lookups.php
@@ -0,0 +1,540 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Lookups.php 207 2013-06-13 01:19:55Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+//
+// initalize the packet id value
+//
+Net_DNS2_Lookups::$next_packet_id   = mt_rand(0, 65535);
+
+//
+// build the reverse lookup tables; this is just so we don't have to
+// have duplicate static content laying around.
+//
+Net_DNS2_Lookups::$rr_types_by_id       = array_flip(Net_DNS2_Lookups::$rr_types_by_name);
+Net_DNS2_Lookups::$classes_by_id        = array_flip(Net_DNS2_Lookups::$classes_by_name);
+Net_DNS2_Lookups::$rr_types_class_to_id = array_flip(Net_DNS2_Lookups::$rr_types_id_to_class);
+Net_DNS2_Lookups::$algorithm_name_to_id = array_flip(Net_DNS2_Lookups::$algorithm_id_to_name);
+Net_DNS2_Lookups::$digest_name_to_id    = array_flip(Net_DNS2_Lookups::$digest_id_to_name);
+Net_DNS2_Lookups::$rr_qtypes_by_id      = array_flip(Net_DNS2_Lookups::$rr_qtypes_by_name);
+Net_DNS2_Lookups::$rr_metatypes_by_id   = array_flip(Net_DNS2_Lookups::$rr_metatypes_by_name);
+Net_DNS2_Lookups::$protocol_by_id       = array_flip(Net_DNS2_Lookups::$protocol_by_name);
+
+/**
+ * This class provides simple lookups used througout the Net_DNS2 code
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * 
+ */
+class Net_DNS2_Lookups
+{
+    /*
+     * size (in bytes) of a header in a standard DNS packet
+     */
+    const DNS_HEADER_SIZE       = 12;
+
+    /*
+     * max size of a UDP packet
+     */
+    const DNS_MAX_UDP_SIZE      = 512;
+    
+    /*
+     * Query/Response flag
+     */
+    const QR_QUERY              = 0;        // RFC 1035
+    const QR_RESPONSE           = 1;        // RFC 1035
+
+    /*
+     * DNS Op Codes
+     */
+    const OPCODE_QUERY          = 0;        // RFC 1035
+    const OPCODE_IQUERY         = 1;        // RFC 1035, RFC 3425
+    const OPCODE_STATUS         = 2;        // RFC 1035
+    const OPCODE_NOTIFY         = 4;        // RFC 1996
+    const OPCODE_UPDATE         = 5;        // RFC 2136
+
+    /*
+     * Resource Record Classes
+     */
+    const RR_CLASS_IN           = 1;        // RFC 1035
+    const RR_CLASS_CH           = 3;        // RFC 1035
+    const RR_CLASS_HS           = 4;        // RFC 1035
+    const RR_CLASS_NONE         = 254;      // RFC 2136
+    const RR_CLASS_ANY          = 255;      // RFC 1035
+
+    /*
+     * DNS Response Codes
+     */
+    const RCODE_NOERROR         = 0;        // RFC 1035
+    const RCODE_FORMERR         = 1;        // RFC 1035
+    const RCODE_SERVFAIL        = 2;        // RFC 1035
+    const RCODE_NXDOMAIN        = 3;        // RFC 1035
+    const RCODE_NOTIMP          = 4;        // RFC 1035
+    const RCODE_REFUSED         = 5;        // RFC 1035
+    const RCODE_YXDOMAIN        = 6;        // RFC 2136
+    const RCODE_YXRRSET         = 7;        // RFC 2136
+    const RCODE_NXRRSET         = 8;        // RFC 2136
+    const RCODE_NOTAUTH         = 9;        // RFC 2136
+    const RCODE_NOTZONE         = 10;       // RFC 2136
+
+    // 11-15 reserved
+
+    const RCODE_BADSIG          = 16;       // RFC 2845    
+    const RCODE_BADKEY          = 17;       // RFC 2845
+    const RCODE_BADTIME         = 18;       // RFC 2845
+    const RCODE_BADMODE         = 19;       // RFC 2930
+    const RCODE_BADNAME         = 20;       // RFC 2930
+    const RCODE_BADALG          = 21;       // RFC 2930
+    const RCODE_BADTRUNC        = 22;       // RFC 4635
+
+    /*
+     * internal errors codes returned by the exceptions class
+     */
+    const E_NONE                = 0;
+    const E_DNS_FORMERR         = self::RCODE_FORMERR;
+    const E_DNS_SERVFAIL        = self::RCODE_SERVFAIL;
+    const E_DNS_NXDOMAIN        = self::RCODE_NXDOMAIN;
+    const E_DNS_NOTIMP          = self::RCODE_NOTIMP;
+    const E_DNS_REFUSED         = self::RCODE_REFUSED;
+    const E_DNS_YXDOMAIN        = self::RCODE_YXDOMAIN;
+    const E_DNS_YXRRSET         = self::RCODE_YXRRSET;
+    const E_DNS_NXRRSET         = self::RCODE_NXRRSET;
+    const E_DNS_NOTAUTH         = self::RCODE_NOTAUTH;
+    const E_DNS_NOTZONE         = self::RCODE_NOTZONE;
+
+    // 11-15 reserved
+
+    const E_DNS_BADSIG          = self::RCODE_BADSIG;
+    const E_DNS_BADKEY          = self::RCODE_BADKEY;
+    const E_DNS_BADTIME         = self::RCODE_BADTIME;
+    const E_DNS_BADMODE         = self::RCODE_BADMODE;
+    const E_DNS_BADNAME         = self::RCODE_BADNAME;
+    const E_DNS_BADALG          = self::RCODE_BADALG;
+    const E_DNS_BADTRUNC        = self::RCODE_BADTRUNC;    
+
+    // other error conditions
+
+    const E_NS_INVALID_FILE     = 200;
+    const E_NS_INVALID_ENTRY    = 201;
+    const E_NS_FAILED           = 202;
+
+    const E_PACKET_INVALID      = 300;
+    const E_PARSE_ERROR         = 301;
+    const E_HEADER_INVALID      = 302;
+    const E_QUESTION_INVALID    = 303;
+    const E_RR_INVALID          = 304;
+
+    const E_OPENSSL_ERROR       = 400;
+    const E_OPENSSL_UNAVAIL     = 401;
+    const E_OPENSSL_INV_PKEY    = 402;
+    const E_OPENSSL_INV_ALGO    = 403;
+
+    const E_CACHE_UNSUPPORTED   = 500;
+    const E_CACHE_SHM_FILE      = 501;
+    const E_CACHE_SHM_UNAVAIL   = 502;
+
+    /*
+     * DNSSEC Algorithms
+     */
+    const DNSSEC_ALGORITHM_RES                  = 0;
+    const DNSSEC_ALGORITHM_RSAMD5               = 1;
+    const DNSSEC_ALGORITHM_DH                   = 2;
+    const DNSSEC_ALGORITHM_DSA                  = 3;
+    const DNSSEC_ALGORITHM_ECC                  = 4;
+    const DNSSEC_ALGORITHM_RSASHA1              = 5;
+    const DNSSEC_ALGORITHM_DSANSEC3SHA1         = 6;
+    const DSNSEC_ALGORITHM_RSASHA1NSEC3SHA1     = 7;
+    const DNSSEC_ALGORITHM_RSASHA256	        = 8;
+    const DNSSEC_ALGORITHM_RSASHA512            = 10;
+    const DNSSEC_ALGORITHM_ECCGOST              = 12;
+    const DNSSEC_ALGORITHM_INDIRECT             = 252;
+    const DNSSEC_ALGORITHM_PRIVATEDNS           = 253;
+    const DNSSEC_ALGORITHM_PRIVATEOID           = 254;
+
+    /*
+     * DNSSEC Digest Types
+     */
+    const DNSSEC_DIGEST_RES                     = 0;
+    const DNSSEC_DIGEST_SHA1                    = 1;
+
+    /*
+     * The packet id used when sending requests
+     */
+    public static $next_packet_id;
+
+    /*
+     * Used to map resource record types to their id's, and back
+     */
+    public static $rr_types_by_id = array();
+    public static $rr_types_by_name = array(
+
+        'SIG0'          => 0,       // RFC 2931 pseudo type
+        'A'             => 1,       // RFC 1035
+        'NS'            => 2,       // RFC 1035
+        'MD'            => 3,       // RFC 1035 - obsolete, Not implemented
+        'MF'            => 4,       // RFC 1035 - obsolete, Not implemented
+        'CNAME'         => 5,       // RFC 1035
+        'SOA'           => 6,       // RFC 1035
+        'MB'            => 7,       // RFC 1035 - obsolete, Not implemented
+        'MG'            => 8,       // RFC 1035 - obsolete, Not implemented
+        'MR'            => 9,       // RFC 1035 - obsolete, Not implemented
+        'NULL'          => 10,      // RFC 1035 - obsolete, Not implemented
+        'WKS'           => 11,      // RFC 1035
+        'PTR'           => 12,      // RFC 1035
+        'HINFO'         => 13,      // RFC 1035
+        'MINFO'         => 14,      // RFC 1035 - obsolete, Not implemented
+        'MX'            => 15,      // RFC 1035
+        'TXT'           => 16,      // RFC 1035
+        'RP'            => 17,      // RFC 1183
+        'AFSDB'         => 18,      // RFC 1183
+        'X25'           => 19,      // RFC 1183
+        'ISDN'          => 20,      // RFC 1183
+        'RT'            => 21,      // RFC 1183
+        'NSAP'          => 22,      // RFC 1706
+        'NSAP_PTR'      => 23,      // RFC 1348 - obsolete, Not implemented
+        'SIG'           => 24,      // RFC 2535
+        'KEY'           => 25,      // RFC 2535, RFC 2930
+        'PX'            => 26,      // RFC 2163
+        'GPOS'          => 27,      // RFC 1712 - Not implemented
+        'AAAA'          => 28,      // RFC 3596
+        'LOC'           => 29,      // RFC 1876
+        'NXT'           => 30,      // RFC 2065, obsoleted by by RFC 3755
+        'EID'           => 31,      // [Patton][Patton1995]
+        'NIMLOC'        => 32,      // [Patton][Patton1995]
+        'SRV'           => 33,      // RFC 2782
+        'ATMA'          => 34,      // Windows only
+        'NAPTR'         => 35,      // RFC 2915
+        'KX'            => 36,      // RFC 2230
+        'CERT'          => 37,      // RFC 4398
+        'A6'            => 38,      // downgraded to experimental by RFC 3363
+        'DNAME'         => 39,      // RFC 2672
+        'SINK'          => 40,      // Not implemented
+        'OPT'           => 41,      // RFC 2671
+        'APL'           => 42,      // RFC 3123
+        'DS'            => 43,      // RFC 4034
+        'SSHFP'         => 44,      // RFC 4255
+        'IPSECKEY'      => 45,      // RFC 4025
+        'RRSIG'         => 46,      // RFC 4034
+        'NSEC'          => 47,      // RFC 4034
+        'DNSKEY'        => 48,      // RFC 4034
+        'DHCID'         => 49,      // RFC 4701
+        'NSEC3'         => 50,      // RFC 5155
+        'NSEC3PARAM'    => 51,      // RFC 5155
+        'TLSA'          => 52,      // RFC 6698
+
+                                    // 52 - 54 unassigned
+
+        'HIP'           => 55,      // RFC 5205
+        'NINFO'         => 56,      // Not implemented
+        'RKEY'          => 57,      // Not implemented
+        'TALINK'        => 58,      // IETF (draft-barwood-dnsop-ds-publish-02)
+        'CDS'           => 59,      // IETF (draft-barwood-dnsop-ds-publish-02)
+
+                                    // 60 - 98 unassigned
+
+        'SPF'           => 99,      // RFC 4408
+        'UINFO'         => 100,     // no RFC, Not implemented
+        'UID'           => 101,     // no RFC, Not implemented
+        'GID'           => 102,     // no RFC, Not implemented
+        'UNSPEC'        => 103,     // no RFC, Not implemented
+        'NID'           => 104,     // RFC 6742
+        'L32'           => 105,     // RFC 6742
+        'L64'           => 106,     // RFC 6742
+        'LP'            => 107,     // RFC 6742
+
+                                    // 108 - 248 unassigned
+
+        'TKEY'          => 249,     // RFC 2930
+        'TSIG'          => 250,     // RFC 2845
+        'IXFR'          => 251,     // RFC 1995 - only a full (AXFR) is supported
+        'AXFR'          => 252,     // RFC 1035
+        'MAILB'         => 253,     // RFC 883, Not implemented
+        'MAILA'         => 254,     // RFC 973, Not implemented
+        'ANY'           => 255,     // RFC 1035 - we support both 'ANY' and '*'
+        'URI'           => 256,     // tools.ietf.org/html/draft-faltstrom-uri-06
+        'CAA'           => 257,     // tools.ietf.org/html/draft-ietf-pkix-caa-03
+
+                                    // 258 - 32767 unassigned
+
+        'TA'            => 32768,   // same as DS
+        'DLV'           => 32769    // RFC 4431
+    );
+
+    /*
+     * Qtypes and Metatypes - defined in RFC2929 section 3.1
+     */
+    public static $rr_qtypes_by_id = array();
+    public static $rr_qtypes_by_name = array(
+
+        'IXFR'          => 251,     // RFC 1995 - only a full (AXFR) is supported
+        'AXFR'          => 252,     // RFC 1035
+        'MAILB'         => 253,     // RFC 883, Not implemented
+        'MAILA'         => 254,     // RFC 973, Not implemented
+        'ANY'           => 255      // RFC 1035 - we support both 'ANY' and '*'
+    );
+    
+    public static $rr_metatypes_by_id = array();
+    public static $rr_metatypes_by_name = array(
+
+        'OPT'           => 41,      // RFC 2671
+        'TKEY'          => 249,     // RFC 2930
+        'TSIG'          => 250      // RFC 2845
+    );
+
+    /*
+     * used to map resource record id's to RR class names
+     */
+    public static $rr_types_class_to_id = array();
+    public static $rr_types_id_to_class = array(
+
+        1           => 'Net_DNS2_RR_A',
+        2           => 'Net_DNS2_RR_NS',
+        5           => 'Net_DNS2_RR_CNAME',
+        6           => 'Net_DNS2_RR_SOA',
+        11          => 'Net_DNS2_RR_WKS',
+        12          => 'Net_DNS2_RR_PTR',
+        13          => 'Net_DNS2_RR_HINFO',
+        15          => 'Net_DNS2_RR_MX',
+        16          => 'Net_DNS2_RR_TXT',
+        17          => 'Net_DNS2_RR_RP',
+        18          => 'Net_DNS2_RR_AFSDB',
+        19          => 'Net_DNS2_RR_X25',
+        20          => 'Net_DNS2_RR_ISDN',
+        21          => 'Net_DNS2_RR_RT',
+        22          => 'Net_DNS2_RR_NSAP',
+        24          => 'Net_DNS2_RR_SIG',
+        25          => 'Net_DNS2_RR_KEY',
+        26          => 'Net_DNS2_RR_PX',
+        28          => 'Net_DNS2_RR_AAAA',
+        29          => 'Net_DNS2_RR_LOC',
+        31          => 'Net_DNS2_RR_EID',
+        32          => 'Net_DNS2_RR_NIMLOC',
+        33          => 'Net_DNS2_RR_SRV',
+        34          => 'Net_DNS2_RR_ATMA',
+        35          => 'Net_DNS2_RR_NAPTR',
+        36          => 'Net_DNS2_RR_KX',
+        37          => 'Net_DNS2_RR_CERT',
+        39          => 'Net_DNS2_RR_DNAME',
+        41          => 'Net_DNS2_RR_OPT',
+        42          => 'Net_DNS2_RR_APL',
+        43          => 'Net_DNS2_RR_DS',
+        44          => 'Net_DNS2_RR_SSHFP',
+        45          => 'Net_DNS2_RR_IPSECKEY',
+        46          => 'Net_DNS2_RR_RRSIG',
+        47          => 'Net_DNS2_RR_NSEC',
+        48          => 'Net_DNS2_RR_DNSKEY',
+        49          => 'Net_DNS2_RR_DHCID',
+        50          => 'Net_DNS2_RR_NSEC3',
+        51          => 'Net_DNS2_RR_NSEC3PARAM',
+        52          => 'Net_DNS2_RR_TLSA',
+        55          => 'Net_DNS2_RR_HIP',
+        58          => 'Net_DNS2_RR_TALINK',
+        59          => 'Net_DNS2_RR_CDS',
+        99          => 'Net_DNS2_RR_SPF',
+        104         => 'Net_DNS2_RR_NID',
+        105         => 'Net_DNS2_RR_L32',
+        106         => 'Net_DNS2_RR_L64',
+        107         => 'Net_DNS2_RR_LP',
+        249         => 'Net_DNS2_RR_TKEY',
+        250         => 'Net_DNS2_RR_TSIG',
+
+    //    251            - IXFR - handled as a full zone transfer (252)
+    //    252            - AXFR - handled as a function call
+    //    255            - ANY - used only for queries
+
+        256         => 'Net_DNS2_RR_URI',
+        257         => 'Net_DNS2_RR_CAA',
+        32768       => 'Net_DNS2_RR_TA',
+        32769       => 'Net_DNS2_RR_DLV'
+    );
+
+    /*
+     * used to map resource record class names to their id's, and back
+     */
+    public static $classes_by_id = array();
+    public static $classes_by_name = array(
+
+        'IN'    => self::RR_CLASS_IN,        // RFC 1035
+        'CH'    => self::RR_CLASS_CH,        // RFC 1035
+        'HS'    => self::RR_CLASS_HS,        // RFC 1035
+        'NONE'  => self::RR_CLASS_NONE,      // RFC 2136
+        'ANY'   => self::RR_CLASS_ANY        // RFC 1035
+    );
+
+    /*
+     * maps response codes to error messages
+     */
+    public static $result_code_messages = array(
+
+        self::RCODE_NOERROR     => 'The request completed successfully.',
+        self::RCODE_FORMERR     => 'The name server was unable to interpret the query.',
+        self::RCODE_SERVFAIL    => 'The name server was unable to process this query due to a problem with the name server.',
+        self::RCODE_NXDOMAIN    => 'The domain name referenced in the query does not exist.',
+        self::RCODE_NOTIMP      => 'The name server does not support the requested kind of query.',
+        self::RCODE_REFUSED     => 'The name server refuses to perform the specified operation for policy reasons.',
+        self::RCODE_YXDOMAIN    => 'Name Exists when it should not.',
+        self::RCODE_YXRRSET     => 'RR Set Exists when it should not.',
+        self::RCODE_NXRRSET     => 'RR Set that should exist does not.',
+        self::RCODE_NOTAUTH     => 'Server Not Authoritative for zone.',
+        self::RCODE_NOTZONE     => 'Name not contained in zone.',
+
+        self::RCODE_BADSIG      => 'TSIG Signature Failure.',
+        self::RCODE_BADKEY      => 'Key not recognized.',
+        self::RCODE_BADTIME     => 'Signature out of time window.',
+        self::RCODE_BADMODE     => 'Bad TKEY Mode.',
+        self::RCODE_BADNAME     => 'Duplicate key name.',
+        self::RCODE_BADALG      => 'Algorithm not supported.',
+        self::RCODE_BADTRUNC    => 'Bad truncation.'
+    );
+
+    /*
+     * maps DNS SEC alrorithms to their mnemonics
+     */
+    public static $algorithm_name_to_id = array();
+    public static $algorithm_id_to_name = array(
+    
+        self::DNSSEC_ALGORITHM_RES                  => 'RES',
+        self::DNSSEC_ALGORITHM_RSAMD5               => 'RSAMD5',
+        self::DNSSEC_ALGORITHM_DH                   => 'DH',
+        self::DNSSEC_ALGORITHM_DSA                  => 'DSA',
+        self::DNSSEC_ALGORITHM_ECC                  => 'ECC',
+        self::DNSSEC_ALGORITHM_RSASHA1              => 'RSASHA1',
+        self::DNSSEC_ALGORITHM_DSANSEC3SHA1         => 'DSA-NSEC3-SHA1',
+        self::DSNSEC_ALGORITHM_RSASHA1NSEC3SHA1     => 'RSASHA1-NSEC3-SHA1',
+        self::DNSSEC_ALGORITHM_RSASHA256            => 'RSASHA256',
+        self::DNSSEC_ALGORITHM_RSASHA512            => 'RSASHA512',
+        self::DNSSEC_ALGORITHM_ECCGOST              => 'ECC-GOST',
+        self::DNSSEC_ALGORITHM_INDIRECT             => 'INDIRECT',
+        self::DNSSEC_ALGORITHM_PRIVATEDNS           => 'PRIVATEDNS',
+        self::DNSSEC_ALGORITHM_PRIVATEOID           => 'PRIVATEOID'
+    );
+
+    /*
+     * maps DNSSEC digest types to their mnemonics
+     */
+    public static $digest_name_to_id = array();
+    public static $digest_id_to_name = array(
+
+        self::DNSSEC_DIGEST_RES         => 'RES',
+        self::DNSSEC_DIGEST_SHA1        => 'SHA-1'
+    );
+
+    /*
+     * Protocols names - RFC 1010
+     */
+    public static $protocol_by_id = array();
+    public static $protocol_by_name = array(
+
+        'ICMP'          => 1,
+        'IGMP'          => 2,
+        'GGP'           => 3,
+        'ST'            => 5,
+        'TCP'           => 6,
+        'UCL'           => 7,
+        'EGP'           => 8,
+        'IGP'           => 9,
+        'BBN-RCC-MON'   => 10,
+        'NVP-II'        => 11,
+        'PUP'           => 12,
+        'ARGUS'         => 13,
+        'EMCON'         => 14,
+        'XNET'          => 15,
+        'CHAOS'         => 16,
+        'UDP'           => 17,
+        'MUX'           => 18,
+        'DCN-MEAS'      => 19,
+        'HMP'           => 20,
+        'PRM'           => 21,
+        'XNS-IDP'       => 22,
+        'TRUNK-1'       => 23,
+        'TRUNK-2'       => 24,
+        'LEAF-1'        => 25,
+        'LEAF-2'        => 26,
+        'RDP'           => 27,
+        'IRTP'          => 28,
+        'ISO-TP4'       => 29,
+        'NETBLT'        => 30,
+        'MFE-NSP'       => 31,
+        'MERIT-INP'     => 32,
+        'SEP'           => 33,
+        // 34 - 60      - Unassigned
+        // 61           - any host internal protocol
+        'CFTP'          => 62,
+        // 63           - any local network
+        'SAT-EXPAK'     => 64,
+        'MIT-SUBNET'    => 65,
+        'RVD'           => 66,
+        'IPPC'          => 67,
+        // 68           - any distributed file system
+        'SAT-MON'       => 69,
+        // 70           - Unassigned
+        'IPCV'          => 71,
+        // 72 - 75      - Unassigned
+        'BR-SAT-MON'    => 76,
+        // 77           - Unassigned
+        'WB-MON'        => 78,
+        'WB-EXPAK'      => 79
+        // 80 - 254     - Unassigned
+        // 255          - Reserved
+    );
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Packet.php b/include/pear/Net/DNS2/Packet.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccd633eb7d2dbbbde819a02c40ae369f95b0f33a
--- /dev/null
+++ b/include/pear/Net/DNS2/Packet.php
@@ -0,0 +1,449 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Packet.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ * This file contains code based off the Net::DNS Perl module by
+ * Michael Fuhr.
+ *
+ * This is the copyright notice from the PERL Net::DNS module:
+ *
+ * Copyright (c) 1997-2000 Michael Fuhr.  All rights reserved.  This
+ * program is free software; you can redistribute it and/or modify it
+ * under the same terms as Perl itself.
+ *
+ */
+
+/**
+ * This is the base class that holds a standard DNS packet.
+ *
+ * The Net_DNS2_Packet_Request and Net_DNS2_Packet_Response classes extend this
+ * class.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet_Request, Net_DNS2_Packet_Response
+ *
+ */
+class Net_DNS2_Packet
+{
+    /*
+     * the full binary data and length for this packet
+     */
+    public $rdata;
+    public $rdlength;
+
+    /*
+     * the offset pointer used when building/parsing packets
+     */
+    public $offset = 0;
+
+    /*
+     * Net_DNS2_Header object with the DNS packet header
+     */
+    public $header;
+
+    /*
+     * array of Net_DNS2_Question objects
+     *
+     * used as "zone" for updates per RFC2136
+     *
+     */
+    public $question = array();
+
+    /*
+     * array of Net_DNS2_RR Objects for Answers
+     * 
+     * used as "prerequisite" for updates per RFC2136
+     *
+     */
+    public $answer = array();
+
+    /*
+     * array of Net_DNS2_RR Objects for Authority
+     *
+     * used as "update" for updates per RFC2136
+     *
+     */
+    public $authority = array();
+
+    /*
+     * array of Net_DNS2_RR Objects for Addtitional
+     */
+    public $additional = array();
+
+    /*
+     * array of compressed labeles
+     */
+    private $_compressed = array();
+
+    /**
+     * magic __toString() method to return the Net_DNS2_Packet as a string
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public function __toString()
+    {
+        $output = $this->header->__toString();
+
+        foreach ($this->question as $x) {
+
+            $output .= $x->__toString() . "\n";
+        }
+        foreach ($this->answer as $x) {
+
+            $output .= $x->__toString() . "\n";
+        }
+        foreach ($this->authority as $x) {
+
+            $output .= $x->__toString() . "\n";
+        }
+        foreach ($this->additional as $x) {
+
+            $output .= $x->__toString() . "\n";
+        }
+
+        return $output;
+    }
+
+    /**
+     * returns a full binary DNS packet
+     *
+     * @return string
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function get()
+    {
+        $data = $this->header->get($this);
+
+        foreach ($this->question as $x) {
+
+            $data .= $x->get($this);
+        }
+        foreach ($this->answer as $x) {
+
+            $data .= $x->get($this);
+        }
+        foreach ($this->authority as $x) {
+
+            $data .= $x->get($this);
+        }
+        foreach ($this->additional as $x) {
+
+            $data .= $x->get($this);
+        }
+
+        return $data;
+    }
+
+    /**
+     * applies a standard DNS name compression on the given name/offset
+     *
+     * This logic was based on the Net::DNS::Packet::dn_comp() function 
+     * by Michanel Fuhr
+     *
+     * @param string  $name    the name to be compressed
+     * @param integer &$offset the offset into the given packet object
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public function compress($name, &$offset)
+    {
+        $names    = explode('.', $name);
+        $compname = '';
+
+        while (!empty($names)) {
+
+            $dname = join('.', $names);
+
+            if (isset($this->_compressed[$dname])) {
+
+                $compname .= pack('n', 0xc000 | $this->_compressed[$dname]);
+                $offset += 2;
+
+                break;
+            }
+
+            $this->_compressed[$dname] = $offset;
+            $first = array_shift($names);
+
+            $length = strlen($first);
+            if ($length <= 0) {
+                continue;
+            }
+        
+            //
+            // truncate see RFC1035 2.3.1
+            //
+            if ($length > 63) {
+
+                $length = 63;
+                $first = substr($first, 0, $length);
+            }
+
+            $compname .= pack('Ca*', $length, $first);
+            $offset += $length + 1;
+        }
+
+        if (empty($names)) {
+
+            $compname .= pack('C', 0);
+            $offset++;
+        }
+
+        return $compname;
+    }
+
+    /**
+     * applies a standard DNS name compression on the given name/offset
+     *
+     * This logic was based on the Net::DNS::Packet::dn_comp() function 
+     * by Michanel Fuhr
+     *
+     * @param string $name the name to be compressed
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public static function pack($name)
+    {
+        $offset = 0;
+        $names = explode('.', $name);
+        $compname = '';
+
+        while (!empty($names)) {
+
+            $first = array_shift($names);
+            $length = strlen($first);
+
+            $compname .= pack('Ca*', $length, $first);
+            $offset += $length + 1;
+        }
+
+        $compname .= "\0";
+        $offset++;
+
+        return $compname;
+    }
+
+    /**
+     * expands the domain name stored at a given offset in a DNS Packet
+     *
+     * This logic was based on the Net::DNS::Packet::dn_expand() function
+     * by Michanel Fuhr
+     *
+     * @param Net_DNS2_Packet &$packet the DNS packet to look in for the domain name
+     * @param integer         &$offset the offset into the given packet object
+     *
+     * @return mixed either the domain name or null if it's not found.
+     * @access public
+     *
+     */
+    public static function expand(Net_DNS2_Packet &$packet, &$offset)
+    {
+        $name = '';
+
+        while (1) {
+            if ($packet->rdlength < ($offset + 1)) {
+                return null;
+            }
+            
+            $xlen = ord($packet->rdata[$offset]);
+            if ($xlen == 0) {
+
+                ++$offset;
+                break;
+
+            } else if (($xlen & 0xc0) == 0xc0) {
+                if ($packet->rdlength < ($offset + 2)) {
+
+                    return null;
+                }
+
+                $ptr = ord($packet->rdata[$offset]) << 8 | 
+                    ord($packet->rdata[$offset+1]);
+                $ptr = $ptr & 0x3fff;
+
+                $name2 = Net_DNS2_Packet::expand($packet, $ptr);
+                if (is_null($name2)) {
+
+                    return null;
+                }
+
+                $name .= $name2;
+                $offset += 2;
+    
+                break;
+            } else {
+                ++$offset;
+
+                if ($packet->rdlength < ($offset + $xlen)) {
+
+                    return null;
+                }
+
+                $elem = '';
+                $elem = substr($packet->rdata, $offset, $xlen);
+                $name .= $elem . '.';
+                $offset += $xlen;
+            }
+        }
+
+        return trim($name, '.');
+    }
+
+    /**
+     * parses a domain label from a DNS Packet at the given offset
+     *
+     * @param Net_DNS2_Packet &$packet the DNS packet to look in for the domain name
+     * @param integer         &$offset the offset into the given packet object
+     *
+     * @return mixed either the domain name or null if it's not found.
+     * @access public
+     *
+     */
+    public static function label(Net_DNS2_Packet &$packet, &$offset)
+    {
+        $name = '';
+
+        if ($packet->rdlength < ($offset + 1)) {
+
+            return null;
+        }
+
+        $xlen = ord($packet->rdata[$offset]);
+        ++$offset;
+
+        if (($xlen + $offset) > $packet->rdlength) {
+
+            $name = substr($packet->rdata, $offset);
+            $offset = $packet->rdlength;
+        } else {
+
+            $name = substr($packet->rdata, $offset, $xlen);
+            $offset += $xlen;
+        }
+
+        return $name;
+    }
+
+    /**
+     * copies the contents of the given packet, to the local packet object. this
+     * function intentionally ignores some of the packet data.
+     *
+     * @param Net_DNS2_Packet $packet the DNS packet to copy the data from
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function copy(Net_DNS2_Packet $packet)
+    {
+        $this->header       = $packet->header;
+        $this->question     = $packet->question;
+        $this->answer       = $packet->answer;
+        $this->authority    = $packet->authority;
+        $this->additional   = $packet->additional;
+
+        return true;
+    }
+
+    /**
+     * resets the values in the current packet object
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function reset()
+    {
+        $this->header->id   = $this->header->nextPacketId();
+        $this->rdata        = '';
+        $this->rdlength     = 0;
+        $this->offset       = 0;
+        $this->answer       = array();
+        $this->authority    = array();
+        $this->additional   = array();
+        $this->_compressed  = array();
+    
+        return true;
+    }
+    
+    /**
+     * formats an IPv6 IP address in the preferred format
+     *
+     * @param string $address The IPv6 IP address to format
+     *
+     * @return string The IPv6 IP address formatted in the new format
+     * @access public
+     * @deprecated function deprecated in 1.1.3
+     *
+     */
+    public static function formatIPv6($address)
+    {
+        return Net_DNS2::expandIPv6($address);
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Packet/Request.php b/include/pear/Net/DNS2/Packet/Request.php
new file mode 100644
index 0000000000000000000000000000000000000000..117fc7a98e03b5f1ec585a42d880dd6a80063056
--- /dev/null
+++ b/include/pear/Net/DNS2/Packet/Request.php
@@ -0,0 +1,221 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Request.php 155 2012-05-06 23:45:23Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+
+/**
+ * This class handles building new DNS request packets; packets used for DNS
+ * queries and updates.
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ *   
+ */
+class Net_DNS2_Packet_Request extends Net_DNS2_Packet
+{
+    /**
+     * Constructor - builds a new Net_DNS2_Packet_Request object
+     *
+     * @param string $name  the domain name for the packet
+     * @param string $type  the DNS RR type for the packet
+     * @param string $class the DNS class for the packet
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct($name, $type = null, $class = null)
+    {
+        $this->set($name, $type, $class);
+    }
+
+    /**
+     * builds a new Net_DNS2_Packet_Request object
+     *
+     * @param string $name  the domain name for the packet
+     * @param string $type  the DNS RR type for the packet
+     * @param string $class the DNS class for the packet
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function set($name, $type = 'A', $class = 'IN')
+    {
+        //
+        // generate a new header
+        //
+        $this->header = new Net_DNS2_Header;
+
+        //
+        // add a new question
+        //
+        $q = new Net_DNS2_Question();
+
+        $name   = trim(strtolower($name), " \t\n\r\0\x0B.");
+        $type   = strtoupper(trim($type));
+        $class  = strtoupper(trim($class));
+
+        //
+        // check that the input string has some data in it
+        //
+        if (empty($name)) {
+
+            throw new Net_DNS2_Exception(
+                'empty query string provided',
+                Net_DNS2_Lookups::E_PACKET_INVALID
+            );
+        }
+
+        //
+        // if the type is "*", rename it to "ANY"- both are acceptable.
+        //
+        if ($type == '*') {
+
+            $type = 'ANY';
+        }
+
+        //
+        // check that the type and class are valid
+        //    
+        if (   (!isset(Net_DNS2_Lookups::$rr_types_by_name[$type])) 
+            || (!isset(Net_DNS2_Lookups::$classes_by_name[$class])) 
+        ) {
+            throw new Net_DNS2_Exception(
+                'invalid type (' . $type . ') or class (' . $class . ') specified.',
+                Net_DNS2_Lookups::E_PACKET_INVALID
+            );
+        }
+
+        //
+        // if it's a PTR request for an IP address, then make sure we tack on 
+        // the arpa domain
+        //
+        if ($type == 'PTR') {
+
+            if (Net_DNS2::isIPv4($name) == true) {
+
+                //
+                // IPv4
+                //
+                $name = implode('.', array_reverse(explode('.', $name)));
+                $name .= '.in-addr.arpa';
+
+            } else if (Net_DNS2::isIPv6($name) == true) {
+
+                //
+                // IPv6
+                //
+                $e = Net_DNS2::expandIPv6($name);
+                if ($e !== false) {
+
+                    $name = implode(
+                        '.', array_reverse(str_split(str_replace(':', '', $e)))
+                    );
+
+                    $name .= '.ip6.arpa';
+
+                } else {
+
+                    throw new Net_DNS2_Exception(
+                        'unsupported PTR value: ' . $name,
+                        Net_DNS2_Lookups::E_PACKET_INVALID
+                    );
+                }
+
+            } else if (preg_match('/arpa$/', $name) == true) {
+
+                //
+                // an already formatted IPv4 or IPv6 address in the arpa domain
+                //
+
+            } else {
+
+                throw new Net_DNS2_Exception(
+                    'unsupported PTR value: ' . $name,
+                    Net_DNS2_Lookups::E_PACKET_INVALID
+                );
+            }
+        }
+
+        //
+        // store the data
+        //
+        $q->qname           = $name;
+        $q->qtype           = $type;
+        $q->qclass          = $class;        
+
+        $this->question[]   = $q;
+
+        //
+        // the answer, authority and additional are empty; they can be modified
+        // after the request is created for UPDATE requests if needed.
+        //
+        $this->answer       = array();
+        $this->authority    = array();
+        $this->additional   = array();
+
+        return true;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Packet/Response.php b/include/pear/Net/DNS2/Packet/Response.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2cd1f281cde12e6bd967586568f613dab43918d
--- /dev/null
+++ b/include/pear/Net/DNS2/Packet/Response.php
@@ -0,0 +1,189 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Response.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+
+/**
+ * This class handles building new DNS response packets; it parses binary packed
+ * packets that come off the wire
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ * 
+ */
+class Net_DNS2_Packet_Response extends Net_DNS2_Packet
+{
+    /*
+     * The name servers that this response came from
+     */
+    public $answer_from;
+
+    /*
+     * The socket type the answer came from (TCP/UDP)
+     */
+    public $answer_socket_type;
+
+    /**
+     * Constructor - builds a new Net_DNS2_Packet_Response object
+     *
+     * @param string  $data binary DNS packet
+     * @param integer $size the length of the DNS packet
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct($data, $size)
+    {
+        $this->set($data, $size);
+    }
+
+    /**
+     * builds a new Net_DNS2_Packet_Response object
+     *
+     * @param string  $data binary DNS packet
+     * @param integer $size the length of the DNS packet
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function set($data, $size)
+    {
+        //
+        // store the full packet
+        //
+        $this->rdata    = $data;
+        $this->rdlength = $size;
+
+        //
+        // parse the header
+        // 
+        // we don't bother checking the size earlier, because the first thing the
+        // header class does, is check the size and throw and exception if it's
+        // invalid.
+        //
+        $this->header = new Net_DNS2_Header($this);
+
+        //
+        // if the truncation bit is set, then just return right here, because the
+        // rest of the packet is probably empty; and there's no point in processing
+        // anything else.
+        //
+        // we also don't need to worry about checking to see if the the header is 
+        // null or not, since the Net_DNS2_Header() constructor will throw an 
+        // exception if the packet is invalid.
+        //
+        if ($this->header->tc == 1) {
+
+            return false;
+        }
+
+        //
+        // parse the questions
+        //
+        for ($x = 0; $x < $this->header->qdcount; ++$x) {
+
+            $this->question[$x] = new Net_DNS2_Question($this);
+        }
+
+        //
+        // parse the answers
+        //
+        for ($x = 0; $x < $this->header->ancount; ++$x) {
+
+            $o = Net_DNS2_RR::parse($this);
+            if (!is_null($o)) {
+
+                $this->answer[] = $o;
+            }
+        } 
+
+        //
+        // parse the authority section
+        //
+        for ($x = 0; $x < $this->header->nscount; ++$x) {
+
+            $o = Net_DNS2_RR::parse($this);
+            if (!is_null($o)) {
+
+                $this->authority[] = $o;  
+            }
+        }
+
+        //
+        // parse the additional section
+        //
+        for ($x = 0; $x < $this->header->arcount; ++$x) {
+
+            $o = Net_DNS2_RR::parse($this);
+            if (!is_null($o)) {
+
+                $this->additional[] = $o; 
+            }
+        }
+
+        return true;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/PrivateKey.php b/include/pear/Net/DNS2/PrivateKey.php
new file mode 100644
index 0000000000000000000000000000000000000000..1dca1ce6d225237e48d74d72aca667107391c6ee
--- /dev/null
+++ b/include/pear/Net/DNS2/PrivateKey.php
@@ -0,0 +1,422 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2011 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: PrivateKey.php 133 2011-12-03 23:42:24Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.1.0
+ *
+ */
+
+/**
+ * SSL Private Key container class
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * 
+ */
+class Net_DNS2_PrivateKey
+{
+    /*
+     * the filename that was loaded; stored for reference
+     */
+    public $filename;
+
+    /*
+     * the keytag for the signature
+     */
+    public $keytag;
+
+    /*
+     * the sign name for the signature
+     */
+    public $signname;
+
+    /*
+     * the algorithm used for the signature
+     */
+    public $algorithm;
+
+    /*
+     * the key format fo the signature
+     */
+    public $key_format;
+
+    /*
+     * the openssl private key id
+     */
+    public $instance;
+
+    /*
+     * RSA: modulus
+     */
+    private $_modulus;
+
+    /*
+     * RSA: public exponent
+     */
+    private $_public_exponent;
+
+    /*
+     * RSA: rivate exponent
+     */
+    private $_private_exponent;
+
+    /*
+     * RSA: prime1
+     */
+    private $_prime1;
+
+    /*
+     * RSA: prime2
+     */
+    private $_prime2;
+
+    /*
+     * RSA: exponent 1
+     */
+    private $_exponent1;
+
+    /*
+     * RSA: exponent 2
+     */
+    private $_exponent2;
+
+    /*
+     * RSA: coefficient
+     */
+    private $_coefficient;
+
+    /*
+     * DSA: prime
+     */
+    //private $_prime;
+    
+    /*
+     * DSA: subprime
+     */
+    //private $_subprime;
+
+    /*
+     * DSA: base
+     */
+    //private $_base;
+
+    /*
+     * DSA: private value
+     */
+    //private $_private_value;
+
+    /*
+     * DSA: public value
+     */
+    //private $_public_value;
+
+    /**
+     * Constructor - base constructor the private key container class
+     * 
+     * @param string $file path to a private-key file to parse and load
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     * 
+     */
+    public function __construct($file = null)
+    {
+        if (isset($file)) {
+            $this->parseFile($file);
+        }
+    }
+
+    /**
+     * parses a private key file generated by dnssec-keygen
+     * 
+     * @param string $file path to a private-key file to parse and load
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     * 
+     */
+    public function parseFile($file)
+    {
+        //
+        // check for OpenSSL
+        //
+        if (extension_loaded('openssl') === false) {
+
+            throw new Net_DNS2_Exception(
+                'the OpenSSL extension is required to use parse private key.',
+                Net_DNS2_Lookups::E_OPENSSL_UNAVAIL
+            );
+        }
+
+        //
+        // check to make sure the file exists
+        //
+        if (is_readable($file) == false) {
+
+            throw new Net_DNS2_Exception(
+                'invalid private key file: ' . $file,
+                Net_DNS2_Lookups::E_OPENSSL_INV_PKEY
+            );
+        }
+
+        //
+        // get the base filename, and parse it for the local value
+        //
+        $keyname = basename($file);
+        if (strlen($keyname) == 0) {
+
+            throw new Net_DNS2_Exception(
+                'failed to get basename() for: ' . $file,
+                Net_DNS2_Lookups::E_OPENSSL_INV_PKEY
+            );
+        }
+
+        //
+        // parse the keyname
+        //
+        if (preg_match("/K(.*)\.\+(\d{3})\+(\d*)\.private/", $keyname, $matches)) {
+            
+            $this->signname    = $matches[1];
+            $this->algorithm   = intval($matches[2]);
+            $this->keytag      = intval($matches[3]);
+
+        } else {
+
+            throw new Net_DNS2_Exception(
+                'file ' . $keyname . ' does not look like a private key file!',
+                Net_DNS2_Lookups::E_OPENSSL_INV_PKEY
+            );
+        }
+
+        //
+        // read all the data from the
+        //
+        $data = file($file, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
+        if (count($data) == 0) {
+            
+            throw new Net_DNS2_Exception(
+                'file ' . $keyname . ' is empty!',
+                Net_DNS2_Lookups::E_OPENSSL_INV_PKEY
+            );
+        }
+
+        foreach ($data as $line) {
+
+            list($key, $value) = explode(':', $line);
+
+            $key    = trim($key);
+            $value  = trim($value);
+
+            switch(strtolower($key)) {
+
+            case 'private-key-format':
+                $this->_key_format = $value;
+                break;
+
+            case 'algorithm':
+                if ($this->algorithm != $value) {
+                    throw new Net_DNS2_Exception(
+                        'Algorithm mis-match! filename is ' . $this->algorithm . 
+                        ', contents say ' . $value,
+                        Net_DNS2_Lookups::E_OPENSSL_INV_ALGO
+                    );
+                }
+                break;
+
+            //
+            // RSA
+            //
+            case 'modulus':
+                $this->_modulus = $value;
+                break;
+
+            case 'publicexponent':
+                $this->_public_exponent = $value;
+                break;
+
+            case 'privateexponent':
+                $this->_private_exponent = $value;
+                break;
+        
+            case 'prime1':
+                $this->_prime1 = $value;
+                break;
+
+            case 'prime2':
+                $this->_prime2 = $value;
+                break;
+
+            case 'exponent1':
+                $this->_exponent1 = $value;
+                break;
+
+            case 'exponent2':
+                $this->_exponent2 = $value;
+                break;
+
+            case 'coefficient':
+                $this->_coefficient = $value;
+                break;
+
+            //
+            // DSA - this won't work in PHP until the OpenSSL extension is better
+            //
+            /*case 'prime(p)':
+                $this->_prime = $value;
+                break;
+
+            case 'subprime(q)':
+                $this->_subprime = $value;
+                break;
+
+            case 'base(g)':
+                $this->_base = $value;
+                break;
+
+            case 'private_value(x)':
+                $this->_private_value = $value;
+                break;
+
+            case 'public_value(y)':
+                $this->_public_value = $value;
+                break;
+            */
+            default:
+                throw new Net_DNS2_Exception(
+                    'unknown private key data: ' . $key . ': ' . $value,
+                    Net_DNS2_Lookups::E_OPENSSL_INV_PKEY
+                );
+            }
+        }
+
+        //
+        // generate the private key
+        //
+        $args = array();
+
+        switch($this->algorithm) {
+        
+        //
+        // RSA
+        //
+        case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSAMD5:
+        case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA1:
+
+            $args = array(
+
+                'rsa' => array(
+
+                    'n'                 => base64_decode($this->_modulus),
+                    'e'                 => base64_decode($this->_public_exponent),
+                    'd'                 => base64_decode($this->_private_exponent),
+                    'p'                 => base64_decode($this->_prime1),
+                    'q'                 => base64_decode($this->_prime2),
+                    'dmp1'              => base64_decode($this->_exponent1),
+                    'dmq1'              => base64_decode($this->_exponent2),
+                    'iqmp'              => base64_decode($this->_coefficient)
+                )
+            );
+
+            break;
+
+        //
+        // DSA - this won't work in PHP until the OpenSSL extension is better
+        //
+        /*case Net_DNS2_Lookups::DNSSEC_ALGORITHM_DSA:
+
+            $args = array(
+
+                'dsa' => array(
+
+                    'p'                 => base64_decode($this->_prime),
+                    'q'                 => base64_decode($this->_subprime),
+                    'g'                 => base64_decode($this->_base),
+                    'priv_key'          => base64_decode($this->_private_value),
+                    'pub_key'           => base64_decode($this->_public_value)
+                )
+            );
+
+            break;
+        */
+        default:
+            throw new Net_DNS2_Exception(
+                'we only currently support RSAMD5 and RSASHA1 encryption.',
+                Net_DNS2_Lookups::E_OPENSSL_INV_PKEY
+            );
+        }
+
+        //
+        // generate and store the key
+        //
+        $this->instance = openssl_pkey_new($args);
+        if ($this->instance === false) {
+            throw new Net_DNS2_Exception(
+                openssl_error_string(),
+                Net_DNS2_Lookups::E_OPENSSL_ERROR
+            );
+        }
+
+        //
+        // store the filename incase we need it for something
+        //
+        $this->filename = $file;
+
+        return true;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Question.php b/include/pear/Net/DNS2/Question.php
new file mode 100644
index 0000000000000000000000000000000000000000..ddae4607b85b84a65f4be5528864efb421883f4b
--- /dev/null
+++ b/include/pear/Net/DNS2/Question.php
@@ -0,0 +1,244 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Question.php 124 2011-12-02 23:23:15Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * This class handles parsing and constructing the question sectino of DNS
+ * packets.
+ *
+ * This is referred to as the "zone" for update per RFC2136
+ *
+ * DNS question format - RFC1035 section 4.1.2
+ *
+ *      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                                               |
+ *    /                     QNAME                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                     QTYPE                     |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                     QCLASS                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Packet
+ *
+ */
+class Net_DNS2_Question
+{
+    /*
+     * The name of the question
+     *
+     * referred to as "zname" for updates per RFC2136
+     *
+     */
+    public $qname;
+
+    /*
+     * The RR type for the questino
+     *
+     * referred to as "ztype" for updates per RFC2136
+     *
+     */
+    public $qtype;
+    
+    /*
+     * The RR class for the questino
+     *
+     * referred to as "zclass" for updates per RFC2136
+     *
+     */
+    public $qclass;
+
+    /**
+     * Constructor - builds a new Net_DNS2_Question object
+     *
+     * @param mixed &$packet either a Net_DNS2_Packet object, or null to 
+     *                       build an empty object
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct(Net_DNS2_Packet &$packet = null)
+    {
+        if (!is_null($packet)) {
+
+            $this->set($packet);
+        } else {
+
+            $this->qname    = '';
+            $this->qtype    = 'A';
+            $this->qclass   = 'IN';
+        }
+    }
+
+    /**
+     * magic __toString() function to return the Net_DNS2_Question object as a string
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public function __toString()
+    {
+        return ";;\n;; Question:\n;;\t " . $this->qname . '. ' . 
+            $this->qtype . ' ' . $this->qclass . "\n";
+    }
+
+    /**
+     * builds a new Net_DNS2_Header object from a Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet object
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function set(Net_DNS2_Packet &$packet)
+    {
+        //
+        // expand the name
+        //
+        $this->qname = $packet->expand($packet, $packet->offset);
+        if ($packet->rdlength < ($packet->offset + 4)) {
+
+            throw new Net_DNS2_Exception(
+                'invalid question section: to small',
+                Net_DNS2_Lookups::E_QUESTION_INVALID
+            );
+        }
+
+        //
+        // unpack the type and class
+        //
+        $type   = ord($packet->rdata[$packet->offset++]) << 8 | 
+            ord($packet->rdata[$packet->offset++]);
+        $class  = ord($packet->rdata[$packet->offset++]) << 8 | 
+            ord($packet->rdata[$packet->offset++]);
+
+        //
+        // validate it
+        //
+        $type_name  = Net_DNS2_Lookups::$rr_types_by_id[$type];
+        $class_name = Net_DNS2_Lookups::$classes_by_id[$class];        
+
+        if ( (!isset($type_name)) || (!isset($class_name)) ) {
+
+            throw new Net_DNS2_Exception(
+                'invalid question section: invalid type (' . $type . 
+                ') or class (' . $class . ') specified.',
+                Net_DNS2_Lookups::E_QUESTION_INVALID
+            );
+        }
+
+        //
+        // store it
+        //
+        $this->qtype     = $type_name;
+        $this->qclass    = $class_name;
+
+        return true;
+    }
+
+    /**
+     * returns a binary packed Net_DNS2_Question object
+     *
+     * @param Net_DNS2_Packet &$packet the Net_DNS2_Packet object this question is 
+     *                                 part of. This needs to be passed in so that
+     *                                 the compressed qname value can be packed in
+     *                                 with the names of the other parts of the 
+     *                                 packet.
+     *
+     * @return string
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function get(Net_DNS2_Packet &$packet)
+    {
+        //
+        // validate the type and class
+        //
+        $type  = Net_DNS2_Lookups::$rr_types_by_name[$this->qtype];
+        $class = Net_DNS2_Lookups::$classes_by_name[$this->qclass];
+
+        if ( (!isset($type)) || (!isset($class)) ) {
+
+            throw new Net_DNS2_Exception(
+                'invalid question section: invalid type (' . $this->qtype . 
+                ') or class (' . $this->qclass . ') specified.',
+                Net_DNS2_Lookups::E_QUESTION_INVALID
+            );
+        }
+
+        $data = $packet->compress($this->qname, $packet->offset);
+
+        $data .= chr($type << 8) . chr($type) . chr($class << 8) . chr($class);
+        $packet->offset += 4;
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR.php b/include/pear/Net/DNS2/RR.php
new file mode 100644
index 0000000000000000000000000000000000000000..55ee7f70a1faba8401dfee7f7aeee97351e686a3
--- /dev/null
+++ b/include/pear/Net/DNS2/RR.php
@@ -0,0 +1,641 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: RR.php 188 2013-03-31 01:25:46Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+
+/**
+ * This is the base class for DNS Resource Records
+ *
+ * Each resource record type (defined in RR/*.php) extends this class for
+ * base functionality.
+ *
+ * This class handles parsing and constructing the common parts of the DNS
+ * resource records, while the RR specific functionality is handled in each
+ * child class.
+ *
+ * DNS resource record format - RFC1035 section 4.1.3
+ *
+ *      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                                               |
+ *    /                                               /
+ *    /                      NAME                     /
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                      TYPE                     |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                     CLASS                     |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                      TTL                      |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   RDLENGTH                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
+ *    /                     RDATA                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ *
+ */
+abstract class Net_DNS2_RR
+{
+    /*
+     * The name of the resource record
+     */
+    public $name;
+
+    /*
+     * The resource record type
+     */
+    public $type;
+
+    /*
+     * The resouce record class
+     */
+    public $class;
+
+    /*
+     * The time to live for this resource record
+     */
+    public $ttl;
+
+    /*
+     * The length of the rdata field
+     */
+    public $rdlength;
+
+    /*
+     * The resource record specific data as a packed binary string
+     */
+    public $rdata;
+
+    /**
+     * abstract definition - method to return a RR as a string; not to 
+     * be confused with the __toString() magic method.
+     *
+     * @return string
+     * @access protected
+     *
+     */
+    abstract protected function rrToString();
+
+    /**
+     * abstract definition - parses a RR from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    abstract protected function rrFromString(array $rdata);
+
+    /**
+     * abstract definition - sets a Net_DNS2_RR from a Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    abstract protected function rrSet(Net_DNS2_Packet &$packet);
+
+    /**
+     * abstract definition - returns a binary packet DNS RR object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for 
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed string or 
+     *                                 null on failure
+     * @access protected
+     *
+     */
+    abstract protected function rrGet(Net_DNS2_Packet &$packet);
+
+    /**
+     * Constructor - builds a new Net_DNS2_RR object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet or null to create 
+     *                                 an empty object
+     * @param array           $rr      an array with RR parse values or null to 
+     *                                 create an empty object
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct(Net_DNS2_Packet &$packet = null, array $rr = null)
+    {
+        if ( (!is_null($packet)) && (!is_null($rr)) ) {
+
+            if ($this->set($packet, $rr) == false) {
+
+                throw new Net_DNS2_Exception(
+                    'failed to generate resource record',
+                    Net_DNS2_Lookups::E_RR_INVALID
+                );
+            }
+        } else {
+
+            $class = Net_DNS2_Lookups::$rr_types_class_to_id[get_class($this)];
+            if (isset($class)) {
+
+                $this->type = Net_DNS2_Lookups::$rr_types_by_id[$class];
+            }
+
+            $this->class    = 'IN';
+            $this->ttl      = 86400;
+        }
+    }
+
+    /**
+     * magic __toString() method to return the Net_DNS2_RR object object as a string
+     *
+     * @return string
+     * @access public
+     *
+     */
+    public function __toString()
+    {
+        return $this->name . '. ' . $this->ttl . ' ' . $this->class . 
+            ' ' . $this->type . ' ' . $this->rrToString();
+    }
+
+    /**
+     * return a formatted string; if a string has spaces in it, then return 
+     * it with double quotes around it, otherwise, return it as it was passed in.
+     *
+     * @param string $string the string to format
+     *
+     * @return string
+     * @access protected
+     *
+     */
+    protected function formatString($string)
+    {
+        return '"' . str_replace('"', '\"', trim($string, '"')) . '"';
+    }
+    
+    /**
+     * builds an array of strings from an array of chunks of text split by spaces
+     *
+     * @param array $chunks an array of chunks of text split by spaces
+     *
+     * @return array
+     * @access protected
+     *
+     */
+    protected function buildString(array $chunks)
+    {
+        $data = array();
+        $c = 0;
+        $in = false;
+
+        foreach ($chunks as $r) {
+
+            $r = trim($r);
+            if (strlen($r) == 0) {
+                continue;
+            }
+
+            if ( ($r[0] == '"')
+                && ($r[strlen($r) - 1] == '"')
+                && ($r[strlen($r) - 2] != '\\')
+            ) {
+
+                $data[$c] = $r;
+                ++$c;
+                $in = false;
+
+            } else if ($r[0] == '"') {
+
+                $data[$c] = $r;
+                $in = true;
+
+            } else if ( ($r[strlen($r) - 1] == '"')
+                && ($r[strlen($r) - 2] != '\\')
+            ) {
+            
+                $data[$c] .= ' ' . $r;
+                ++$c;  
+                $in = false;
+
+            } else {
+
+                if ($in == true) {
+                    $data[$c] .= ' ' . $r;
+                } else {
+                    $data[$c++] = $r;
+                }
+            }
+        }        
+
+        foreach ($data as $index => $string) {
+            
+            $data[$index] = str_replace('\"', '"', trim($string, '"'));
+        }
+
+        return $data;
+    }
+
+    /**
+     * builds a new Net_DNS2_RR object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet or null to create
+     *                                 an empty object
+     * @param array           $rr      an array with RR parse values or null to 
+     *                                 create an empty object
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function set(Net_DNS2_Packet &$packet, array $rr)
+    {
+        $this->name     = $rr['name'];
+        $this->type     = Net_DNS2_Lookups::$rr_types_by_id[$rr['type']];
+
+        //
+        // for RR OPT (41), the class value includes the requestors UDP payload size,
+        // and not a class value
+        //
+        if ($this->type == 'OPT') {
+            $this->class = $rr['class'];
+        } else {
+            $this->class = Net_DNS2_Lookups::$classes_by_id[$rr['class']];
+        }
+
+        $this->ttl      = $rr['ttl'];
+        $this->rdlength = $rr['rdlength'];
+        $this->rdata    = substr($packet->rdata, $packet->offset, $rr['rdlength']);
+
+        return $this->rrSet($packet);
+    }
+
+    /**
+     * returns a binary packed DNS RR object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet used for 
+     *                                 compressing names
+     *
+     * @return string
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function get(Net_DNS2_Packet &$packet)
+    {
+        $data  = '';
+        $rdata = '';
+
+        //
+        // pack the name
+        //
+        $data = $packet->compress($this->name, $packet->offset);
+
+        //
+        // pack the main values
+        //
+        if ($this->type == 'OPT') {
+
+            //
+            // pre-build the TTL value
+            //
+            $this->preBuild();
+
+            //
+            // the class value is different for OPT types
+            //
+            $data .= pack(
+                'nnN', 
+                Net_DNS2_Lookups::$rr_types_by_name[$this->type],
+                $this->class,
+                $this->ttl
+            );
+        } else {
+
+            $data .= pack(
+                'nnN', 
+                Net_DNS2_Lookups::$rr_types_by_name[$this->type],
+                Net_DNS2_Lookups::$classes_by_name[$this->class],
+                $this->ttl
+            );
+        }
+
+        //
+        // increase the offset, and allow for the rdlength
+        //
+        $packet->offset += 10;
+
+        //
+        // get the RR specific details
+        //
+        if ($this->rdlength != -1) {
+
+            $rdata = $this->rrGet($packet);
+        }
+
+        //
+        // add the RR
+        //
+        $data .= pack('n', strlen($rdata)) . $rdata;
+
+        return $data;
+    }
+
+    /**
+     * parses a binary packet, and returns the appropriate Net_DNS2_RR object, 
+     * based on the RR type of the binary content.
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet used for 
+     *                                 decompressing names
+     *
+     * @return mixed                   returns a new Net_DNS2_RR_* object for
+     *                                 the given RR
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public static function parse(Net_DNS2_Packet &$packet)
+    {
+        $object = array();
+
+        //
+        // expand the name
+        //
+        $object['name'] = $packet->expand($packet, $packet->offset);
+        if (is_null($object['name'])) {
+
+            throw new Net_DNS2_Exception(
+                'failed to parse resource record: failed to expand name.',
+                Net_DNS2_Lookups::E_PARSE_ERROR
+            );
+        }
+        if ($packet->rdlength < ($packet->offset + 10)) {
+
+            throw new Net_DNS2_Exception(
+                'failed to parse resource record: packet too small.',
+                Net_DNS2_Lookups::E_PARSE_ERROR
+            );
+        }
+
+        //
+        // unpack the RR details
+        //
+        $object['type']     = ord($packet->rdata[$packet->offset++]) << 8 | 
+                                ord($packet->rdata[$packet->offset++]);
+        $object['class']    = ord($packet->rdata[$packet->offset++]) << 8 | 
+                                ord($packet->rdata[$packet->offset++]);
+
+        $object['ttl']      = ord($packet->rdata[$packet->offset++]) << 24 | 
+                                ord($packet->rdata[$packet->offset++]) << 16 | 
+                                ord($packet->rdata[$packet->offset++]) << 8 | 
+                                ord($packet->rdata[$packet->offset++]);
+
+        $object['rdlength'] = ord($packet->rdata[$packet->offset++]) << 8 | 
+                                ord($packet->rdata[$packet->offset++]);
+
+        if ($packet->rdlength < ($packet->offset + $object['rdlength'])) {
+            return null;
+        }
+
+        //
+        // lookup the class to use
+        //
+        $o      = null;
+        $class  = Net_DNS2_Lookups::$rr_types_id_to_class[$object['type']];
+
+        if (isset($class)) {
+
+            $o = new $class($packet, $object);
+            if ($o) {
+
+                $packet->offset += $object['rdlength'];
+            }
+        } else {
+
+            throw new Net_DNS2_Exception(
+                'un-implemented resource record type: ' . $object['type'],
+                Net_DNS2_Lookups::E_RR_INVALID
+            );
+        }
+
+        return $o;
+    }
+
+    /**
+     * cleans up some RR data
+     * 
+     * @param string $data the text string to clean
+     *
+     * @return string returns the cleaned string
+     *
+     * @access public
+     *
+     */
+    public function cleanString($data)
+    {
+        return strtolower(rtrim($data, '.'));
+    }
+
+    /**
+     * parses a standard RR format lines, as defined by rfc1035 (kinda)
+     *
+     * In our implementation, the domain *must* be specified- format must be
+     *
+     *        <name> [<ttl>] [<class>] <type> <rdata>
+     * or
+     *        <name> [<class>] [<ttl>] <type> <rdata>
+     *
+     * name, title, class and type are parsed by this function, rdata is passed
+     * to the RR specific classes for parsing.
+     *
+     * @param string $line a standard DNS config line 
+     *
+     * @return mixed       returns a new Net_DNS2_RR_* object for the given RR
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public static function fromString($line)
+    {
+        if (strlen($line) == 0) {
+            throw new Net_DNS2_Exception(
+                'empty config line provided.',
+                Net_DNS2_Lookups::E_PARSE_ERROR
+            );
+        }
+
+        $name   = '';
+        $type   = '';
+        $class  = 'IN';
+        $ttl    = 86400;
+
+        //
+        // split the line by spaces
+        //
+        $values = preg_split('/[\s]+/', $line);
+        if (count($values) < 3) {
+
+            throw new Net_DNS2_Exception(
+                'failed to parse config: minimum of name, type and rdata required.',
+                Net_DNS2_Lookups::E_PARSE_ERROR
+            );
+        }
+
+        //
+        // assume the first value is the name
+        //
+        $name = trim(strtolower(array_shift($values)), '.');
+
+        //
+        // The next value is either a TTL, Class or Type
+        //
+        foreach ($values as $value) {
+
+            switch($value) {
+            case is_numeric($value):
+
+                $ttl = array_shift($values);
+                break;
+
+            //
+            // PHP SUCKS!
+            //
+            case ($value === 0):
+                $ttl = array_shift($values);
+                break;
+
+            case isset(Net_DNS2_Lookups::$classes_by_name[strtoupper($value)]):
+
+                $class = strtoupper(array_shift($values));
+                break;
+
+            case isset(Net_DNS2_Lookups::$rr_types_by_name[strtoupper($value)]):
+
+                $type = strtoupper(array_shift($values));
+                break 2;
+                break;   
+            default:
+
+                throw new Net_DNS2_Exception(
+                    'invalid config line provided: unknown file: ' . $value,
+                    Net_DNS2_Lookups::E_PARSE_ERROR
+                );
+            }
+        }
+
+        //
+        // lookup the class to use
+        //
+        $o = null;
+        $class_name = Net_DNS2_Lookups::$rr_types_id_to_class[
+            Net_DNS2_Lookups::$rr_types_by_name[$type]
+        ];
+
+        if (isset($class_name)) {
+
+            $o = new $class_name;
+            if (!is_null($o)) {
+
+                //
+                // set the parsed values
+                //
+                $o->name    = $name;
+                $o->class   = $class;
+                $o->ttl     = $ttl;
+
+                //
+                // parse the rdata
+                //
+                if ($o->rrFromString($values) === false) {
+
+                    throw new Net_DNS2_Exception(
+                        'failed to parse rdata for config: ' . $line,
+                        Net_DNS2_Lookups::E_PARSE_ERROR
+                    );
+                }
+
+            } else {
+
+                throw new Net_DNS2_Exception(
+                    'failed to create new RR record for type: ' . $type,
+                    Net_DNS2_Lookups::E_RR_INVALID
+                );
+            }
+
+        } else {
+
+            throw new Net_DNS2_Exception(
+                'un-implemented resource record type: '. $type,
+                Net_DNS2_Lookups::E_RR_INVALID
+            );
+        }
+
+        return $o;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/A.php b/include/pear/Net/DNS2/RR/A.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8a0554615bb2b5bdd80d171a347123633ba0646
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/A.php
@@ -0,0 +1,156 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: A.php 113 2011-07-25 02:54:19Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * A Resource Record - RFC1035 section 3.4.1
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    ADDRESS                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_A extends Net_DNS2_RR
+{
+    /*
+     * The IPv4 address in quad-dotted notation
+     */
+    public $address;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->address;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $value = array_shift($rdata);
+
+        if (Net_DNS2::isIPv4($value) == true) {
+            
+            $this->address = $value;
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     * 
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $this->address = inet_ntop($this->rdata);
+            if ($this->address !== false) {
+            
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     * 
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed 
+     *                                 string or null on failure
+     * @access protected
+     * 
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        $packet->offset += 4;
+        return inet_pton($this->address);
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/AAAA.php b/include/pear/Net/DNS2/RR/AAAA.php
new file mode 100644
index 0000000000000000000000000000000000000000..86c15155d6d3308bf29dd818da921ff1ab92a011
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/AAAA.php
@@ -0,0 +1,177 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: AAAA.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * A Resource Record - RFC1035 section 3.4.1
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                                               |       
+ *    |                                               |       
+ *    |                                               |       
+ *    |                    ADDRESS                    |       
+ *    |                                               |       
+ *    |                   (128 bit)                   |       
+ *    |                                               |       
+ *    |                                               |       
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_AAAA extends Net_DNS2_RR
+{
+    /*
+     * the IPv6 address in the preferred hexadecimal values of the eight 
+     * 16-bit pieces 
+     * per RFC1884
+     *
+     */
+    public $address;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->address;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // expand out compressed formats
+        //
+        $value = array_shift($rdata);
+        if (Net_DNS2::isIPv6($value) == true) {
+
+            $this->address = $value;
+            return true;
+        }
+            
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        //
+        // must be 8 x 16bit chunks, or 16 x 8bit
+        //
+        if ($this->rdlength == 16) {
+
+            //
+            // PHP's inet_ntop returns IPv6 addresses in their compressed form,
+            // but we want to keep with the preferred standard, so we'll parse
+            // it manually.
+            //
+            $x = unpack('n8', $this->rdata);
+            if (count($x) == 8) {
+
+                $this->address = vsprintf('%x:%x:%x:%x:%x:%x:%x:%x', $x);
+                return true;
+            }
+        }
+        
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        $packet->offset += 16;
+        return inet_pton($this->address);
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/AFSDB.php b/include/pear/Net/DNS2/RR/AFSDB.php
new file mode 100644
index 0000000000000000000000000000000000000000..0117a9a09d9372fe3d59ed4268ff8fe9202351f4
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/AFSDB.php
@@ -0,0 +1,174 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: AFSDB.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * AFSDB Resource Record - RFC1183 section 1
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    SUBTYPE                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    HOSTNAME                   /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_AFSDB extends Net_DNS2_RR
+{
+    /*
+     * The AFSDB sub type
+     */
+    public $subtype;
+
+    /*
+     * The AFSDB hostname
+     */
+    public $hostname;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->subtype . ' ' . $this->cleanString($this->hostname) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->subtype  = array_shift($rdata);
+        $this->hostname = $this->cleanString(array_shift($rdata));
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+            
+            //
+            // unpack the subtype
+            //
+            $x = unpack('nsubtype', $this->rdata);
+
+            $this->subtype  = $x['subtype'];
+            $offset         = $packet->offset + 2;
+
+            $this->hostname = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->hostname) > 0) {
+            
+            $data = pack('n', $this->subtype);
+            $packet->offset += 2;
+            
+            $data .= $packet->compress($this->hostname, $packet->offset);
+
+            return $data;
+        }
+        
+        return null; 
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/ANY.php b/include/pear/Net/DNS2/RR/ANY.php
new file mode 100644
index 0000000000000000000000000000000000000000..915324058ec575cbb18868216181b7345f2fdd5d
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/ANY.php
@@ -0,0 +1,129 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: ANY.php 47 2010-10-24 23:53:08Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * This is only used for generating an empty ANY RR.
+ *
+ * @category Networking
+ * @package  Net_DNS2   
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2     
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_ANY extends Net_DNS2_RR
+{
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return '';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        return true;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        return '';
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/APL.php b/include/pear/Net/DNS2/RR/APL.php
new file mode 100644
index 0000000000000000000000000000000000000000..da323f86dd72d4c74739fbb01cbdbb048e29f5bb
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/APL.php
@@ -0,0 +1,343 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: APL.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.0.0
+ *
+ */
+
+/**
+ * APL Resource Record - RFC3123
+ *
+ *     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *     |                          ADDRESSFAMILY                        |
+ *     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *     |             PREFIX            | N |         AFDLENGTH         |
+ *     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *     /                            AFDPART                            /
+ *     |                                                               |
+ *     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_APL extends Net_DNS2_RR
+{
+    /*
+     * a list of all the address prefix list items
+     */
+    public $apl_items = array();
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = '';
+
+        foreach ($this->apl_items as $item) {
+
+            if ($item['n'] == 1) {
+
+                $out .= '!';
+            }
+
+            $out .= $item['address_family'] . ':' . 
+                $item['afd_part'] . '/' . $item['prefix'] . ' ';
+        }
+
+        return trim($out);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        foreach ($rdata as $item) {
+
+            if (preg_match('/^(!?)([1|2])\:([^\/]*)\/([0-9]{1,3})$/', $item, $m)) {
+
+                $i = array(
+
+                    'address_family'    => $m[2],
+                    'prefix'            => $m[4],
+                    'n'                 => ($m[1] == '!') ? 1 : 0,
+                    'afd_part'          => strtolower($m[3])
+                );
+
+                $address = $this->_trimZeros(
+                    $i['address_family'], $i['afd_part']
+                );
+                    
+                $i['afd_length'] = count(explode('.', $address));
+
+                $this->apl_items[] = $i;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset = 0;
+
+            while ($offset < $this->rdlength) {
+
+                //
+                // unpack the family, prefix, negate and length values
+                //   
+                $x = unpack(
+                    'naddress_family/Cprefix/Cextra', substr($this->rdata, $offset)
+                );
+
+                $item = array(
+            
+                    'address_family'    => $x['address_family'],
+                    'prefix'            => $x['prefix'],
+                    'n'                 => ($x['extra'] >> 7) & 0x1,
+                    'afd_length'        => $x['extra'] & 0xf
+                );
+
+                switch($item['address_family']) {
+
+                case 1:
+                    $r = unpack(
+                        'C*', substr($this->rdata, $offset + 4, $item['afd_length'])
+                    );
+                    if (count($r) < 4) {
+
+                        for ($c=count($r)+1; $c<4+1; $c++) {
+
+                            $r[$c] = 0;
+                        }
+                    }
+
+                    $item['afd_part'] = implode('.', $r);
+
+                    break;
+                case 2:
+                    $r = unpack(
+                        'C*', substr($this->rdata, $offset + 4, $item['afd_length'])
+                    );
+                    if (count($r) < 8) {
+
+                        for ($c=count($r)+1; $c<8+1; $c++) {
+
+                            $r[$c] = 0;
+                        }
+                    }
+
+                    $item['afd_part'] = sprintf(
+                        '%x:%x:%x:%x:%x:%x:%x:%x', 
+                        $r[1], $r[2], $r[3], $r[4], $r[5], $r[6], $r[7], $r[8]
+                    );
+
+                    break;
+                default:
+                    return false;
+                }
+
+                $this->apl_items[] = $item;
+
+                $offset += 4 + $item['afd_length'];
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (count($this->apl_items) > 0) {
+
+            $data = '';
+
+            foreach ($this->apl_items as $item) {
+
+                //
+                // pack the address_family and prefix values
+                //
+                $data .= pack(
+                    'nCC', 
+                    $item['address_family'], 
+                    $item['prefix'],
+                    ($item['n'] << 7) | $item['afd_length']
+                );
+
+                switch($item['address_family']) {
+                case 1:
+                    $address = explode(
+                        '.', 
+                        $this->_trimZeros($item['address_family'], $item['afd_part'])
+                    );
+
+                    foreach ($address as $b) {
+                        $data .= chr($b);
+                    }
+                    break;
+                case 2:
+                    $address = explode(
+                        ':', 
+                        $this->_trimZeros($item['address_family'], $item['afd_part'])
+                    );
+
+                    foreach ($address as $b) {
+                        $data .= pack('H', $b);
+                    }
+                    break;
+                default:
+                    return null;
+                }
+            }
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+
+    /**
+     * returns an IP address with the right-hand zero's trimmed
+     *
+     * @param integer $family  the IP address family from the rdata
+     * @param string  $address the IP address
+     *
+     * @return string the trimmed IP addresss.
+     *
+     * @access private
+     *
+     */
+    private function _trimZeros($family, $address)
+    {
+        $a = array();
+
+        switch($family) {
+        case 1:
+            $a = array_reverse(explode('.', $address));
+            break;
+        case 2:
+            $a = array_reverse(explode(':', $address));
+            break;
+        default:
+            return '';
+        }
+
+        foreach ($a as $value) {
+
+            if ($value === '0') {
+
+                array_shift($a);
+            }
+        }
+
+        $out = '';
+
+        switch($family) {
+        case 1:
+            $out = implode('.', array_reverse($a));
+            break;
+        case 2:
+            $out = implode(':', array_reverse($a));
+            break;
+        default:
+            return '';
+        }
+
+        return $out;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/ATMA.php b/include/pear/Net/DNS2/RR/ATMA.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9e51b0e7ed9b08278bd8d4f16b0664e7c3c68bc
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/ATMA.php
@@ -0,0 +1,210 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: ATMA.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.1.0
+ *
+ */
+
+/**
+ * ATMA Resource Record
+ *
+ *   0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * |          FORMAT       |                       |
+ * |                       +--+--+--+--+--+--+--+--+
+ * /                    ADDRESS                    /
+ * |                                               |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_ATMA extends Net_DNS2_RR
+{
+    /*
+     * One octet that indicates the format of ADDRESS. The two possible values 
+     * for FORMAT are value 0 indicating ATM End System Address (AESA) format
+     * and value 1 indicating E.164 format
+     */
+    public $format;
+
+    /*
+     * The IPv4 address in quad-dotted notation
+     */
+    public $address;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->address;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $value = array_shift($rdata);
+
+        if (ctype_xdigit($value) == true) {
+            
+            $this->format   = 0;
+            $this->address  = $value;
+
+        } else if (is_numeric($value) == true) {
+
+            $this->format   = 1;
+            $this->address  = $value;
+
+        } else {
+
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     * 
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the format
+            //
+            $x = unpack('Cformat/N*address', $this->rdata);
+
+            $this->format = $x['format'];
+
+            if ($this->format == 0) {
+
+                $a = unpack('@1/H*address', $this->rdata);
+
+                $this->address = $a['address'];
+
+            } else if ($this->format == 1) {
+
+                $this->address = substr($this->rdata, 1, $this->rdlength - 1);
+
+            } else {
+
+                return false;
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     * 
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed 
+     *                                 string or null on failure
+     * @access protected
+     * 
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        $data = chr($this->format);
+
+        if ($this->format == 0) {
+
+            $data .= pack('H*', $this->address);
+
+        } else if ($this->format == 1) {
+
+            $data .= $this->address;
+
+        } else {
+
+            return null;
+        }
+
+        $packet->offset += strlen($data);
+        
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/CAA.php b/include/pear/Net/DNS2/RR/CAA.php
new file mode 100644
index 0000000000000000000000000000000000000000..81d3601b4eccaf79d26fab407c042adb4cf646a0
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/CAA.php
@@ -0,0 +1,179 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates.
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors
+ *     may be used to endorse or promote products derived from this
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2011 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: CAA.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.2.0
+ *
+ */
+
+/**
+ * CAA Resource Record - http://tools.ietf.org/html/draft-ietf-pkix-caa-03
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |          FLAGS        |      TAG LENGTH       |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                      TAG                      /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                      DATA                     /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_CAA extends Net_DNS2_RR
+{
+    /*
+     * The critcal flag
+     */
+    public $flags;
+
+    /*
+     * The property identifier
+     */
+    public $tag;
+
+    /*
+      * The property value
+     */
+    public $value;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->flags . ' ' . $this->tag . ' "' . 
+            trim($this->cleanString($this->value), '"') . '"';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->flags    = array_shift($rdata);
+        $this->tag      = array_shift($rdata);
+
+        $this->value    = trim($this->cleanString(implode($rdata, ' ')), '"');
+        
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+            
+            //
+            // unpack the flags and tag length
+            //
+            $x = unpack('Cflags/Ctag_length', $this->rdata);
+
+            $this->flags    = $x['flags'];
+            $offset         = 2;
+
+            $this->tag      = substr($this->rdata, $offset, $x['tag_length']);
+            $offset         += $x['tag_length'];
+
+            $this->value    = substr($this->rdata, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->value) > 0) {
+
+            $data  = chr($this->flags);
+            $data .= chr(strlen($this->tag)) . $this->tag . $this->value;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+?>
diff --git a/include/pear/Net/DNS2/RR/CDS.php b/include/pear/Net/DNS2/RR/CDS.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9a08adc25252bcd56735e25e48c227c30689401
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/CDS.php
@@ -0,0 +1,77 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2011 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: CDS.php 130 2011-12-03 05:02:37Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.2.0
+ *
+ */
+
+/**
+ * The CDS RR is implemented exactly like the DS record, so
+ * for now we just extend the DS RR and use it.
+ *
+ * http://tools.ietf.org/html/draft-barwood-dnsop-ds-publish-02
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_CDS extends Net_DNS2_RR_DS
+{
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/CERT.php b/include/pear/Net/DNS2/RR/CERT.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f3773e382b6bdb7d5645cd51628a53454e3668f
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/CERT.php
@@ -0,0 +1,292 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: CERT.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * CERT Resource Record - RFC4398 section 2
+ *
+ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |            format             |             key tag           |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |   algorithm   |                                               /
+ *  +---------------+            certificate or CRL                 /
+ *  /                                                               /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_CERT extends Net_DNS2_RR
+{
+    /*
+     * format's allowed for certificates
+     */
+    const CERT_FORMAT_RES       = 0;
+    const CERT_FORMAT_PKIX      = 1;
+    const CERT_FORMAT_SPKI      = 2;
+    const CERT_FORMAT_PGP       = 3;
+    const CERT_FORMAT_IPKIX     = 4;
+    const CERT_FORMAT_ISPKI     = 5;
+    const CERT_FORMAT_IPGP      = 6;
+    const CERT_FORMAT_ACPKIX    = 7;
+    const CERT_FORMAT_IACPKIX   = 8;
+    const CERT_FORMAT_URI       = 253;
+    const CERT_FORMAT_OID       = 254;
+
+    public $cert_format_name_to_id = array();
+    public $cert_format_id_to_name = array(
+
+        self::CERT_FORMAT_RES       => 'Reserved',
+        self::CERT_FORMAT_PKIX      => 'PKIX',
+        self::CERT_FORMAT_SPKI      => 'SPKI',
+        self::CERT_FORMAT_PGP       => 'PGP',
+        self::CERT_FORMAT_IPKIX     => 'IPKIX',
+        self::CERT_FORMAT_ISPKI     => 'ISPKI',
+        self::CERT_FORMAT_IPGP      => 'IPGP',
+        self::CERT_FORMAT_ACPKIX    => 'ACPKIX',
+        self::CERT_FORMAT_IACPKIX   => 'IACPKIX',
+        self::CERT_FORMAT_URI       => 'URI',
+        self::CERT_FORMAT_OID       => 'OID'
+    );
+
+    /*
+      * certificate format
+     */
+    public $format;
+
+    /*
+     * key tag
+     */
+    public $keytag;
+
+    /*
+     * The algorithm used for the CERt
+     */
+    public $algorithm;
+
+    /*
+     * certificate
+     */
+    public $certificate;
+
+    /**
+     * we have our own constructor so that we can load our certificate
+     * information for parsing.
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     * @param array           $rr      a array with parsed RR values
+     *
+     * @return
+     *
+     */
+    public function __construct(Net_DNS2_Packet &$packet = null, array $rr = null)
+    {
+        parent::__construct($packet, $rr);
+    
+        //
+        // load the lookup values
+        //
+        $this->cert_format_name_to_id = array_flip($this->cert_format_id_to_name);
+    }
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->format . ' ' . $this->keytag . ' ' . $this->algorithm . 
+            ' ' . base64_encode($this->certificate);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // load and check the format; can be an int, or a mnemonic symbol
+        //
+        $this->format = array_shift($rdata);
+        if (!is_numeric($this->format)) {
+
+            $mnemonic = strtoupper(trim($this->format));
+            if (!isset($this->cert_format_name_to_id[$mnemonic])) {
+
+                return false;
+            }
+
+            $this->format = $this->cert_format_name_to_id[$mnemonic];
+        } else {
+
+            if (!isset($this->cert_format_id_to_name[$this->format])) {
+
+                return false;
+            }
+        }
+    
+        $this->keytag = array_shift($rdata);
+
+        //
+        // parse and check the algorithm; can be an int, or a mnemonic symbol
+        //
+        $this->algorithm = array_shift($rdata);
+        if (!is_numeric($this->algorithm)) {
+
+            $mnemonic = strtoupper(trim($this->algorithm));
+            if (!isset(Net_DNS2_Lookups::$algorithm_name_to_id[$mnemonic])) {
+
+                return false;
+            }
+
+            $this->algorithm = Net_DNS2_Lookups::$algorithm_name_to_id[
+                $mnemonic
+            ];
+        } else {
+
+            if (!isset(Net_DNS2_Lookups::$algorithm_id_to_name[$this->algorithm])) {
+                return false;
+            }
+        }
+
+        //
+        // parse and base64 decode the certificate
+        //
+        // certificates MUST be provided base64 encoded, if not, everything will
+        // be broken after this point, as we assume it's base64 encoded.
+        //
+        $this->certificate = base64_decode(implode(' ', $rdata));
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the format, keytag and algorithm
+            //
+            $x = unpack('nformat/nkeytag/Calgorithm', $this->rdata);
+
+            $this->format       = $x['format'];
+            $this->keytag       = $x['keytag'];
+            $this->algorithm    = $x['algorithm'];
+
+            //
+            // copy the certificate
+            //
+            $this->certificate  = substr($this->rdata, 5, $this->rdlength - 5);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->certificate) > 0) {
+
+            $data = pack('nnC', $this->format, $this->keytag, $this->algorithm) . 
+                $this->certificate;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/CNAME.php b/include/pear/Net/DNS2/RR/CNAME.php
new file mode 100644
index 0000000000000000000000000000000000000000..7241f584145dc63680e2856f2d298278ead0e28a
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/CNAME.php
@@ -0,0 +1,153 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: CNAME.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * CNAME Resource Record - RFC1035 section 3.3.1
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                     CNAME                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_CNAME extends Net_DNS2_RR
+{
+    /*
+     * The canonical name 
+     */
+    public $cname;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->cname) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->cname = $this->cleanString(array_shift($rdata));
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset = $packet->offset;
+            $this->cname = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->cname) > 0) {
+
+            return $packet->compress($this->cname, $packet->offset);
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/DHCID.php b/include/pear/Net/DNS2/RR/DHCID.php
new file mode 100644
index 0000000000000000000000000000000000000000..521880b8cf05b24c1bcd8cb9c3744b32b230993d
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/DHCID.php
@@ -0,0 +1,207 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: DHCID.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * DHCID Resource Record - RFC4701 section 3.1
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                  ID Type Code                 |       
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |       Digest Type     |                       /       
+ *    +--+--+--+--+--+--+--+--+                       /
+ *    /                                               /       
+ *    /                    Digest                     /       
+ *    /                                               /       
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_DHCID extends Net_DNS2_RR
+{
+    /*
+     * Identifier type
+     */
+    public $id_type;
+
+    /*
+     * Digest Type
+     */
+    public $digest_type;
+
+    /*
+     * The digest
+     */
+    public $digest;
+
+    
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = pack('nC', $this->id_type, $this->digest_type);
+        $out .= base64_decode($this->digest);
+
+        return base64_encode($out);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $data = base64_decode(array_shift($rdata));
+        if (strlen($data) > 0) {
+
+            //
+            // unpack the id type and digest type
+            //
+            $x = unpack('nid_type/Cdigest_type', $data);
+
+            $this->id_type      = $x['id_type'];
+            $this->digest_type  = $x['digest_type'];
+
+            //
+            // copy out the digest
+            //
+            $this->digest = base64_encode(substr($data, 3, strlen($data) - 3));
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the id type and digest type
+            //
+            $x = unpack('nid_type/Cdigest_type', $this->rdata);
+
+            $this->id_type      = $x['id_type'];
+            $this->digest_type  = $x['digest_type'];
+
+            //
+            // copy out the digest
+            //
+            $this->digest = base64_encode(
+                substr($this->rdata, 3, $this->rdlength - 3)
+            );
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->digest) > 0) {
+
+            $data = pack('nC', $this->id_type, $this->digest_type) . 
+                base64_decode($this->digest);
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+    
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/DLV.php b/include/pear/Net/DNS2/RR/DLV.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb235c2024d2ffed3198793620936118b88c6bd1
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/DLV.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: DLV.php 47 2010-10-24 23:53:08Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * The DLV RR is implemented exactly like the DS RR; so we just extend that
+ * class, and use all of it's methods
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_DLV extends Net_DNS2_RR_DS
+{
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/DNAME.php b/include/pear/Net/DNS2/RR/DNAME.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5c631d82565221a2630cd9754851f96b337d698
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/DNAME.php
@@ -0,0 +1,153 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: DNAME.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * DNAME Resource Record - RFC2672 section 3
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                     DNAME                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_DNAME extends Net_DNS2_RR
+{
+    /*
+     * The target name 
+     */
+    public $dname;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->dname) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->dname = $this->cleanString(array_shift($rdata));
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset = $packet->offset;
+            $this->dname = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->dname) > 0) {
+
+            return $packet->compress($this->dname, $packet->offset);
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/DNSKEY.php b/include/pear/Net/DNS2/RR/DNSKEY.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1c08a1e264b5b5c534977c822b1f7cd678e239b
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/DNSKEY.php
@@ -0,0 +1,198 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: DNSKEY.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * DNSKEY Resource Record - RFC4034 sction 2.1
+ *
+ *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |              Flags            |    Protocol   |   Algorithm   |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   /                                                               /
+ *   /                            Public Key                         /
+ *   /                                                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_DNSKEY extends Net_DNS2_RR
+{
+    /*
+     * flags
+     */
+    public $flags;
+
+    /*
+     * protocol
+     */
+    public $protocol;
+
+    /*
+     * algorithm used
+     */
+    public $algorithm;
+
+    /*
+     * the public key
+     */
+    public $key;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->flags . ' ' . $this->protocol . ' ' . 
+            $this->algorithm . ' ' . $this->key;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->flags        = array_shift($rdata);
+        $this->protocol     = array_shift($rdata);
+        $this->algorithm    = array_shift($rdata);
+        $this->key          = implode(' ', $rdata);
+    
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the flags, protocol and algorithm
+            //
+            $x = unpack('nflags/Cprotocol/Calgorithm', $this->rdata);
+
+            //
+            // TODO: right now we're just displaying what's in DNS; we really 
+            // should be parsing bit 7 and bit 15 of the flags field, and store
+            // those separately.
+            //
+            // right now the DNSSEC implementation is really just for display,
+            // we don't validate or handle any of the keys
+            //
+            $this->flags        = $x['flags'];
+            $this->protocol     = $x['protocol'];
+            $this->algorithm    = $x['algorithm'];
+
+            $this->key          = base64_encode(substr($this->rdata, 4));
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->key) > 0) {
+
+            $data = pack('nCC', $this->flags, $this->protocol, $this->algorithm);
+            $data .= base64_decode($this->key);
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+        
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/DS.php b/include/pear/Net/DNS2/RR/DS.php
new file mode 100644
index 0000000000000000000000000000000000000000..407828ed6e973c8c9320a7312d546fecb82930c5
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/DS.php
@@ -0,0 +1,209 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: DS.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * DS Resource Record - RFC4034 sction 5.1
+ *
+ *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |           Key Tag             |  Algorithm    |  Digest Type  |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   /                                                               /
+ *   /                            Digest                             /
+ *   /                                                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_DS extends Net_DNS2_RR
+{
+    /*
+     * key tag
+     */
+    public $keytag;
+
+    /*
+     * algorithm number
+     */
+    public $algorithm;
+
+    /*
+     * algorithm used to construct the digest
+     */
+    public $digesttype;
+
+    /*
+     * the digest data
+     */
+    public $digest;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->keytag . ' ' . $this->algorithm . ' ' . 
+            $this->digesttype . ' ' . $this->digest;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->keytag       = array_shift($rdata);
+        $this->algorithm    = array_shift($rdata);
+        $this->digesttype   = array_shift($rdata);
+        $this->digest       = implode('', $rdata);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the keytag, algorithm and digesttype
+            //
+            $x = unpack('nkeytag/Calgorithm/Cdigesttype', $this->rdata);
+
+            $this->keytag       = $x['keytag'];
+            $this->algorithm    = $x['algorithm'];
+            $this->digesttype   = $x['digesttype'];
+
+            //
+            // figure out the digest size
+            //
+            $digest_size = 0;
+            if ($this->digesttype == 1) {
+
+                $digest_size = 20; // SHA1
+
+            } else if ($this->digesttype == 2) {
+
+                $digest_size = 32; // SHA256
+            }
+
+            //
+            // copy the digest
+            //
+            $x = unpack('H*', substr($this->rdata, 4, $digest_size));
+            $this->digest = $x[1];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->digest) > 0) {
+
+            $data = pack(
+                'nCCH*', 
+                $this->keytag, $this->algorithm, $this->digesttype, $this->digest
+            );
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+        
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/EID.php b/include/pear/Net/DNS2/RR/EID.php
new file mode 100644
index 0000000000000000000000000000000000000000..17cf8fc27cd7dfe9c0f009fa558d499b3b0d922c
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/EID.php
@@ -0,0 +1,130 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: EID.php 125 2011-12-03 00:19:49Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * EID Resource Record - undefined; the rdata is simply used as-is in it's
+ *                          binary format, so not process has to be done.
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_EID extends Net_DNS2_RR
+{
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return '';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        return true;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        return $this->rdata;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/HINFO.php b/include/pear/Net/DNS2/RR/HINFO.php
new file mode 100644
index 0000000000000000000000000000000000000000..355ec90839cd1ac45052ea5c7637e97b896660d5
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/HINFO.php
@@ -0,0 +1,175 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: HINFO.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * HINFO Resource Record - RFC1035 section 3.3.2
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                      CPU                      /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                       OS                      /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_HINFO extends Net_DNS2_RR
+{
+    /*
+     * computer informatino
+     */
+    public $cpu;
+
+    /*
+     * operataing system
+     */
+    public $os;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->formatString($this->cpu) . ' ' . 
+            $this->formatString($this->os);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $data = $this->buildString($rdata);
+        if (count($data) == 2) {
+
+            $this->cpu  = $data[0];
+            $this->os   = $data[1];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset = $packet->offset;
+    
+            $this->cpu  = trim(Net_DNS2_Packet::label($packet, $offset), '"');
+            $this->os   = trim(Net_DNS2_Packet::label($packet, $offset), '"');
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->cpu) > 0) {
+
+            $data  = chr(strlen($this->cpu)) . $this->cpu;
+            $data .= chr(strlen($this->os)) . $this->os;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/HIP.php b/include/pear/Net/DNS2/RR/HIP.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c0b80be45b078d097011b77cd708b465c9d05a8
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/HIP.php
@@ -0,0 +1,287 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: HIP.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.0.0
+ *
+ */
+
+/**
+ * HIP Resource Record - RFC5205 section 5
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  HIT length   | PK algorithm  |          PK length            |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                                                               |
+ *  ~                           HIT                                 ~
+ *  |                                                               |
+ *  +                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                     |                                         |
+ *  +-+-+-+-+-+-+-+-+-+-+-+                                         +
+ *  |                           Public Key                          |
+ *  ~                                                               ~
+ *  |                                                               |
+ *  +                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                               |                               |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+ *  |                                                               |
+ *  ~                       Rendezvous Servers                      ~
+ *  |                                                               |
+ *  +             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |             |
+ *  +-+-+-+-+-+-+-+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_HIP extends Net_DNS2_RR
+{
+    /*
+     * The length of the HIT field
+     */
+    public $hit_length;
+
+    /*
+     * the public key cryptographic algorithm
+     */
+    public $pk_algorithm;
+
+    /*
+     * the length of the public key field
+     */
+    public $pk_length;
+    
+    /*
+     * The HIT is stored as a binary value in network byte order.
+     */
+    public $hit;
+
+    /*
+     * The public key
+     */
+    public $public_key;
+
+    /*
+     * a list of rendezvous servers
+     */
+    public $rendezvous_servers = array();
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = $this->pk_algorithm . ' ' . 
+            $this->hit . ' ' . $this->public_key . ' ';
+
+        foreach ($this->rendezvous_servers as $index => $server) {
+        
+            $out .= $server . '. ';
+        }
+
+        return trim($out);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->pk_algorithm     = array_shift($rdata);
+        $this->hit              = strtoupper(array_shift($rdata));
+        $this->public_key       = array_shift($rdata);
+
+        //
+        // anything left on the array, must be one or more rendezevous servers. add
+        // them and strip off the trailing dot
+        //
+        if (count($rdata) > 0) {
+
+            $this->rendezvous_servers = preg_replace('/\.$/', '', $rdata);
+        }
+
+        //
+        // store the lengths; 
+        //
+        $this->hit_length       = strlen(pack('H*', $this->hit));
+        $this->pk_length        = strlen(base64_decode($this->public_key));        
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the algorithm and length values
+            //
+            $x = unpack('Chit_length/Cpk_algorithm/npk_length', $this->rdata);
+
+            $this->hit_length   = $x['hit_length'];
+            $this->pk_algorithm = $x['pk_algorithm'];
+            $this->pk_length    = $x['pk_length'];
+
+            $offset = 4;
+
+            //
+            // copy out the HIT value
+            //
+            $hit = unpack('H*', substr($this->rdata, $offset, $this->hit_length));
+            
+            $this->hit = strtoupper($hit[1]);
+            $offset += $this->hit_length;
+
+            //
+            // copy out the public key
+            //
+            $this->public_key = base64_encode(
+                substr($this->rdata, $offset, $this->pk_length)
+            );
+            $offset += $this->pk_length;
+
+            //
+            // copy out any possible rendezvous servers
+            //
+            $offset = $packet->offset + $offset;
+
+            while ( ($offset - $packet->offset) < $this->rdlength) {
+
+                $this->rendezvous_servers[] = Net_DNS2_Packet::expand(
+                    $packet, $offset
+                );
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if ( (strlen($this->hit) > 0) && (strlen($this->public_key) > 0) ) {
+
+            //
+            // pack the length, algorithm and HIT values
+            //
+            $data = pack(
+                'CCnH*', 
+                $this->hit_length, 
+                $this->pk_algorithm, 
+                $this->pk_length,
+                $this->hit                
+            );
+            
+            //
+            // add the public key
+            //
+            $data .= base64_decode($this->public_key);
+
+            //
+            // add the offset
+            //
+            $packet->offset += strlen($data);
+
+            //
+            // add each rendezvous server
+            //
+            foreach ($this->rendezvous_servers as $index => $server) {
+
+                $data .= $packet->compress($server, $packet->offset);
+            }
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/IPSECKEY.php b/include/pear/Net/DNS2/RR/IPSECKEY.php
new file mode 100644
index 0000000000000000000000000000000000000000..76a4c7fb247c4d10a6b24b4c46132b5db7f70a23
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/IPSECKEY.php
@@ -0,0 +1,386 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: IPSECKEY.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * IPSECKEY Resource Record - RFC4025 section 2.1
+ *
+ *       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |  precedence   | gateway type  |  algorithm  |     gateway     |
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-------------+                 +
+ *     ~                            gateway                            ~
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |                                                               /
+ *     /                          public key                           /
+ *     /                                                               /
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_IPSECKEY extends Net_DNS2_RR
+{
+    const GATEWAY_TYPE_NONE     = 0;
+    const GATEWAY_TYPE_IPV4     = 1;
+    const GATEWAY_TYPE_IPV6     = 2;
+    const GATEWAY_TYPE_DOMAIN   = 3;
+
+    const ALGORITHM_NONE        = 0;
+    const ALGORITHM_DSA         = 1;
+    const ALGORITHM_RSA         = 2;
+
+    /*
+     * Precedence (used the same was as a preference field)
+     */
+    public $precedence;
+
+    /*
+     * Gateway type - specifies the format of the gataway information
+     * This can be either:
+     *
+     *  0    No Gateway
+     *  1    IPv4 address
+     *  2    IPV6 address
+     *  3    wire-encoded domain name (not compressed)
+     *
+     */
+    public $gateway_type;
+
+    /*
+     * The algorithm used
+     *
+     * This can be:
+     *
+     *  0    No key is present
+     *  1    DSA key is present
+     *  2    RSA key is present
+     *
+     */
+    public $algorithm;
+
+    /*
+     * The gatway information 
+     */
+    public $gateway;
+
+    /*
+     * the public key
+     */
+    public $key;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = $this->precedence . ' ' . $this->gateway_type . ' ' . 
+            $this->algorithm . ' ';
+        
+        switch($this->gateway_type) {
+        case self::GATEWAY_TYPE_NONE:
+            $out .= '. ';
+            break;
+
+        case self::GATEWAY_TYPE_IPV4:
+        case self::GATEWAY_TYPE_IPV6:
+            $out .= $this->gateway . ' ';
+            break;
+
+        case self::GATEWAY_TYPE_DOMAIN:
+            $out .= $this->gateway . '. ';
+            break;
+        }
+
+        $out .= $this->key;
+        return $out;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // load the data
+        //
+        $precedence     = array_shift($rdata);
+        $gateway_type   = array_shift($rdata);
+        $algorithm      = array_shift($rdata);
+        $gateway        = strtolower(trim(array_shift($rdata)));
+        $key            = array_shift($rdata);
+        
+        //
+        // validate it
+        //
+        switch($gateway_type) {
+        case self::GATEWAY_TYPE_NONE:
+            $gateway = '';
+            break;
+
+        case self::GATEWAY_TYPE_IPV4:
+            if (Net_DNS2::isIPv4($gateway) == false) {
+                return false;
+            }
+            break;
+
+        case self::GATEWAY_TYPE_IPV6:
+            if (Net_DNS2::isIPv6($gateway) == false) {
+                return false;
+            }
+            break;
+
+        case self::GATEWAY_TYPE_DOMAIN:
+            ; // do nothing
+            break;
+
+        default:
+            return false;
+        }
+        
+        //
+        // check the algorithm and key
+        //
+        switch($algorithm) {
+        case self::ALGORITHM_NONE:
+            $key = '';
+            break;
+
+        case self::ALGORITHM_DSA:
+        case self::ALGORITHM_RSA:
+            ; // do nothing        
+            break;
+
+        default:
+            return false;
+        }
+
+        //
+        // store the values
+        //
+        $this->precedence   = $precedence;
+        $this->gateway_type = $gateway_type;
+        $this->algorithm    = $algorithm;
+        $this->gateway      = $gateway;
+        $this->key          = $key;
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // parse off the precedence, gateway type and algorithm
+            //
+            $x = unpack('Cprecedence/Cgateway_type/Calgorithm', $this->rdata);
+
+            $this->precedence   = $x['precedence'];
+            $this->gateway_type = $x['gateway_type'];
+            $this->algorithm    = $x['algorithm'];
+
+            $offset = 3;
+
+            //
+            // extract the gatway based on the type
+            //
+            switch($this->gateway_type) {
+            case self::GATEWAY_TYPE_NONE:
+                $this->gateway = '';
+                break;
+
+            case self::GATEWAY_TYPE_IPV4:
+                $this->gateway = inet_ntop(substr($this->rdata, $offset, 4));
+                $offset += 4;
+                break;
+
+            case self::GATEWAY_TYPE_IPV6:
+                $ip = unpack('n8', substr($this->rdata, $offset, 16));
+                if (count($ip) == 8) {
+
+                    $this->gateway = vsprintf('%x:%x:%x:%x:%x:%x:%x:%x', $ip);
+                    $offset += 16;
+                } else {
+
+                    return false;
+                }
+                break;
+
+            case self::GATEWAY_TYPE_DOMAIN:
+
+                $doffset = $offset + $packet->offset;
+                $this->gateway = Net_DNS2_Packet::expand($packet, $doffset);
+                $offset = ($doffset - $packet->offset);
+                break;
+
+            default:
+                return false;
+            }
+
+            //
+            // extract the key
+            //
+            switch($this->algorithm) {
+            case self::ALGORITHM_NONE:
+                $this->key = '';
+                break;
+                
+            case self::ALGORITHM_DSA:
+            case self::ALGORITHM_RSA:
+                $this->key = base64_encode(substr($this->rdata, $offset));
+                break;
+             
+            default:
+                return false;
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        //
+        // pack the precedence, gateway type and algorithm
+        //
+        $data = pack(
+            'CCC', $this->precedence, $this->gateway_type, $this->algorithm
+        );
+
+        //
+        // add the gateway based on the type
+        //
+        switch($this->gateway_type) {
+        case self::GATEWAY_TYPE_NONE:
+            ; // add nothing
+            break;
+        
+        case self::GATEWAY_TYPE_IPV4:
+        case self::GATEWAY_TYPE_IPV6:
+            $data .= inet_pton($this->gateway);
+            break;
+            
+        case self::GATEWAY_TYPE_DOMAIN:
+            $data .= chr(strlen($this->gateway))  . $this->gateway;
+            break;
+            
+        default:
+            return null;
+        }
+
+        //
+        // add the key if there's one specified
+        //
+        switch($this->algorithm) {
+        case self::ALGORITHM_NONE:
+            ; // add nothing
+            break;
+            
+        case self::ALGORITHM_DSA:
+        case self::ALGORITHM_RSA:
+            $data .= base64_decode($this->key);
+            break;
+            
+        default:
+            return null;
+        }
+
+        $packet->offset += strlen($data);
+        
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/ISDN.php b/include/pear/Net/DNS2/RR/ISDN.php
new file mode 100644
index 0000000000000000000000000000000000000000..94db77a68deeff5b0b68cccb27e74b8bda77cc08
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/ISDN.php
@@ -0,0 +1,190 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: ISDN.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * ISDN Resource Record - RFC1183 section 3.2
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    ISDN-address               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    SA                         /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_ISDN extends Net_DNS2_RR
+{
+    /*
+     * ISDN Number
+     */
+    public $isdnaddress;
+    
+    /*
+     * Sub-Address
+     */
+    public $sa;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->formatString($this->isdnaddress) . ' ' . 
+            $this->formatString($this->sa);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $data = $this->buildString($rdata);
+        if (count($data) >= 1) {
+
+            $this->isdnaddress = $data[0];
+            if (isset($data[1])) {
+                
+                $this->sa = $data[1];
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $this->isdnaddress = Net_DNS2_Packet::label($packet, $packet->offset);
+
+            //
+            // look for a SA (sub address) - it's optional
+            //
+            if ( (strlen($this->isdnaddress) + 1) < $this->rdlength) {
+
+                $this->sa = Net_DNS2_Packet::label($packet, $packet->offset);
+            } else {
+            
+                $this->sa = '';
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->isdnaddress) > 0) {
+
+            $data = chr(strlen($this->isdnaddress)) . $this->isdnaddress;
+            if (!empty($this->sa)) {
+
+                $data .= chr(strlen($this->sa));
+                $data .= $this->sa;
+            }
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+        
+        return null; 
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/KEY.php b/include/pear/Net/DNS2/RR/KEY.php
new file mode 100644
index 0000000000000000000000000000000000000000..6bcb0f596cbe6700cf12646c8575792fb03da634
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/KEY.php
@@ -0,0 +1,85 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: KEY.php 47 2010-10-24 23:53:08Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * the KEY RR is implemented the same as the DNSKEY RR, the only difference
+ * is how the flags data is parsed.
+ *
+ *     0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
+ *   +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *   |  A/C  | Z | XT| Z | Z | NAMTYP| Z | Z | Z | Z |      SIG      |
+ *   +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *
+ * DNSKEY only uses bits 7 and 15
+ *
+ * We're not doing anything with these flags right now, so duplicating the
+ * class like this is fine.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_KEY extends Net_DNS2_RR_DNSKEY
+{
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/KX.php b/include/pear/Net/DNS2/RR/KX.php
new file mode 100644
index 0000000000000000000000000000000000000000..0218c390c2fce8f3f0a93526d76623609875250f
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/KX.php
@@ -0,0 +1,179 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: KX.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * KX Resource Record - RFC2230 section 3.1
+ *
+ * This class is almost identical to MX, except that the the exchanger
+ * domain is not compressed, it's added as a label
+ *
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   |                  PREFERENCE                   |
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   /                   EXCHANGER                   /
+ *   /                                               /
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_KX extends Net_DNS2_RR
+{
+    /*
+     * the preference for this mail exchanger
+     */    
+    public $preference;
+ 
+    /*
+     * the hostname of the mail exchanger
+     */
+    public $exchange;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->cleanString($this->exchange) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference   = array_shift($rdata);
+        $this->exchange     = $this->cleanString(array_shift($rdata));
+ 
+        return true;        
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+   
+            //
+            // parse the preference
+            //
+            $x = unpack('npreference', $this->rdata);
+            $this->preference = $x['preference'];
+
+            //
+            // get the exchange entry server)
+            //
+            $offset = $packet->offset + 2;
+            $this->exchange = Net_DNS2_Packet::label($packet, $offset);
+
+            return true;
+        }
+      
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->exchange) > 0) {
+     
+            $data = pack('nC', $this->preference, strlen($this->exchange)) . 
+                $this->exchange;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+    
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/L32.php b/include/pear/Net/DNS2/RR/L32.php
new file mode 100644
index 0000000000000000000000000000000000000000..b26d7cb9f0c6ba81f6f4ee717cda542a23509fac
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/L32.php
@@ -0,0 +1,180 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2013 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: L32.php 207 2013-06-13 01:19:55Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.3.1
+ *
+ */
+
+/**
+ * L32 Resource Record - RFC6742 section 2.2
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |          Preference           |      Locator32 (16 MSBs)      |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |     Locator32 (16 LSBs)       |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_L32 extends Net_DNS2_RR
+{
+    /*
+     * The preference
+     */
+    public $preference;
+
+    /*
+     * The locator32 field
+     */
+    public $locator32;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->locator32;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference = array_shift($rdata);
+        $this->locator32 = array_shift($rdata);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     * 
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the values
+            //
+            $x = unpack('npreference/C4locator', $this->rdata);
+
+            $this->preference = $x['preference'];
+
+            //
+            // build the locator value
+            //
+            $this->locator32 = $x['locator1'] . '.' . $x['locator2'] . '.' .
+                $x['locator3'] . '.' . $x['locator4'];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     * 
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed 
+     *                                 string or null on failure
+     * @access protected
+     * 
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->locator32) > 0) {
+
+            //
+            // break out the locator value
+            //
+            $n = explode('.', $this->locator32);
+
+            //
+            // pack the data
+            //
+            return pack('nC4', $this->preference, $n[0], $n[1], $n[2], $n[3]);
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/L64.php b/include/pear/Net/DNS2/RR/L64.php
new file mode 100644
index 0000000000000000000000000000000000000000..900b433457b39987b97622d667297c6216f0e4eb
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/L64.php
@@ -0,0 +1,187 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2013 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: L64.php 208 2013-06-13 01:22:36Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.3.1
+ *
+ */
+
+/**
+ * L64 Resource Record - RFC6742 section 2.3
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |          Preference           |                               |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+ *  |                          Locator64                            |
+ *  +                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                               |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_L64 extends Net_DNS2_RR
+{
+    /*
+     * The preference
+     */
+    public $preference;
+
+    /*
+     * The locator64 field
+     */
+    public $locator64;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->locator64;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference = array_shift($rdata);
+        $this->locator64 = array_shift($rdata);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     * 
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+ 
+            //
+            // unpack the values
+            //
+            $x = unpack('npreference/n4locator', $this->rdata);
+   
+            $this->preference = $x['preference'];
+ 
+            //
+            // build the locator64
+            //
+            $this->locator64 = dechex($x['locator1']) . ':' . 
+                dechex($x['locator2']) . ':' .
+                dechex($x['locator3']) . ':' . 
+                dechex($x['locator4']);
+      
+            return true;
+        }
+    
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     * 
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed 
+     *                                 string or null on failure
+     * @access protected
+     * 
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->locator64) > 0) {
+      
+            //
+            // break out the locator64
+            //
+            $n = explode(':', $this->locator64);
+    
+            //
+            // pack the data
+            //
+            return pack(
+                'n5', $this->preference, hexdec($n[0]), hexdec($n[1]),
+                hexdec($n[2]), hexdec($n[3])
+            );
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/LOC.php b/include/pear/Net/DNS2/RR/LOC.php
new file mode 100644
index 0000000000000000000000000000000000000000..7afd2fabb8d77c39422a5a3c4adb390e74ba8339
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/LOC.php
@@ -0,0 +1,440 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: LOC.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * LOC Resource Record - RFC1876 section 2
+ *
+ *      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *      |        VERSION        |         SIZE          |
+ *      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *      |       HORIZ PRE       |       VERT PRE        |
+ *      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *      |                   LATITUDE                    |
+ *      |                                               |
+ *      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *      |                   LONGITUDE                   |
+ *      |                                               |
+ *      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *      |                   ALTITUDE                    |
+ *      |                                               |
+ *      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_LOC extends Net_DNS2_RR
+{
+    /*
+     * the LOC version- should only ever be 0
+     */
+    public $version;
+
+    /*
+     * The diameter of a sphere enclosing the described entity
+     */
+    public $size;
+
+    /*
+     * The horizontal precision of the data
+     */
+    public $horiz_pre;
+
+    /*
+     * The vertical precision of the data
+     */
+    public $vert_pre;
+
+    /*
+     * The latitude - stored in decimal degrees
+     */
+    public $latitude;
+
+    /* 
+     * The longitude - stored in decimal degrees
+     */
+    public $longitude;
+
+    /*
+     * The altitude - stored in decimal
+     */
+    public $altitude;
+
+    /*
+     * used for quick power-of-ten lookups
+     */
+    private $_powerOfTen = array(1, 10, 100, 1000, 10000, 100000, 
+                                 1000000,10000000,100000000,1000000000);
+
+    /*
+     * some conversion values
+     */
+    const CONV_SEC          = 1000;
+    const CONV_MIN          = 60000;
+    const CONV_DEG          = 3600000;
+
+    const REFERENCE_ALT     = 10000000;
+    const REFERENCE_LATLON  = 2147483648;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        if ($this->version == 0) {
+
+            return $this->_d2Dms($this->latitude, 'LAT') . ' ' . 
+                $this->_d2Dms($this->longitude, 'LNG') . ' ' . 
+                sprintf('%.2fm', $this->altitude) . ' ' .
+                sprintf('%.2fm', $this->size) . ' ' .
+                sprintf('%.2fm', $this->horiz_pre) . ' ' .
+                sprintf('%.2fm', $this->vert_pre);
+        }
+        
+        return '';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // format as defined by RFC1876 section 3
+        //
+        // d1 [m1 [s1]] {"N"|"S"} d2 [m2 [s2]] {"E"|"W"} alt["m"] 
+        //      [siz["m"] [hp["m"] [vp["m"]]]]
+        //
+        $res = preg_match(
+            '/^(\d+) \s+((\d+) \s+)?(([\d.]+) \s+)?(N|S) \s+(\d+) ' .
+            '\s+((\d+) \s+)?(([\d.]+) \s+)?(E|W) \s+(-?[\d.]+) m?(\s+ ' .
+            '([\d.]+) m?)?(\s+ ([\d.]+) m?)?(\s+ ([\d.]+) m?)?/ix', 
+            implode(' ', $rdata), $x
+        );
+
+        if ($res) {
+
+            //
+            // latitude
+            //
+            $latdeg     = $x[1];
+            $latmin     = (isset($x[3])) ? $x[3] : 0;
+            $latsec     = (isset($x[5])) ? $x[5] : 0;
+            $lathem     = strtoupper($x[6]);
+
+            $this->latitude = $this->_dms2d($latdeg, $latmin, $latsec, $lathem);
+
+            //
+            // longitude
+            //
+            $londeg     = $x[7];
+            $lonmin     = (isset($x[9])) ? $x[9] : 0;
+            $lonsec     = (isset($x[11])) ? $x[11] : 0;
+            $lonhem     = strtoupper($x[12]);
+
+            $this->longitude = $this->_dms2d($londeg, $lonmin, $lonsec, $lonhem);
+
+            //
+            // the rest of teh values
+            //
+            $version            = 0;
+
+            $this->size         = (isset($x[15])) ? $x[15] : 1;
+            $this->horiz_pre    = ((isset($x[17])) ? $x[17] : 10000);
+            $this->vert_pre     = ((isset($x[19])) ? $x[19] : 10);
+            $this->altitude     = $x[13];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack all the values
+            //
+            $x = unpack(
+                'Cver/Csize/Choriz_pre/Cvert_pre/Nlatitude/Nlongitude/Naltitude', 
+                $this->rdata
+            );
+
+            //
+            // version must be 0 per RFC 1876 section 2
+            //
+            $this->version = $x['ver'];
+            if ($this->version == 0) {
+
+                $this->size         = $this->_precsizeNtoA($x['size']);
+                $this->horiz_pre    = $this->_precsizeNtoA($x['horiz_pre']);
+                $this->vert_pre     = $this->_precsizeNtoA($x['vert_pre']);
+
+                //
+                // convert the latitude and longitude to degress in decimal
+                //
+                if ($x['latitude'] < 0) {
+
+                    $this->latitude = ($x['latitude'] + 
+                        self::REFERENCE_LATLON) / self::CONV_DEG;
+                } else {
+
+                    $this->latitude = ($x['latitude'] - 
+                        self::REFERENCE_LATLON) / self::CONV_DEG;
+                }
+
+                if ($x['longitude'] < 0) {
+ 
+                    $this->longitude = ($x['longitude'] + 
+                        self::REFERENCE_LATLON) / self::CONV_DEG;
+                } else {
+
+                    $this->longitude = ($x['longitude'] - 
+                        self::REFERENCE_LATLON) / self::CONV_DEG;
+                }
+
+                //
+                // convert down the altitude
+                //
+                $this->altitude = ($x['altitude'] - self::REFERENCE_ALT) / 100;
+
+                return true;
+
+            } else {
+
+                return false;
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->version == 0) {
+
+            $lat = 0;
+            $lng = 0;
+
+            if ($this->latitude < 0) {
+
+                $lat = ($this->latitude * self::CONV_DEG) - self::REFERENCE_LATLON;
+            } else {
+
+                $lat = ($this->latitude * self::CONV_DEG) + self::REFERENCE_LATLON;
+            }
+
+            if ($this->longitude < 0) {
+
+                $lng = ($this->longitude * self::CONV_DEG) - self::REFERENCE_LATLON;
+            } else {
+
+                $lng = ($this->longitude * self::CONV_DEG) + self::REFERENCE_LATLON;
+            }
+
+            $packet->offset += 16;
+
+            return pack(
+                'CCCCNNN', 
+                $this->version,
+                $this->_precsizeAtoN($this->size),
+                $this->_precsizeAtoN($this->horiz_pre),
+                $this->_precsizeAtoN($this->vert_pre),
+                $lat, $lng,
+                ($this->altitude * 100) + self::REFERENCE_ALT
+            );
+        }
+
+        return null;
+    }
+
+    /**
+     * takes an XeY precision/size value, returns a string representation.
+     * shamlessly stolen from RFC1876 Appendix A
+     *
+     * @param integer $prec the value to convert
+     *
+     * @return string
+     * @access private
+     *
+     */
+    private function _precsizeNtoA($prec)
+    {
+        $mantissa = (($prec >> 4) & 0x0f) % 10;
+        $exponent = (($prec >> 0) & 0x0f) % 10;
+
+        return $mantissa * $this->_powerOfTen[$exponent];
+    }
+
+    /**
+     * converts ascii size/precision X * 10**Y(cm) to 0xXY.
+     * shamlessly stolen from RFC1876 Appendix A
+     *
+     * @param string $prec the value to convert
+     *
+     * @return integer
+     * @access private
+     *
+     */
+    private function _precsizeAtoN($prec)
+    {
+        $exponent = 0;
+        while ($prec >= 10) {
+
+            $prec /= 10;
+            ++$exponent;
+        }
+
+        return ($prec << 4) | ($exponent & 0x0f);
+    }
+
+    /**
+     * convert lat/lng in deg/min/sec/hem to decimal value
+     *
+     * @param integer $deg the degree value
+     * @param integer $min the minutes value
+     * @param integer $sec the seconds value
+     * @param string  $hem the hemisphere (N/E/S/W)
+     *
+     * @return float the decinmal value
+     * @access private
+     *
+     */
+    private function _dms2d($deg, $min, $sec, $hem)
+    {
+        $deg = $deg - 0;
+        $min = $min - 0;
+
+        $sign = ($hem == 'W' || $hem == 'S') ? -1 : 1;
+        return ((($sec/60+$min)/60)+$deg) * $sign;
+    }
+
+    /**
+     * convert lat/lng in decimal to deg/min/sec/hem
+     *
+     * @param float  $data   the decimal value
+     * @param string $latlng either LAT or LNG so we can determine the HEM value
+     *
+     * @return string
+     * @access private
+     *
+     */
+    private function _d2Dms($data, $latlng)
+    {
+        $deg = 0;
+        $min = 0;
+        $sec = 0;
+        $msec = 0;
+        $hem = '';
+
+        if ($latlng == 'LAT') {
+            $hem = ($data > 0) ? 'N' : 'S';
+        } else {
+            $hem = ($data > 0) ? 'E' : 'W';
+        }
+
+        $data = abs($data);
+
+        $deg = (int)$data;
+        $min = (int)(($data - $deg) * 60);
+        $sec = (int)(((($data - $deg) * 60) - $min) * 60);
+        $msec = round((((((($data - $deg) * 60) - $min) * 60) - $sec) * 1000));
+
+        return sprintf('%d %02d %02d.%03d %s', $deg, $min, $sec, round($msec), $hem);
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/LP.php b/include/pear/Net/DNS2/RR/LP.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c5356c09bcde506d15de72b2916f48647b267d2
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/LP.php
@@ -0,0 +1,177 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2013 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: LP.php 207 2013-06-13 01:19:55Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.3.1
+ *
+ */
+
+/**
+ * LP Resource Record - RFC6742 section 2.4
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |          Preference           |                               /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               /
+ *  /                                                               /
+ *  /                              FQDN                             /
+ *  /                                                               /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_LP extends Net_DNS2_RR
+{
+    /*
+     * The preference
+     */
+    public $preference;
+
+    /*
+     * The fdqn field
+     */
+    public $fqdn;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->fqdn . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference = array_shift($rdata);
+        $this->fqdn = trim(array_shift($rdata), '.');
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     * 
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+ 
+            //
+            // parse the preference
+            //
+            $x = unpack('npreference', $this->rdata);
+            $this->preference = $x['preference'];
+            $offset = $packet->offset + 2;
+
+            //
+            // get the hostname
+            //
+            $this->fqdn = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+       
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     * 
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed 
+     *                                 string or null on failure
+     * @access protected
+     * 
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->fqdn) > 0) {
+     
+            $data = pack('n', $this->preference);
+            $packet->offset += 2;
+
+            $data .= $packet->compress($this->fqdn, $packet->offset);
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/MX.php b/include/pear/Net/DNS2/RR/MX.php
new file mode 100644
index 0000000000000000000000000000000000000000..d75af38dff2974461aa4d000909b4241029bdc56
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/MX.php
@@ -0,0 +1,175 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: MX.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * MX Resource Record - RFC1035 section 3.3.9
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                  PREFERENCE                   |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   EXCHANGE                    /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_MX extends Net_DNS2_RR
+{
+    /*
+     * the preference for this mail exchanger
+     */
+    public $preference;
+
+    /*
+     * the hostname of the mail exchanger
+     */
+    public $exchange;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->cleanString($this->exchange) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference   = array_shift($rdata);
+        $this->exchange     = $this->cleanString(array_shift($rdata));
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // parse the preference
+            //
+            $x = unpack('npreference', $this->rdata);
+            $this->preference = $x['preference'];
+
+            //
+            // get the exchange entry server)
+            //
+            $offset = $packet->offset + 2;
+            $this->exchange = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->exchange) > 0) {
+
+            $data = pack('n', $this->preference);
+            $packet->offset += 2;
+
+            $data .= $packet->compress($this->exchange, $packet->offset);
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NAPTR.php b/include/pear/Net/DNS2/RR/NAPTR.php
new file mode 100644
index 0000000000000000000000000000000000000000..d05d9da55c3b8686399a55a071334e6f8bc72238
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NAPTR.php
@@ -0,0 +1,231 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NAPTR.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NAPTR Resource Record - RFC2915
+ *
+ *      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   |                     ORDER                     |
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   |                   PREFERENCE                  |
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   /                     FLAGS                     /
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   /                   SERVICES                    /
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   /                    REGEXP                     /
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   /                  REPLACEMENT                  /
+ *   /                                               /
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NAPTR extends Net_DNS2_RR
+{
+    /*
+     * the order in which the NAPTR records MUST be processed
+     */
+    public $order;
+
+    /*
+     * specifies the order in which NAPTR records with equal "order"
+     * values SHOULD be processed
+     */
+    public $preference;
+
+    /*
+     * rewrite flags
+     */
+    public $flags;
+
+    /* 
+     * Specifies the service(s) available down this rewrite path
+     */
+    public $services;
+
+    /*
+     * regular expression
+     */
+    public $regexp;
+
+    /* 
+     * The next NAME to query for NAPTR, SRV, or address records
+     * depending on the value of the flags field
+     */
+    public $replacement;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->order . ' ' . $this->preference . ' ' . 
+            $this->formatString($this->flags) . ' ' . 
+            $this->formatString($this->services) . ' ' . 
+            $this->formatString($this->regexp) . ' ' . 
+            $this->cleanString($this->replacement) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->order        = array_shift($rdata);
+        $this->preference   = array_shift($rdata);
+
+        $data = $this->buildString($rdata);
+        if (count($data) == 4) {
+
+            $this->flags        = $data[0];
+            $this->services     = $data[1];
+            $this->regexp       = $data[2];
+            $this->replacement  = $this->cleanString($data[3]);
+        
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+            
+            //
+            // unpack the order and preference
+            //
+            $x = unpack('norder/npreference', $this->rdata);
+            
+            $this->order        = $x['order'];
+            $this->preference   = $x['preference'];
+
+            $offset             = $packet->offset + 4;
+
+            $this->flags        = Net_DNS2_Packet::label($packet, $offset);
+            $this->services     = Net_DNS2_Packet::label($packet, $offset);
+            $this->regexp       = Net_DNS2_Packet::label($packet, $offset);
+
+            $this->replacement  = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if ( (isset($this->order)) && (strlen($this->services) > 0) ) {
+            
+            $data = pack('nn', $this->order, $this->preference);
+
+            $data .= chr(strlen($this->flags)) . $this->flags;
+            $data .= chr(strlen($this->services)) . $this->services;
+            $data .= chr(strlen($this->regexp)) . $this->regexp;
+
+            $packet->offset += strlen($data);
+
+            $data .= $packet->compress($this->replacement, $packet->offset);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NID.php b/include/pear/Net/DNS2/RR/NID.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed4463de5b4f8cd4ffd30edf5e6b96f644abbe7f
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NID.php
@@ -0,0 +1,187 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2013, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2013 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NID.php 208 2013-06-13 01:22:36Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.3.1
+ *
+ */
+
+/**
+ * NID Resource Record - RFC6742 section 2.1
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |          Preference           |                               |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
+ *  |                             NodeID                            |
+ *  +                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                               |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NID extends Net_DNS2_RR
+{
+    /*
+     * The preference
+     */
+    public $preference;
+
+    /*
+     * The node ID field
+     */
+    public $nodeid;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->nodeid;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference = array_shift($rdata);
+        $this->nodeid = array_shift($rdata);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     * 
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+        
+            //
+            // unpack the values
+            //
+            $x = unpack('npreference/n4nodeid', $this->rdata);
+
+            $this->preference = $x['preference'];
+
+            //
+            // build the node id
+            //
+            $this->nodeid = dechex($x['nodeid1']) . ':' . 
+                dechex($x['nodeid2']) . ':' .
+                dechex($x['nodeid3']) . ':' . 
+                dechex($x['nodeid4']);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     * 
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed 
+     *                                 string or null on failure
+     * @access protected
+     * 
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->nodeid) > 0) {
+
+            //
+            // break out the node id
+            //
+            $n = explode(':', $this->nodeid);
+
+            //
+            // pack the data
+            //
+            return pack(
+                'n5', $this->preference, hexdec($n[0]), hexdec($n[1]), 
+                hexdec($n[2]), hexdec($n[3])
+            );
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NIMLOC.php b/include/pear/Net/DNS2/RR/NIMLOC.php
new file mode 100644
index 0000000000000000000000000000000000000000..70c421975f96d8eb07bfbd8276ccbb50ea7f1b17
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NIMLOC.php
@@ -0,0 +1,130 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NIMLOC.php 125 2011-12-03 00:19:49Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NIMLOCK Resource Record - undefined; the rdata is simply used as-is in it's
+ *                              binary format, so not process has to be done.
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NIMLOCK extends Net_DNS2_RR
+{
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return '';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        return true;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        return $this->rdata;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NS.php b/include/pear/Net/DNS2/RR/NS.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d006872a0760fdd13ac157ff661d38ccb3e279c
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NS.php
@@ -0,0 +1,153 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NS.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NS Resource Record - RFC1035 section 3.3.11
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   NSDNAME                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NS extends Net_DNS2_RR
+{
+    /*
+     * the hostname of the DNS server
+     */
+    public $nsdname;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->nsdname) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->nsdname = $this->cleanString(array_shift($rdata));
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset = $packet->offset;
+            $this->nsdname = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->nsdname) > 0) {
+
+            return $packet->compress($this->nsdname, $packet->offset);
+        }
+        
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NSAP.php b/include/pear/Net/DNS2/RR/NSAP.php
new file mode 100644
index 0000000000000000000000000000000000000000..4413ebcec50d674298ad9e18fac0f85ff97f1406
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NSAP.php
@@ -0,0 +1,262 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NSAP.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NSAP Resource Record - RFC1706
+ *
+ *             |--------------|
+ *             | <-- IDP -->  |
+ *             |--------------|-------------------------------------|
+ *             | AFI |  IDI   |            <-- DSP -->              |
+ *             |-----|--------|-------------------------------------|
+ *             | 47  |  0005  | DFI | AA |Rsvd | RD |Area | ID |Sel |
+ *             |-----|--------|-----|----|-----|----|-----|----|----|
+ *      octets |  1  |   2    |  1  | 3  |  2  | 2  |  2  | 6  | 1  |
+ *             |-----|--------|-----|----|-----|----|-----|----|----|
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NSAP extends Net_DNS2_RR
+{
+    public $afi;
+    public $idi;
+    public $dfi;
+    public $aa;
+    public $rsvd;
+    public $rd;
+    public $area;
+    public $id;
+    public $sel;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->afi) . '.' . 
+            $this->cleanString($this->idi) . '.' . 
+            $this->cleanString($this->dfi) . '.' . 
+            $this->cleanString($this->aa) . '.' . 
+            $this->cleanString($this->rsvd) . '.' . 
+            $this->cleanString($this->rd) . '.' . 
+            $this->cleanString($this->area) . '.' . 
+            $this->cleanString($this->id) . '.' . 
+            $this->sel;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $data = strtolower(trim(array_shift($rdata)));
+
+        //
+        // there is no real standard for format, so we can't rely on the fact that
+        // the value will come in with periods separating the values- so strip 
+        // them out if they're included, and parse without them.
+        //    
+        $data = str_replace(array('.', '0x'), '', $data);
+
+        //
+        // unpack it as ascii characters
+        //
+        $x = unpack('A2afi/A4idi/A2dfi/A6aa/A4rsvd/A4rd/A4area/A12id/A2sel', $data);
+        
+        //
+        // make sure the afi value is 47
+        //
+        if ($x['afi'] == 47) {
+
+            $this->afi  = '0x' . $x['afi'];
+            $this->idi  = $x['idi'];
+            $this->dfi  = $x['dfi'];
+            $this->aa   = $x['aa'];
+            $this->rsvd = $x['rsvd'];
+            $this->rd   = $x['rd'];
+            $this->area = $x['area'];
+            $this->id   = $x['id'];
+            $this->sel  = $x['sel'];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength == 20) {
+
+            //
+            // get the AFI value
+            //
+            $this->afi = dechex(ord($this->rdata[0]));
+
+            //
+            // we only support AFI 47- there arent' any others defined.
+            //
+            if ($this->afi == 47) {
+
+                //
+                // unpack the rest of the values
+                //
+                $x = unpack(
+                    'Cafi/nidi/Cdfi/C3aa/nrsvd/nrd/narea/Nidh/nidl/Csel', 
+                    $this->rdata
+                );
+
+                $this->afi  = sprintf('0x%02x', $x['afi']);
+                $this->idi  = sprintf('%04x', $x['idi']);
+                $this->dfi  = sprintf('%02x', $x['dfi']);
+                $this->aa   = sprintf(
+                    '%06x', $x['aa1'] << 16 | $x['aa2'] << 8 | $x['aa3']
+                );
+                $this->rsvd = sprintf('%04x', $x['rsvd']);
+                $this->rd   = sprintf('%04x', $x['rd']);
+                $this->area = sprintf('%04x', $x['area']);
+                $this->id   = sprintf('%08x', $x['idh']) . 
+                    sprintf('%04x', $x['idl']);
+                $this->sel  = sprintf('%02x', $x['sel']);
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->afi == 0x47) {
+
+            //
+            // build the aa field
+            //
+            $aa = unpack('A2x/A2y/A2z', $this->aa);
+
+            //
+            // build the id field
+            //
+            $id = unpack('A8a/A4b', $this->id);
+
+            //
+            $data = pack(
+                'CnCCCCnnnNnC', 
+                hexdec($this->afi), 
+                hexdec($this->idi),
+                hexdec($this->dfi),
+                hexdec($aa['x']),
+                hexdec($aa['y']),
+                hexdec($aa['z']),
+                hexdec($this->rsvd),
+                hexdec($this->rd),
+                hexdec($this->area),
+                hexdec($id['a']),
+                hexdec($id['b']),
+                hexdec($this->sel)
+            );
+
+            if (strlen($data) == 20) {
+                
+                $packet->offset += 20;
+                return $data;
+            }
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NSEC.php b/include/pear/Net/DNS2/RR/NSEC.php
new file mode 100644
index 0000000000000000000000000000000000000000..d87d525423713664aae43371ed35dcbc755fdd73
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NSEC.php
@@ -0,0 +1,184 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NSEC.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NSEC Resource Record - RFC3845 section 2.1
+ *
+ *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   /                      Next Domain Name                         /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   /                   List of Type Bit Map(s)                     /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NSEC extends Net_DNS2_RR
+{
+    /*
+     * The next owner name
+     */
+    public $next_domain_name;
+
+    /*
+     * identifies the RRset types that exist at the NSEC RR's owner name.
+     */
+    public $type_bit_maps = array();
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $data = $this->cleanString($this->next_domain_name) . '.';
+
+        foreach ($this->type_bit_maps as $rr) {
+
+            $data .= ' ' . $rr;
+        }
+
+        return $data;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->next_domain_name = $this->cleanString(array_shift($rdata));
+        $this->type_bit_maps = $rdata;
+        
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // expand the next domain name
+            //
+            $offset = $packet->offset;
+            $this->next_domain_name = Net_DNS2_Packet::expand($packet, $offset);
+
+            //
+            // parse out the RR's from the bitmap
+            //
+            $this->type_bit_maps = Net_DNS2_BitMap::bitMapToArray(
+                substr($this->rdata, $offset - $packet->offset)
+            );
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->next_domain_name) > 0) {
+
+            $data = $packet->compress($this->next_domain_name, $packet->offset);
+            $bitmap = Net_DNS2_BitMap::arrayToBitMap($this->type_bit_maps);
+    
+            $packet->offset += strlen($bitmap);
+
+            return $data . $bitmap;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NSEC3.php b/include/pear/Net/DNS2/RR/NSEC3.php
new file mode 100644
index 0000000000000000000000000000000000000000..71dc028cb5150eceaafcbf4e9b5bd215f9aad833
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NSEC3.php
@@ -0,0 +1,310 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NSEC3.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NSEC3 Resource Record - RFC5155 section 3.2
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |   Hash Alg.   |     Flags     |          Iterations           |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Salt Length  |                     Salt                      /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Hash Length  |             Next Hashed Owner Name            /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  /                         Type Bit Maps                         /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NSEC3 extends Net_DNS2_RR
+{
+    /*
+     * Algorithm to use
+     */
+    public $algorithm;
+ 
+    /*
+     * flags
+     */
+    public $flags;
+ 
+    /*
+     *  defines the number of additional times the hash is performed.
+     */
+    public $iterations;
+ 
+    /*
+     * the length of the salt- not displayed
+     */
+    public $salt_length;
+ 
+    /*
+     * the salt
+     */
+    public $salt;
+
+    /*
+     * the length of the hash value
+     */
+    public $hash_length;
+
+    /*
+     * the hashed value of the owner name
+     */
+    public $hashed_owner_name;
+
+    /*
+     * array of RR type names
+     */
+    public $type_bit_maps = array();
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = $this->algorithm . ' ' . $this->flags . ' ' . $this->iterations . ' ';
+ 
+        //
+        // per RFC5155, the salt_length value isn't displayed, and if the salt
+        // is empty, the salt is displayed as '-'
+        //
+        if ($this->salt_length > 0) {
+  
+            $out .= $this->salt;
+        } else {     
+ 
+            $out .= '-';
+        }
+
+        //
+        // per RFC5255 the hash length isn't shown
+        //
+        $out .= ' ' . $this->hashed_owner_name;
+ 
+        //
+        // show the RR's
+        //
+        foreach ($this->type_bit_maps as $rr) {
+    
+            $out .= ' ' . strtoupper($rr);
+        }
+
+        return $out;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->algorithm    = array_shift($rdata);
+        $this->flags        = array_shift($rdata);
+        $this->iterations   = array_shift($rdata);
+     
+        //
+        // an empty salt is represented as '-' per RFC5155 section 3.3
+        //
+        $salt = array_shift($rdata);
+        if ($salt == '-') {
+
+            $this->salt_length = 0;
+            $this->salt = '';
+        } else {
+    
+            $this->salt_length = strlen(pack('H*', $salt));
+            $this->salt = strtoupper($salt);
+        }
+
+        $this->hashed_owner_name = array_shift($rdata);
+        $this->hash_length = strlen(base64_decode($this->hashed_owner_name));
+
+        $this->type_bit_maps = $rdata;
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+        
+            //
+            // unpack the first values
+            //
+            $x = unpack('Calgorithm/Cflags/niterations/Csalt_length', $this->rdata);
+        
+            $this->algorithm    = $x['algorithm'];
+            $this->flags        = $x['flags'];
+            $this->iterations   = $x['iterations'];
+            $this->salt_length  = $x['salt_length'];
+
+            $offset = 5;
+
+            if ($this->salt_length > 0) {
+ 
+                $x = unpack('H*', substr($this->rdata, $offset, $this->salt_length));
+                $this->salt = strtoupper($x[1]);
+                $offset += $this->salt_length;
+            }
+
+            //
+            // unpack the hash length
+            //
+            $x = unpack('@' . $offset . '/Chash_length', $this->rdata);
+            $offset++;
+
+            //
+            // copy out the hash
+            //
+            $this->hash_length  = $x['hash_length'];
+            if ($this->hash_length > 0) {
+
+                $this->hashed_owner_name = base64_encode(
+                    substr($this->rdata, $offset, $this->hash_length)
+                );
+                $offset += $this->hash_length;
+            }
+
+            //
+            // parse out the RR bitmap
+            //
+            $this->type_bit_maps = Net_DNS2_BitMap::bitMapToArray(
+                substr($this->rdata, $offset)
+            );
+
+            return true;
+        }
+     
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        //
+        // pull the salt and build the length
+        //
+        $salt = pack('H*', $this->salt);
+        $this->salt_length = strlen($salt);
+            
+        //
+        // pack the algorithm, flags, iterations and salt length
+        //
+        $data = pack(
+            'CCnC',
+            $this->algorithm, $this->flags, $this->iterations, $this->salt_length
+        );
+        $data .= $salt;
+
+        //
+        // add the hash length and hash
+        //
+        $data .= chr($this->hash_length);
+        if ($this->hash_length > 0) {
+
+            $data .= base64_decode($this->hashed_owner_name);
+        }
+
+        //
+        // conver the array of RR names to a type bitmap
+        //
+        $data .= Net_DNS2_BitMap::arrayToBitMap($this->type_bit_maps);
+
+        $packet->offset += strlen($data);
+     
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/NSEC3PARAM.php b/include/pear/Net/DNS2/RR/NSEC3PARAM.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a67c628081cdd53665f9f583cc46fa650518f1d
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/NSEC3PARAM.php
@@ -0,0 +1,220 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: NSEC3PARAM.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * NSEC3PARAM Resource Record - RFC5155 section 4.2
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |   Hash Alg.   |     Flags     |          Iterations           |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Salt Length  |                     Salt                      /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_NSEC3PARAM extends Net_DNS2_RR
+{
+    /*
+     * Algorithm to use
+     *
+     * TODO: same as the NSEC3
+     */
+    public $algorithm;
+
+    /*
+     * flags
+     */
+    public $flags;
+
+    /*
+     *  defines the number of additional times the hash is performed.
+     */
+    public $iterations;
+
+    /*
+     * the length of the salt- not displayed
+     */
+    public $salt_length;
+
+    /*
+     * the salt
+     */
+    public $salt;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = $this->algorithm . ' ' . $this->flags . ' ' . $this->iterations . ' ';
+
+        //
+        // per RFC5155, the salt_length value isn't displayed, and if the salt 
+        // is empty, the salt is displayed as "-"
+        //        
+        if ($this->salt_length > 0) {
+
+            $out .= $this->salt;
+        } else {
+            
+            $out .= '-';
+        }
+    
+        return $out;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->algorithm    = array_shift($rdata);
+        $this->flags        = array_shift($rdata);
+        $this->iterations   = array_shift($rdata);
+
+        $salt = array_shift($rdata);
+        if ($salt == '-') {
+
+            $this->salt_length = 0;
+            $this->salt = '';
+        } else {
+
+            $this->salt_length = strlen(pack('H*', $salt));
+            $this->salt = strtoupper($salt);
+        }
+        
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $x = unpack('Calgorithm/Cflags/niterations/Csalt_length', $this->rdata);
+
+            $this->algorithm    = $x['algorithm'];
+            $this->flags        = $x['flags'];
+            $this->iterations   = $x['iterations'];
+            $this->salt_length  = $x['salt_length'];
+
+            if ($this->salt_length > 0) {
+
+                $x = unpack('H*', substr($this->rdata, 5, $this->salt_length));
+                $this->salt = strtoupper($x[1]);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        $salt = pack('H*', $this->salt);
+        $this->salt_length = strlen($salt);
+
+        $data = pack(
+            'CCnC', 
+            $this->algorithm, $this->flags, $this->iterations, $this->salt_length
+        ) . $salt;
+
+        $packet->offset += strlen($data);
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/OPT.php b/include/pear/Net/DNS2/RR/OPT.php
new file mode 100644
index 0000000000000000000000000000000000000000..37422d689f07616071d66bfd1762abf00b85ec83
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/OPT.php
@@ -0,0 +1,292 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: OPT.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.0.0
+ *
+ */
+
+/**
+ * OPT Resource Record - RFC2929 section 3.1
+ *
+ *    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *    |                          OPTION-CODE                          |
+ *    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *    |                         OPTION-LENGTH                         |
+ *    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *    |                                                               |
+ *    /                          OPTION-DATA                          /
+ *    /                                                               /
+ *    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_OPT extends Net_DNS2_RR
+{
+    /*
+     * option code - assigned by IANA
+     */
+    public $option_code;
+
+    /*
+     * the length of the option data
+     */
+    public $option_length;
+
+    /*
+     * the option data
+     */
+    public $option_data;
+
+    /*
+     * the extended response code stored in the TTL
+     */
+    public $extended_rcode;
+
+    /*
+     * the implementation level
+     */
+    public $version;
+
+    /*
+     * the DO bit used for DNSSEC - RFC3225
+     */
+    public $do;
+
+    /*
+     * the extended flags
+     */
+    public $z;
+
+    /**
+     * Constructor - builds a new Net_DNS2_RR_OPT object; normally you wouldn't call
+     * this directly, but OPT RR's are a little different
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet or null to create
+     *                                 an empty object
+     * @param array           $rr      an array with RR parse values or null to
+     *                                 create an empty object
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct(Net_DNS2_Packet &$packet = null, array $rr = null)
+    {
+        //
+        // this is for when we're manually building an OPT RR object; we aren't
+        // passing in binary data to parse, we just want a clean/empty object.
+        //
+        $this->type             = 'OPT';
+        $this->rdlength         = 0;
+
+        $this->option_length    = 0;
+        $this->extended_rcode   = 0;
+        $this->version          = 0;
+        $this->do               = 0;
+        $this->z                = 0;
+
+        //
+        // everthing else gets passed through to the parent.
+        //
+        if ( (!is_null($packet)) && (!is_null($rr)) ) {
+
+            parent::__construct($packet, $rr);
+        }
+    }
+
+    /**
+     * method to return the rdata portion of the packet as a string. There is no
+     * defintion for returning an OPT RR by string- this is just here to validate
+     * the binary parsing / building routines.
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->option_code . ' ' . $this->option_data;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line. There is no 
+     * definition for parsing a OPT RR by string- this is just here to validate
+     * the binary parsing / building routines.
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->option_code      = array_shift($rdata);
+        $this->option_data      = array_shift($rdata);
+        $this->option_length    = strlen($this->option_data);
+
+        $x = unpack('Cextended/Cversion/Cdo/Cz', pack('N', $this->ttl));
+
+        $this->extended_rcode   = $x['extended'];
+        $this->version          = $x['version'];
+        $this->do               = ($x['do'] >> 7);
+        $this->z                = $x['z'];
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        //
+        // parse out the TTL value
+        //
+        $x = unpack('Cextended/Cversion/Cdo/Cz', pack('N', $this->ttl));
+
+        $this->extended_rcode   = $x['extended'];
+        $this->version          = $x['version'];
+        $this->do               = ($x['do'] >> 7);
+        $this->z                = $x['z'];
+
+        //
+        // parse the data, if there is any
+        //
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the code and length
+            //
+            $x = unpack('noption_code/noption_length', $this->rdata);
+
+            $this->option_code      = $x['option_code'];
+            $this->option_length    = $x['option_length'];
+
+            //
+            // copy out the data based on the length
+            //
+            $this->option_data      = substr($this->rdata, 4);
+        }
+
+        return true;
+    }
+
+    /**
+     * pre-builds the TTL value for this record; we needed to separate this out
+     * from the rrGet() function, as the logic in the Net_DNS2_RR packs the TTL
+     * value before it builds the rdata value.
+     *
+     * @return void
+     * @access protected
+     *
+     */
+    protected function preBuild()
+    {
+        //
+        // build the TTL value based on the local values
+        //
+        $ttl = unpack(
+            'N', 
+            pack('CCCC', $this->extended_rcode, $this->version, ($this->do << 7), 0)
+        );
+
+        $this->ttl = $ttl[1];
+
+        return;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        //
+        // if there is an option code, then pack that data too
+        //
+        if ($this->option_code) {
+
+            $data = pack('nn', $this->option_code, $this->option_length) . 
+                $this->option_data;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/PTR.php b/include/pear/Net/DNS2/RR/PTR.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc0b90e782dbf543f43833400ee0a7babc16bfcf
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/PTR.php
@@ -0,0 +1,152 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: PTR.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * PTR Resource Record - RFC1035 section 3.3.12
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   PTRDNAME                    /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_PTR extends Net_DNS2_RR
+{
+    /*
+     * the hostname of the PTR entry
+     */
+    public $ptrdname;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->ptrdname) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->ptrdname = $this->cleanString(array_shift($rdata));
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset = $packet->offset;
+            $this->ptrdname = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->ptrdname) > 0) {
+
+            return $packet->compress($this->ptrdname, $packet->offset);
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/PX.php b/include/pear/Net/DNS2/RR/PX.php
new file mode 100644
index 0000000000000000000000000000000000000000..143b8e879d1e5af4d548127148d7fa3fc678ee3a
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/PX.php
@@ -0,0 +1,186 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: PX.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * PX Resource Record - RFC2163 section 4
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                  PREFERENCE                   |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    MAP822                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    MAPX400                    /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_PX extends Net_DNS2_RR
+{
+    /*
+     * preference
+     */
+    public $preference;
+
+    /* 
+     * the RFC822 part of the MCGAM
+     */
+    public $map822;
+
+    /*
+     * the X.400 part of the MCGAM
+     */
+    public $mapx400;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . $this->cleanString($this->map822) . '. ' . 
+            $this->cleanString($this->mapx400) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference   = $rdata[0];
+        $this->map822       = $this->cleanString($rdata[1]);
+        $this->mapx400      = $this->cleanString($rdata[2]);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // parse the preference
+            //
+            $x = unpack('npreference', $this->rdata);
+            $this->preference = $x['preference'];
+
+            $offset         = $packet->offset + 2;
+
+            $this->map822   = Net_DNS2_Packet::expand($packet, $offset);
+            $this->mapx400  = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->map822) > 0) {
+            
+            $data = pack('n', $this->preference);
+            $packet->offset += 2;
+
+            $data .= $packet->compress($this->map822, $packet->offset);
+            $data .= $packet->compress($this->mapx400, $packet->offset);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/RP.php b/include/pear/Net/DNS2/RR/RP.php
new file mode 100644
index 0000000000000000000000000000000000000000..f0b97b7ab968a4923ad0a4c7129b407967289b44
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/RP.php
@@ -0,0 +1,167 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: RP.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * RP Resource Record - RFC1183 section 2.2
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   mboxdname                   /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   txtdname                    /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_RP extends Net_DNS2_RR
+{
+    /*
+     * mailbox for the responsible person
+     */
+    public $mboxdname;
+
+    /*
+     * is a domain name for which TXT RR's exists
+     */
+    public $txtdname;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->mboxdname) . '. ' . 
+            $this->cleanString($this->txtdname) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->mboxdname    = $this->cleanString($rdata[0]);
+        $this->txtdname     = $this->cleanString($rdata[1]);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset             = $packet->offset;
+
+            $this->mboxdname    = Net_DNS2_Packet::expand($packet, $offset);
+            $this->txtdname     = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->mboxdname) > 0) {
+
+            return $packet->compress($this->mboxdname, $packet->offset) .
+                $packet->compress($this->txtdname, $packet->offset);
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/RRSIG.php b/include/pear/Net/DNS2/RR/RRSIG.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f9aa276e24664607c3ec5db2c5b73725c2a488b
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/RRSIG.php
@@ -0,0 +1,329 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: RRSIG.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ * This file contains code based off the Net::DNS::SEC Perl module by
+ * Olaf M. Kolkman
+ *
+ * This is the copyright notice from the PERL Net::DNS::SEC module:
+ *
+ * Copyright (c) 2001 - 2005  RIPE NCC.  Author Olaf M. Kolkman 
+ * Copyright (c) 2007 - 2008  NLnet Labs.  Author Olaf M. Kolkman 
+ * <olaf@net-dns.org>
+ *
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of the author not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+ * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+/**
+ * RRSIG Resource Record - RFC4034 sction 3.1
+ *
+ *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |        Type Covered           |  Algorithm    |     Labels    |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |                         Original TTL                          |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |                      Signature Expiration                     |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |                      Signature Inception                      |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |            Key Tag            |                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         Signer's Name         /
+ *   /                                                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   /                                                               /
+ *   /                            Signature                          /
+ *   /                                                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_RRSIG extends Net_DNS2_RR
+{
+    /*
+     * the RR type covered by this signature
+     */
+    public $typecovered;
+
+    /*
+     * the algorithm used for the signature
+     */
+    public $algorithm;
+    
+    /*
+     * the number of labels in the name
+     */
+    public $labels;
+
+    /*
+     * the original TTL
+     */
+    public $origttl;
+
+    /*
+     * the signature expiration
+     */
+    public $sigexp;
+
+    /*
+     * the inception of the signature
+    */
+    public $sigincep;
+
+    /*
+     * the keytag used
+     */
+    public $keytag;
+
+    /*
+     * the signer's name
+     */
+    public $signname;
+
+    /*
+     * the signature
+     */
+    public $signature;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->typecovered . ' ' . $this->algorithm . ' ' . 
+            $this->labels . ' ' . $this->origttl . ' ' .
+            $this->sigexp . ' ' . $this->sigincep . ' ' . 
+            $this->keytag . ' ' . $this->cleanString($this->signname) . '. ' . 
+            $this->signature;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->typecovered  = strtoupper(array_shift($rdata));
+        $this->algorithm    = array_shift($rdata);
+        $this->labels       = array_shift($rdata);
+        $this->origttl      = array_shift($rdata);
+        $this->sigexp       = array_shift($rdata);
+        $this->sigincep     = array_shift($rdata);
+        $this->keytag       = array_shift($rdata);
+        $this->signname     = $this->cleanString(array_shift($rdata));
+
+        foreach ($rdata as $line) {
+
+            $this->signature .= $line;
+        }
+
+        $this->signature = trim($this->signature);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack 
+            //
+            $x = unpack(
+                'ntc/Calgorithm/Clabels/Norigttl/Nsigexp/Nsigincep/nkeytag', 
+                $this->rdata
+            );
+
+            $this->typecovered  = Net_DNS2_Lookups::$rr_types_by_id[$x['tc']];
+            $this->algorithm    = $x['algorithm'];
+            $this->labels       = $x['labels'];
+            $this->origttl      = Net_DNS2::expandUint32($x['origttl']);
+
+            //
+            // the dates are in GM time
+            //
+            $this->sigexp       = gmdate('YmdHis', $x['sigexp']);
+            $this->sigincep     = gmdate('YmdHis', $x['sigincep']);
+
+            //
+            // get the keytag
+            //
+            $this->keytag       = $x['keytag'];
+
+            //
+            // get teh signers name and signature
+            //
+            $offset             = $packet->offset + 18;
+            $sigoffset          = $offset;
+
+            $this->signname     = strtolower(
+                Net_DNS2_Packet::expand($packet, $sigoffset)
+            );
+            $this->signature    = base64_encode(
+                substr($this->rdata, 18 + ($sigoffset - $offset))
+            );
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->signature) > 0) {
+
+            //
+            // parse the values out of the dates
+            //
+            preg_match(
+                '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigexp, $e
+            );
+            preg_match(
+                '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigincep, $i
+            );
+
+            //
+            // pack the value
+            //
+            $data = pack(
+                'nCCNNNn', 
+                Net_DNS2_Lookups::$rr_types_by_name[$this->typecovered],
+                $this->algorithm,
+                $this->labels,
+                $this->origttl,
+                gmmktime($e[4], $e[5], $e[6], $e[2], $e[3], $e[1]),
+                gmmktime($i[4], $i[5], $i[6], $i[2], $i[3], $i[1]),
+                $this->keytag
+            );
+
+            //
+            // the signer name is special; it's not allowed to be compressed 
+            // (see section 3.1.7)
+            //
+            $names = explode('.', strtolower($this->signname));
+            foreach ($names as $name) {
+    
+                $data .= chr(strlen($name));
+                $data .= $name;
+            }
+            $data .= "\0";
+
+            //
+            // add the signature
+            //
+            $data .= base64_decode($this->signature);
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+        
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/RT.php b/include/pear/Net/DNS2/RR/RT.php
new file mode 100644
index 0000000000000000000000000000000000000000..afbe966951cbb5295c20db024c8a96d35fcecbf7
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/RT.php
@@ -0,0 +1,175 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: RT.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * RT Resource Record - RFC1183 section 3.3
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                preference                     |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /             intermediate-host                 /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_RT extends Net_DNS2_RR
+{
+    /*
+     * the preference of this route
+     */
+    public $preference;
+
+    /*
+      * host which will servce as an intermediate in reaching the owner host
+     */
+    public $intermediatehost;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->preference . ' ' . 
+            $this->cleanString($this->intermediatehost) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->preference       = $rdata[0];
+        $this->intermediatehost = $this->cleanString($rdata[1]);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the preference
+            //
+            $x = unpack('npreference', $this->rdata);
+
+            $this->preference       = $x['preference'];
+            $offset                 = $packet->offset + 2;
+
+            $this->intermediatehost =  Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->intermediatehost) > 0) {
+
+            $data = pack('n', $this->preference);
+            $packet->offset += 2;
+
+            $data .= $packet->compress($this->intermediatehost, $packet->offset);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/SIG.php b/include/pear/Net/DNS2/RR/SIG.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d6202066d0c6ecd425e02c4f8e76fc94c9d13a8
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/SIG.php
@@ -0,0 +1,423 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: SIG.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ * This file contains code based off the Net::DNS::SEC Perl module by
+ * Olaf M. Kolkman
+ *
+ * This is the copyright notice from the PERL Net::DNS::SEC module:
+ *
+ * Copyright (c) 2001 - 2005  RIPE NCC.  Author Olaf M. Kolkman 
+ * Copyright (c) 2007 - 2008  NLnet Labs.  Author Olaf M. Kolkman 
+ * <olaf@net-dns.org>
+ *
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of the author not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+ * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+/**
+ * SIG Resource Record - RFC2535 section 4.1
+ *
+ *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |        Type Covered           |  Algorithm    |     Labels    |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |                         Original TTL                          |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |                      Signature Expiration                     |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |                      Signature Inception                      |
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   |            Key Tag            |                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+         Signer's Name         /
+ *   /                                                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *   /                                                               /
+ *   /                            Signature                          /
+ *   /                                                               /
+ *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_SIG extends Net_DNS2_RR
+{
+    /*
+     * and instance of a Net_DNS2_PrivateKey object
+     */
+    public $private_key = null;
+
+    /*
+     * the RR type covered by this signature
+     */
+    public $typecovered;
+
+    /*
+     * the algorithm used for the signature
+     */
+    public $algorithm;
+    
+    /*
+     * the number of labels in the name
+     */
+    public $labels;
+
+    /*
+     * the original TTL
+     */
+    public $origttl;
+
+    /*
+     * the signature expiration
+     */
+    public $sigexp;
+
+    /*
+     * the inception of the signature
+    */
+    public $sigincep;
+
+    /*
+     * the keytag used
+     */
+    public $keytag;
+
+    /*
+     * the signer's name
+     */
+    public $signname;
+
+    /*
+     * the signature
+     */
+    public $signature;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->typecovered . ' ' . $this->algorithm . ' ' . 
+            $this->labels . ' ' . $this->origttl . ' ' .
+            $this->sigexp . ' ' . $this->sigincep . ' ' . 
+            $this->keytag . ' ' . $this->cleanString($this->signname) . '. ' . 
+            $this->signature;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->typecovered  = strtoupper(array_shift($rdata));
+        $this->algorithm    = array_shift($rdata);
+        $this->labels       = array_shift($rdata);
+        $this->origttl      = array_shift($rdata);
+        $this->sigexp       = array_shift($rdata);
+        $this->sigincep     = array_shift($rdata);
+        $this->keytag       = array_shift($rdata);
+        $this->signname     = $this->cleanString(array_shift($rdata));
+
+        foreach ($rdata as $line) {
+
+            $this->signature .= $line;
+        }
+
+        $this->signature = trim($this->signature);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack 
+            //
+            $x = unpack(
+                'ntc/Calgorithm/Clabels/Norigttl/Nsigexp/Nsigincep/nkeytag', 
+                $this->rdata
+            );
+
+            $this->typecovered  = Net_DNS2_Lookups::$rr_types_by_id[$x['tc']];
+            $this->algorithm    = $x['algorithm'];
+            $this->labels       = $x['labels'];
+            $this->origttl      = Net_DNS2::expandUint32($x['origttl']);
+
+            //
+            // the dates are in GM time
+            //
+            $this->sigexp       = gmdate('YmdHis', $x['sigexp']);
+            $this->sigincep     = gmdate('YmdHis', $x['sigincep']);
+
+            //
+            // get the keytag
+            //
+            $this->keytag       = $x['keytag'];
+
+            //
+            // get teh signers name and signature
+            //
+            $offset             = $packet->offset + 18;
+            $sigoffset          = $offset;
+
+            $this->signname     = strtolower(
+                Net_DNS2_Packet::expand($packet, $sigoffset)
+            );
+            $this->signature    = base64_encode(
+                substr($this->rdata, 18 + ($sigoffset - $offset))
+            );
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        //
+        // parse the values out of the dates
+        //
+        preg_match(
+            '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigexp, $e
+        );
+        preg_match(
+            '/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/', $this->sigincep, $i
+        );
+
+        //
+        // pack the value
+        //
+        $data = pack(
+            'nCCNNNn', 
+            Net_DNS2_Lookups::$rr_types_by_name[$this->typecovered],
+            $this->algorithm,
+            $this->labels,
+            $this->origttl,
+            gmmktime($e[4], $e[5], $e[6], $e[2], $e[3], $e[1]),
+            gmmktime($i[4], $i[5], $i[6], $i[2], $i[3], $i[1]),
+            $this->keytag
+        );
+
+        //
+        // the signer name is special; it's not allowed to be compressed 
+        // (see section 3.1.7)
+        //
+        $names = explode('.', strtolower($this->signname));
+        foreach ($names as $name) {
+
+            $data .= chr(strlen($name));
+            $data .= $name;
+        }
+
+        $data .= chr('0');
+
+        //
+        // if the signature is empty, and $this->private_key is an instance of a 
+        // private key object, and we have access to openssl, then assume this
+        // is a SIG(0), and generate a new signature
+        //
+        if ( (strlen($this->signature) == 0)
+            && ($this->private_key instanceof Net_DNS2_PrivateKey)
+            && (extension_loaded('openssl') === true)
+        ) {
+
+            //
+            // create a new packet for the signature-
+            //
+            $new_packet = new Net_DNS2_Packet_Request('example.com', 'SOA', 'IN');
+
+            //
+            // copy the packet data over
+            //
+            $new_packet->copy($packet);
+
+            //
+            // remove the SIG object from the additional list
+            //
+            array_pop($new_packet->additional);
+            $new_packet->header->arcount = count($new_packet->additional);
+
+            //
+            // copy out the data
+            //
+            $sigdata = $data . $new_packet->get();
+
+            //
+            // based on the algorithm
+            //
+            $algorithm = 0;
+
+            switch($this->algorithm) {
+
+            //
+            // MD5
+            //
+            case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSAMD5:
+
+                $algorithm = OPENSSL_ALGO_MD5;
+                break;
+
+            //
+            // SHA1
+            //
+            case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA1:
+
+                $algorithm = OPENSSL_ALGO_SHA1;
+                break;
+        
+            //
+            // un-supported
+            //
+            case Net_DNS2_Lookups::DNSSEC_ALGORITHM_DSA:
+                //
+                // DSA won't work in PHP until the OpenSSL extension has 
+                // better DSA support
+                //
+            case Net_DNS2_Lookups::DSNSEC_ALGORITHM_RSASHA1NSEC3SHA1:
+            case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA256:
+            case Net_DNS2_Lookups::DNSSEC_ALGORITHM_RSASHA512:
+            case Net_DNS2_Lookups::DNSSEC_ALGORITHM_DSANSEC3SHA1:            
+            default:
+                throw new Net_DNS2_Exception(
+                    'invalid or unsupported algorithm',
+                    Net_DNS2_Lookups::E_OPENSSL_INV_ALGO
+                );
+                break;
+            }
+
+            //
+            // sign the data
+            //
+            if (openssl_sign(
+                $sigdata, $this->signature, $this->private_key->instance, $algorithm
+            ) == false) {
+
+                throw new Net_DNS2_Exception(
+                    openssl_error_string(), 
+                    Net_DNS2_Lookups::E_OPENSSL_ERROR
+                );
+            }
+
+            //
+            // add it locally encoded
+            //
+            $this->signature = base64_encode($this->signature);
+        }
+
+        //
+        // add the signature
+        //
+        $data .= base64_decode($this->signature);
+
+        $packet->offset += strlen($data);
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/SOA.php b/include/pear/Net/DNS2/RR/SOA.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f92f87407e01f148e34ebe4a58d9e5aababa375
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/SOA.php
@@ -0,0 +1,240 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: SOA.php 149 2012-03-02 01:08:19Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * SOA Resource Record - RFC1035 section 3.3.13
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                     MNAME                     /
+ *    /                                               /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                     RNAME                     /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    SERIAL                     |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    REFRESH                    |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                     RETRY                     |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    EXPIRE                     |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    MINIMUM                    |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_SOA extends Net_DNS2_RR
+{
+    /*
+     * The master DNS server
+     */
+    public $mname;
+
+    /*
+     * mailbox of the responsible person
+     */
+    public $rname;
+
+    /*
+     * serial number
+      */
+    public $serial;
+
+    /*
+      * refresh time
+      */
+    public $refresh;
+
+    /*
+      * retry interval
+     */
+    public $retry;
+
+    /*
+     * expire time
+      */
+    public $expire;
+
+    /*
+     * minimum TTL for any RR in this zone
+      */
+    public $minimum;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->mname) . '. ' . 
+            $this->cleanString($this->rname) . '. ' . 
+            $this->serial . ' ' . $this->refresh . ' ' . $this->retry . ' ' . 
+            $this->expire . ' ' . $this->minimum;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->mname    = $this->cleanString($rdata[0]);
+        $this->rname    = $this->cleanString($rdata[1]);
+
+        $this->serial   = $rdata[2];
+        $this->refresh  = $rdata[3];
+        $this->retry    = $rdata[4];
+        $this->expire   = $rdata[5];
+        $this->minimum  = $rdata[6];
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // parse the 
+            //
+            $offset = $packet->offset;
+
+            $this->mname = Net_DNS2_Packet::expand($packet, $offset);
+            $this->rname = Net_DNS2_Packet::expand($packet, $offset);
+
+            //
+            // get the SOA values
+            //
+            $x = unpack(
+                '@' . $offset . '/Nserial/Nrefresh/Nretry/Nexpire/Nminimum/', 
+                $packet->rdata
+            );
+
+            $this->serial   = Net_DNS2::expandUint32($x['serial']);
+            $this->refresh  = Net_DNS2::expandUint32($x['refresh']);
+            $this->retry    = Net_DNS2::expandUint32($x['retry']);
+            $this->expire   = Net_DNS2::expandUint32($x['expire']);
+            $this->minimum  = Net_DNS2::expandUint32($x['minimum']);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->mname) > 0) {
+    
+            $data = $packet->compress($this->mname, $packet->offset);
+            $data .= $packet->compress($this->rname, $packet->offset);
+
+            $data .= pack(
+                'N5', $this->serial, $this->refresh, $this->retry, 
+                $this->expire, $this->minimum
+            );
+
+            $packet->offset += 20;
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/SPF.php b/include/pear/Net/DNS2/RR/SPF.php
new file mode 100644
index 0000000000000000000000000000000000000000..751d93ac808dedf27a01c9e57915c298150532ce
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/SPF.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: SPF.php 47 2010-10-24 23:53:08Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * The SPF RR is implemented exactly like the TXT record, so
+ * for now we just extend the TXT RR and use it.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_SPF extends Net_DNS2_RR_TXT
+{
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/SRV.php b/include/pear/Net/DNS2/RR/SRV.php
new file mode 100644
index 0000000000000000000000000000000000000000..616be99441059adea75f4d5078ea82d69d5e43f0
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/SRV.php
@@ -0,0 +1,186 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates.
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors
+ *     may be used to endorse or promote products derived from this
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: SRV.php 127 2011-12-03 03:29:39Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * SRV Resource Record - RFC2782
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   PRIORITY                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    WEIGHT                     |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                     PORT                      |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    TARGET                     /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_SRV extends Net_DNS2_RR
+{
+    /*
+     * The priority of this target host.
+     */
+    public $priority;
+
+    /*
+     * a relative weight for entries with the same priority
+     */
+    public $weight;
+
+    /*
+      * The port on this target host of this service.
+     */
+    public $port;
+
+    /*
+      * The domain name of the target host
+     */
+    public $target;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->priority . ' ' . $this->weight . ' ' . 
+            $this->port . ' ' . $this->cleanString($this->target) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->priority = $rdata[0];
+        $this->weight   = $rdata[1];
+        $this->port     = $rdata[2];
+
+        $this->target   = $this->cleanString($rdata[3]);
+        
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+            
+            //
+            // unpack the priority, weight and port
+            //
+            $x = unpack('npriority/nweight/nport', $this->rdata);
+
+            $this->priority = $x['priority'];
+            $this->weight   = $x['weight'];
+            $this->port     = $x['port'];
+
+            $offset         = $packet->offset + 6;
+            $this->target   = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+        
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->target) > 0) {
+
+            $data = pack('nnn', $this->priority, $this->weight, $this->port);
+            $packet->offset += 6;
+
+            $data .= $packet->compress($this->target, $packet->offset);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+?>
diff --git a/include/pear/Net/DNS2/RR/SSHFP.php b/include/pear/Net/DNS2/RR/SSHFP.php
new file mode 100644
index 0000000000000000000000000000000000000000..13022a6b87bca94252108a285d0524b58484c141
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/SSHFP.php
@@ -0,0 +1,244 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: SSHFP.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * SSHFP Resource Record - RFC4255 section 3.1
+ *
+ *       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *      |   algorithm   |    fp type    |                               /
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               /
+ *      /                                                               /
+ *      /                          fingerprint                          /
+ *      /                                                               /
+ *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_SSHFP extends Net_DNS2_RR
+{
+    /*
+     * the algorithm used
+     */
+    public $algorithm;
+
+    /*
+     * The finger print type
+     */
+    public $fp_type;
+
+    /*
+     * the finger print data
+     */
+    public $fingerprint;
+
+    /*
+     * Algorithms
+     */
+    const SSHFP_ALGORITHM_RES   = 0;
+    const SSHFP_ALGORITHM_RSA   = 1;
+    const SSHFP_ALGORITHM_DSS   = 2;
+
+    /*
+     * Fingerprint Types
+     */
+    const SSHFP_FPTYPE_RES      = 0;
+    const SSHFP_FPTYPE_SHA1     = 1;
+
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->algorithm . ' ' . $this->fp_type . ' ' . $this->fingerprint;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // "The use of mnemonics instead of numbers is not allowed."
+        // 
+        // RFC4255 section 3.2
+        //
+        $algorithm      = array_shift($rdata);
+        $fp_type        = array_shift($rdata);
+        $fingerprint    = strtolower(implode('', $rdata));
+
+        //
+        // There are only two algorithm's defined 
+        //
+        if ( ($algorithm != self::SSHFP_ALGORITHM_RSA) 
+            && ($algorithm != self::SSHFP_ALGORITHM_DSS) 
+        ) {
+            return false;
+        }
+
+        //
+        // there's only one fingerprint type currently implemented, so if it's not
+        // that, then fail.
+        //
+        if ($fp_type != self::SSHFP_FPTYPE_SHA1) {
+            return false;
+        }
+
+        $this->algorithm    = $algorithm;
+        $this->fp_type      = $fp_type;
+        $this->fingerprint  = $fingerprint;
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the algorithm and finger print type
+            //
+            $x = unpack('Calgorithm/Cfp_type', $this->rdata);
+
+            $this->algorithm    = $x['algorithm'];
+            $this->fp_type      = $x['fp_type'];
+
+            //
+            // There are only two algorithm's defined 
+            //
+            if ( ($this->algorithm != self::SSHFP_ALGORITHM_RSA) 
+                && ($this->algorithm != self::SSHFP_ALGORITHM_DSS)
+            ) {
+                return false;
+            }
+
+            //
+            // there's only one fingerprint type currently implemented, 
+            // so if it's not that, then fail.
+            //
+            if ($this->fp_type != self::SSHFP_FPTYPE_SHA1) {
+                return false;
+            }
+            
+            //
+            // parse the finger print; this assumes SHA-1
+            //
+            $fp = unpack('H*a', substr($this->rdata, 2));
+            $this->fingerprint = strtolower($fp['a']);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->fingerprint) > 0) {
+
+            $data = pack(
+                'CCH*', $this->algorithm, $this->fp_type, $this->fingerprint
+            );
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/TA.php b/include/pear/Net/DNS2/RR/TA.php
new file mode 100644
index 0000000000000000000000000000000000000000..0253dbe52099ffc4826a1762ed626cc8fc8c34b9
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/TA.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2011 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: TA.php 130 2011-12-03 05:02:37Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.2.0
+ *
+ */
+
+/**
+ * The TA RR is implemented exactly like the DS record, so
+ * for now we just extend the DS RR and use it.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_TA extends Net_DNS2_RR_DS
+{
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/TALINK.php b/include/pear/Net/DNS2/RR/TALINK.php
new file mode 100644
index 0000000000000000000000000000000000000000..33e938c5144d76caed2903478ae4f4499fe35456
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/TALINK.php
@@ -0,0 +1,171 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2011 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: TALINK.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.2.0
+ *
+ */
+
+/**
+ * TALINK Resource Record - DNSSEC Trust Anchor
+ *
+ * http://tools.ietf.org/id/draft-ietf-dnsop-dnssec-trust-history-00.txt
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   PREVIOUS                    /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                     NEXT                      /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_TALINK extends Net_DNS2_RR
+{
+    /*
+     * the previous domain name
+     */
+    public $previous;
+
+    /*
+     * the next domain name
+     */
+    public $next;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cleanString($this->previous) . '. ' . 
+            $this->cleanString($this->next) . '.';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->previous = $this->cleanString($rdata[0]);
+        $this->next     = $this->cleanString($rdata[1]);
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $offset         = $packet->offset;
+
+            $this->previous = Net_DNS2_Packet::label($packet, $offset);
+            $this->next     = Net_DNS2_Packet::label($packet, $offset);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if ( (strlen($this->previous) > 0) || (strlen($this->next) > 0) ) {
+
+            $data = chr(strlen($this->previous)) . $this->previous . 
+                chr(strlen($this->next)) . $this->next;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/TKEY.php b/include/pear/Net/DNS2/RR/TKEY.php
new file mode 100644
index 0000000000000000000000000000000000000000..115b8bb39ac8fbed242bfce044519686dce6e13c
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/TKEY.php
@@ -0,0 +1,307 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: TKEY.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * TKEY Resource Record - RFC 2930 section 2
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   ALGORITHM                   / 
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   INCEPTION                   |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   EXPIRATION                  |
+ *    |                                               |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   MODE                        |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   ERROR                       |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   KEY SIZE                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   KEY DATA                    /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   OTHER SIZE                  |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   OTHER DATA                  /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_TKEY extends Net_DNS2_RR
+{
+    public $algorithm;
+    public $inception;
+    public $expiration;
+    public $mode;
+    public $error;
+    public $key_size;
+    public $key_data;
+    public $other_size;
+    public $other_data;
+
+    /*
+     * TSIG Modes
+     */
+    const TSIG_MODE_RES           = 0;
+    const TSIG_MODE_SERV_ASSIGN   = 1;
+    const TSIG_MODE_DH            = 2;
+    const TSIG_MODE_GSS_API       = 3;
+    const TSIG_MODE_RESV_ASSIGN   = 4;
+    const TSIG_MODE_KEY_DELE      = 5;
+
+    /*
+     * map the mod id's to names so we can validate
+     */
+    public $tsgi_mode_id_to_name = array(
+
+        self::TSIG_MODE_RES           => 'Reserved',
+        self::TSIG_MODE_SERV_ASSIGN   => 'Server Assignment',
+        self::TSIG_MODE_DH            => 'Diffie-Hellman',
+        self::TSIG_MODE_GSS_API       => 'GSS-API',
+        self::TSIG_MODE_RESV_ASSIGN   => 'Resolver Assignment',
+        self::TSIG_MODE_KEY_DELE      => 'Key Deletion'
+    );
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = $this->cleanString($this->algorithm) . '. ' . $this->mode;
+        if ($this->key_size > 0) {
+
+            $out .= ' ' . trim($this->key_data, '.') . '.';
+        } else {
+
+            $out .= ' .';
+        }
+
+        return $out;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // data passed in is assumed: <algorithm> <mode> <key>
+        //
+        $this->algorithm    = $this->cleanString(array_shift($rdata));
+        $this->mode         = array_shift($rdata);
+        $this->key_data     = trim(array_shift($rdata), '.');
+
+        //
+        // the rest of the data is set manually
+        //
+        $this->inception    = time();
+        $this->expiration   = time() + 86400; // 1 day
+        $this->error        = 0;
+        $this->key_size     = strlen($this->key_data);
+        $this->other_size   = 0;
+        $this->other_data   = '';
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+        
+            //
+            // expand the algorithm
+            //
+            $offset = $packet->offset;
+            $this->algorithm = Net_DNS2_Packet::expand($packet, $offset);
+            
+            //
+            // unpack inception, expiration, mode, error and key size
+            //
+            $x = unpack(
+                '@' . $offset . '/Ninception/Nexpiration/nmode/nerror/nkey_size', 
+                $packet->rdata
+            );
+
+            $this->inception    = Net_DNS2::expandUint32($x['inception']);
+            $this->expiration   = Net_DNS2::expandUint32($x['expiration']);
+            $this->mode         = $x['mode'];
+            $this->error        = $x['error'];
+            $this->key_size     = $x['key_size'];
+
+            $offset += 14;
+
+            //
+            // if key_size > 0, then copy out the key
+            //
+            if ($this->key_size > 0) {
+
+                $this->key_data = substr($packet->rdata, $offset, $this->key_size);
+                $offset += $this->key_size;
+            }
+
+            //
+            // unpack the other length
+            //
+            $x = unpack('@' . $offset . '/nother_size', $packet->rdata);
+            
+            $this->other_size = $x['other_size'];
+            $offset += 2;
+
+            //
+            // if other_size > 0, then copy out the data
+            //
+            if ($this->other_size > 0) {
+
+                $this->other_data = substr(
+                    $packet->rdata, $offset, $this->other_size
+                );
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->algorithm) > 0) {
+
+            //
+            // make sure the size values are correct
+            //
+            $this->key_size     = strlen($this->key_data);
+            $this->other_size   = strlen($this->other_data);
+
+            //
+            // add the algorithm without compression
+            //
+            $data = Net_DNS2_Packet::pack($this->algorithm);
+
+            //
+            // pack in the inception, expiration, mode, error and key size
+            //
+            $data .= pack(
+                'NNnnn', $this->inception, $this->expiration, 
+                $this->mode, 0, $this->key_size
+            );
+
+            //
+            // if the key_size > 0, then add the key
+            //
+            if ($this->key_size > 0) {
+            
+                $data .= $this->key_data;
+            }
+
+            //
+            // pack in the other size
+            //
+            $data .= pack('n', $this->other_size);
+            if ($this->other_size > 0) {
+
+                $data .= $this->other_data;
+            }
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/TLSA.php b/include/pear/Net/DNS2/RR/TLSA.php
new file mode 100644
index 0000000000000000000000000000000000000000..5eba7b5b19dc4a2909804c8fda0f6a2bbf330963
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/TLSA.php
@@ -0,0 +1,194 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2012, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2012 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: TLSA.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.2.5
+ *
+ */
+
+/**
+ * TLSA Resource Record - RFC 6698
+ *
+ *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Cert. Usage  |   Selector    | Matching Type |               /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               /
+ *  /                                                               /
+ *  /                 Certificate Association Data                  /
+ *  /                                                               /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_TLSA extends Net_DNS2_RR
+{
+    /*
+     * The Certificate Usage Field
+     */
+    public $cert_usage;
+
+    /*
+     * The Selector Field
+     */
+    public $selector;
+
+    /*
+     * The Matching Type Field
+     */
+    public $matching_type;
+
+    /*
+     * The Certificate Association Data Field
+     */
+    public $certificate;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->cert_usage . ' ' . $this->selector . ' ' . 
+            $this->matching_type . ' ' . base64_encode($this->certificate);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->cert_usage       = array_shift($rdata);
+        $this->selector         = array_shift($rdata);
+        $this->matching_type    = array_shift($rdata);
+        $this->certificate      = base64_decode(implode('', $rdata));
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // unpack the format, keytag and algorithm
+            //
+            $x = unpack('Cusage/Cselector/Ctype', $this->rdata);
+
+            $this->cert_usage       = $x['usage'];
+            $this->selector         = $x['selector'];
+            $this->matching_type    = $x['type'];
+
+            //
+            // copy the certificate
+            //
+            $this->certificate  = substr($this->rdata, 3, $this->rdlength - 3);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->certificate) > 0) {
+
+            $data = pack(
+                'CCC', $this->cert_usage, $this->selector, $this->matching_type
+            ) . $this->certificate;
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/TSIG.php b/include/pear/Net/DNS2/RR/TSIG.php
new file mode 100644
index 0000000000000000000000000000000000000000..472107585b3c5cb27d63c9223088dbb8dcc27298
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/TSIG.php
@@ -0,0 +1,504 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: TSIG.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * TSIG Resource Record - RFC 2845
+ *
+ *      0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     /                          algorithm                            /
+ *     /                                                               /
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |                          time signed                          |
+ *     |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |                               |              fudge            |
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |            mac size           |                               /
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               /
+ *     /                              mac                              /
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |           original id         |              error            |
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *     |          other length         |                               /
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               /
+ *     /                          other data                           /
+ *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_TSIG extends Net_DNS2_RR
+{
+    /*
+     * TSIG Algorithm Identifiers
+     */
+    const HMAC_MD5      = 'hmac-md5.sig-alg.reg.int';   // RFC 2845, required
+    const GSS_TSIG      = 'gss-tsig';                   // unsupported, optional
+    const HMAC_SHA1     = 'hmac-sha1';                  // RFC 4635, required
+    const HMAC_SHA224   = 'hmac-sha224';                // RFC 4635, optional
+    const HMAC_SHA256   = 'hmac-sha256';                // RFC 4635, required
+    const HMAC_SHA384   = 'hmac-sha384';                // RFC 4635, optional
+    const HMAC_SHA512   = 'hmac-sha512';                // RFC 4635, optional
+
+    /*
+     * the map of hash values to names
+     */
+    public static $hash_algorithms = array(
+
+        self::HMAC_MD5      => 'md5',
+        self::HMAC_SHA1     => 'sha1',
+        self::HMAC_SHA224   => 'sha224',
+        self::HMAC_SHA256   => 'sha256',
+        self::HMAC_SHA384   => 'sha384',
+        self::HMAC_SHA512   => 'sha512'
+    );
+
+    /*
+     * algorithm used; only supports HMAC-MD5
+     */
+    public $algorithm;
+
+    /*
+     * The time it was signed
+     */
+    public $time_signed;
+
+    /*
+     * fudge- allowed offset from the time signed
+     */
+    public $fudge;
+
+    /*
+     * size of the digest
+     */
+    public $mac_size;
+
+    /*
+     * the digest data
+     */
+    public $mac;
+
+    /*
+     * the original id of the request
+     */
+    public $original_id;
+
+    /*
+     * additional error code
+     */
+    public $error;
+
+    /*
+     * length of the "other" data, should only ever be 0 when there is
+     * no error, or 6 when there is the error RCODE_BADTIME
+     */
+    public $other_length;
+
+    /*
+     * the other data; should only ever be a timestamp when there is the
+     * error RCODE_BADTIME
+     */
+    public $other_data;
+
+    /*
+     * the key to use for signing - passed in, not included in the rdata
+     */
+    public $key;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $out = $this->cleanString($this->algorithm) . '. ' . 
+            $this->time_signed . ' ' . 
+            $this->fudge . ' ' . $this->mac_size . ' ' .
+            base64_encode($this->mac) . ' ' . $this->original_id . ' ' . 
+            $this->error . ' '. $this->other_length;
+
+        if ($this->other_length > 0) {
+
+            $out .= ' ' . $this->other_data;
+        }
+
+        return $out;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        //
+        // the only value passed in is the key-
+        //
+        // this assumes it's passed in base64 encoded.
+        //
+        $this->key = preg_replace('/\s+/', '', array_shift($rdata));
+
+        //
+        // the rest of the data is set to default
+        //
+        $this->algorithm    = self::HMAC_MD5;
+        $this->time_signed  = time();
+        $this->fudge        = 300;
+        $this->mac_size     = 0;
+        $this->mac          = '';
+        $this->original_id  = 0;
+        $this->error        = 0;
+        $this->other_length = 0;
+        $this->other_data   = '';
+
+        //
+        // per RFC 2845 section 2.3
+        //
+        $this->class        = 'ANY';
+        $this->ttl          = 0;
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // expand the algorithm
+            //
+            $newoffset          = $packet->offset;
+            $this->algorithm    = Net_DNS2_Packet::expand($packet, $newoffset);
+            $offset             = $newoffset - $packet->offset;
+
+            //
+            // unpack time, fudge and mac_size
+            //
+            $x = unpack(
+                '@' . $offset . '/ntime_high/Ntime_low/nfudge/nmac_size', 
+                $this->rdata
+            );
+
+            $this->time_signed  = Net_DNS2::expandUint32($x['time_low']);
+            $this->fudge        = $x['fudge'];
+            $this->mac_size     = $x['mac_size'];
+
+            $offset += 10;
+
+            //
+            // copy out the mac
+            //
+            if ($this->mac_size > 0) {
+            
+                $this->mac = substr($this->rdata, $offset, $this->mac_size);
+                $offset += $this->mac_size;
+            }
+
+            //
+            // unpack the original id, error, and other_length values
+            //
+            $x = unpack(
+                '@' . $offset . '/noriginal_id/nerror/nother_length', 
+                $this->rdata
+            );
+        
+            $this->original_id  = $x['original_id'];
+            $this->error        = $x['error'];
+            $this->other_length = $x['other_length'];
+
+            //
+            // the only time there is actually any "other data", is when there's
+            // a BADTIME error code.
+            //
+            // The other length should be 6, and the other data field includes the
+            // servers current time - per RFC 2845 section 4.5.2
+            //
+            if ($this->error == Net_DNS2_Lookups::RCODE_BADTIME) {
+
+                if ($this->other_length != 6) {
+
+                    return false;
+                }
+
+                //
+                // other data is a 48bit timestamp
+                //
+                $x = unpack(
+                    'nhigh/nlow', 
+                    substr($this->rdata, $offset + 6, $this->other_length)
+                );
+                $this->other_data = $x['low'];
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->key) > 0) {
+
+            //
+            // create a new packet for the signature-
+            //
+            $new_packet = new Net_DNS2_Packet_Request('example.com', 'SOA', 'IN');
+
+            //
+            // copy the packet data over
+            //
+            $new_packet->copy($packet);
+
+            //
+            // remove the TSIG object from the additional list
+            //
+            array_pop($new_packet->additional);
+            $new_packet->header->arcount = count($new_packet->additional);
+
+            //
+            // copy out the data
+            //
+            $sig_data = $new_packet->get();
+
+            //
+            // add the name without compressing
+            //
+            $sig_data .= Net_DNS2_Packet::pack($this->name);
+
+            //
+            // add the class and TTL
+            //
+            $sig_data .= pack(
+                'nN', Net_DNS2_Lookups::$classes_by_name[$this->class], $this->ttl
+            );
+
+            //
+            // add the algorithm name without compression
+            //
+            $sig_data .= Net_DNS2_Packet::pack(strtolower($this->algorithm));
+
+            //
+            // add the rest of the values
+            //
+            $sig_data .= pack(
+                'nNnnn', 0, $this->time_signed, $this->fudge, 
+                $this->error, $this->other_length
+            );
+            if ($this->other_length > 0) {
+
+                $sig_data .= pack('nN', 0, $this->other_data);
+            }
+
+            //
+            // sign the data
+            //
+            $this->mac = $this->_signHMAC(
+                $sig_data, base64_decode($this->key), $this->algorithm
+            );
+            $this->mac_size = strlen($this->mac);
+
+            //
+            // compress the algorithm
+            //
+            $data = Net_DNS2_Packet::pack(strtolower($this->algorithm));
+
+            //
+            // pack the time, fudge and mac size
+            //
+            $data .= pack(
+                'nNnn', 0, $this->time_signed, $this->fudge, $this->mac_size
+            );
+            $data .= $this->mac;
+
+            //
+            // check the error and other_length
+            //
+            if ($this->error == Net_DNS2_Lookups::RCODE_BADTIME) {
+
+                $this->other_length = strlen($this->other_data);
+                if ($this->other_length != 6) {
+
+                    return null;
+                }
+            } else {
+
+                $this->other_length = 0;
+                $this->other_data = '';
+            }
+
+            //
+            // pack the id, error and other_length
+            //
+            $data .= pack(
+                'nnn', $packet->header->id, $this->error, $this->other_length
+            );
+            if ($this->other_length > 0) {
+
+                $data .= pack('nN', 0, $this->other_data);
+            }
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+
+    /**
+     * signs the given data with the given key, and returns the result
+     *
+     * @param string $data      the data to sign
+     * @param string $key       key to use for signing
+     * @param string $algorithm the algorithm to use; defaults to MD5
+     *
+     * @return string the signed digest
+     * @throws Net_DNS2_Exception
+     * @access private
+     *
+     */
+    private function _signHMAC($data, $key = null, $algorithm = self::HMAC_MD5)
+    {
+        //
+        // use the hash extension; this is included by default in >= 5.1.2 which
+        // is our dependent version anyway- so it's easy to switch to it.
+        //
+        if (extension_loaded('hash')) {
+
+            if (!isset(self::$hash_algorithms[$algorithm])) {
+
+                throw new Net_DNS2_Exception(
+                    'invalid or unsupported algorithm',
+                    Net_DNS2_Lookups::E_PARSE_ERROR
+                );
+            }
+
+            return hash_hmac(self::$hash_algorithms[$algorithm], $data, $key, true);
+        }
+
+        //
+        // if the hash extension isn't loaded, and they selected something other
+        // than MD5, throw an exception
+        //
+        if ($algorithm != self::HMAC_MD5) {
+
+            throw new Net_DNS2_Exception(
+                'only HMAC-MD5 supported. please install the php-extension ' .
+                '"hash" in order to use the sha-family',
+                Net_DNS2_Lookups::E_PARSE_ERROR
+            );
+        }
+
+        //
+        // otherwise, do it ourselves
+        //
+        if (is_null($key)) {
+
+            return pack('H*', md5($data));
+        }
+
+        $key = str_pad($key, 64, chr(0x00));
+        if (strlen($key) > 64) {
+    
+            $key = pack('H*', md5($key));
+        }
+
+        $k_ipad = $key ^ str_repeat(chr(0x36), 64);
+        $k_opad = $key ^ str_repeat(chr(0x5c), 64);
+
+        return $this->_signHMAC(
+            $k_opad . pack('H*', md5($k_ipad . $data)), null, $algorithm
+        );
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/TXT.php b/include/pear/Net/DNS2/RR/TXT.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e86ce7e35415818a726e4b0da8372fcac930a93
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/TXT.php
@@ -0,0 +1,177 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: TXT.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * TXT Resource Record - RFC1035 section 3.3.14
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                   TXT-DATA                    /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_TXT extends Net_DNS2_RR
+{
+    /*
+     * an array of the text strings
+     */
+    public $text = array();
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        if (count($this->text) == 0) {
+            return '""';
+        }
+
+        $data = '';
+
+        foreach ($this->text as $t) {
+
+            $data .= $this->formatString($t) . ' ';
+        }
+
+        return trim($data);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $data = $this->buildString($rdata);
+        if (count($data) > 0) {
+
+            $this->text = $data;
+        }
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+            
+            $length = $packet->offset + $this->rdlength;
+            $offset = $packet->offset;
+
+            while ($length > $offset) {
+
+                $this->text[] = Net_DNS2_Packet::label($packet, $offset);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        $data = null;
+
+        foreach ($this->text as $t) {
+
+            $data .= chr(strlen($t)) . $t;
+        }
+
+        $packet->offset += strlen($data);
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/URI.php b/include/pear/Net/DNS2/RR/URI.php
new file mode 100644
index 0000000000000000000000000000000000000000..aef788b823d8be9e641d0ac041b4b89ee6fcf09e
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/URI.php
@@ -0,0 +1,183 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates.
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2011, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors
+ *     may be used to endorse or promote products derived from this
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2011 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: URI.php 132 2011-12-03 05:28:54Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.2.0
+ *
+ */
+
+/**
+ * URI Resource Record - http://tools.ietf.org/html/draft-faltstrom-uri-06
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                   PRIORITY                    |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    |                    WEIGHT                     |
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                    TARGET                     /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_URI extends Net_DNS2_RR
+{
+    /*
+     * The priority of this target host.
+     */
+    public $priority;
+
+    /*
+     * a relative weight for entries with the same priority
+     */
+    public $weight;
+
+    /*
+      * The domain name of the target host
+     */
+    public $target;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        //
+        // presentation format has double quotes (") around the target.
+        //
+        return $this->priority . ' ' . $this->weight . ' "' . 
+            $this->cleanString($this->target) . '"';
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->priority = $rdata[0];
+        $this->weight   = $rdata[1];
+
+        //
+        // make sure to trim the lead/trailing double quote if it's there.
+        //
+        $this->target   = trim($this->cleanString($rdata[2]), '"');
+        
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+            
+            //
+            // unpack the priority and weight
+            //
+            $x = unpack('npriority/nweight', $this->rdata);
+
+            $this->priority = $x['priority'];
+            $this->weight   = $x['weight'];
+
+            $offset         = $packet->offset + 4;
+            $this->target   = Net_DNS2_Packet::expand($packet, $offset);
+
+            return true;
+        }
+        
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->target) > 0) {
+
+            $data = pack('nn', $this->priority, $this->weight);
+            $packet->offset += 4;
+
+            $data .= $packet->compress(trim($this->target, '"'), $packet->offset);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+?>
diff --git a/include/pear/Net/DNS2/RR/WKS.php b/include/pear/Net/DNS2/RR/WKS.php
new file mode 100644
index 0000000000000000000000000000000000000000..437eb52ed7c09708dad044d74bf810d2616d626c
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/WKS.php
@@ -0,0 +1,235 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: WKS.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 1.0.1
+ *
+ */
+
+/**
+ * WKS Resource Record - RFC1035 section 3.4.2
+ *
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   |                    ADDRESS                    |
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *   |       PROTOCOL        |                       |
+ *   +--+--+--+--+--+--+--+--+                       |
+ *   |                                               |
+ *   /                   <BIT MAP>                   /
+ *   /                                               /
+ *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_WKS extends Net_DNS2_RR
+{
+    /*
+     * The IP address of the service
+     */
+    public $address;
+
+    /*
+     * The protocol of the service
+     */
+    public $protocol;
+
+    /*
+     * bitmap
+     */
+    public $bitmap = array();
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        $data = $this->address . ' ' . $this->protocol;
+
+        foreach ($this->bitmap as $port) {
+            $data .= ' ' . $port;
+        }
+
+        return $data;
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $this->address  = strtolower(trim(array_shift($rdata), '.'));
+        $this->protocol = array_shift($rdata);
+        $this->bitmap   = $rdata;
+
+        return true;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            //
+            // get the address and protocol value
+            //
+            $x = unpack('Naddress/Cprotocol', $this->rdata);
+
+            $this->address  = long2ip($x['address']);
+            $this->protocol = $x['protocol'];
+
+            //
+            // unpack the port list bitmap
+            //
+            $port = 0;
+            foreach (unpack('@5/C*', $this->rdata) as $set) {
+
+                $s = sprintf('%08b', $set);
+
+                for ($i=0; $i<8; $i++, $port++) {
+                    if ($s[$i] == '1') {
+                        $this->bitmap[] = $port;
+                    }
+                }
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->address) > 0) {
+
+            $data = pack('NC', ip2long($this->address), $this->protocol);
+
+            $ports = array();
+
+            $n = 0;
+            foreach ($this->bitmap as $port) {
+                $ports[$port] = 1;
+
+                if ($port > $n) {
+                    $n = $port;
+                }
+            }
+            for ($i=0; $i<ceil($n/8)*8; $i++) {
+                if (!isset($ports[$i])) {
+                    $ports[$i] = 0;
+                }
+            }
+
+            ksort($ports);
+
+            $string = '';
+            $n = 0;
+
+            foreach ($ports as $s) {
+
+                $string .= $s;
+                $n++;
+
+                if ($n == 8) {
+
+                    $data .= chr(bindec($string));
+                    $string = '';
+                    $n = 0;
+                }
+            }
+
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+
+        return null;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/RR/X25.php b/include/pear/Net/DNS2/RR/X25.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1e6cfde43bd5f0e5fa54d9387e3f22e0cf9e3ef
--- /dev/null
+++ b/include/pear/Net/DNS2/RR/X25.php
@@ -0,0 +1,160 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: X25.php 179 2012-11-23 05:49:01Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * X25 Resource Record - RFC1183 section 3.1
+ *
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *    /                  PSDN-address                 /
+ *    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_RR
+ *
+ */
+class Net_DNS2_RR_X25 extends Net_DNS2_RR
+{
+    /*
+     * The PSDN address
+      */
+    public $psdnaddress;
+
+    /**
+     * method to return the rdata portion of the packet as a string
+     *
+     * @return  string
+     * @access  protected
+     *
+     */
+    protected function rrToString()
+    {
+        return $this->formatString($this->psdnaddress);
+    }
+
+    /**
+     * parses the rdata portion from a standard DNS config line
+     *
+     * @param array $rdata a string split line of values for the rdata
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrFromString(array $rdata)
+    {
+        $data = $this->buildString($rdata);
+        if (count($data) == 1) {
+
+            $this->psdnaddress = $data[0];
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * parses the rdata of the Net_DNS2_Packet object
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet to parse the RR from
+     *
+     * @return boolean
+     * @access protected
+     *
+     */
+    protected function rrSet(Net_DNS2_Packet &$packet)
+    {
+        if ($this->rdlength > 0) {
+
+            $this->psdnaddress = Net_DNS2_Packet::label($packet, $packet->offset);
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * returns the rdata portion of the DNS packet
+     *
+     * @param Net_DNS2_Packet &$packet a Net_DNS2_Packet packet use for
+     *                                 compressed names
+     *
+     * @return mixed                   either returns a binary packed
+     *                                 string or null on failure
+     * @access protected
+     *
+     */
+    protected function rrGet(Net_DNS2_Packet &$packet)
+    {
+        if (strlen($this->psdnaddress) > 0) {
+
+            $data = chr(strlen($this->psdnaddress)) . $this->psdnaddress;
+            
+            $packet->offset += strlen($data);
+
+            return $data;
+        }
+        
+        return null; 
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Resolver.php b/include/pear/Net/DNS2/Resolver.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdb99e04d25277d3f32a064ff8904ee1b9c506db
--- /dev/null
+++ b/include/pear/Net/DNS2/Resolver.php
@@ -0,0 +1,332 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Resolver.php 191 2013-04-07 23:28:20Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * This is the main resolver class, providing DNS query functions.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2
+ *
+ */
+class Net_DNS2_Resolver extends Net_DNS2
+{
+    /**
+     * Constructor - creates a new Net_DNS2_Resolver object
+     *
+     * @param mixed $options either an array with options or null
+     *
+     * @access public
+     *
+     */
+    public function __construct(array $options = null)
+    {
+        parent::__construct($options);
+    }
+
+    /**
+     * does a basic DNS lookup query
+     *
+     * @param string $name  the DNS name to loookup
+     * @param string $type  the name of the RR type to lookup
+     * @param string $class the name of the RR class to lookup
+     *
+     * @return Net_DNS_RR object
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function query($name, $type = 'A', $class = 'IN')
+    {
+        //
+        // make sure we have some name servers set
+        //
+        $this->checkServers(Net_DNS2::RESOLV_CONF);
+
+        //
+        // we dont' support incremental zone tranfers; so if it's requested, a full
+        // zone transfer can be returned
+        //
+        if ($type == 'IXFR') {
+
+            $type = 'AXFR';
+        }
+
+        //
+        // if the name *looks* too short, then append the domain from the config
+        //
+        if ( (strpos($name, '.') === false) && ($type != 'PTR') ) {
+
+            $name .= '.' . strtolower($this->domain);
+        }
+
+        //
+        // create a new packet based on the input
+        //
+        $packet = new Net_DNS2_Packet_Request($name, $type, $class);
+
+        //
+        // check for an authentication method; either TSIG or SIG
+        //
+        if (   ($this->auth_signature instanceof Net_DNS2_RR_TSIG)
+            || ($this->auth_signature instanceof Net_DNS2_RR_SIG)
+        ) {
+            $packet->additional[]       = $this->auth_signature;
+            $packet->header->arcount    = count($packet->additional);
+        }
+
+        //
+        // check for the DNSSEC flag, and if it's true, then add an OPT
+        // RR to the additional section, and set the DO flag to 1.
+        //
+        if ($this->dnssec == true) {
+
+            //
+            // create a new OPT RR
+            //
+            $opt = new Net_DNS2_RR_OPT();
+
+            //
+            // set the DO flag, and the other values
+            //
+            $opt->do = 1;
+            $opt->class = $this->dnssec_payload_size;
+
+            //
+            // add the RR to the additional section.
+            //
+            $packet->additional[] = $opt;
+            $packet->header->arcount = count($packet->additional);
+        }
+
+        //
+        // set the DNSSEC AD or CD bits
+        //
+        if ($this->dnssec_ad_flag == true) {
+
+            $packet->header->ad = 1;
+        }
+        if ($this->dnssec_cd_flag == true) {
+
+            $packet->header->cd = 1;
+        }
+
+        //
+        // if caching is turned on, then check then hash the question, and
+        // do a cache lookup.
+        //
+        // don't use the cache for zone transfers
+        //
+        $packet_hash = '';
+
+        if ( ($this->use_cache == true) && ($this->cacheable($type) == true) ) {
+
+            //
+            // open the cache
+            //
+            $this->cache->open(
+                $this->cache_file, $this->cache_size, $this->cache_serializer
+            );
+
+            //
+            // build the key and check for it in the cache.
+            //
+            $packet_hash = md5(
+                $packet->question[0]->qname . '|' . $packet->question[0]->qtype
+            );
+
+            if ($this->cache->has($packet_hash)) {
+
+                return $this->cache->get($packet_hash);
+            }
+        }
+
+        //
+        // set the RD (recursion desired) bit to 1 / 0 depending on the config
+        // setting.
+        //
+        if ($this->recurse == false) {
+            $packet->header->rd = 0;
+        } else {
+            $packet->header->rd = 1;
+        }
+
+        //
+        // send the packet and get back the response
+        //
+        // *always* use TCP for zone transfers- does this cause any problems?
+        //
+        $response = $this->sendPacket(
+            $packet, ($type == 'AXFR') ? true : $this->use_tcp
+        );
+
+        //
+        // if strict mode is enabled, then make sure that the name that was
+        // looked up is *actually* in the response object.
+        //
+        // only do this is strict_query_mode is turned on, AND we've received
+        // some answers; no point doing any else if there were no answers.
+        //
+        if ( ($this->strict_query_mode == true) 
+            && ($response->header->ancount > 0) 
+        ) {
+
+            $found = false;
+
+            //
+            // look for the requested name/type/class
+            //
+            foreach ($response->answer as $index => $object) {
+
+                if ( (strcasecmp($object->name, $name) == 0)
+                    && ($object->type == $type)
+                    && ($object->class == $class)
+                ) {
+                    $found = true;
+                    break;
+                }
+            }
+
+            //
+            // if it's not found, then unset the answer section; it's not correct to
+            // throw an exception here; if the hostname didn't exist, then 
+            // sendPacket() would have already thrown an NXDOMAIN error- so the host 
+            // *exists*, but just not the request type/class.
+            //
+            // the correct response in this case, is an empty answer section; the
+            // authority section may still have usual information, like a SOA record.
+            //
+            if ($found == false) {
+                
+                $response->answer = array();
+                $response->header->ancount = 0;
+            }
+        }
+
+        //
+        // cache the response object
+        //
+        if ( ($this->use_cache == true) && ($this->cacheable($type) == true) ) {
+
+            $this->cache->put($packet_hash, $response);
+        }
+
+        return $response;
+    }
+
+    /**
+     * does an inverse query for the given RR; most DNS servers do not implement 
+     * inverse queries, but they should be able to return "not implemented"
+     *
+     * @param Net_DNS2_RR $rr the RR object to lookup
+     * 
+     * @return Net_DNS_RR object
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function iquery(Net_DNS2_RR $rr)
+    {
+        //
+        // make sure we have some name servers set
+        //
+        $this->checkServers(Net_DNS2::RESOLV_CONF);
+
+        //
+        // create an empty packet
+        //
+        $packet = new Net_DNS2_Packet_Request($rr->name, 'A', 'IN');
+
+        //
+        // unset the question
+        //
+        $packet->question = array();
+        $packet->header->qdcount = 0;
+
+        //
+        // set the opcode to IQUERY
+        //
+        $packet->header->opcode = Net_DNS2_Lookups::OPCODE_IQUERY;
+
+        //
+        // add the given RR as the answer
+        //
+        $packet->answer[] = $rr;
+        $packet->header->ancount = 1;
+
+        //
+        // check for an authentication method; either TSIG or SIG
+        //
+        if (   ($this->auth_signature instanceof Net_DNS2_RR_TSIG)
+            || ($this->auth_signature instanceof Net_DNS2_RR_SIG)
+        ) {
+            $packet->additional[]       = $this->auth_signature;
+            $packet->header->arcount    = count($packet->additional);
+        }
+
+        //
+        // send the packet and get back the response
+        //
+        return $this->sendPacket($packet, $this->use_tcp);
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Socket.php b/include/pear/Net/DNS2/Socket.php
new file mode 100644
index 0000000000000000000000000000000000000000..090d2cbee45496478ee5aa31a9378eeb6878c585
--- /dev/null
+++ b/include/pear/Net/DNS2/Socket.php
@@ -0,0 +1,189 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Socket.php 176 2012-11-16 02:14:09Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/*
+ * check to see if the socket defines exist; if they don't, then define them
+ */
+if (defined('SOCK_STREAM') == false) {
+    define('SOCK_STREAM', 1);
+}
+if (defined('SOCK_DGRAM') == false) {
+    define('SOCK_DGRAM', 2);
+}
+
+/**
+ * This is the abstract base class for the two sockets classes; this simply
+ * provides the class definition for the two sockets classes.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Socket_Sockets, Net_DNS2_Socket_Streams
+ *
+ */
+abstract class Net_DNS2_Socket
+{
+    protected $sock;
+    protected $type;
+    protected $host;
+    protected $port;
+    protected $timeout;
+
+    protected $local_host;
+    protected $local_port;
+
+    public $last_error;
+
+    /*
+     * type of sockets
+     */
+    const SOCK_STREAM   = SOCK_STREAM;
+    const SOCK_DGRAM    = SOCK_DGRAM;
+
+    /**   
+     * constructor - set the port details
+     *
+     * @param integer $type    the socket type
+     * @param string  $host    the IP address of the DNS server to connect to
+     * @param integer $port    the port of the DNS server to connect to
+     * @param integer $timeout the timeout value to use for socket functions
+     *
+     * @access public
+     *       
+     */
+    public function __construct($type, $host, $port, $timeout)
+    {
+        $this->type     = $type;
+        $this->host     = $host;
+        $this->port     = $port;
+        $this->timeout  = $timeout;
+    }
+
+    /**
+     * destructor
+     *
+     * @access public
+     */
+    public function __destruct()
+    {
+        $this->close();
+    }
+
+    /**   
+     * sets the local address/port for the socket to bind to
+     *
+     * @param string $address the local IP address to bind to
+     * @param mixed  $port    the local port to bind to, or 0 to let the socket
+     *                        function select a port
+     *
+     * @return boolean
+     * @access public
+     *       
+     */
+    public function bindAddress($address, $port = 0)
+    {
+        $this->local_host = $address;
+        $this->local_port = $port;
+
+        return true;
+    }
+
+    /**
+     * opens a socket connection to the DNS server
+     *     
+     * @return boolean
+     * @access public
+     *
+     */
+    abstract public function open();
+
+    /**
+     * closes a socket connection to the DNS server  
+     *
+     * @return boolean
+     * @access public
+     *     
+     */
+    abstract public function close();
+
+    /**
+     * writes the given string to the DNS server socket
+     *
+     * @param string $data a binary packed DNS packet
+     *   
+     * @return boolean
+     * @access public
+     *
+     */
+    abstract public function write($data);
+
+    /**   
+     * reads a response from a DNS server
+     *
+     * @param integer &$size the size of the DNS packet read is passed back
+     *
+     * @return mixed         returns the data on success and false on error
+     * @access public
+     *       
+     */
+    abstract public function read(&$size);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Socket/Sockets.php b/include/pear/Net/DNS2/Socket/Sockets.php
new file mode 100644
index 0000000000000000000000000000000000000000..e17c73a9ae88aa9bf4e87433aefa33d05fd36243
--- /dev/null
+++ b/include/pear/Net/DNS2/Socket/Sockets.php
@@ -0,0 +1,370 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Sockets.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * Socket handling class using the PHP sockets extension
+ *
+ * The sockets extension is faster than the stream functions in PHP, but it's
+ * not standard. So if the extension is loaded, then this class is used, if
+ * it's not, then the Net_DNS2_Socket_Streams class is used.
+ *
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Socket
+ *
+ */
+class Net_DNS2_Socket_Sockets extends Net_DNS2_Socket
+{
+    /**
+     * opens a socket connection to the DNS server
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function open()
+    {
+        //
+        // create the socket
+        //
+        if (Net_DNS2::isIPv4($this->host) == true) {
+
+            $this->sock = @socket_create(
+                AF_INET, $this->type, 
+                ($this->type == Net_DNS2_Socket::SOCK_STREAM) ? SOL_TCP : SOL_UDP
+            );
+
+        } else if (Net_DNS2::isIPv6($this->host) == true) {
+        
+            $this->sock = @socket_create(
+                AF_INET6, $this->type, 
+                ($this->type == Net_DNS2_Socket::SOCK_STREAM) ? SOL_TCP : SOL_UDP
+            );
+
+        } else {
+
+            $this->last_error = 'invalid address type: ' . $this->host;
+            return false;
+        }
+
+        if ($this->sock === false) {
+
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+        }
+
+        @socket_set_option($this->sock, SOL_SOCKET, SO_REUSEADDR, 1);
+
+        //
+        // bind to a local IP/port if it's set
+        //
+        if (strlen($this->local_host) > 0) {
+
+            $result = @socket_bind(
+                $this->sock, $this->local_host, 
+                ($this->local_port > 0) ? $this->local_port : null
+            );
+            if ($result === false) {
+
+                $this->last_error = socket_strerror(socket_last_error());
+                return false;
+            }
+        }
+
+        //
+        // mark the socket as non-blocking
+        //
+        if (@socket_set_nonblock($this->sock) === false) {
+
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+        }
+
+        //
+        // connect to the socket; don't check for status here, we'll check it on the
+        // socket_select() call so we can handle timeouts properly
+        //
+        @socket_connect($this->sock, $this->host, $this->port);
+
+        $read   = null;
+        $write  = array($this->sock);
+        $except = null;
+
+        //
+        // select on write to check if the call to connect worked
+        //
+        switch(@socket_select($read, $write, $except, $this->timeout)) {
+        case false:
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+            break;
+
+        case 0:
+            return false;
+            break;
+            
+        default:
+            ;
+        }
+
+        return true;
+    }
+
+    /**
+     * closes a socket connection to the DNS server
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function close()
+    {
+        if (is_resource($this->sock) === true) {
+
+            @socket_close($this->sock);
+        }
+        return true;
+    }
+
+    /**
+     * writes the given string to the DNS server socket
+     *
+     * @param string $data a binary packed DNS packet
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function write($data)
+    {
+        $length = strlen($data);
+        if ($length == 0) {
+
+            $this->last_error = 'empty data on write()';
+            return false;
+        }
+
+        $read   = null;
+        $write  = array($this->sock);
+        $except = null;
+
+        //
+        // select on write
+        //
+        switch(@socket_select($read, $write, $except, $this->timeout)) {
+        case false:
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+            break;
+
+        case 0:
+            return false;
+            break;
+
+        default:
+            ;
+        }
+
+        //
+        // if it's a TCP socket, then we need to packet and send the length of the
+        // data as the first 16bit of data.
+        //
+        if ($this->type == Net_DNS2_Socket::SOCK_STREAM) {
+
+            $s = chr($length >> 8) . chr($length);
+
+            if (@socket_write($this->sock, $s) === false) {
+
+                $this->last_error = socket_strerror(socket_last_error());
+                return false;
+            }
+        }
+
+        //
+        // write the data to the socket
+        //
+        $size = @socket_write($this->sock, $data);
+        if ( ($size === false) || ($size != $length) ) {
+
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * reads a response from a DNS server
+     *
+     * @param integer &$size the size of the DNS packet read is passed back
+     *
+     * @return mixed         returns the data on success and false on error
+     * @access public
+     *
+     */
+    public function read(&$size)
+    {
+        $read   = array($this->sock);
+        $write  = null;
+        $except = null;
+
+        //
+        // make sure our socket is non-blocking
+        //
+        if (@socket_set_nonblock($this->sock) === false) {
+    
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+        }
+
+        //
+        // select on read
+        //
+        switch(@socket_select($read, $write, $except, $this->timeout)) {
+        case false:
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+            break;
+
+        case 0:
+            return false;
+            break;
+            
+        default:
+            ;
+        }
+    
+        $data = '';
+        $length = Net_DNS2_Lookups::DNS_MAX_UDP_SIZE;
+
+        //
+        // if it's a TCP socket, then the first two bytes is the length of the DNS
+        // packet- we need to read that off first, then use that value for the 
+        // packet read.
+        //
+        if ($this->type == Net_DNS2_Socket::SOCK_STREAM) {
+
+            if (($size = @socket_recv($this->sock, $data, 2, 0)) === false) {
+
+                $this->last_error = socket_strerror(socket_last_error());
+                return false;
+            }
+
+            $length = ord($data[0]) << 8 | ord($data[1]);
+            if ($length < Net_DNS2_Lookups::DNS_HEADER_SIZE) {
+
+                return false;
+            }
+        }
+
+        //
+        // at this point, we know that there is data on the socket to be read,
+        // because we've already extracted the length from the first two bytes.
+        //
+        // so the easiest thing to do, is just turn off socket blocking, and
+        // wait for the data.
+        //
+        if (@socket_set_block($this->sock) === false) {
+    
+            $this->last_error = socket_strerror(socket_last_error());
+            return false;
+        }
+
+        //
+        // read the data from the socket
+        //
+        // loop while reading since some OS's (specifically Win < 2003) don't support
+        // MSG_WAITALL properly, so they may return with less data than is available.
+        //
+        // According to M$, XP and below don't support MSG_WAITALL at all; and there
+        // also seems to be some issue in 2003 and 2008 where the MSG_WAITALL is 
+        // defined as 0, but if you actually pass 8 (which is the correct defined 
+        // value), it works as it's supposed to- so in these cases, it's just the 
+        // define that's incorrect- this is likely a PHP issue.
+        //
+        $data = '';
+        $size = 0;
+
+        while (1) {
+
+            $chunk_size = @socket_recv($this->sock, $chunk, $length, MSG_WAITALL);
+            if ($chunk_size === false) {
+
+                $size = $chunk_size;
+                $this->last_error = socket_strerror(socket_last_error());
+
+                return false;
+            }
+
+            $data .= $chunk;
+            $size += $chunk_size;
+
+            $length -= $chunk_size;
+            if ( ($length <= 0) || ($this->type == Net_DNS2_Socket::SOCK_DGRAM) ) {
+                break;
+            }
+        }
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Socket/Streams.php b/include/pear/Net/DNS2/Socket/Streams.php
new file mode 100644
index 0000000000000000000000000000000000000000..08a09704a9a940d13b4c6b605af4bf1f0608e687
--- /dev/null
+++ b/include/pear/Net/DNS2/Socket/Streams.php
@@ -0,0 +1,393 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Streams.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * Socket handling class using the PHP Streams
+ *
+ * The sockets extension is faster than the stream functions in PHP, but it's
+ * not standard. So if the extension is loaded, then the Net_DNS_Socket_Sockets
+ * class it used, otherwise, this class it used.
+ *   
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2_Socket
+ *
+ */
+class Net_DNS2_Socket_Streams extends Net_DNS2_Socket
+{
+    private $_context;
+
+    /**
+     * opens a socket connection to the DNS server
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function open()
+    {
+        //
+        // create a list of options for the context 
+        //
+        $opts = array('socket' => array());
+        
+        //
+        // bind to a local IP/port if it's set
+        //
+        if (strlen($this->local_host) > 0) {
+
+            $opts['socket']['bindto'] = $this->local_host;
+            if ($this->local_port > 0) {
+
+                $opts['socket']['bindto'] .= ':' . $this->local_port;
+            }
+        }
+
+        //
+        // create the context
+        //
+        $this->_context = @stream_context_create($opts);
+
+        //
+        // create socket
+        //
+        $errno;
+        $errstr;
+
+        switch($this->type) {
+        case Net_DNS2_Socket::SOCK_STREAM:
+
+            if (Net_DNS2::isIPv4($this->host) == true) {
+
+                $this->sock = @stream_socket_client(
+                    'tcp://' . $this->host . ':' . $this->port, 
+                    $errno, $errstr, $this->timeout, 
+                    STREAM_CLIENT_CONNECT, $this->_context
+                );
+            } else if (Net_DNS2::isIPv6($this->host) == true) {
+
+                $this->sock = @stream_socket_client(
+                    'tcp://[' . $this->host . ']:' . $this->port, 
+                    $errno, $errstr, $this->timeout, 
+                    STREAM_CLIENT_CONNECT, $this->_context
+                );
+            } else {
+
+                $this->last_error = 'invalid address type: ' . $this->host;
+                return false;
+            }
+
+            break;
+        
+        case Net_DNS2_Socket::SOCK_DGRAM:
+
+            if (Net_DNS2::isIPv4($this->host) == true) {
+
+                $this->sock = @stream_socket_client(
+                    'udp://' . $this->host . ':' . $this->port, 
+                    $errno, $errstr, $this->timeout, 
+                    STREAM_CLIENT_CONNECT, $this->_context
+                );
+            } else if (Net_DNS2::isIPv6($this->host) == true) {
+
+                $this->sock = @stream_socket_client(
+                    'udp://[' . $this->host . ']:' . $this->port, 
+                    $errno, $errstr, $this->timeout, 
+                    STREAM_CLIENT_CONNECT, $this->_context
+                );
+            } else {
+
+                $this->last_error = 'invalid address type: ' . $this->host;
+                return false;
+            }
+
+            break;
+            
+        default:
+            $this->last_error = 'Invalid socket type: ' . $this->type;
+            return false;
+        }
+
+        if ($this->sock === false) {
+
+            $this->last_error = $errstr;
+            return false;
+        }
+
+        //
+        // set it to non-blocking and set the timeout
+        //
+        @stream_set_blocking($this->sock, 0);
+        @stream_set_timeout($this->sock, $this->timeout);
+
+        return true;
+    }
+
+    /**
+     * closes a socket connection to the DNS server
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function close()
+    {
+        if (is_resource($this->sock) === true) {
+
+            @fclose($this->sock);
+        }
+        return true;
+    }
+
+    /**
+     * writes the given string to the DNS server socket
+     *
+     * @param string $data a binary packed DNS packet
+     *
+     * @return boolean
+     * @access public
+     *
+     */
+    public function write($data)
+    {
+        $length = strlen($data);
+        if ($length == 0) {
+
+            $this->last_error = 'empty data on write()';
+            return false;
+        }
+
+        $read   = null;
+        $write  = array($this->sock);
+        $except = null;
+
+        //
+        // select on write
+        //
+        switch(@stream_select($read, $write, $except, $this->timeout)) {
+        case false:
+            $this->last_error = 'failed on stream_select()';
+            return false;
+            break;
+       
+        case 0:
+            return false;
+            break;
+            
+        default:
+            ;
+        }
+
+        //
+        // if it's a TCP socket, then we need to packet and send the length of the
+        // data as the first 16bit of data.
+        //        
+        if ($this->type == Net_DNS2_Socket::SOCK_STREAM) {
+
+            $s = chr($length >> 8) . chr($length);
+
+            if (@fwrite($this->sock, $s) === false) {
+
+                $this->last_error = 'failed to fwrite() 16bit length';
+                return false;
+            }
+        }
+
+        //
+        // write the data to the socket
+        //
+        $size = @fwrite($this->sock, $data);
+        if ( ($size === false) || ($size != $length) ) {
+        
+            $this->last_error = 'failed to fwrite() packet';
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * reads a response from a DNS server
+     *
+     * @param integer &$size the size of the DNS packet read is passed back
+     *
+     * @return mixed         returns the data on success and false on error
+     * @access public
+     *
+     */
+    public function read(&$size)
+    {
+        $read   = array($this->sock);
+        $write  = null;
+        $except = null;
+
+        //
+        // make sure our socket is non-blocking
+        //
+        @stream_set_blocking($this->sock, 0);
+
+        //
+        // select on read
+        //
+        switch(stream_select($read, $write, $except, $this->timeout)) {
+        case false:
+            $this->last_error = 'error on stream_select()';
+            return false;
+            break;
+            
+        case 0:
+            return false;
+            break;
+            
+        default:
+            ;
+        }
+
+        $data = '';
+        $length = Net_DNS2_Lookups::DNS_MAX_UDP_SIZE;
+
+        //
+        // if it's a TCP socket, then the first two bytes is the length of the DNS
+        // packet- we need to read that off first, then use that value for the    
+        // packet read.
+        //
+        if ($this->type == Net_DNS2_Socket::SOCK_STREAM) {
+    
+            if (($data = fread($this->sock, 2)) === false) {
+                
+                $this->last_error = 'failed on fread() for data length';
+                return false;
+            }
+        
+            $length = ord($data[0]) << 8 | ord($data[1]);
+            if ($length < Net_DNS2_Lookups::DNS_HEADER_SIZE) {
+
+                return false;
+            }
+        }
+
+        //
+        // at this point, we know that there is data on the socket to be read,
+        // because we've already extracted the length from the first two bytes.
+        //
+        // so the easiest thing to do, is just turn off socket blocking, and
+        // wait for the data.
+        //
+        @stream_set_blocking($this->sock, 1);
+
+        //
+        // read the data from the socket
+        //
+        $data = '';
+
+        //
+        // the streams socket is weird for TCP sockets; it doesn't seem to always
+        // return all the data properly; but the looping code I added broke UDP
+        // packets- my fault- 
+        //
+        // the sockets library works much better.
+        //
+        if ($this->type == Net_DNS2_Socket::SOCK_STREAM) {
+
+            $chunk = '';
+            $chunk_size = $length;
+
+            //
+            // loop so we make sure we read all the data
+            //
+            while (1) {
+
+                $chunk = fread($this->sock, $chunk_size);
+                if ($chunk === false) {
+            
+                    $this->last_error = 'failed on fread() for data';
+                    return false;
+                }
+
+                $data .= $chunk;
+                $chunk_size -= strlen($chunk);
+
+                if (strlen($data) >= $length) {
+                    break;
+                }
+            }
+
+        } else {
+
+            //
+            // if it's UDP, it's a single fixed-size frame, and the streams library
+            // doesn't seem to have a problem reading it.
+            //
+            $data = fread($this->sock, $length);
+            if ($length === false) {
+            
+                $this->last_error = 'failed on fread() for data';
+                return false;
+            }
+        }
+        
+        $size = strlen($data);
+
+        return $data;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/pear/Net/DNS2/Updater.php b/include/pear/Net/DNS2/Updater.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3446a522d4e7cc7052104d0a5a5bfbee7b90ea1
--- /dev/null
+++ b/include/pear/Net/DNS2/Updater.php
@@ -0,0 +1,654 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * DNS Library for handling lookups and updates. 
+ *
+ * PHP Version 5
+ *
+ * Copyright (c) 2010, Mike Pultz <mike@mikepultz.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *
+ *   * Neither the name of Mike Pultz nor the names of his contributors 
+ *     may be used to endorse or promote products derived from this 
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category  Networking
+ * @package   Net_DNS2
+ * @author    Mike Pultz <mike@mikepultz.com>
+ * @copyright 2010 Mike Pultz <mike@mikepultz.com>
+ * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @version   SVN: $Id: Updater.php 198 2013-05-26 05:05:22Z mike.pultz $
+ * @link      http://pear.php.net/package/Net_DNS2
+ * @since     File available since Release 0.6.0
+ *
+ */
+
+/**
+ * The main dynamic DNS updater class.
+ *
+ * This class provices functions to handle all defined dynamic DNS update 
+ * requests as defined by RFC 2136.
+ *
+ * This is separate from the Net_DNS2_Resolver class, as while the underlying
+ * protocol is the same, the functionality is completely different.
+ *
+ * Generally, query (recursive) lookups are done against caching server, while
+ * update requests are done against authoratative servers.
+ * 
+ * @category Networking
+ * @package  Net_DNS2
+ * @author   Mike Pultz <mike@mikepultz.com>
+ * @license  http://www.opensource.org/licenses/bsd-license.php  BSD License
+ * @link     http://pear.php.net/package/Net_DNS2
+ * @see      Net_DNS2
+ *
+ */
+class Net_DNS2_Updater extends Net_DNS2
+{
+    /*
+     * a Net_DNS2_Packet_Request object used for the update request
+     */
+    private $_packet;
+
+    /**
+     * Constructor - builds a new Net_DNS2_Updater objected used for doing 
+     * dynamic DNS updates
+     *
+     * @param string $zone    the domain name to use for DNS updates
+     * @param mixed  $options an array of config options or null
+     *
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function __construct($zone, array $options = null)
+    {
+        parent::__construct($options);
+
+        //
+        // create the packet
+        //
+        $this->_packet = new Net_DNS2_Packet_Request(
+            strtolower(trim($zone, " \n\r\t.")), 'SOA', 'IN'
+        );
+
+        //
+        // make sure the opcode on the packet is set to UPDATE
+        //
+        $this->_packet->header->opcode = Net_DNS2_Lookups::OPCODE_UPDATE;
+    }
+
+    /**
+     * checks that the given name matches the name for the zone we're updating
+     *
+     * @param string $name The name to be checked.
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access private
+     *
+     */
+    private function _checkName($name)
+    {
+        if (!preg_match('/' . $this->_packet->question[0]->qname . '$/', $name)) {
+            
+            throw new Net_DNS2_Exception(
+                'name provided (' . $name . ') does not match zone name (' .
+                $this->_packet->question[0]->qname . ')',
+                Net_DNS2_Lookups::E_PACKET_INVALID
+            );
+        }
+    
+        return true;
+    }
+
+    /**
+     * add a signature to the request for authentication 
+     *
+     * @param string $keyname   the key name to use for the TSIG RR
+     * @param string $signature the key to sign the request.
+     *
+     * @return     boolean
+     * @access     public
+     * @see        Net_DNS2::signTSIG()
+     * @deprecated function deprecated in 1.1.0
+     *
+     */
+    public function signature($keyname, $signature)
+    {
+        return $this->signTSIG($keyname, $signature);
+    }
+
+    /**
+     *   2.5.1 - Add To An RRset
+     *
+     *   RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
+     *   and RDATA are those being added, and CLASS is the same as the zone
+     *   class.  Any duplicate RRs will be silently ignored by the primary
+     *   master.
+     *
+     * @param Net_DNS2_RR $rr the Net_DNS2_RR object to be added to the zone
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function add(Net_DNS2_RR $rr)
+    {
+        $this->_checkName($rr->name);
+
+        //
+        // add the RR to the "update" section
+        //
+        if (!in_array($rr, $this->_packet->authority)) {
+            $this->_packet->authority[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.5.4 - Delete An RR From An RRset
+     *
+     *   RRs to be deleted are added to the Update Section.  The NAME, TYPE,
+     *   RDLENGTH and RDATA must match the RR being deleted.  TTL must be
+     *   specified as zero (0) and will otherwise be ignored by the primary
+     *   master.  CLASS must be specified as NONE to distinguish this from an
+     *   RR addition.  If no such RRs exist, then this Update RR will be
+     *   silently ignored by the primary master.
+     *
+     * @param Net_DNS2_RR $rr the Net_DNS2_RR object to be deleted from the zone
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function delete(Net_DNS2_RR $rr)
+    {
+        $this->_checkName($rr->name);
+
+        $rr->ttl    = 0;
+        $rr->class  = 'NONE';
+
+        //
+        // add the RR to the "update" section
+        //
+        if (!in_array($rr, $this->_packet->authority)) {
+            $this->_packet->authority[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.5.2 - Delete An RRset
+     *
+     *   One RR is added to the Update Section whose NAME and TYPE are those
+     *   of the RRset to be deleted.  TTL must be specified as zero (0) and is
+     *   otherwise not used by the primary master.  CLASS must be specified as
+     *   ANY.  RDLENGTH must be zero (0) and RDATA must therefore be empty.
+     *   If no such RRset exists, then this Update RR will be silently ignored
+     *   by the primary master
+     *
+     * @param string $name the RR name to be removed from the zone
+     * @param string $type the RR type to be removed from the zone
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function deleteAny($name, $type)
+    {
+        $this->_checkName($name);
+
+        $class = Net_DNS2_Lookups::$rr_types_id_to_class[
+            Net_DNS2_Lookups::$rr_types_by_name[$type]
+        ];
+        if (!isset($class)) {
+
+            throw new Net_DNS2_Exception(
+                'unknown or un-supported resource record type: ' . $type,
+                Net_DNS2_Lookups::E_RR_INVALID
+            );
+        }
+    
+        $rr = new $class;
+
+        $rr->name       = $name;
+        $rr->ttl        = 0;
+        $rr->class      = 'ANY';
+        $rr->rdlength   = -1;
+        $rr->rdata      = '';    
+
+        //
+        // add the RR to the "update" section
+        //
+        if (!in_array($rr, $this->_packet->authority)) {
+            $this->_packet->authority[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.5.3 - Delete All RRsets From A Name
+     *
+     *   One RR is added to the Update Section whose NAME is that of the name
+     *   to be cleansed of RRsets.  TYPE must be specified as ANY.  TTL must
+     *   be specified as zero (0) and is otherwise not used by the primary
+     *   master.  CLASS must be specified as ANY.  RDLENGTH must be zero (0)
+     *   and RDATA must therefore be empty.  If no such RRsets exist, then
+     *   this Update RR will be silently ignored by the primary master.
+     *
+     * @param string $name the RR name to be removed from the zone
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function deleteAll($name)
+    {
+        $this->_checkName($name);
+
+        //
+        // the Net_DNS2_RR_ANY class is just an empty stub class used for these
+        // cases only
+        //
+        $rr = new Net_DNS2_RR_ANY;
+
+        $rr->name       = $name;
+        $rr->ttl        = 0;
+        $rr->type       = 'ANY';
+        $rr->class      = 'ANY';
+        $rr->rdlength   = -1;
+        $rr->rdata      = '';
+
+        //
+        // add the RR to the "update" section
+        //
+        if (!in_array($rr, $this->_packet->authority)) {
+            $this->_packet->authority[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.4.1 - RRset Exists (Value Independent)
+     *
+     *   At least one RR with a specified NAME and TYPE (in the zone and class
+     *   specified in the Zone Section) must exist.
+     *
+     *   For this prerequisite, a requestor adds to the section a single RR
+     *   whose NAME and TYPE are equal to that of the zone RRset whose
+     *   existence is required.  RDLENGTH is zero and RDATA is therefore
+     *   empty.  CLASS must be specified as ANY to differentiate this
+     *   condition from that of an actual RR whose RDLENGTH is naturally zero
+     *   (0) (e.g., NULL).  TTL is specified as zero (0).
+     *
+     * @param string $name the RR name for the prerequisite
+     * @param string $type the RR type for the prerequisite
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function checkExists($name, $type)
+    {
+        $this->_checkName($name);
+        
+        $class = Net_DNS2_Lookups::$rr_types_id_to_class[
+            Net_DNS2_Lookups::$rr_types_by_name[$type]
+        ];
+        if (!isset($class)) {
+
+            throw new Net_DNS2_Exception(
+                'unknown or un-supported resource record type: ' . $type,
+                Net_DNS2_Lookups::E_RR_INVALID
+            );
+        }
+    
+        $rr = new $class;
+
+        $rr->name       = $name;
+        $rr->ttl        = 0;
+        $rr->class      = 'ANY';
+        $rr->rdlength   = -1;
+        $rr->rdata      = '';    
+
+        //
+        // add the RR to the "prerequisite" section
+        //
+        if (!in_array($rr, $this->_packet->answer)) {
+            $this->_packet->answer[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.4.2 - RRset Exists (Value Dependent)
+     *
+     *   A set of RRs with a specified NAME and TYPE exists and has the same
+     *   members with the same RDATAs as the RRset specified here in this
+     *   section.  While RRset ordering is undefined and therefore not
+     *   significant to this comparison, the sets be identical in their
+     *   extent.
+     *
+     *   For this prerequisite, a requestor adds to the section an entire
+     *   RRset whose preexistence is required.  NAME and TYPE are that of the
+     *   RRset being denoted.  CLASS is that of the zone.  TTL must be
+     *   specified as zero (0) and is ignored when comparing RRsets for
+     *   identity.
+     *
+     * @param Net_DNS2_RR $rr the RR object to be used as a prerequisite
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function checkValueExists(Net_DNS2_RR $rr)
+    {
+        $this->_checkName($rr->name);
+
+        $rr->ttl = 0;
+
+        //
+        // add the RR to the "prerequisite" section
+        //
+        if (!in_array($rr, $this->_packet->answer)) {
+            $this->_packet->answer[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.4.3 - RRset Does Not Exist
+     *
+     *   No RRs with a specified NAME and TYPE (in the zone and class denoted
+     *   by the Zone Section) can exist.
+     *
+     *   For this prerequisite, a requestor adds to the section a single RR
+     *   whose NAME and TYPE are equal to that of the RRset whose nonexistence
+     *   is required.  The RDLENGTH of this record is zero (0), and RDATA
+     *   field is therefore empty.  CLASS must be specified as NONE in order
+     *   to distinguish this condition from a valid RR whose RDLENGTH is
+     *   naturally zero (0) (for example, the NULL RR).  TTL must be specified
+     *   as zero (0).
+     *
+     * @param string $name the RR name for the prerequisite
+     * @param string $type the RR type for the prerequisite
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function checkNotExists($name, $type)
+    {
+        $this->_checkName($name);
+
+        $class = Net_DNS2_Lookups::$rr_types_id_to_class[
+            Net_DNS2_Lookups::$rr_types_by_name[$type]
+        ];
+        if (!isset($class)) {
+
+            throw new Net_DNS2_Exception(
+                'unknown or un-supported resource record type: ' . $type,
+                Net_DNS2_Lookups::E_RR_INVALID
+            );
+        }
+    
+        $rr = new $class;
+
+        $rr->name       = $name;
+        $rr->ttl        = 0;
+        $rr->class      = 'NONE';
+        $rr->rdlength   = -1;
+        $rr->rdata      = '';    
+
+        //
+        // add the RR to the "prerequisite" section
+        //
+        if (!in_array($rr, $this->_packet->answer)) {
+            $this->_packet->answer[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.4.4 - Name Is In Use
+     *
+     *   Name is in use.  At least one RR with a specified NAME (in the zone
+     *   and class specified by the Zone Section) must exist.  Note that this
+     *   prerequisite is NOT satisfied by empty nonterminals.
+     *
+     *   For this prerequisite, a requestor adds to the section a single RR
+     *   whose NAME is equal to that of the name whose ownership of an RR is
+     *   required.  RDLENGTH is zero and RDATA is therefore empty.  CLASS must
+     *   be specified as ANY to differentiate this condition from that of an
+     *   actual RR whose RDLENGTH is naturally zero (0) (e.g., NULL).  TYPE
+     *   must be specified as ANY to differentiate this case from that of an
+     *   RRset existence test.  TTL is specified as zero (0).
+     *
+     * @param string $name the RR name for the prerequisite
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function checkNameInUse($name)
+    {
+        $this->_checkName($name);
+
+        //
+        // the Net_DNS2_RR_ANY class is just an empty stub class used for these
+        // cases only
+        //
+        $rr = new Net_DNS2_RR_ANY;
+
+        $rr->name       = $name;
+        $rr->ttl        = 0;
+        $rr->type       = 'ANY';
+        $rr->class      = 'ANY';
+        $rr->rdlength   = -1;
+        $rr->rdata      = '';
+
+        //
+        // add the RR to the "prerequisite" section
+        //
+        if (!in_array($rr, $this->_packet->answer)) {
+            $this->_packet->answer[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     *   2.4.5 - Name Is Not In Use
+     *
+     *   Name is not in use.  No RR of any type is owned by a specified NAME.
+     *   Note that this prerequisite IS satisfied by empty nonterminals.
+     *
+     *   For this prerequisite, a requestor adds to the section a single RR
+     *   whose NAME is equal to that of the name whose nonownership of any RRs
+     *   is required.  RDLENGTH is zero and RDATA is therefore empty.  CLASS
+     *   must be specified as NONE.  TYPE must be specified as ANY.  TTL must
+     *   be specified as zero (0).
+     *
+     * @param string $name the RR name for the prerequisite
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function checkNameNotInUse($name)
+    {
+        $this->_checkName($name);
+
+        //
+        // the Net_DNS2_RR_ANY class is just an empty stub class used for these
+        // cases only
+        //
+        $rr = new Net_DNS2_RR_ANY;
+
+        $rr->name       = $name;
+        $rr->ttl        = 0;
+        $rr->type       = 'ANY';
+        $rr->class      = 'NONE';
+        $rr->rdlength   = -1;
+        $rr->rdata      = '';
+
+        //
+        // add the RR to the "prerequisite" section
+        //
+        if (!in_array($rr, $this->_packet->answer)) {
+            $this->_packet->answer[] = $rr;
+        }
+
+        return true;
+    }
+
+    /**
+     * returns the current internal packet object.
+     *
+     * @return Net_DNS2_Packet_Request
+     * @access public
+     #
+     */
+    public function packet()
+    {
+        //
+        // take a copy
+        //
+        $p = $this->_packet;
+
+        //
+        // check for an authentication method; either TSIG or SIG
+        //
+        if (   ($this->auth_signature instanceof Net_DNS2_RR_TSIG) 
+            || ($this->auth_signature instanceof Net_DNS2_RR_SIG)
+        ) {
+            $p->additional[] = $this->auth_signature;
+        }
+
+        //
+        // update the counts
+        //
+        $p->header->qdcount = count($p->question);
+        $p->header->ancount = count($p->answer);
+        $p->header->nscount = count($p->authority);
+        $p->header->arcount = count($p->additional);
+
+        return $p;
+    }
+
+    /**
+     * executes the update request with the object informaton
+     *
+     * @param Net_DNS2_Packet_Response &$response ref to the response object
+     *
+     * @return boolean
+     * @throws Net_DNS2_Exception
+     * @access public
+     *
+     */
+    public function update(&$response = null)
+    {
+        //
+        // make sure we have some name servers set
+        //
+        $this->checkServers(Net_DNS2::RESOLV_CONF);
+
+        //
+        // check for an authentication method; either TSIG or SIG
+        //
+        if (   ($this->auth_signature instanceof Net_DNS2_RR_TSIG) 
+            || ($this->auth_signature instanceof Net_DNS2_RR_SIG)
+        ) {
+            $this->_packet->additional[] = $this->auth_signature;
+        }
+
+        //
+        // update the counts
+        //
+        $this->_packet->header->qdcount = count($this->_packet->question);
+        $this->_packet->header->ancount = count($this->_packet->answer);
+        $this->_packet->header->nscount = count($this->_packet->authority);
+        $this->_packet->header->arcount = count($this->_packet->additional);
+
+        //
+        // make sure we have some data to send
+        //
+        if (   ($this->_packet->header->qdcount == 0) 
+            || ($this->_packet->header->nscount == 0) 
+        ) {
+            throw new Net_DNS2_Exception(
+                'empty headers- nothing to send!',
+                Net_DNS2_Lookups::E_PACKET_INVALID
+            );
+        }
+
+        //
+        // send the packet and get back the response
+        //
+        $response = $this->sendPacket($this->_packet, $this->use_tcp);
+
+        //
+        // clear the internal packet so if we make another request, we don't have
+        // old data being sent.
+        //
+        $this->_packet->reset();
+
+        //
+        // for updates, we just need to know it worked- we don't actualy need to
+        // return the response object
+        //
+        return true;
+    }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/include/staff/plugin-add.inc.php b/include/staff/plugin-add.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..46251f66d1c2269e8c2417ed0e238613d1e1f8e6
--- /dev/null
+++ b/include/staff/plugin-add.inc.php
@@ -0,0 +1,35 @@
+
+<h2>Install a new plugin</h2>
+<p>
+To add a plugin into the system, download and place the plugin into the
+<code>include/plugins</code> folder. Once in the plugin is in the
+<code>plugins/</code> folder, it will be shown in the list below.
+</p>
+
+<form method="post" action="?">
+    <?php echo csrf_token(); ?>
+    <input type="hidden" name="do" value="install"/>
+<table class="list" width="100%"><tbody>
+<?php
+
+$installed = $ost->plugins->allInstalled();
+foreach ($ost->plugins->allInfos() as $info) {
+    // Ignore installed plugins
+    if (isset($installed[$info['install_path']]))
+        continue;
+    ?>
+        <tr><td><button type="submit" name="install_path"
+            value="<?php echo $info['install_path'];
+            ?>">Install</button></td>
+        <td>
+    <div><strong><?php echo $info['name']; ?></strong><br/>
+        <div><?php echo $info['description']; ?></div>
+        <div class="faded"><em>Version: <?php echo $info['version']; ?></em></div>
+        <div class="faded"><em>Author: <?php echo $info['author']; ?></em></div>
+    </div>
+    </td></tr>
+    <?php
+}
+?>
+</tbody></table>
+</form>
diff --git a/include/staff/plugin.inc.php b/include/staff/plugin.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1cefd5bc2fb60e1570b97e7fec9e6b838461bf9
--- /dev/null
+++ b/include/staff/plugin.inc.php
@@ -0,0 +1,44 @@
+<?php
+
+$info=array();
+if($plugin && $_REQUEST['a']!='add') {
+    $config = $plugin->getConfig();
+    if ($config)
+        $form = $config->getForm();
+    if ($_POST)
+        $form->isValid();
+    $title = 'Update Plugin';
+    $action = 'update';
+    $submit_text='Save Changes';
+    $info = $plugin->ht;
+}
+$info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
+?>
+
+<form action="?id=<?php echo urlencode($_REQUEST['id']); ?>" method="post" id="save">
+    <?php csrf_token(); ?>
+    <input type="hidden" name="do" value="<?php echo $action; ?>">
+    <input type="hidden" name="id" value="<?php echo $info['id']; ?>">
+    <h2>Manage Plugin
+        <br/><small><?php echo $plugin->getName(); ?></small></h2>
+
+    <h3>Configuration</h3>
+    <table class="form_table" width="940" border="0" cellspacing="0" cellpadding="2">
+    <tbody>
+<?php
+if ($form)
+    $form->render();
+else { ?>
+    <tr><th>This plugin has no configurable settings<br>
+        <em>Every plugin should be so easy to use</em></th></tr>
+<?php }
+?>
+    </tbody></table>
+<p class="centered">
+<?php if ($form) { ?>
+    <input type="submit" name="submit" value="<?php echo $submit_text; ?>">
+    <input type="reset"  name="reset"  value="Reset">
+<?php } ?>
+    <input type="button" name="cancel" value="Cancel" onclick='window.location.href="?"'>
+</p>
+</form>
diff --git a/include/staff/plugins.inc.php b/include/staff/plugins.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..eab4a796ee6a3240cd30d35fac1e20f2071b17f0
--- /dev/null
+++ b/include/staff/plugins.inc.php
@@ -0,0 +1,104 @@
+<div style="width:700;padding-top:5px; float:left;">
+ <h2>Currently Installed Plugins</h2>
+</div>
+<div style="float:right;text-align:right;padding-top:5px;padding-right:5px;">
+ <b><a href="plugins.php?a=add" class="Icon form-add">Add New Plugin</a></b></div>
+<div class="clear"></div>
+
+<?php
+$page = ($_GET['p'] && is_numeric($_GET['p'])) ? $_GET['p'] : 1;
+$count = count($ost->plugins->allInstalled());
+$pageNav = new Pagenate($count, $page, PAGE_LIMIT);
+$pageNav->setURL('forms.php');
+$showing=$pageNav->showing().' forms';
+?>
+
+<form action="plugins.php" method="POST" name="forms">
+<?php csrf_token(); ?>
+<input type="hidden" name="do" value="mass_process" >
+<input type="hidden" id="action" name="a" value="" >
+<table class="list" border="0" cellspacing="1" cellpadding="0" width="940">
+    <thead>
+        <tr>
+            <th width="7">&nbsp;</th>
+            <th>Plugin Name</th>
+            <th>Status</td>
+            <th>Date Installed</th>
+        </tr>
+    </thead>
+    <tbody>
+<?php
+foreach ($ost->plugins->allInstalled() as $p) {
+    if ($p instanceof Plugin) { ?>
+    <tr>
+        <td><input type="checkbox" class="ckb" name="ids[]" value="<?php echo $p->getId(); ?>"
+                <?php echo $sel?'checked="checked"':''; ?>></td>
+        <td><a href="plugins.php?id=<?php echo $p->getId(); ?>"
+            ><?php echo $p->getName(); ?></a></td>
+        <td>Enabled</td>
+        <td><?php echo Format::db_datetime($p->getInstallDate()); ?></td>
+    </tr>
+    <?php } else {
+        $p = $ost->plugins->getInfoForPath($p['install_path']); ?>
+    <tr>
+        <td><input type="checkbox" class="ckb" name="ids[]" value="<?php echo $p['install_path']; ?>"
+                <?php echo $sel?'checked="checked"':''; ?>></td>
+        <td><?php echo $p['name']; ?></td>
+        <td><strong>Disabled</strong></td>
+        <td></td>
+    </tr>
+    <?php } ?>
+<?php } ?>
+    </tbody>
+    <tfoot>
+     <tr>
+        <td colspan="4">
+            <?php if($count){ ?>
+            Select:&nbsp;
+            <a id="selectAll" href="#ckb">All</a>&nbsp;&nbsp;
+            <a id="selectNone" href="#ckb">None</a>&nbsp;&nbsp;
+            <a id="selectToggle" href="#ckb">Toggle</a>&nbsp;&nbsp;
+            <?php }else{
+                echo 'No extra forms defined yet &mdash; add one!';
+            } ?>
+        </td>
+     </tr>
+    </tfoot>
+</table>
+<?php
+if ($count) //Show options..
+    echo '<div>&nbsp;Page:'.$pageNav->getPageLinks().'&nbsp;</div>';
+?>
+<p class="centered" id="actions">
+    <input class="button" type="submit" name="delete" value="Delete">
+    <input class="button" type="submit" name="enable" value="Enable">
+    <input class="button" type="submit" name="disable" value="Disable">
+</p>
+</form>
+
+<div style="display:none;" class="dialog" id="confirm-action">
+    <h3>Please Confirm</h3>
+    <a class="close" href="">&times;</a>
+    <hr/>
+    <p class="confirm-action" style="display:none;" id="delete-confirm">
+        <font color="red"><strong>Are you sure you want to DELETE selected plugins?</strong></font>
+        <br><br>Deleted forms CANNOT be recovered.
+    </p>
+    <p class="confirm-action" style="display:none;" id="enable-confirm">
+        <font color="green"><strong>Are you ready to enable selected plugins?</strong></font>
+    </p>
+    <p class="confirm-action" style="display:none;" id="disable-confirm">
+        <font color="red"><strong>Are you sure you want to disable selected plugins?</strong></font>
+    </p>
+    <div>Please confirm to continue.</div>
+    <hr style="margin-top:1em"/>
+    <p class="full-width">
+        <span class="buttons" style="float:left">
+            <input type="button" value="No, Cancel" class="close">
+        </span>
+        <span class="buttons" style="float:right">
+            <input type="button" value="Yes, Do it!" class="confirm">
+        </span>
+     </p>
+    <div class="clear"></div>
+</div>
diff --git a/include/staff/staff.inc.php b/include/staff/staff.inc.php
index 4567624842d7aaee268dfe7e034e4173b82c2afd..667b462312b603a205c912584dafb35fe15ac06c 100644
--- a/include/staff/staff.inc.php
+++ b/include/staff/staff.inc.php
@@ -17,12 +17,12 @@ if($staff && $_REQUEST['a']!='add'){
     $title='Add New Staff';
     $action='create';
     $submit_text='Add Staff';
-    $passwd_text='Temp. password required &nbsp;<span class="error">&nbsp;*</span>';
+    $passwd_text='Temporary password required only for "Local" authenication';
     //Some defaults for new staff.
     $info['change_passwd']=1;
     $info['isactive']=1;
     $info['isvisible']=1;
-    $info['isadmin']=0; 
+    $info['isadmin']=0;
     $qstr.='&a=add';
 }
 $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
@@ -48,7 +48,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 Username:
             </td>
             <td>
-                <input type="text" size="30" name="username" value="<?php echo $info['username']; ?>">
+                <input type="text" size="30" class="staff-username typeahead"
+                     name="username" value="<?php echo $info['username']; ?>">
                 &nbsp;<span class="error">*&nbsp;<?php echo $errors['username']; ?></span>
             </td>
         </tr>
@@ -58,7 +59,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 First Name:
             </td>
             <td>
-                <input type="text" size="30" name="firstname" value="<?php echo $info['firstname']; ?>">
+                <input type="text" size="30" name="firstname" class="auto first"
+                     value="<?php echo $info['firstname']; ?>">
                 &nbsp;<span class="error">*&nbsp;<?php echo $errors['firstname']; ?></span>
             </td>
         </tr>
@@ -67,7 +69,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 Last Name:
             </td>
             <td>
-                <input type="text" size="30" name="lastname" value="<?php echo $info['lastname']; ?>">
+                <input type="text" size="30" name="lastname" class="auto last"
+                    value="<?php echo $info['lastname']; ?>">
                 &nbsp;<span class="error">*&nbsp;<?php echo $errors['lastname']; ?></span>
             </td>
         </tr>
@@ -76,7 +79,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 Email Address:
             </td>
             <td>
-                <input type="text" size="30" name="email" value="<?php echo $info['email']; ?>">
+                <input type="text" size="30" name="email" class="auto email"
+                    value="<?php echo $info['email']; ?>">
                 &nbsp;<span class="error">*&nbsp;<?php echo $errors['email']; ?></span>
             </td>
         </tr>
@@ -85,7 +89,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 Phone Number:
             </td>
             <td>
-                <input type="text" size="18" name="phone" value="<?php echo $info['phone']; ?>">
+                <input type="text" size="18" name="phone" class="auto phone"
+                    value="<?php echo $info['phone']; ?>">
                 &nbsp;<span class="error">&nbsp;<?php echo $errors['phone']; ?></span>
                 Ext <input type="text" size="5" name="phone_ext" value="<?php echo $info['phone_ext']; ?>">
                 &nbsp;<span class="error">&nbsp;<?php echo $errors['phone_ext']; ?></span>
@@ -96,15 +101,39 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 Mobile Number:
             </td>
             <td>
-                <input type="text" size="18" name="mobile" value="<?php echo $info['mobile']; ?>">
+                <input type="text" size="18" name="mobile" class="auto mobile"
+                    value="<?php echo $info['mobile']; ?>">
                 &nbsp;<span class="error">&nbsp;<?php echo $errors['mobile']; ?></span>
             </td>
         </tr>
         <tr>
             <th colspan="2">
-                <em><strong>Account Password</strong>: <?php echo $passwd_text; ?> &nbsp;<span class="error">&nbsp;<?php echo $errors['temppasswd']; ?></span></em>
+                <em><strong>Authentication</strong>: <?php echo $passwd_text; ?> &nbsp;<span class="error">&nbsp;<?php echo $errors['temppasswd']; ?></span></em>
             </th>
         </tr>
+        <tr>
+            <td>Authentication Backend</td>
+            <td>
+            <select name="backend" onchange="javascript:
+                if (this.value != '' && this.value != 'local')
+                    $('#password-fields').hide();
+                else
+                    $('#password-fields').show();
+                ">
+                <option value="">&mdash; Use any available backend &mdash;</option>
+            <?php foreach (AuthenticationBackend::allRegistered() as $ab) {
+                if (!$ab->supportsAuthentication()) continue; ?>
+                <option value="<?php echo $ab::$id; ?>" <?php
+                    if ($info['backend'] == $ab::$id)
+                        echo 'selected="selected"'; ?>><?php
+                    echo $ab::$name; ?></option>
+            <?php } ?>
+            </select>
+            </td>
+        </tr>
+        </tbody>
+        <tbody id="password-fields" style="<?php if ($info['backend'] && $info['backend'] != 'local')
+            echo 'display:none;'; ?>">
         <tr>
             <td width="180">
                 Password:
@@ -133,6 +162,8 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 <strong>Force</strong> password change on next login.
             </td>
         </tr>
+    </tbody>
+    <tbody>
         <tr>
             <th colspan="2">
                 <em><strong>Staff's Signature</strong>: Optional signature used on outgoing emails. &nbsp;<span class="error">&nbsp;<?php echo $errors['signature']; ?></span></em>
diff --git a/include/staff/templates/dynamic-form.tmpl.php b/include/staff/templates/dynamic-form.tmpl.php
index f77fa928a74148164d24a6af8eb3527aa6593682..cfe25a45ad544779d916179e55f639edb6073a49 100644
--- a/include/staff/templates/dynamic-form.tmpl.php
+++ b/include/staff/templates/dynamic-form.tmpl.php
@@ -12,7 +12,7 @@
                 <?php
             }
             else { ?>
-                <td class="multi-line <?php if ($field->get('required')) echo 'required'; ?>">
+                <td class="multi-line <?php if ($field->get('required')) echo 'required'; ?>" style="min-width:120px;">
                 <?php echo Format::htmlchars($field->get('label')); ?>:</td>
                 <td><?php
             }
diff --git a/include/upgrader/streams/core.sig b/include/upgrader/streams/core.sig
index cc5bdea3c043bacc39e0d2213dfa2c8b13c5a8f8..882f4a25247117dd27b27f868e35279e75f29e89 100644
--- a/include/upgrader/streams/core.sig
+++ b/include/upgrader/streams/core.sig
@@ -1 +1 @@
-6de40a4d5bad7a2923e769a4db1ff3b9
+1b0fce992f6c7ed37a9b2914f86775d4
diff --git a/include/upgrader/streams/core/6de40a4d-1b0fce99.patch.sql b/include/upgrader/streams/core/6de40a4d-1b0fce99.patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..48f9480d54544b4eb94935817109cd930cce487d
--- /dev/null
+++ b/include/upgrader/streams/core/6de40a4d-1b0fce99.patch.sql
@@ -0,0 +1,27 @@
+/**
+ * @version v1.8.1 - Plugins
+ * @schema 1b0fce992f6c7ed37a9b2914f86775d4
+ * @title Add plugin management system
+ *
+ * Add table for plugin manager
+ */
+
+ALTER TABLE `%TABLE_PREFIX%staff`
+  ADD `backend` varchar(32) default NULL AFTER `passwd`;
+
+-- Plugins
+DROP TABLE IF EXISTS `%TABLE_PREFIX%plugin`;
+CREATE TABLE `%TABLE_PREFIX%plugin` (
+  `id` int(11) unsigned not null auto_increment,
+  `name` varchar(30) not null,
+  `install_path` varchar(60) not null,
+  `isphar` tinyint(1) not null default 0,
+  `isactive` tinyint(1) not null default 0,
+  `installed` datetime not null,
+  primary key (`id`)
+) DEFAULT CHARSET=utf8;
+
+-- Finished with patch
+UPDATE `%TABLE_PREFIX%config`
+    SET `value` = '1b0fce992f6c7ed37a9b2914f86775d4'
+    WHERE `key` = 'schema_signature' AND `namespace` = 'core';
diff --git a/scp/ajax.php b/scp/ajax.php
index 0ea64116e77289b22e9c5aba5a7efac971f8b6ee..a8a407acceb30705a62bc31bc74fd48f16ac3a42 100644
--- a/scp/ajax.php
+++ b/scp/ajax.php
@@ -64,7 +64,8 @@ $dispatcher = patterns('',
         url_get('^/lookup/form$', 'getLookupForm'),
         url_post('^/lookup/form$', 'addUser'),
         url_get('^/select$', 'selectUser'),
-        url_get('^/select/(?P<id>\d+)$', 'selectUser')
+        url_get('^/select/(?P<id>\d+)$', 'selectUser'),
+        url_get('^/staff$', 'searchStaff')
     )),
     url('^/tickets/', patterns('ajax.tickets.php:TicketsAjaxAPI',
         url_get('^(?P<tid>\d+)/change-user$', 'changeUserForm'),
@@ -100,6 +101,8 @@ $dispatcher = patterns('',
     ))
 );
 
+Signal::send('ajax.scp', $dispatcher);
+
 # Call the respective function
 print $dispatcher->resolve($ost->get_path_info());
 ?>
diff --git a/scp/js/scp.js b/scp/js/scp.js
index b80cb1a3b83f41f7825ff3e0b6aad8019c7af002..84a491479d8e6ff65dd63d5dcf952585606e4cf2 100644
--- a/scp/js/scp.js
+++ b/scp/js/scp.js
@@ -345,6 +345,26 @@ $(document).ready(function(){
         },
         property: "email"
     });
+    $('.staff-username.typeahead').typeahead({
+        source: function (typeahead, query) {
+            if(query.length > 2) {
+                $.ajax({
+                    url: "ajax.php/users/staff?q="+query,
+                    dataType: 'json',
+                    success: function (data) {
+                        typeahead.process(data);
+                    }
+                });
+            }
+        },
+        onselect: function (obj) {
+            var fObj=$('.staff-username.typeahead').closest('form');
+            $.each(['first','last','email','phone','mobile'], function(i,k) {
+                if (obj[k]) $('.auto.'+k, fObj).val(obj[k]);
+            });
+        },
+        property: "username"
+    });
 
     //Overlay
     $('#overlay').css({
diff --git a/scp/login.php b/scp/login.php
index 2f3cf2236e9f4996bb10b94764fb6d0a14d99d22..17424b6aeda068aa29b8bd233416cc3c604ad868 100644
--- a/scp/login.php
+++ b/scp/login.php
@@ -22,10 +22,12 @@ require_once(INCLUDE_DIR.'class.csrf.php');
 $dest = $_SESSION['_staff']['auth']['dest'];
 $msg = $_SESSION['_staff']['auth']['msg'];
 $msg = $msg?$msg:'Authentication Required';
+$dest=($dest && (!strstr($dest,'login.php') && !strstr($dest,'ajax.php')))?$dest:'index.php';
 if($_POST) {
-    //$_SESSION['_staff']=array(); #Uncomment to disable login strikes.
-    if(($user=Staff::login($_POST['userid'], $_POST['passwd'], $errors))){
-        $dest=($dest && (!strstr($dest,'login.php') && !strstr($dest,'ajax.php')))?$dest:'index.php';
+    // Lookup support backends for this staff
+    $username = trim($_POST['userid']);
+    if ($user = AuthenticationBackend::process($username,
+            $_POST['passwd'], $errors)) {
         @header("Location: $dest");
         require_once('index.php'); //Just incase header is messed up.
         exit;
@@ -33,6 +35,14 @@ if($_POST) {
 
     $msg = $errors['err']?$errors['err']:'Invalid login';
 }
+
+// Consider single sign-on authentication backends
+if (!$thisstaff || !($thisstaff->getId() || $thisstaff->isValid())) {
+    if (($user = AuthenticationBackend::singleSignOn($errors))
+            && ($user instanceof Staff))
+       @header("Location: $dest");
+}
+
 define("OSTSCPINC",TRUE); //Make includes happy!
 include_once(INCLUDE_DIR.'staff/login.tpl.php');
 ?>
diff --git a/scp/plugins.php b/scp/plugins.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5e7e8918027296970b717289626fb4c5982d6ac
--- /dev/null
+++ b/scp/plugins.php
@@ -0,0 +1,63 @@
+<?php
+require('admin.inc.php');
+require_once(INCLUDE_DIR."/class.plugin.php");
+
+if($_REQUEST['id'] && !($plugin=Plugin::lookup($_REQUEST['id'])))
+    $errors['err']='Unknown or invalid plugin ID.';
+
+if($_POST) {
+    switch(strtolower($_POST['do'])) {
+    case 'update':
+        if ($plugin) {
+            $plugin->getConfig()->commit($errors);
+        }
+        break;
+    case 'mass_process':
+        if(!$_POST['ids'] || !is_array($_POST['ids']) || !count($_POST['ids'])) {
+            $errors['err'] = 'You must select at least one plugin';
+        } else {
+            $count = count($_POST['ids']);
+            switch(strtolower($_POST['a'])) {
+            case 'enable':
+                foreach ($_POST['ids'] as $path) {
+                    if ($p = $ost->plugins->getInstance($path)) {
+                        $p->enable();
+                    }
+                }
+                break;
+            case 'disable':
+                foreach ($_POST['ids'] as $id) {
+                    if ($p = Plugin::lookup($id)) {
+                        $p->disable();
+                    }
+                }
+                break;
+            case 'delete':
+                foreach ($_POST['ids'] as $id) {
+                    if ($p = Plugin::lookup($id)) {
+                        var_dump($p);
+                        $p->uninstall();
+                    }
+                }
+                break;
+            }
+        }
+        break;
+    case 'install':
+        if ($ost->plugins->install($_POST['install_path']))
+            $msg = 'Plugin successfully installed';
+        break;
+    }
+}
+
+$page = 'plugins.inc.php';
+if ($plugin)
+    $page = 'plugin.inc.php';
+elseif ($_REQUEST['a']=='add')
+    $page = 'plugin-add.inc.php';
+
+$nav->setTabActive('manage');
+require(STAFFINC_DIR.'header.inc.php');
+require(STAFFINC_DIR.$page);
+include(STAFFINC_DIR.'footer.inc.php');
+?>
diff --git a/setup/cli/package.php b/setup/cli/package.php
index 15080fd8ab11eda31d6d09f06e0274f48de99a3b..e0b02cdea6725d3a8bd36387ba7e156c0765c32d 100755
--- a/setup/cli/package.php
+++ b/setup/cli/package.php
@@ -115,7 +115,7 @@ mkdir("$stage_path/scripts/");
 package("setup/scripts/*", "scripts/", -1, "*stage");
 
 # Load the heart of the system
-package("include/{,.}*", "upload/include", -1, array('*ost-config.php', '*.sw[a-z]'));
+package("include/{,.}*", "upload/include", -1, array('*ost-config.php', '*.sw[a-z]','plugins/*'));
 
 # Include the installer
 package("setup/*.{php,txt,html}", "upload/setup", -1, array("*scripts","*test","*stage"));
diff --git a/setup/inc/streams/core/install-mysql.sql b/setup/inc/streams/core/install-mysql.sql
index cd260b93e439881d1c2bef6040eccc4f9d00b3b2..ce6030b8b2134a5a57a3107e8ddfed9784385b6a 100644
--- a/setup/inc/streams/core/install-mysql.sql
+++ b/setup/inc/streams/core/install-mysql.sql
@@ -435,6 +435,7 @@ CREATE TABLE `%TABLE_PREFIX%staff` (
   `firstname` varchar(32) default NULL,
   `lastname` varchar(32) default NULL,
   `passwd` varchar(128) default NULL,
+  `backend` varchar(32) default NULL,
   `email` varchar(128) default NULL,
   `phone` varchar(24) NOT NULL default '',
   `phone_ext` varchar(6) default NULL,
@@ -689,6 +690,18 @@ CREATE TABLE IF NOT EXISTS `%TABLE_PREFIX%page` (
   UNIQUE KEY `name` (`name`)
 ) DEFAULT CHARSET=utf8;
 
+-- Plugins
+DROP TABLE IF EXISTS `%TABLE_PREFIX%plugin`;
+CREATE TABLE `%TABLE_PREFIX%plugin` (
+  `id` int(11) unsigned not null auto_increment,
+  `name` varchar(30) not null,
+  `install_path` varchar(60) not null,
+  `isphar` tinyint(1) not null default 0,
+  `isactive` tinyint(1) not null default 0,
+  `installed` datetime not null,
+  primary key (`id`)
+) DEFAULT CHARSET=utf8;
+
 DROP TABLE IF EXISTS `%TABLE_PREFIX%user`;
 CREATE TABLE `%TABLE_PREFIX%user` (
   `id` int(10) unsigned NOT NULL auto_increment,