diff --git a/bean.module b/bean.module
index 3cbec25..549daa5 100644
--- a/bean.module
+++ b/bean.module
@@ -340,10 +340,15 @@ function bean_load($bid, $reset = FALSE) {
 function bean_load_multiple($bids = array(), $conditions = array(), $reset = FALSE) {
   $beans = entity_load('bean', $bids, $conditions, $reset);
   foreach ($beans as $bid => $bean) {
-    $bean->setPlugin();
-    $bean->setFields();
+    try {
+      $bean->setPlugin();
+      $bean->setFields();
+    } catch (BeanException $e) {
+      watchdog(WATCHDOG_ERROR, t('Bid: @bid Bean not loaded correctly', array('@bid' => $bean->bid)));
+    }
     $beans[$bid] = $bean;
   }
+
   return $beans;
 }
 
diff --git a/includes/bean.core.inc b/includes/bean.core.inc
index fedc8c8..156b002 100644
--- a/includes/bean.core.inc
+++ b/includes/bean.core.inc
@@ -1,6 +1,106 @@
 <?php
 
 /**
+ * Interface for Plugin Classes
+ */
+interface bean_type_plugin_interface {
+
+  /**
+   * Constructor
+   *
+   * Plugin info should be called using bean_fetch_plugin_info().
+   *
+   * @abstract
+   * @param  $plugin_info array of information from the ctools plugin.
+   */
+  public function __construct($plugin_info);
+
+  /**
+   * Get the ctools plugin info.
+   *
+   * If you pass in a key, then the key from the plugin info will be returned
+   * otherwise the entire plugin will be returned
+   *
+   * @abstract
+   * @param  $key
+   * @return array of plugin info for value froma key
+   */
+  public function getInfo($key = NULL);
+
+  /**
+   * Build the URL string for the plugin
+   *
+   * @abstract
+   * @return url
+   */
+  public function buildURL();
+
+  /**
+   * Get the label name of the plugin
+   *
+   * @abstract
+   * @return label of the type
+   */
+  public function getLabel();
+
+  /**
+   * Set the Bean object for later use
+   *
+   * @abstract
+   * @param Bean $bean
+   */
+  public function setBean($bean);
+
+  /**
+   * Is this type editable?
+   *
+   * @abstract
+   * @return boolean
+   */
+  public function isEditable();
+
+  /**
+   * Define the form values and their defaults
+   */
+  public function values();
+
+  /**
+   * The Plugin Form
+   *
+   * The Bean object will be either loaded from the database or filled with the defaults.
+   *
+   * @param $bean
+   * @return form array
+   */
+  public function form($bean);
+
+  /**
+   * Validate function for bean type form
+   *
+   * @abstract
+   * @param  $values
+   */
+  public function validate($values);
+
+  /**
+   * Return the block content.
+   *
+   * @abstract
+   *
+   * @param $bean
+   *   The bean object being viewed.
+   * @param $content
+   *   The default content array created by Entity API.  This will include any
+   *   fields attached to the entity.
+   * @param $view_mode
+   *   The view mode passed into $entity->view().
+   * @return
+   *   Return a renderable content array.
+   */
+  public function view($bean, $content, $view_mode = 'full', $langcode = NULL);
+}
+
+/**
  * The Bean entity class
  */
 class Bean extends Entity {
@@ -14,11 +114,11 @@ class Bean extends Entity {
    * Get Plugin info
    */
   public function getInfo($key = NULL) {
-    if (!empty($this->plugin)) {
+    if ($this->plugin instanceof bean_type_plugin_interface) {
       return $this->plugin->getInfo($key);
     }
 
-    return array();
+    return NULL;
   }
 
   public function defaultLabel() {
@@ -28,7 +128,7 @@ class Bean extends Entity {
   public function __construct($values = array()) {
     parent::__construct($values, 'bean');
     // Load the plugin info
-    // NOTE: When this is caalled as part of entity_load, $values seems to be
+    // NOTE: When this is called as part of entity_load, $values seems to be
     // empty, which makes it impossible to load the plugin and field data.
     // in this case, we don't do this now and rely on the caller of entity_load to
     // do it manually.
@@ -45,6 +145,9 @@ class Bean extends Entity {
    */
   public function setPlugin() {
     $this->plugin = bean_load_plugin_class($this->type);
+    if (!($this->plugin instanceof bean_type_plugin_interface)) {
+      throw new BeanException('Plugin Not Loaded');
+    }
   }
 
   /**
@@ -161,4 +264,6 @@ class Bean extends Entity {
 
     parent::delete();
   }
-}
\ No newline at end of file
+}
+
+class BeanException extends Exception {};
\ No newline at end of file
diff --git a/plugins/base.inc b/plugins/base.inc
index 903d732..94613e4 100644
--- a/plugins/base.inc
+++ b/plugins/base.inc
@@ -5,7 +5,7 @@
  * Base Plugin Class
  */
 
-abstract class bean_plugin {
+abstract class bean_plugin implements bean_type_plugin_interface {
   protected $plugin_info;
   public $type;
 
@@ -42,7 +42,7 @@ abstract class bean_plugin {
   /**
    * Add a Bean to the plugin
    */
-  public function setBean(Bean $bean) {
+  public function setBean($bean) {
     $this->bean = $bean;
   }
 
@@ -54,16 +54,6 @@ abstract class bean_plugin {
   }
 
   /**
-   * Define the form values
-   */
-  abstract public function values();
-
-  /**
-   * The Plugin Form
-   */
-  abstract public function form($bean);
-
-  /**
    * THe plugin submit function
    */
   public function validate($values) {}
