diff --git a/mailman_api.module b/mailman_api.module
index 83a3974..9d1b6fa 100644
--- a/mailman_api.module
+++ b/mailman_api.module
@@ -123,6 +123,198 @@ function mailman_api_is_subscribed($list, $email) {
 }
 
 /**
+ * Build the mailman administration form
+ * 
+ * @param $form_state
+ *   Drupal variable for passing form values
+ * @param $list
+ *   List object from which to get the form basic information
+ * @param $ext
+ *   The specific path to grab the form from
+ * @return
+ *   The form array of the given list, or FALSE, if failure
+ */
+function mailman_api_get_form(&$form_state, $list, $ext = NULL) {
+  $query = array(
+    'adminpw' => $list->pass,
+  );
+  if (!$ext) {
+    $ext = 'general';
+  }
+  // Build URL without password for error reporting
+  $url = url($list->url . '/' . $ext);
+  
+  // Explicitly tell the user which forms are supported
+  switch ($ext) {
+      
+    case 'general':
+    case 'language':
+    case 'nondigest':
+    case 'digest':
+    case 'privacy':
+      $ext = 'privacy/subscribing';
+    case 'privacy/sender':
+    case 'privacy/subscribing':
+    case 'privacy/recipient':
+    case 'bounce':
+    case 'archive':
+    case 'gateway':
+    case 'contentfilter':
+      break;
+    default:
+    drupal_set_message(t('Mailman API does not support loading the form at path %url yet', array('%url' => $url)), 'error');
+      return FALSE;
+      break;
+  }
+  
+  // Build the URL query, and call the form
+  $url = url($url, array('query' => $query));
+  $result = _mailman_api_response($url);
+  
+  // Use drupal DOM class to build the form
+  $dom = new DOMDocument;
+
+  $dom->loadHTML($result->data);
+
+  $rows = $dom->getElementsByTagName('tr');
+  $form = array();
+  $form['list'] = array(
+    '#value' => serialize($list),
+    '#type' => 'value',
+  );
+  $form['url'] = array(
+    '#value' => $list->url . '/' . $ext,
+    '#type' => 'value',
+  );
+
+  foreach ($rows as $row){
+    $divs = $row->getElementsByTagName('div');
+    foreach ($divs as $div) {
+      // Huge hack. However, unfortunately mailman's form is not
+      // properly formed, so this is how we can get descriptions
+      // for each form element
+      if ($div->getAttribute('align') == 'right') {
+        $inputs = $row->getElementsByTagName('input');
+        foreach ($inputs as $input) {
+          if (!isset($form[$input->getAttribute('name')])) {
+            $form[$input->getAttribute('name')] = array(
+              '#title' => t(ucwords(str_replace('_', ' ', $input->getAttribute('name')))),
+              '#description' => t($div->textContent),
+            );
+          }
+          
+          $type = strtolower($input->getAttribute('type'));
+          switch ($type) {
+            case 'text':
+              $form[$input->getAttribute('name')]['#type'] = 'textfield';
+              $form[$input->getAttribute('name')]['#default_value'] = $input->getAttribute('value');
+              $form[$input->getAttribute('name')]['#size'] = $input->getAttribute('size');
+              break;
+            
+            case 'radio':
+              if (!isset($form[$input->getAttribute('name')]['#type'])) {
+                $form[$input->getAttribute('name')]['#type'] = 'radios';
+              }
+              $form[$input->getAttribute('name')]['#options'][$input->getAttribute('value')] = t($input->nextSibling->nodeValue);
+              if ($input->hasAttribute('checked')) {
+                $form[$input->getAttribute('name')]['#default_value'] = $input->getAttribute('value');
+              }
+              break;
+            case 'checkbox':
+              if (!isset($form[$input->getAttribute('name')]['#type'])) {
+                $form[$input->getAttribute('name')]['#type'] = 'checkboxes';
+                $form[$input->getAttribute('name')]['#tree'] = FALSE;
+              }
+              
+              $form[$input->getAttribute('name')]['#options'][$input->getAttribute('value')] = t($input->nextSibling->nodeValue);
+              if ($input->hasAttribute('checked')) {
+                $form[$input->getAttribute('name')]['#default_value'][] = $input->getAttribute('value');
+              }
+              break;
+          }
+        }
+        $textareas = $row->getElementsByTagName('textarea');
+        foreach ($textareas as $textarea) {
+          $form[$textarea->getAttribute('name')] = array(
+            '#type' => 'textarea',
+            '#title' => t(ucwords(str_replace('_', ' ', $textarea->getAttribute('name')))),
+            '#default_value' => $textarea->textContent,
+            '#description' => t($div->textContent),
+            '#cols' => $textarea->getAttribute('cols'),
+            '#rows' => $textarea->getAttribute('rows'),
+          );
+        }
+        $selects = $row->getElementsByTagName('select');
+        foreach ($selects as $select) {
+          $form[$select->getAttribute('name')] = array(
+            '#type' => 'select',
+            '#title' => t(ucwords(str_replace('_', ' ', $select->getAttribute('name')))),
+            '#description' => t($div->textContent),
+          );
+          $options = $select->getElementsByTagName('option');
+          foreach ($options as $option) {
+            $form[$select->getAttribute('name')]['#options'][$option->getAttribute('value')] = $option->textContent;
+            if ($option->hasAttribute('selected')) {
+              $form[$select->getAttribute('name')]['#default_value'] = $option->getAttribute('value');
+            }
+          }
+        }
+      }
+    }
+  }
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  $form['#submit'][] = 'mailman_api_submit_form';
+
+  return $form;
+}
+
+/**
+ * Submit function for a mailman api form
+ * 
+ * @param $form
+ *   Drupal form that was submitted
+ * @param $form_state
+ *   Form information passed from form
+ * @return
+ *   TODO
+ */
+function mailman_api_submit_form($form, &$form_state) {
+  $list = unserialize($form_state['values']['list']);
+  $url = $form_state['values']['url'];
+  unset($form_state['values']['url']);
+  unset($form_state['values']['list']);
+  $query = array();
+  $query = array(
+    'adminpw' => $list->pass,
+  );
+  $array_query = $query;
+  
+  $ignore = array('list', 'url', 'op', 'submit', 'form_build_id', 'form_token', 'form_id');
+  foreach($form_state['values'] as $form_name => $value) {
+    if (in_array($form_name, $ignore)) {
+      continue;
+    }
+    $query[$form_name] = $value;
+  }
+  
+  $post_url = ''; 
+  foreach ($query AS $key => $value) {
+    if (is_array($value)) {
+      foreach ($value as $two) {
+        $post_url .= urlencode($key) . '=' . urlencode($two) . '&';
+      }
+    }else
+    {
+      $post_url .= urlencode($key) . '=' . urlencode($value) . '&';
+    }
+  }
+  $post_url = rtrim($post_url, '&');
+  
+  $url = url($url, array('query' => $post_url));
+  return _mailman_api_response($url);
+}
+
+/**
  * Submit query to MailMan, return result if true
  *
  * @param $url
