diff --git a/services_entity.module b/services_entity.module
index c1f70e3..6ee081d 100644
--- a/services_entity.module
+++ b/services_entity.module
@@ -21,8 +21,10 @@ function services_entity_menu() {
  */
 function services_entity_settings_form($form, $form_state) {
   $resources = services_entity_get_resource_info();
+  $entity_options = array();
   foreach ($resources as $id => $resource) {
     $options[$resource['class']] = '<strong>' . $resource['title'] . '</strong><div>' . $resource['description'] . '</div>';
+    $entity_options[$resource['class']] = $resource['title'];
   }
 
   $form['services_entity_resource_class'] = array(
@@ -33,6 +35,23 @@ function services_entity_settings_form($form, $form_state) {
     '#default_value' => variable_get('services_entity_resource_class', 'ServicesEntityResourceController'),
   );
 
+  $form['services_entity_per_entity_class'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Entity Type Resource Class'),
+    '#tree' => FALSE,
+    '#collapsible' => TRUE,
+  );
+
+  foreach (entity_get_info() as $entity_type => $info) {
+    $form['services_entity_per_entity_class']['services_entity_resource_class_' . $entity_type] = array(
+      '#type' => 'select',
+      '#title' => t('@entity controller', array('@entity' => $info['label'])),
+      '#options' => array('' => '<' . t('default') . '>') + $entity_options,
+      '#description' => t('Select different controller per entity type.'),
+      '#default_value' => variable_get('services_entity_resource_class_' . $entity_type, ''),
+    );
+  }
+
   $form['services_entity_max_pagesize'] = array(
     '#title' => 'Maximum Page Size',
     '#description' => 'Enter the maximum number of items that can be returned per page of an index.',
@@ -61,6 +80,24 @@ function services_entity_get_resource_info($resource = NULL) {
 }
 
 /**
+ * Retrieve controller for handling entity requests.
+ *
+ * @param string $entity_type
+ *   Entity type.
+ *
+ * @return ServicesResourceControllerInterface
+ */
+function services_entity_get_resource_controller($entity_type) {
+  // Try to load entity specific controller.
+  $resourceclass = variable_get('services_entity_resource_class_' . $entity_type);
+  // If no controller load general entity controller.
+  if ($resourceclass == NULL) {
+    $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
+  }
+  return new $resourceclass;
+}
+
+/**
  * Implements hook_entity_resource_info().
  *
  * Provides resources for all entity types.
diff --git a/services_entity.resources.inc b/services_entity.resources.inc
index 7efc332..c38933a 100644
--- a/services_entity.resources.inc
+++ b/services_entity.resources.inc
@@ -4,52 +4,46 @@
  * Services resource access callback.
  */
 function _services_entity_resource_access($op, $args) {
-  $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
-  $resource = new $resourceclass;
-  return $resource->access($op, $args);
+  return services_entity_get_resource_controller($args[0])
+    ->access($op, $args);
 }
 
 /**
  * Services resource callback.
  */
 function _services_entity_resource_create($entity_type, $values) {
-  $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
-  $resource = new $resourceclass;
-  return $resource->create($entity_type, $values);
+  return services_entity_get_resource_controller($entity_type)
+    ->create($entity_type, $values);
 }
 
 /**
  * Services resource callback.
  */
 function _services_entity_resource_retrieve($entity_type, $entity_key, $fields) {
-  $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
-  $resource = new $resourceclass;
-  return $resource->retrieve($entity_type, $entity_key, $fields);
+  return services_entity_get_resource_controller($entity_type)
+    ->retrieve($entity_type, $entity_key, $fields);
 }
 
 /**
  * Services resource callback.
  */
 function _services_entity_resource_update($entity_type, $entity_id, $values) {
-  $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
-  $resource = new $resourceclass;
-  return $resource->update($entity_type, $entity_id, $values);
+  return services_entity_get_resource_controller($entity_type)
+    ->update($entity_type, $entity_id, $values);
 }
 
 /**
  * Services resource callback.
  */
 function _services_entity_resource_delete($entity_type, $entity_id) {
-  $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
-  $resource = new $resourceclass;
-  return $resource->delete($entity_type, $entity_id);
+  return services_entity_get_resource_controller($entity_type)
+    ->delete($entity_type, $entity_id);
 }
 
 /**
  * Services resource callback.
  */
 function _services_entity_resource_index($entity_type, $fields, $parameters, $page, $pagesize, $sort, $direction) {
-  $resourceclass = variable_get('services_entity_resource_class', 'ServicesEntityResourceController');
-  $resource = new $resourceclass;
-  return $resource->index($entity_type, $fields, $parameters, $page, $pagesize, $sort, $direction);
+  return services_entity_get_resource_controller($entity_type)
+    ->index($entity_type, $fields, $parameters, $page, $pagesize, $sort, $direction);
 }
