diff --git a/class/Exceptions.inc b/class/Exceptions.inc
index 256fdeb..a5f3e8f 100644
--- a/class/Exceptions.inc
+++ b/class/Exceptions.inc
@@ -26,6 +26,15 @@ class UcAddressesInvalidFieldException extends UcAddressesException { }
 class UcAddressesDbException extends UcAddressesException { }
 
 /**
+ * UcAddressesUndefinedFunctionException
+ *
+ * Used when a function from outside the class does not
+ * exists. This can happen if the classes are used early
+ * in the Drupal bootstrap phase.
+ */
+class UcAddressesUndefinedFunctionException extends UcAddressesException { }
+
+/**
  * UcAddressesInvalidParameterException
  *
  * Used when a method parameter is invalid.
diff --git a/class/UcAddressesAddress.class.php b/class/UcAddressesAddress.class.php
index ae8e427..7616ba6 100644
--- a/class/UcAddressesAddress.class.php
+++ b/class/UcAddressesAddress.class.php
@@ -188,6 +188,18 @@ class UcAddressesAddress extends UcAddressesSchemaAddress {
   }
 
   /**
+   * Alias of getId().
+   *
+   * @return int
+   *   The address ID.
+   *
+   * @see entity_id()
+   */
+  public function identifier() {
+    return $this->getId();
+  }
+
+  /**
    * Returns owner of this address.
    *
    * @access public
@@ -223,12 +235,61 @@ class UcAddressesAddress extends UcAddressesSchemaAddress {
     return ($this->getId() < 1);
   }
 
+  /**
+   * Returns address name if given.
+   *
+   * If the address has no name, it will use the
+   * address format as label instead.
+   *
+   * @return string
+   *   The address name.
+   * @todo better alternative for address name?
+   */
+  public function label() {
+    if ($name = $this->getName()) {
+      return $name;
+    }
+    return preg_replace('/<.*?>/', ', ', trim(uc_addresses_format_address($this)));
+  }
+
+  /**
+   * Returns the uri of the address.
+   *
+   * @return array
+   *   The addres uri.
+   */
+  public function uri() {
+    return array('path' => 'user/' . $this->getUserId() . '/addresses/' . $this->getId());
+  }
+
   // -----------------------------------------------------------------------------
   // uc_addresses features
   // -----------------------------------------------------------------------------
 
   /**
-   * Override of setField().
+   * Override of UcAddressesSchemaAddress::getField().
+   *
+   * Getting some of the schema fields differently.
+   *
+   * @param string $fieldName
+   *	 The name of the field whose value we want.
+   * @access public
+   * @return mixed
+   *	 The field value.
+   * @throws UcAddressInvalidFieldException
+   */
+  public function getField($fieldName) {
+    switch ($fieldName) {
+      case 'aid':
+        return $this->getId();
+      case 'uid':
+        return $this->getUserId();
+    }
+    return parent::getField($fieldName);
+  }
+
+  /**
+   * Override of UcAddressesSchemaAddress::setField().
    *
    * Prevents setting some schema fields directly.
    *
@@ -243,7 +304,15 @@ class UcAddressesAddress extends UcAddressesSchemaAddress {
   public function setField($fieldName, $value) {
     switch ($fieldName) {
       case 'aid':
-        // Don't set. Throw an Exception here?
+        // Don't set.
+        // @todo Throw an Exception here?
+        break;
+      case 'uid':
+        // Only set if the address is unowned. Else, ignore it.
+        // @todo Throw an Exception here?
+        if (!$this->isOwned()) {
+          $this->setOwner($value);
+        }
         break;
       case 'address_name':
         $this->setName($value);
@@ -382,14 +451,14 @@ class UcAddressesAddress extends UcAddressesSchemaAddress {
         unset($address->aid);
         $address->created = time();
         $result = drupal_write_record('uc_addresses', $address);
-        $hook = 'uc_addresses_address_insert';
+        $hook = 'insert';
 
         // Tell address book the address now has a definitive ID
         $this->addressBook->updateAddress($this);
       }
       else {
         $result = drupal_write_record('uc_addresses', $address, array('aid'));
-        $hook = 'uc_addresses_address_update';
+        $hook = 'update';
       }
       if ($result === FALSE) {
         throw new UcAddressesDbException(t('Failed to write address with id = %aid', array('%aid' => $address->aid)));
@@ -398,7 +467,7 @@ class UcAddressesAddress extends UcAddressesSchemaAddress {
       $this->clearDirty();
 
       // Notify other modules that an address has been saved
-      module_invoke_all($hook, $this);
+      module_invoke_all('uc_addresses_address_' . $hook, $this);
     }
   }
 
diff --git a/class/UcAddressesSchemaAddress.class.php b/class/UcAddressesSchemaAddress.class.php
index ed5bb63..bef2bea 100644
--- a/class/UcAddressesSchemaAddress.class.php
+++ b/class/UcAddressesSchemaAddress.class.php
@@ -69,11 +69,11 @@ class UcAddressesSchemaAddress {
       $this->schemaAddress = $schemaAddress;
     }
     // Make sure all fields are present
-    $fields = uc_addresses_get_address_fields();
-    foreach ($fields as $fieldname => $fielddata) {
-      if (!isset($this->schemaAddress->$fieldname)) {
-        $instance = uc_addresses_get_address_field_handler($this, $fieldname);
-        $this->schemaAddress->$fieldname = $instance->getDefaultValue();
+    $fields = self::getDefinedFields();
+    foreach ($fields as $fieldName => $fielddata) {
+      if (!isset($this->schemaAddress->$fieldName)) {
+        $instance = $this->getHandler($fieldName);
+        $this->schemaAddress->$fieldName = $instance->getDefaultValue();
       }
     }
   }
@@ -157,6 +157,68 @@ class UcAddressesSchemaAddress {
   // -----------------------------------------------------------------------------
 
   /**
+   * Magic getter.
+   *
+   * Returns properties/fields from the address object.
+   *
+   * @return mixed
+   *   Property or field values.
+   */
+  public function __get($property) {
+    try {
+      if (self::fieldExists($property)) {
+        return $this->getField($property);
+      }
+    }
+    catch (UcAddressesUndefinedFunctionException $e) {
+      // Ignore undefined function exceptions.
+    }
+    if (isset($this->$property)) {
+      return $this->$property;
+    }
+  }
+
+  /**
+   * Magic setter.
+   *
+   * Passes values to the address object.
+   *
+   * @return void
+   * @throw UcAddressesException
+   */
+  public function __set($property, $value) {
+    try {
+      if (self::fieldExists($property)) {
+        return $this->setField($property, $value);
+      }
+    }
+    catch (UcAddressesUndefinedFunctionException $e) {
+      // Ignore undefined function exceptions.
+    }
+    $this->$property = $value;
+  }
+
+  /**
+   * Magic method for giving back if property exists or not.
+   *
+   * @return boolean
+   *   TRUE if the property exists.
+   *   FALSE otherwise.
+   */
+  public function __isset($property) {
+    try {
+      if (self::fieldExists($property)) {
+        return TRUE;
+      }
+    }
+    catch (UcAddressesUndefinedFunctionException $e) {
+      // Ignore undefined function exceptions.
+    }
+    // Else, fallback to the "real" properties.
+    return isset($this->$property);
+  }
+
+  /**
    * Get a field's value.
    *
    * @param string $fieldName
@@ -225,7 +287,7 @@ class UcAddressesSchemaAddress {
    *	 TRUE if addresses have a field with the given name.
    */
   static public function fieldExists($fieldName) {
-    $fields_data = uc_addresses_get_address_fields();
+    $fields_data = self::getDefinedFields();
     return isset($fields_data[$fieldName]);
   }
 
