diff --git i/eck.classes.inc w/eck.classes.inc
index 91fa890..473c65d 100644
--- i/eck.classes.inc
+++ w/eck.classes.inc
@@ -5,34 +5,34 @@ class DBObject implements Iterator{
   public $is_new;
   //Iterator variable
   private $position;
-  
+
   //The database table where the objects exist
   private $table;
   private $vars;
   private $data;
-  
+
   private $primary_keys;
   private $serialize;
-  
+
   protected function __construct($table){
     $this->serialize = array();
     $this->is_new = TRUE;
     //Iterator variable
     $this->position = 0;
-    
+
     $data = array();
     //is this a real table, check it
- 
-    
+
+
     $schemas = drupal_get_schema();
     $tables = array_keys($schemas);
 
-    
+
     if(in_array($table, $tables)){
       $this->table = $table;
       $this->primary_keys = $schemas[$table]["primary key"];
       $this->vars = array_keys($schemas[$table]['fields']);
-      
+
       //do we want to handle searialized variables by default? let's do it
       //and wait for some critizism
       foreach($schemas[$table]['fields'] as $name => $field){
@@ -49,21 +49,21 @@ class DBObject implements Iterator{
       //@todo throw an exception
     }
   }
-  
+
   function __set($var, $value){
     if(in_array($var, $this->vars)){
       $this->data[$var] = $value;
     }
   }
-  
+
   function __get($var){
     if(property_exists($this, $var)){
       return $this->{$var};
     }
-    
+
     return $this->data[$var];
   }
-  
+
   public function __isset($name) {
     return isset($this->data[$name]);
   }
@@ -72,20 +72,20 @@ class DBObject implements Iterator{
   public function __unset($name) {
     unset($this->data[$name]);
   }
-  
+
   //DB Interaction Functions
   public function save(){
-    
+
     //before we save, lets serialize the properties that require it
     foreach($this->serialize as $property){
-   
+
       $this->{$property} = drupal_json_encode($this->{$property});
     }
-    
-   
-    
+
+
+
     if($this->is_new){
-      return 
+      return
       db_insert($this->table)
       ->fields($this->data)
       ->execute();
@@ -97,24 +97,28 @@ class DBObject implements Iterator{
       ->fields($this->data)
       ->execute();
     }
-    
+
     //now that we are done saving lets deserialize in case that for some
     //reason we will continue manipulating the properties
     foreach($this->serialize as $property){
       $this->{$property} = drupal_json_decode($this->{$property});
     }
-    
+
     $this->is_new = FALSE;
   }
-  
+
   protected function load($property, $value){
-    $result = 
-    db_select($this->table, 't')
-    ->fields('t')
-    ->condition($property, $value,'=')
-    ->execute()
-    ->fetchAssoc();
-    
+    $call = get_called_class() . '--' . __FUNCTION__ . implode('_', func_get_args());
+    $result = &drupal_static($call);
+    if (!isset($result)) {
+      $result =
+      db_select($this->table, 't')
+      ->fields('t')
+      ->condition($property, $value,'=')
+      ->execute()
+      ->fetchAssoc();
+    }
+
     if($result){
       foreach($result as $property => $value){
         if(in_array($property, $this->serialize)){
@@ -125,9 +129,9 @@ class DBObject implements Iterator{
       //we should only set the is_new flag as false if we loaded something
       $this->is_new = FALSE;
     }
-    
+
   }
-  
+
   public function delete(){
     //we can only deleted if its a loaded object, or if it has been saved
     if(!$this->is_new){
@@ -139,9 +143,9 @@ class DBObject implements Iterator{
       //for right now lets just set it back to new
       $this->is_new = TRUE;
     }
-    
+
   }
-  
+
   //Iterator Interface Functions
   function rewind() {
       $this->position = 0;
@@ -169,31 +173,31 @@ class DBObject implements Iterator{
 }
 
 class EntityType extends DBObject{
-  
+
   //If an entity type is new, we can create its table from the current data of
   //the object, but if this is a loaded object, we need to actually keep
   //track of the changes happening so we can modify the already existing table
   //appropiately.
   private $changes;
-  
+
   public function __construct(){
     parent::__construct('eck_entity_type');
     $this->properties = array();
     $this->changes = array();
   }
-  
+
   public function addProperty($name, $label, $type, $behavior = NULL){
     if(!$this->is_new){
       $this->recordFieldChange('add', $name);
     }
-    
+
     $p = $this->properties;
     //@todo check that type is an actual type
     $p[$name] = array('label' => $label, 'type' => $type, 'behavior' => $behavior);
-    
+
     $this->properties = $p;
   }
-  
+
   public function removeProperty($name){
     $p = $this->properties;
     if(array_key_exists($name, $p)){
@@ -204,7 +208,7 @@ class EntityType extends DBObject{
       }
     }
   }
-  
+
   public function changeBehavior($name, $behavior){
     $p = $this->properties;
     //@todo check that type is an actual type
@@ -216,14 +220,14 @@ class EntityType extends DBObject{
     }else{
       //@Todo add exception.. the property does not exist
     }
-    
+
     $this->properties = $p;
   }
-  
+
   public function removeBehavior($name){
     $this->changeBehavior($name, NULL);
   }
-  
+
   private function recordFieldChange($op, $name){
     //If it is not new we need to keep track of stuff
     if(!$this->is_new){
@@ -236,16 +240,16 @@ class EntityType extends DBObject{
             $c[$op][] = $name;
           }
         break;
-        
+
         case 'remove':
           //if there is an add in the changes take it out, otherwise add a
           //remove
           if(array_key_exists('add', $c)){
-            
+
             $key = array_search($name, $c['add']);
             if($key != FALSE){
               unset($c['add'][$key]);
-            }     
+            }
           }else{
             $c[$op][] = $name;
           }
@@ -254,25 +258,25 @@ class EntityType extends DBObject{
       $this->changes = $c;
     }
   }
-  
+
   public function save(){
     if($this->is_new){
       module_load_include('inc', 'eck', 'eck.entity_type');
       $schema = eck__entity_type__schema($this);
       db_create_table("eck_{$this->name}", $schema);
-      
+
     }else{
       //modify the already existing table in accordance with the recorded changes
       if(array_key_exists('add', $this->changes)){
         foreach($this->changes['add'] as $name){
-          //first lets get the record 
+          //first lets get the record
           $properties = $this->properties;
           $property = $properties[$name];
           //now we check to see whether it is a default or a custom property
           //it is not custom so lets get the schema and add the field
           $schema = eck_property_type_schema($property['type']);
           db_add_field("eck_{$this->name}", $name, $schema);
-          
+
         }
       }
       if(array_key_exists('remove', $this->changes)){
@@ -281,32 +285,37 @@ class EntityType extends DBObject{
         }
       }
     }
-    
+
     parent::save();
     drupal_get_schema(NULL, TRUE);
   }
-  
+
   public function delete(){
     parent::delete();
     db_drop_table('eck_'.$this->name);
     drupal_flush_all_caches();
   }
-  
+
   public static function loadByName($name){
     $self = new EntityType();
     $self->load('name', $name);
     return $self;
   }
-  
+
   public static function loadAll(){
-    $results = db_select('eck_entity_type', 't')
-    ->fields('t', array('name'))
-    ->execute();
-    
+    $call = get_called_class() . '--' .__FUNCTION__ ;
+    // statically cache future calls
+    $results = &drupal_static($call);
+    if (!isset($results)) {
+      $results = db_select('eck_entity_type', 't')
+      ->fields('t', array('name'))
+      ->execute();
+    }
+
     $entity_types = array();
-    
+
     foreach($results as $result){
-      $name = $result->name;
+      $name = $result['name'];
       $entity_types[] = EntityType::loadByName($name);
     }
     return $entity_types;
@@ -314,16 +323,16 @@ class EntityType extends DBObject{
 }
 
 class Bundle extends DBObject{
-  
+
   public function __construct(){
     parent::__construct('eck_bundle');
     $this->config = array();
   }
-  
+
   private function createMachineName(){
     $this->machine_name = "{$this->entity_type}_{$this->name}";
   }
-  
+
   private function createLabel(){
     $name = $this->name;
     $pieces = explode("_", $name);
@@ -331,22 +340,22 @@ class Bundle extends DBObject{
     foreach($pieces as $piece){
       $final[] = ucfirst($piece);
     }
-    
+
     $this->label = implode(" ", $final);
   }
-  
+
   public function save(){
     //Lets do some checks before the bundle is saved
     if(isset($this->entity_type) && isset($this->name)){
-     
+
       $save = TRUE;
       //we are good
       //@todo we should check that the entity type is a proper
       //entity type object
-      
+
       //Lets set the machine name
       $this->createMachineName();
-      
+
       //if this bundle is_new we need to check that it does not exist
       //@todo we just need to change the field in the db to be unique
       if($this->is_new){
@@ -355,24 +364,24 @@ class Bundle extends DBObject{
           $save = FALSE;
         }
       }
-      
+
       if(!isset($this->label)){
         $this->createLabel();
       }
-      
+
       if($save){
         parent::save();
       }else{
         //@todo throw some error
       }
-      
+
     }else{
       //if the name an entity type are not set, we can not save
       //the bundle
       //@todo throw soem error or exception
     }
   }
-  
+
   /**
    * This method returns a bundle object
    * @param $machine_name
@@ -384,34 +393,38 @@ class Bundle extends DBObject{
     $self->load('machine_name', $machine_name);
     return $self;
   }
-  
+
   public static function loadAll(){
     //@todo move this to a general function
-    $results = db_select('eck_bundle', 't')
-    ->fields('t', array('machine_name'))
-    ->execute();
-    
+    $call = get_called_class() . '--' .__FUNCTION__ ;
+    $results = &drupal_static($call);
+    if (!isset($results)) {
+      $results = db_select('eck_bundle', 't')
+      ->fields('t', array('machine_name'))
+      ->execute();
+    }
+
     $bundles = array();
-    
+
     foreach($results as $result){
-      $name = $result->machine_name;
+      $name = $result['machine_name'];
       $bundles[] = Bundle::loadByMachineName($name);
     }
     return $bundles;
   }
-  
+
   public static function loadByEntityType($entity_type){
     //@todo move this to a general function
     $results = db_select('eck_bundle', 't')
     ->fields('t', array('name'))
     ->condition('entity_type', $entity_type->name, '=')
     ->execute();
-    
+
     $bundles = array();
-    
+
     foreach($results as $result){
       $name = $result->name;
-   
+
       $bundles[] = Bundle::loadByMachineName("{$entity_type->name}_{$name}");
     }
     return $bundles;
@@ -423,7 +436,7 @@ class Bundle extends DBObject{
   *
   * @param $field_type
   *   The type of field to add. One of the keys as defined by any field module using hook_field_info.
-  * 
+  *
   * @param $options
   *   This is an optional array. Its properties can include:
   *   - use existing: If TRUE and if a 'field_name' property is specified in the 'field'
@@ -439,7 +452,7 @@ class Bundle extends DBObject{
   *   - instance: all options accepted by field_create_instance(). Defaults will be used for
   *     each property that is omitted. 'bundle' and 'entity_type' properties are ignored because
   *     they come from the bundle info. The field_name property is either generated or taken from
-  *     the field properties. 
+  *     the field properties.
   *
   * @return
   *   The $instance array with the id property filled in as returned by field_create_instance().
