diff --git a/twitter_pull.admin.inc b/twitter_pull.admin.inc
new file mode 100644
index 0000000..dc43fbb
--- /dev/null
+++ b/twitter_pull.admin.inc
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * @file twitter_pull.admin.inc
+ * 
+ * Configuration settings page for twitter_pull module.
+ */
+
+function twitter_pull_config_page() {
+  
+  // check for twitter-api-php library
+  $lib = 'sites/all/libraries/twitter-api-php';
+  if (!file_exists($lib)) {
+    drupal_set_message(t('Please install TwitterAPIExchange as a library.  http://github.com/j7mbo/twitter-api-php'), 'error');
+  }
+  
+  $desc =<<<EOF
+Using twitter_pull with v1.1 of the Twitter api requires you register your site as a twitter app.  To do this, please
+visit https://dev.twitter.com/apps/new and create an application.  Click "Create my access token" at the bottom of the
+page.  Then copy the Consumer key, Consumer secret, Access token, and Access token secret into the fields below.
+EOF;
+  
+  $form = array(
+    'twitter_api_key' => array(
+      '#type' => 'fieldset',
+      '#collapsible' => FALSE,
+      '#description' => t($desc),
+      '#title' => t('Twitter v1.1 API keys'),
+
+      'twitter_pull_consumer_key' => array(
+        '#type' => 'textfield',
+        '#required' => TRUE,
+        '#default_value' => variable_get('twitter_pull_consumer_key', ''),
+        '#title' => t('Consumer Key'),     
+      ),
+
+      'twitter_pull_consumer_secret' => array(
+        '#type' => 'textfield',
+        '#required' => TRUE,
+        '#default_value' => variable_get('twitter_pull_consumer_secret', ''),
+        '#title' => t('Consumer Secret'),
+      ),
+        
+      'twitter_pull_oauth_access_token' => array(
+        '#type' => 'textfield',
+        '#required' => TRUE,
+        '#default_value' => variable_get('twitter_pull_oauth_access_token', ''),
+        '#title' => t('Access Token'),
+      ),
+        
+      'twitter_pull_oauth_access_token_secret' => array(
+        '#type' => 'textfield',
+        '#required' => TRUE,
+        '#default_value' => variable_get('twitter_pull_oauth_access_token_secret', ''),
+        '#title' => t('Access Token Secret'),
+      ),   
+    ) 
+  );
+  
+  
+  return system_settings_form($form);
+}
diff --git a/twitter_pull.class.inc b/twitter_pull.class.inc
index d7ba7e0..cfdb852 100644
--- a/twitter_pull.class.inc
+++ b/twitter_pull.class.inc
@@ -48,35 +48,49 @@ class twitter_puller {
 
     // lists have the format @username/listname
     if ($prefix == '@' && $slash !== FALSE) {
-      $username = drupal_substr($this->twitkey, 1, $slash - 1);
       $listname = drupal_substr($this->twitkey, $slash + 1);
-      $url = 'http://api.twitter.com/1/'. urlencode($username) .'/lists/'. urlencode($listname) .'/statuses.json?per_page='. $num;
+      $url = 'https://api.twitter.com/1.1/lists/show.json';
+      $query = '?slug=' . urlencode($listname);
     }
     // if the first character is @, then consider the key a username
     elseif ($prefix == "@") {
       $key = drupal_substr($this->twitkey, 1);
-      $url = 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name='. urlencode($key) .'&include_rts=true&count='. $num;   
+      $url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
+      $query = "?screen_name=${key}&count=${num}&include_rts=1";
     }
     // otherwise, use the key as a search term
     else {
       if ($num > 100) {
         $num = 100;
       }
-      $url = 'http://search.twitter.com/search.json?q='. urlencode($this->twitkey) .'&rpp='. $num;
+      $url = 'https://api.twitter.com/1.1/search/tweets.json';
+      $query = '?q=' . urlencode($this->twitkey) ."&include_entities=true&count=${num}";
     }
 
-    $ret = drupal_http_request($url);
+    $lib = 'sites/all/libraries/twitter-api-php';
+    if (!file_exists($lib)) {
+      drupal_set_message(t('Please install TwitterAPIExchange as a library.  http://github.com/j7mbo/twitter-api-php'), 'error');
+      return;
+    }
+    require_once($lib . '/TwitterAPIExchange.php');
 
-    if ($ret->code < 200 || $ret->code > 399) {
-      $errmsg = json_decode($ret->data);
-      $errmsg = t('The error message received was: @message.', array('@message' => $errmsg->error));
-      if ($ret->code == 400) {
-        $errmsg .= t('This site may be subject to rate limiting. For more information, see:') . 'http://apiwiki.twitter.com/Rate-limiting';
-      }
-      throw new Exception(t('Could not retrieve data from Twitter.') .' '. $errmsg);
+    $settings = array();
+    foreach (array('consumer_key', 'consumer_secret', 'oauth_access_token', 'oauth_access_token_secret') as $var) {
+      $settings[$var] = variable_get('twitter_pull_'.$var, FALSE);
+    }
+
+    if (in_array(FALSE, $settings, TRUE)) {
+      drupal_set_message('Twitter has not been configured yet.  Please contact your admin.', 'error');
+      return;
     }
 
-    $items = json_decode($ret->data);
+
+
+    $twitter = new TwitterAPIExchange($settings);
+    $req = $twitter->setGetfield($query)
+      ->buildOauth($url, 'GET')
+      ->performRequest();
+    $items = json_decode($req);
     $this->parse_items($items);
 
   }
@@ -85,8 +99,8 @@ class twitter_puller {
     $tweets = array();
 
     //-- If search response then items are one level lower.
-    if (isset($items->results) && is_array($items->results)) {
-      $items = $items->results;
+    if (isset($items->statuses) && is_array($items->statuses)) {
+      $items = $items->statuses;
     }
 
     if (is_array($items)) {
diff --git a/twitter_pull.module b/twitter_pull.module
index 7774875..8e65726 100644
--- a/twitter_pull.module
+++ b/twitter_pull.module
@@ -214,21 +214,36 @@ function twitter_pull_block_data() {
 
 /****** FOR TESTING ONLY. KEEP DISABLED AT ALL TIMES UNLESS DEBUGGING ******/
 
-/*
+
 function twitter_pull_menu() {
   $items = array();
 
+  /*
   $items['twitter/pull/test'] = array(
     'title' => 'Twitter Pull Test',
     'page callback' => 'twitter_pull_test',
     'access arguments' => array('access content'),
     'type' => MENU_CALLBACK,
   );
+   */
+
+  $items['admin/settings/twitter_pull'] = array(
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('twitter_pull_config_page'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'twitter_pull.admin.inc',
+    'file path' => drupal_get_path('module', 'twitter_pull'),
+    'type' => MENU_NORMAL_ITEM,
+    'description' => t('Configure twitter_pull module.'),
+    'title' => 'twitter_pull',    
+  );
 
   return $items;
 }
 
+/*
 function twitter_pull_test() {
   return twitter_pull_render('@inadarei');
 }
-*/
+ */
+
