diff --git resources/taxonomy_resource.inc resources/taxonomy_resource.inc
index d0790d6..cb1026b 100644
--- resources/taxonomy_resource.inc
+++ resources/taxonomy_resource.inc
@@ -23,9 +23,7 @@ function _taxonomy_resource_definition() {
             'description' => 'The tid of the taxonomy term to get',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('view'),
-        'access arguments append' => TRUE,
+        'access arguments' => array('access content'),
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
       'create' => array(
@@ -39,8 +37,7 @@ function _taxonomy_resource_definition() {
             'type' => 'struct',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('create'),
+        'access callback' => '_taxonomy_resource_create_access',
         'access arguments append' => TRUE,
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
@@ -62,8 +59,7 @@ function _taxonomy_resource_definition() {
             'type' => 'struct',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('update'),
+        'access callback' => '_taxonomy_resource_update_access',
         'access arguments append' => TRUE,
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
@@ -74,10 +70,10 @@ function _taxonomy_resource_definition() {
             'name' => 'tid',
             'optional' => FALSE,
             'source' => array('path' => 0),
+            'type' => 'int',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('delete'),
+        'access callback' => '_taxonomy_resource_delete_access',
         'access arguments append' => TRUE,
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
@@ -85,9 +81,7 @@ function _taxonomy_resource_definition() {
         'selectNodes' => array(
           'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
           'help'   => t('This method returns all nodes with provided taxonomy id.'),
-          'access callback' => '_taxonomy_resource_access',
-          'access arguments' => array('view'),
-          'access arguments append' => TRUE,
+          'access arguments' => array('access content'),
           'callback' => 'taxonomy_service_select_nodes',
           'args'     => array(
             array(
@@ -103,6 +97,7 @@ function _taxonomy_resource_definition() {
               'description'  => t('Whether the nodes are to be used with a pager (the case on most Drupal pages) or not (in an XML feed, for example).'),
               'source'       => 'data',
               'optional'     => TRUE,
+              'default value'=> TRUE,
             ),
             array(
               'name'         => 'limit',
@@ -110,7 +105,7 @@ function _taxonomy_resource_definition() {
               'description'  => t('Maximum number of nodes to find.'),
               'source'       => 'data',
               'optional'     => TRUE,
-              'default value' => FALSE,
+              'default value'=> FALSE,
             ),
             array(
               'name'         => 'order',
@@ -118,6 +113,7 @@ function _taxonomy_resource_definition() {
               'description'  => t('The order clause for the query that retrieve the nodes.'),
               'source'       => 'data',
               'optional'     => TRUE,
+              'default value'=> array('t.sticky' => 'DESC', 't.created' => 'DESC'),
             ),
           ),
         ),
@@ -136,9 +132,7 @@ function _taxonomy_resource_definition() {
             'description' => 'The vid of the taxonomy vocabulary to get',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('view'),
-        'access arguments append' => TRUE,
+        'access arguments' => array('access content'),
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
       'create' => array(
@@ -152,9 +146,7 @@ function _taxonomy_resource_definition() {
             'type' => 'struct',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('create'),
-        'access arguments append' => TRUE,
+        'access arguments' => array('administer taxonomy'),
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
       'update' => array(
@@ -175,9 +167,7 @@ function _taxonomy_resource_definition() {
             'type' => 'struct',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('update'),
-        'access arguments append' => TRUE,
+        'access arguments' => array('administer taxonomy'),
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
       'delete' => array(
@@ -187,20 +177,17 @@ function _taxonomy_resource_definition() {
             'name' => 'vid',
             'optional' => FALSE,
             'source' => array('path' => 0),
+            'type' => 'int',
           ),
         ),
-        'access callback' => '_taxonomy_resource_access',
-        'access arguments' => array('delete'),
-        'access arguments append' => TRUE,
+        'access arguments' => array('administer taxonomy'),
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
       ),
       'actions' =>array(
         'getTree' => array(
           'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/taxonomy_resource'),
           'help'   => t('This method returns a full list of taxonomy terms.'),
-          'access callback' => '_taxonomy_resource_access',
-          'access arguments' => array('view'),
-          'access arguments append' => TRUE,
+          'access arguments' => array('access content'),
           'callback' => 'taxonomy_service_get_tree',
           'args'     => array(
             array(
@@ -217,7 +204,7 @@ function _taxonomy_resource_definition() {
               'source'       => 'data',
               'default value' => 0,
               'optional'     => TRUE,
-            ), 
+            ),
             array(
               'name'         => 'maxdepth',
               'type'         => 'int',
@@ -244,7 +231,7 @@ function _taxonomy_resource_definition() {
  * @see taxonomy_get_term().
  */
 function _taxonomy_term_resource_retrieve($tid) {
-  return taxonomy_get_term($tid);
+  return taxonomy_term_load($tid);
 }
 
 /**
@@ -277,7 +264,7 @@ function _taxonomy_term_resource_create($term) {
 function _taxonomy_term_resource_update($tid, $term) {
   $term = (object) $term;
   $term->tid = $tid;
-  return _taxonomy_term_resource_create($term);
+  return taxonomy_term_save($term);
 }
 
 /**
@@ -336,11 +323,11 @@ function _taxonomy_vocabulary_resource_retrieve($vid) {
  * @return
  *   Status constant indicating if vocabulary was inserted or updated.
  *
- * @see taxonomy_save_vocabulary().
+ * @see taxonomy_vocabulary_save().
  */
 function _taxonomy_vocabulary_resource_create($vocabulary) {
-  $vocabulary = (array) $vocabulary;
-  return taxonomy_save_vocabulary($vocabulary);
+  $vocabulary = (object) $vocabulary;
+  return taxonomy_vocabulary_save($vocabulary);
 }
 
 /**
@@ -353,12 +340,11 @@ function _taxonomy_vocabulary_resource_create($vocabulary) {
  * @return
  *   Status constant indicating if vocabulary was inserted or updated.
  *
- * @see taxonomy_save_vocabulary().
+ * @see taxonomy_vocabulary_save().
  */
 function _taxonomy_vocabulary_resource_update($vid, $vocabulary) {
-  $vocabulary = (array) $vocabulary;
-  $vocabulary['vid'] = $vid;
-  return _taxonomy_vocabulary_resource_create($vocabulary);
+  $vocabulary = (object) $vocabulary;
+  return taxonomy_vocabulary_save($vocabulary);
 }
 
 /**
@@ -372,7 +358,7 @@ function _taxonomy_vocabulary_resource_update($vid, $vocabulary) {
  * @see taxonomy_del_vocabulary().
  */
 function _taxonomy_vocabulary_resource_delete($vid) {
-  return taxonomy_del_vocabulary($vid);
+  return taxonomy_vocabulary_delete($vid);
 }
 
 
@@ -399,12 +385,12 @@ function taxonomy_service_get_tree($vid, $parent = 0, $max_depth = NULL) {
  *
  * @see
  *   taxonomy_select_nodes().
- * @return 
+ * @return
  *   An array of node objects.
  */
-function taxonomy_service_select_nodes($tid = '', $pager = TRUE, $limit = FALSE,  $order = array('t.sticky' => 'DESC', 't.created' => 'DESC')) {
+function taxonomy_service_select_nodes($tid = '', $pager, $limit,  $order) {
   $result = taxonomy_select_nodes($tid, (bool)$pager, $limit, $order);
-  foreach($result as $nid) {  
+  foreach($result as $nid) {
     if ($uri = services_resource_uri(array('node', $nid))) {
       $node = node_load($nid);
       $node->uri = $uri;
@@ -417,9 +403,47 @@ function taxonomy_service_select_nodes($tid = '', $pager = TRUE, $limit = FALSE,
   return $nodes;
 }
 
-function _taxonomy_resource_access($op = 'view', $args = array()) {
-  if (user_access('administer taxonomy')) {
-    return TRUE;
+/**
+ * Access callback for term updating.
+ *
+ * @param $term
+ *   An taxonomy term object
+ * @return
+ *   Boolean whether or not the user has access to create or edit the term.
+ */
+function _taxonomy_resource_update_access($tid, $term) {
+  $term = (object) $term;
+  if (!isset($term->vid)) {
+    throw new ServicesArgumentException(t('Term object needs vid property.'), 'term', 0);
+  }
+  return user_access('edit terms in ' . $term->vid) || user_access('administer taxonomy');
+}
+
+/**
+ * Access callback for term creating.
+ *
+ * @param $term
+ *   An taxonomy term object
+ * @return
+ *   Boolean whether or not the user has access to create or edit the term.
+ */
+function _taxonomy_resource_create_access($term) {
+  $term = (object) $term;
+  return user_access('edit terms in ' . $term->vid) || user_access('administer taxonomy');
+}
+
+/**
+ * Access callback for term deleting.
+ *
+ * @param $term
+ *   An taxonomy term object
+ * @return
+ *   Boolean whether or not the user has access to delete the term.
+ */
+function _taxonomy_resource_delete_access($tid) {
+  $term = taxonomy_term_load($tid);
+  if (!$term) {
+    throw new ServicesArgumentException(t('There is no term with id %tid', array('%tid' => $tid)), 'tid', 0);
   }
-  // TODO - check perms of user to return ability to interact with terms / vocabulary
+  return user_access('delete terms in ' . $term->vid) || user_access('administer taxonomy');
 }
diff --git services.info services.info
index e5d8649..8b8f32a 100644
--- services.info
+++ services.info
@@ -15,9 +15,9 @@ files[] = services.servers.api.php
 files[] = serviers.services.api.php
 files[] = tests/functional/NoAuthEndpointTestRunner.test
 files[] = tests/functional/ServicesResourceNodeTests.test
-files[] = tests/functional/ServicesResourceUserTests.test
+files[] = tests/functional/ServicesResourceTaxonomyTests.test
 files[] = tests/functional/ServicesEndpointTests.test
 files[] = tests/unit/TestServicesModule.test
 files[] = tests/services.test
 
-dependencies[] = ctools
\ No newline at end of file
+dependencies[] = ctools
diff --git tests/functional/ServicesResourceTaxonomyTests.test tests/functional/ServicesResourceTaxonomyTests.test
new file mode 100644
index 0000000..d127495
--- /dev/null
+++ tests/functional/ServicesResourceTaxonomyTests.test
@@ -0,0 +1,446 @@
+<?php
+// $Id: ServicesResourceTaxonomyTests.test,v 1.1.2.1 2011/01/19 00:34:49 ocyrus Exp $
+
+/**
+ * @file
+ * Call the endpoint tests when no authentication is being used.
+ *
+ */
+
+/**
+ * Run test cases for the endpoint with no authentication turned on.
+ *
+ */
+class ServicesResourceTaxonomyTests extends ServicesWebtestCase {
+  // Class variables
+  protected $privileged_user = NULL ;
+  // Endpoint details.
+  protected $endpoint = NULL;
+
+  /**
+   * Implementation of setUp().
+   */
+  public function setUp() {
+    parent::setUp(
+      'ctools',
+      'services',
+      'rest_server'
+    );
+    // Set up endpoint.
+    $this->endpoint =  $this->saveNewEndpoint();
+    // Set up privileged user and login.
+    $this->privileged_user = $this->drupalCreateUser(array('administer taxonomy', 'access content'));
+    $this->drupalLogin($this->privileged_user);
+  }
+
+  /**
+   * Implementation of getInfo().
+   */
+  public static function getInfo() {
+   return array(
+     'name'        => t('Resource Taxonomy'),
+     'description' => t('Test the resource Taxonomy methods and actions.'),
+     'group'       => t('Services'),
+   );
+  }
+
+  /**
+   * Test taxonomy vocabulary create method.
+   */
+  function testVocabularyCreate() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = (object)array(
+      'name'        => $this->randomName(),
+      'machine_name'=> $this->randomName(),
+      'description' => $this->randomString(),
+      'hierarchy'   => 1,
+      'module'      => 'services',
+      'weight'      => 0,
+    );
+
+    $response = $this->servicesPost($path . '/taxonomy_vocabulary', array('vocabulary' => $vocabulary));
+
+    $query = db_select('taxonomy_vocabulary', 'v')
+      ->fields('v', array('vid'))
+      ->condition('v.name', $vocabulary->name);
+    $vid = $query->execute()->fetchField();
+
+    $vocabulary_load = (array)taxonomy_vocabulary_load($vid);
+    $vocabulary_intersect = array_intersect_assoc((array)$vocabulary, $vocabulary_load);
+
+    $this->assertEqual((array)$vocabulary, $vocabulary_intersect, t('Taxonomy vocabulary created properly.'), 'TaxonomyVocabularyResource: Create');
+  }
+
+  /**
+   * Test taxonomy vocabulry retrieve method.
+   */
+  function testVocabularyRetrieve() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = $this->createVocabulary();
+    $vid = $vocabulary['vid'];
+
+    $response = $this->servicesGet($path . '/taxonomy_vocabulary/' . $vid);
+    $vocabulary_retrieve = (array)$response['body'];
+
+    $vocabulary_intersect = array_intersect_assoc($vocabulary, $vocabulary_retrieve);
+
+    $this->assertEqual($vocabulary, $vocabulary_intersect, t('Taxonomy vocabulary retrieved properly.'), 'TaxonomyVocabularyResource: Retrieve');
+  }
+
+  /**
+   * Test taxonomy vocabulary update.
+   */
+  function testVocabularyUpdate() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = $this->createVocabulary();
+    $vid = $vocabulary['vid'];
+
+    $vocabulary['name'] = $this->randomName();
+    $vocabulary['description'] = $this->randomString();
+
+    $response = $this->servicesPUT($path . '/taxonomy_vocabulary/' . $vid, array('vocabulary' => $vocabulary));
+
+    // Load vocabulary from database. We use entity_load to reset static cache.
+    $vocabularies_load = entity_load('taxonomy_vocabulary', array($vid), array(), TRUE);
+    $vocabulary_load = (array)array_pop($vocabularies_load);
+
+    $vocabulary_intersect = array_intersect_assoc($vocabulary, $vocabulary_load);
+    $this->assertEqual($vocabulary, $vocabulary_intersect, t('Taxonomy vocabulary updated properly.'), 'TaxonomyVocabularyResource: Update');
+  }
+
+  /**
+   * Test taxonomy vocabulary delete method.
+   */
+  function testVocabularyDelete() {
+    $path = $this->endpoint->path;
+    $vocabulary = $this->createVocabulary();
+    $vid = $vocabulary['vid'];
+
+    $this->servicesDelete($path . '/taxonomy_vocabulary/' . $vid);
+
+    // Load vocabulary from database. We use entity_load to reset static cache.
+    $vocabularies_load = entity_load('taxonomy_vocabulary', array($vid), array(), TRUE);
+    $vocabulary_load = (array)array_pop($vocabularies_load);
+
+    $this->assertTrue(empty($vocabulary_load), t('Taxonomy vocabulary deleted properly.'), 'TaxonomyVocabularyResource: Delete');
+  }
+
+  /**
+   * Test taxonomy vocabulary getTree method.
+   */
+  function testVocabularyGetTree() {
+    $path = $this->endpoint->path;
+    $vocabulary = $this->createVocabulary();
+    $vid = $vocabulary['vid'];
+
+    $part_tree_parent = 0;
+
+    // Generate taxonomy tree.
+    for ($i = 0; $i < 10; $i++) {
+      $query = db_select('taxonomy_term_data', 'td')
+        ->fields('td', array('tid'))
+        ->condition('td.vid', $vid)
+        ->orderRandom()
+        ->range(0,1);
+      $tid = $query->execute()->fetchField();
+      $parent = rand(0, 1) * $tid;
+      $edit = (object)array(
+        'name'    => $this->randomName(),
+        'parent'  => $parent,
+        'vid'     => $vid,
+      );
+      taxonomy_term_save($edit);
+
+      if (!empty($parent)) {
+        $part_tree_parent = $parent;
+      }
+    }
+    // Add term as grandchild to test maxdepth.
+    $children = taxonomy_get_children($part_tree_parent);
+    $edit = (object)array(
+      'name'    => $this->randomName(),
+      'parent'  => key($children),
+      'vid'     => $vid,
+    );
+    taxonomy_term_save($edit);
+
+    // Compare full tree.
+    $vocabulary_tree = taxonomy_get_tree($vid);
+
+    $response = $this->servicesPost($path . '/taxonomy_vocabulary/getTree', array('vid' => $vid));
+    $vocabulary_tree_response = $response['body'];
+    $this->assertEqual($vocabulary_tree, $vocabulary_tree_response, t('Vocabulary full tree received properly.'), 'TaxonomyVocabularyResource: getTree');
+
+    // Compare part tree.
+    $vocabulary_tree = taxonomy_get_tree($vid, $part_tree_parent);
+    $response = $this->servicesPost($path . '/taxonomy_vocabulary/getTree', array('vid' => $vid, 'parent' => $part_tree_parent));
+    $vocabulary_tree_response = $response['body'];
+    $this->assertEqual($vocabulary_tree, $vocabulary_tree_response, t('Vocabulary part tree received properly.'), 'TaxonomyVocabularyResource: getTree');
+
+    // Compare part tree with maxdepth = 1.
+    $vocabulary_tree = taxonomy_get_tree($vid, $part_tree_parent, 1);
+    $response = $this->servicesPost($path . '/taxonomy_vocabulary/getTree', array('vid' => $vid, 'parent' => $part_tree_parent, 'maxdepth' => 1));
+    $vocabulary_tree_response = $response['body'];
+    $this->assertEqual($vocabulary_tree, $vocabulary_tree_response, t('Vocabulary part tree with depth received properly.'), 'TaxonomyVocabularyResource: getTree');
+  }
+
+  /**
+   * Test taxonomy term create method.
+   */
+  function testTermCreate() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = $this->createVocabulary();
+
+    $term = array(
+      'vid' => $vocabulary['vid'],
+      'name' => $this->randomName(),
+      'description' => $this->randomString(),
+      'weight' => rand(0, 100),
+      'parent' => NULL,
+    );
+
+    $response = $this->servicesPost($path . '/taxonomy_term', array('term' => $term));
+
+    // Load term by name.
+    $term_by_name = (array)current(taxonomy_get_term_by_name($term['name']));
+    $term_intersect = array_intersect_assoc($term, $term_by_name);
+
+    // As term_intersect will not have parent, we unset this property.
+    $term_data = $term;
+    unset($term_data['parent']);
+
+    $this->assertEqual($term_data, $term_intersect, t('Taxonomy term created properly.'), 'TaxonomyTermResource: Create');
+  }
+
+  /**
+   * Test taxonomy term retrieve method.
+   */
+  function testTermRetrieve() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = $this->createVocabulary();
+    $term = $this->createTerm($vocabulary['vid']);
+
+    $response = $this->servicesGet($path . '/taxonomy_term/' . $term['tid']);
+    $term_retrieve = (array)$response['body'];
+
+    $this->assertEqual($term_retrieve, $term, t('Taxonomy term retrieved properly.'), 'TaxonomyTermResource: Retrieve');
+  }
+
+  /**
+   * Test taxonomy term update method.
+   */
+  function testTermUpdate() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = $this->createVocabulary();
+    $term = $this->createTerm($vocabulary['vid']);
+
+    $term_update_data = array(
+      'name' => $this->randomName(),
+      'vid'  => $term['vid'],
+    );
+
+    $this->servicesPut($path . '/taxonomy_term/' . $term['tid'], array('term' => $term_update_data));
+
+    $term_update = (array)current(entity_load('taxonomy_term', array($term['tid']), array(), TRUE));
+
+    // Ensure that terms have different names but same tid.
+    $this->assertTrue(($term['tid'] == $term_update['tid']) && ($term['name'] != $term_update['name']), t('Taxonomy term updated properly.'), 'TaxonomyTermResource: Update');
+  }
+
+  /**
+   * Test taxonomy term delete method.
+   */
+  function testTermDelete() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = $this->createVocabulary();
+    $term = $this->createTerm($vocabulary['vid']);
+
+    $this->servicesDelete($path . '/taxonomy_term/' . $term['tid']);
+
+    $term_load = entity_load('taxonomy_term', array($term['tid']), array(), TRUE);
+    $this->assertTrue(empty($term_load), t('Taxonomy term deleted properly.'), 'TaxonomyTermResource: Delete');
+  }
+
+  /**
+   * Test taxonomy term selectNodes method.
+   */
+  function testTermSelectNodes() {
+    $path = $this->endpoint->path;
+
+    $vocabulary = (object)array(
+      'name'        => $this->randomName(),
+      'machine_name'=> 'text_vocabulary',
+      'description' => $this->randomString(),
+      'help'        => $this->randomString(),
+      'relations'   => 1,
+      'hierarchy'   => 1,
+      'multiple'    => 1,
+      'required'    => 0,
+      'module'      => 'services',
+      'weight'      => 0,
+      'nodes'       => array('page' => 'page'),
+    );
+    taxonomy_vocabulary_save($vocabulary);
+
+    $query = db_select('taxonomy_vocabulary', 'v')
+      ->fields('v', array('vid'))
+      ->condition('v.name', $vocabulary->name);
+    $vid = $query->execute()->fetchField();
+
+    $term1 = $this->createTerm($vid);
+    $term2 = $this->createTerm($vid);
+
+    $nodes = array();
+    $nodes_term1  = array();
+    $nodes_term2 = array();
+    $nodes_term1_term2 = array();
+    $nodes_noterm = array();
+
+    $field_name = 'taxonomy_' . $vocabulary->machine_name;
+
+    // Create field for term.
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'taxonomy_term_reference',
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'label' => $vocabulary->name,
+      'bundle' => 'page',
+      'required' => TRUE,
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+         'weight' => 10,
+        ),
+        'teaser' => array(
+          'type' => 'taxonomy_term_reference_link',
+         'weight' => 10,
+        ),
+      ),
+    );
+    field_create_instance($instance);
+
+    node_types_rebuild();
+
+    // Create 7 page nodes with term1 attached.
+    for ($i = 0; $i < 7; $i++) {
+      $node = $this->drupalCreateNode(array($field_name => array(LANGUAGE_NONE => array(array('tid' => $term1['tid'])))));
+      $nodes[$node->nid] = $node;
+      $nodes_term1[] = $node->nid;
+    }
+
+    // Create 7 page nodes with term2 attached.
+    for ($i = 0; $i < 7; $i++) {
+      $node = $this->drupalCreateNode(array($field_name => array(LANGUAGE_NONE => array(array('tid' => $term2['tid'])))));
+      $nodes[$node->nid] = $node;
+      $nodes_term2[] = $node->nid;
+    }
+
+    // Create 7 page nodes with both term1 and term2 attached.
+    for ($i = 0; $i < 7; $i++) {
+      $node = $this->drupalCreateNode(array($field_name => array(LANGUAGE_NONE => array(array('tid' => $term1['tid']), array('tid' => $term2['tid'])))));
+      $nodes[$node->nid] = $node;
+      $nodes_term1_term2[] = $node->nid;
+    }
+
+    // Create 7 page nodes without any terms.
+    for ($i = 0; $i < 7; $i++) {
+      $node = $this->drupalCreateNode();
+      $nodes[$node->nid] = $node;
+      $nodes_noterm[] = $node->nid;
+    }
+
+    // If pager is FALSE query is limited by 'feed_default_items' variable.
+    variable_set('feed_default_items', 100);
+
+    // Select 14 nodes with term1 attached.
+    $response = $this->servicesPost($path . '/taxonomy_term/selectNodes', array('tid' => $term1['tid'], 'pager' => FALSE));
+    $response_nodes = $this->getNodeNids($response['body']);
+    sort($response_nodes);
+
+    $term1_nodes = array_merge($nodes_term1, $nodes_term1_term2);
+    sort($term1_nodes);
+
+    $this->assertEqual($response_nodes, $term1_nodes, t('selectNodes selected proper nodes by one term.'), 'TaxonomyTermResource: selectNodes');
+
+    // Ensure pager works.
+    $response = $this->servicesPost($path . '/taxonomy_term/selectNodes', array('tid' => $term1['tid'], 'pager' => TRUE));
+    $this->assertEqual(count($response['body']), 10, t('selectNodes pager works.'), 'TaxonomyTermResource: selectNodes');
+
+    // AND or OR tests are not applicable as taxonomy_select_nodes() does not accept operators.
+  }
+
+  /**
+   * Helper. Create taxonomy vocabulary.
+   */
+  function createVocabulary() {
+    $vocabulary = (object)array(
+      'name'        => $this->randomName(),
+      'machine_name'=> $this->randomName(),
+      'description' => $this->randomString(),
+      'hierarchy'   => 1,
+      'module'      => 'services',
+      'weight'      => 0,
+    );
+    taxonomy_vocabulary_save($vocabulary);
+    $query = db_select('taxonomy_vocabulary', 'v')
+      ->fields('v', array('vid'))
+      ->condition('v.name', $vocabulary->name);
+    $vid = $query->execute()->fetchField();
+
+    return (array)taxonomy_vocabulary_load($vid);
+  }
+
+  /**
+   * Helper. Create taxonomy term.
+   */
+  function createTerm($vid) {
+    $term = (object)array(
+      'vid' => $vid,
+      'name' => $this->randomName(),
+      'description' => $this->randomString(),
+      'weight' => rand(0, 100),
+      'parent' => NULL,
+    );
+    taxonomy_term_save($term);
+
+    // Load term by name.
+    return (array)current(taxonomy_get_term_by_name($term->name));
+  }
+
+  /**
+   * Helper. Get array of nids from nodes array.
+   */
+  function getNodeNids($nodes) {
+    $nodes = (array)$nodes;
+    $return = array();
+    foreach ($nodes as $node) {
+      if (isset($node->nid)) {
+        $return[] = $node->nid;
+      }
+    }
+    return $return;
+  }
+}