@@ -252,10 +314,10 @@ class UcAddressesSchemaAddress {
    */
   public function getFieldData() {
     $values = array();
-    $fields_data = uc_addresses_get_address_fields();
-    foreach ($fields_data as $fieldname => $fielddata) {
-      $instance = uc_addresses_get_address_field_handler($this, $fieldname);
-      $values[$fieldname] = $instance->outputValue($this->getField($fieldname));
+    $fields_data = self::getDefinedFields();
+    foreach ($fields_data as $fieldName => $fielddata) {
+      $instance = $this->getHandler($fieldName);
+      $values[$fieldName] = $instance->outputValue($this->getField($fieldName));
     }
     return $values;
   }
@@ -289,11 +351,56 @@ class UcAddressesSchemaAddress {
    */
   public function getFieldValue($fieldName, $format = '', $context = 'default') {
     self::fieldMustExist($fieldName);
-    $handler = uc_addresses_get_address_field_handler($this, $fieldName, $context);
+    $handler = $this->getHandler($fieldName, $context);
     return $handler->outputValue($this->getField($fieldName), $format);
   }
 
   // -----------------------------------------------------------------------------
+  // HELPER METHODS
+  // These methods call functions defined outside the class.
+  // To ensure the class from operating well, we should throw an exception in
+  // case the functions were not defined. This can happen early in the Drupal
+  // bootstrap phase.
+  // -----------------------------------------------------------------------------
+
+  /**
+   * Returns defined fields.
+   *
+   * @return array
+   *   A list of address field definitions.
+   * @throws UcAddressesUndefinedFunctionException
+   *   In case the function uc_addresses_get_address_fields()
+   *   does not exists.
+   */
+  public static function getDefinedFields() {
+    if (!function_exists('uc_addresses_get_address_fields')) {
+      throw new UcAddressesUndefinedFunctionException('Function uc_addresses_get_address_fields() does not exists.');
+    }
+    return uc_addresses_get_address_fields();
+  }
+
+  /**
+   * Returns a handler instance.
+   *
+   * @param string $fieldName
+   *   The field name to get a handler for.
+   * @param string $context
+   *   The context where the field is used for.
+   *
+   * @return UcAddressesFieldHandler
+   *   An instance of UcAddressesFieldHandler.
+   * @throws UcAddressesUndefinedFunctionException
+   *   In case the function uc_addresses_get_address_field_handler()
+   *   does not exists.
+   */
+  public function getHandler($fieldName, $context = 'default') {
+    if (!function_exists('uc_addresses_get_address_field_handler')) {
+      throw new UcAddressesUndefinedFunctionException('Function uc_addresses_get_address_field_handler() does not exists.');
+    }
+    return uc_addresses_get_address_field_handler($this, $fieldName, $context);
+  }
+
+  // -----------------------------------------------------------------------------
   // SCHEMA METHODS
   // -----------------------------------------------------------------------------
 
@@ -375,18 +482,18 @@ class UcAddressesSchemaAddress {
     $fieldsDataThisAddress = $this->getRawFieldData();
     $fieldsDataOtherAddress = $address->getRawFieldData();
 
-    // Find out which field to compare
+    // Find out which field to compare.
     if (count($fields_to_compare) < 1) {
-      $fields_data = uc_addresses_get_address_fields();
-      foreach ($fields_data as $fieldname => $field_data) {
+      $fields_data = self::getDefinedFields();
+      foreach ($fields_data as $fieldName => $field_data) {
         if ($field_data['compare']) {
-          $fields_to_compare[] = $fieldname;
+          $fields_to_compare[] = $fieldName;
         }
       }
     }
 
-    foreach ($fields_to_compare as $fieldname) {
-      if ($fieldsDataThisAddress[$fieldname] != $fieldsDataOtherAddress[$fieldname]) {
+    foreach ($fields_to_compare as $fieldName) {
+      if ($fieldsDataThisAddress[$fieldName] != $fieldsDataOtherAddress[$fieldName]) {
         return FALSE;
       }
     }
