diff --git a/include/class.canned.php b/include/class.canned.php
index 52a487529c368bc158777359260d36b808dc1d90..0550e81ba839da8273558e029881e186f9d4c844 100644
--- a/include/class.canned.php
+++ b/include/class.canned.php
@@ -35,7 +35,7 @@ class Canned {
             .' count(filter.id) as filters '
             .' FROM '.CANNED_TABLE.' canned '
             .' LEFT JOIN '.CANNED_ATTACHMENT_TABLE.' attach ON (attach.canned_id=canned.canned_id) ' 
-            .' LEFT JOIN '.EMAIL_FILTER_TABLE.' filter ON (canned.canned_id = filter.canned_response_id) '
+            .' LEFT JOIN '.FILTER_TABLE.' filter ON (canned.canned_id = filter.canned_response_id) '
             .' WHERE canned.canned_id='.db_input($id);
         if(!($res=db_query($sql)) ||  !db_num_rows($res))
             return false;
@@ -100,7 +100,7 @@ class Canned {
         if (!$this->_filters) {
             $this->_filters = array();
             $res = db_query(
-                  'SELECT name FROM '.EMAIL_FILTER_TABLE
+                  'SELECT name FROM '.FILTER_TABLE
                 .' WHERE canned_response_id = '.db_input($this->getId())
                 .' ORDER BY name');
             while ($row = db_fetch_row($res))
diff --git a/include/class.filter.php b/include/class.filter.php
index b6c81b42b60d0d4b8c67d3f7b33b1138695fa1e7..a7015d4ee18bb7e15463828406de38951191560f 100644
--- a/include/class.filter.php
+++ b/include/class.filter.php
@@ -18,7 +18,7 @@ class Filter {
     var $id;
     var $ht;
 
-    function Filter($id){
+    function Filter($id) {
         $this->id=0;
         $this->load($id);
     }
@@ -29,8 +29,8 @@ class Filter {
             return false;
 
         $sql='SELECT filter.*,count(rule.id) as rule_count '
-            .' FROM '.EMAIL_FILTER_TABLE.' filter '
-            .' LEFT JOIN '.EMAIL_FILTER_RULE_TABLE.' rule ON(rule.filter_id=filter.id) '
+            .' FROM '.FILTER_TABLE.' filter '
+            .' LEFT JOIN '.FILTER_RULE_TABLE.' rule ON(rule.filter_id=filter.id) '
             .' WHERE filter.id='.db_input($id)
             .' GROUP BY filter.id';
 
@@ -47,27 +47,31 @@ class Filter {
         return $this->load($this->getId());
     }
 
-    function getId(){
+    function getId() {
         return $this->id;
     }
 
-    function getName(){
+    function getTarget() {
+        return $this->ht['target'];
+    }
+
+    function getName() {
         return $this->ht['name'];
     }
 
-    function getNotes(){
+    function getNotes() {
         return $this->ht['notes'];
     }
 
-    function getInfo(){
+    function getInfo() {
         return  $this->ht;
     }
 
-    function getNumRules(){
+    function getNumRules() {
         return $this->ht['rule_count'];
     }
 
-    function getExecOrder(){
+    function getExecOrder() {
         return $this->ht['execorder'];
     }
 
@@ -75,7 +79,7 @@ class Filter {
         return $this->ht['email_id'];
     }
 
-    function isActive(){
+    function isActive() {
         return ($this->ht['isactive']);
     }
 
@@ -83,23 +87,23 @@ class Filter {
         return !strcasecmp($this->getName(),'SYSTEM BAN LIST');
     }
 
-    function getDeptId(){
+    function getDeptId() {
         return $this->ht['dept_id'];
     }
 
-    function getPriorityId(){
+    function getPriorityId() {
         return $this->ht['priority_id'];
     }
 
-    function getSLAId(){
+    function getSLAId() {
         return $this->ht['sla_id'];
     }
 
-    function getStaffId(){
+    function getStaffId() {
         return $this->ht['staff_id'];
     }
 
-    function getTeamId(){
+    function getTeamId() {
         return $this->ht['team_id'];
     }
 
@@ -107,36 +111,36 @@ class Filter {
         return $this->ht['canned_response_id'];
     }
 
-    function stopOnMatch(){
+    function stopOnMatch() {
         return ($this->ht['stop_on_match']);
     }
 
-    function matchAllRules(){
+    function matchAllRules() {
         return ($this->ht['match_all_rules']);
     }
 
-    function rejectEmail(){
+    function rejectEmail() {
         return ($this->ht['reject_email']);
     }
 
-    function useReplyToEmail(){
+    function useReplyToEmail() {
         return ($this->ht['use_replyto_email']);
     }
 
-    function disableAlerts(){
+    function disableAlerts() {
         return ($this->ht['disable_autoresponder']);
     }
      
-    function sendAlerts(){
+    function sendAlerts() {
         return (!$this->disableAlerts());
     }
 
-    function getRules(){
+    function getRules() {
         if (!$this->ht['rules']) {
             $rules=array();
             //We're getting the rules...live because it gets cleared on update.
-            $sql='SELECT * FROM '.EMAIL_FILTER_RULE_TABLE.' WHERE filter_id='.db_input($this->getId());
-            if(($res=db_query($sql)) && db_num_rows($res)){
+            $sql='SELECT * FROM '.FILTER_RULE_TABLE.' WHERE filter_id='.db_input($this->getId());
+            if(($res=db_query($sql)) && db_num_rows($res)) {
                 while($row=db_fetch_array($res))
                     $rules[]=array('w'=>$row['what'],'h'=>$row['how'],'v'=>$row['val']);
             }
@@ -145,11 +149,11 @@ class Filter {
         return $this->ht['rules'];
     }
 
-    function getFlatRules(){ //Format used on html... I'm ashamed 
+    function getFlatRules() { //Format used on html... I'm ashamed 
 
         $info=array();
-        if(($rules=$this->getRules())){
-            foreach($rules as $k=>$rule){
+        if(($rules=$this->getRules())) {
+            foreach($rules as $k=>$rule) {
                 $i=$k+1;
                 $info["rule_w$i"]=$rule['w'];
                 $info["rule_h$i"]=$rule['h'];
@@ -169,7 +173,7 @@ class Filter {
 
     function removeRule($what, $how, $val) {
 
-        $sql='DELETE FROM '.EMAIL_FILTER_RULE_TABLE
+        $sql='DELETE FROM '.FILTER_RULE_TABLE
             .' WHERE filter_id='.db_input($this->getId())
             .' AND what='.db_input($what)
             .' AND how='.db_input($how)
@@ -197,7 +201,7 @@ class Filter {
         } else {
             # Fetch from database
             return 0 != db_count(
-                "SELECT COUNT(*) FROM ".EMAIL_FILTER_RULE_TABLE
+                "SELECT COUNT(*) FROM ".FILTER_RULE_TABLE
                ." WHERE filter_id=".db_input($this->id)
                ." AND what=".db_input($what)." AND how=".db_input($how)
                ." AND val=".db_input($val)
@@ -306,7 +310,7 @@ class Filter {
         );
     }
 
-    function update($vars,&$errors){
+    function update($vars,&$errors) {
 
         if(!Filter::save($this->getId(),$vars,$errors))
             return false;
@@ -316,47 +320,55 @@ class Filter {
         return true;
     }
 
-    function delete(){
+    function delete() {
         
         $id=$this->getId();
-        $sql='DELETE FROM '.EMAIL_FILTER_TABLE.' WHERE id='.db_input($id).' LIMIT 1';
-        if(db_query($sql) && ($num=db_affected_rows())){
-            db_query('DELETE FROM '.EMAIL_FILTER_RULE_TABLE.' WHERE filter_id='.db_input($id));
+        $sql='DELETE FROM '.FILTER_TABLE.' WHERE id='.db_input($id).' LIMIT 1';
+        if(db_query($sql) && ($num=db_affected_rows())) {
+            db_query('DELETE FROM '.FILTER_RULE_TABLE.' WHERE filter_id='.db_input($id));
         }
 
         return $num;
     }
 
     /** static functions **/
-    function create($vars,&$errors){
+    function getTargets() {
+        return array(
+                'All' => 'All',
+                'Web' => 'Web Forms',
+                'Email' => 'Emails',
+                'API' => 'API Calls');
+    }
+
+    function create($vars,&$errors) {
         return Filter::save(0,$vars,$errors);
     }
 
-    function getIdByName($name){
+    function getIdByName($name) {
 
-        $sql='SELECT id FROM '.EMAIL_FILTER_TABLE.' WHERE name='.db_input($name);
+        $sql='SELECT id FROM '.FILTER_TABLE.' WHERE name='.db_input($name);
         if(($res=db_query($sql)) && db_num_rows($res))
             list($id)=db_fetch_row($res);
 
         return $id;
     }
 
-    function lookup($id){
+    function lookup($id) {
         return ($id && is_numeric($id) && ($f= new Filter($id)) && $f->getId()==$id)?$f:null;
     }
 
-    function validate_rules($vars,&$errors){
+    function validate_rules($vars,&$errors) {
         return self::save_rules(0,$vars,$errors);
     }
 
-    function save_rules($id,$vars,&$errors){
+    function save_rules($id,$vars,&$errors) {
 
         $matches=array('name','email','subject','body','header');
         $types=array('equal','not_equal','contains','dn_contain');
 
         $rules=array();
         for($i=1; $i<=25; $i++) { //Expecting no more than 25 rules...
-            if($vars["rule_w$i"] || $vars["rule_h$i"]){
+            if($vars["rule_w$i"] || $vars["rule_h$i"]) {
                 if(!$vars["rule_w$i"] || !in_array($vars["rule_w$i"],$matches))
                     $errors["rule_$i"]='Invalid match selection';
                 elseif(!$vars["rule_h$i"] || !in_array($vars["rule_h$i"],$types))
@@ -367,7 +379,7 @@ class Filter {
                     $errors["rule_$i"]='Valid email required for the match type';
                 else //for everything-else...we assume it's valid.
                     $rules[]=array('w'=>$vars["rule_w$i"],'h'=>$vars["rule_h$i"],'v'=>$vars["rule_v$i"]);
-            }elseif($vars["rule_v$i"]){
+            }elseif($vars["rule_v$i"]) {
                 $errors["rule_$i"]='Incomplete selection';
             }
         }
@@ -383,7 +395,7 @@ class Filter {
         if(!$id) return true; //When ID is 0 then assume it was just validation...
 
         //Clear existing rules...we're doing mass replace on each save!! 
-        db_query('DELETE FROM '.EMAIL_FILTER_RULE_TABLE.' WHERE filter_id='.db_input($id));
+        db_query('DELETE FROM '.FILTER_RULE_TABLE.' WHERE filter_id='.db_input($id));
         $num=0;
         foreach($rules as $rule) {
             $rule['filter_id']=$id;
@@ -394,39 +406,49 @@ class Filter {
         return $num; 
     }
 
-    function save($id,$vars,&$errors){
+    function save($id,$vars,&$errors) {
 
 
         if(!$vars['execorder'])
-            $errors['execorder']='Order required';
+            $errors['execorder'] = 'Order required';
         elseif(!is_numeric($vars['execorder']))
-            $errors['execorder']='Must be numeric value';
+            $errors['execorder'] = 'Must be numeric value';
             
         if(!$vars['name'])
-            $errors['name']='Name required';
+            $errors['name'] = 'Name required';
         elseif(($sid=self::getIdByName($vars['name'])) && $sid!=$id)
-            $errors['name']='Name already in-use';
+            $errors['name'] = 'Name already in-use';
 
         if(!$errors && !self::validate_rules($vars,$errors) && !$errors['rules'])
-            $errors['rules']='Unable to validate rules as entered';
+            $errors['rules'] = 'Unable to validate rules as entered';
+
+        if(!is_numeric($vars['target']) && !in_array($vars['target'], array('All', 'Email', 'Web')))
+            $errors['target'] = 'Unknown or invalid target';
 
         if($errors) return false;
 
-        $sql=' updated=NOW() '.
-             ',isactive='.db_input($vars['isactive']).
-             ',name='.db_input($vars['name']).
-             ',execorder='.db_input($vars['execorder']).
-             ',email_id='.db_input($vars['email_id']).
-             ',dept_id='.db_input($vars['dept_id']).
-             ',priority_id='.db_input($vars['priority_id']).
-             ',sla_id='.db_input($vars['sla_id']).
-             ',match_all_rules='.db_input($vars['match_all_rules']).
-             ',stop_onmatch='.db_input(isset($vars['stop_onmatch'])?1:0).
-             ',reject_email='.db_input(isset($vars['reject_email'])?1:0).
-             ',use_replyto_email='.db_input(isset($vars['use_replyto_email'])?1:0).
-             ',disable_autoresponder='.db_input(isset($vars['disable_autoresponder'])?1:0).
-             ',canned_response_id='.db_input($vars['canned_response_id']).
-             ',notes='.db_input($vars['notes']);
+        $emailId = 0;
+        if(is_numeric($vars['target'])) {
+            $emailId = $vars['target'];
+            $vars['target'] = 'Email';
+        }
+
+        $sql=' updated=NOW() '
+            .',isactive='.db_input($vars['isactive'])
+            .',target='.db_input($vars['target'])
+            .',name='.db_input($vars['name'])
+            .',execorder='.db_input($vars['execorder'])
+            .',email_id='.db_input($emailId)
+            .',dept_id='.db_input($vars['dept_id'])
+            .',priority_id='.db_input($vars['priority_id'])
+            .',sla_id='.db_input($vars['sla_id'])
+            .',match_all_rules='.db_input($vars['match_all_rules'])
+            .',stop_onmatch='.db_input(isset($vars['stop_onmatch'])?1:0)
+            .',reject_email='.db_input(isset($vars['reject_email'])?1:0)
+            .',use_replyto_email='.db_input(isset($vars['use_replyto_email'])?1:0)
+            .',disable_autoresponder='.db_input(isset($vars['disable_autoresponder'])?1:0)
+            .',canned_response_id='.db_input($vars['canned_response_id'])
+            .',notes='.db_input($vars['notes']);
        
 
         //Auto assign ID is overloaded...
@@ -438,11 +460,11 @@ class Filter {
             $sql.=',staff_id=0,team_id=0 '; //no auto-assignment!
 
         if($id) {
-            $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET '.$sql.' WHERE id='.db_input($id);
+            $sql='UPDATE '.FILTER_TABLE.' SET '.$sql.' WHERE id='.db_input($id);
             if(!db_query($sql))
                 $errors['err']='Unable to update the filter. Internal error occurred';
         }else{
-            $sql='INSERT INTO '.EMAIL_FILTER_TABLE.' SET '.$sql.',created=NOW() ';
+            $sql='INSERT INTO '.FILTER_TABLE.' SET '.$sql.',created=NOW() ';
             if(!db_query($sql) || !($id=db_insert_id()))
                 $errors['err']='Unable to add filter. Internal error';
         }
@@ -464,14 +486,14 @@ class FilterRule {
 
     var $filter;
 
-    function FilterRule($id,$filterId=0){
+    function FilterRule($id,$filterId=0) {
         $this->id=0;
         $this->load($id,$filterId);
     }
 
     function load($id,$filterId=0) {
 
-        $sql='SELECT rule.* FROM '.EMAIL_FILTER_RULE_TABLE.' rule '
+        $sql='SELECT rule.* FROM '.FILTER_RULE_TABLE.' rule '
             .' WHERE rule.id='.db_input($id);
         if($filterId)
             $sql.=' AND rule.filter_id='.db_input($filterId);
@@ -529,9 +551,9 @@ class FilterRule {
         return true;
     }
 
-    function delete(){
+    function delete() {
         
-        $sql='DELETE FROM '.EMAIL_FILTER_RULE_TABLE.' WHERE id='.db_input($this->getId()).' AND filter_id='.db_input($this->getFilterId());
+        $sql='DELETE FROM '.FILTER_RULE_TABLE.' WHERE id='.db_input($this->getId()).' AND filter_id='.db_input($this->getFilterId());
 
         return (db_query($sql) && db_affected_rows());
     }
@@ -559,12 +581,12 @@ class FilterRule {
             $sql.=',notes='.db_input($vars['notes']);
 
         if($id) {
-            $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET '.$sql.' WHERE id='.db_input($id).' AND filter_id='.db_input($vars['filter_id']);
+            $sql='UPDATE '.FILTER_RULE_TABLE.' SET '.$sql.' WHERE id='.db_input($id).' AND filter_id='.db_input($vars['filter_id']);
             if(db_query($sql))
                 return true;
 
         } else {
-            $sql='INSERT INTO '.EMAIL_FILTER_RULE_TABLE.' SET created=NOW(), filter_id='.db_input($vars['filter_id']).', '.$sql;
+            $sql='INSERT INTO '.FILTER_RULE_TABLE.' SET created=NOW(), filter_id='.db_input($vars['filter_id']).', '.$sql;
             if(db_query($sql) && ($id=db_insert_id()))
                 return $id;
         }
@@ -665,7 +687,7 @@ class EmailFilter {
     }
     
     /* static */ function getAllActive() {
-        $sql="SELECT id FROM ".EMAIL_FILTER_TABLE." WHERE isactive"
+        $sql="SELECT id FROM ".FILTER_TABLE." WHERE isactive"
            ." ORDER BY execorder";
 
         return db_query($sql);
@@ -695,8 +717,8 @@ class EmailFilter {
      */
     /* static */ function quickList($addr, $name=false, $subj=false, 
             $emailid=0) {
-        $sql="SELECT DISTINCT filter_id FROM ".EMAIL_FILTER_RULE_TABLE." rule"
-           ." INNER JOIN ".EMAIL_FILTER_TABLE." filter"
+        $sql="SELECT DISTINCT filter_id FROM ".FILTER_RULE_TABLE." rule"
+           ." INNER JOIN ".FILTER_TABLE." filter"
            ." ON (filter.id=rule.filter_id)"
            ." WHERE filter.isactive";
         # Filter by recipient email-id if specified
@@ -713,8 +735,8 @@ class EmailFilter {
         # sender-email-addresses or sender-names or subjects
         $sql.=") OR filter.id IN ("
                ." SELECT filter_id "
-               ." FROM ".EMAIL_FILTER_RULE_TABLE." rule"
-               ." INNER JOIN ".EMAIL_FILTER_TABLE." filter"
+               ." FROM ".FILTER_RULE_TABLE." rule"
+               ." INNER JOIN ".FILTER_TABLE." filter"
                ." ON (rule.filter_id=filter.id)"
                ." GROUP BY filter_id"
                ." HAVING COUNT(*)-COUNT(NULLIF(what,'email'))=0";
@@ -724,8 +746,8 @@ class EmailFilter {
         # have at least one rule 'what' type that wasn't considered
         $sql.=") OR filter.id IN ("
                ." SELECT filter_id"
-               ." FROM ".EMAIL_FILTER_RULE_TABLE." rule"
-               ." INNER JOIN ".EMAIL_FILTER_TABLE." filter"
+               ." FROM ".FILTER_RULE_TABLE." rule"
+               ." INNER JOIN ".FILTER_TABLE." filter"
                ." ON (rule.filter_id=filter.id)"
                ." WHERE what NOT IN ('email'"
         # Handle sender-name and subject if specified
@@ -751,8 +773,8 @@ class EmailFilter {
     /* static */ function isBanned($addr) {
 
         $sql='SELECT filter.id, what, how, UPPER(val) '
-            .' FROM '.EMAIL_FILTER_TABLE.' filter'
-            .' INNER JOIN '.EMAIL_FILTER_RULE_TABLE.' rule'
+            .' FROM '.FILTER_TABLE.' filter'
+            .' INNER JOIN '.FILTER_RULE_TABLE.' rule'
             .' ON (filter.id=rule.filter_id)'
             .' WHERE filter.reject_email'
             .'   AND filter.match_all_rules=0'
diff --git a/include/staff/banlist.inc.php b/include/staff/banlist.inc.php
index 0b61d1e8b779edaf48c448c82eb38c3d1ce3deed..b2b37b284b0ae4de0750650b2feb9fae2135cf5d 100644
--- a/include/staff/banlist.inc.php
+++ b/include/staff/banlist.inc.php
@@ -3,7 +3,7 @@ if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin() || !$filter)
 
 $qstr='';
 $select='SELECT rule.* ';
-$from='FROM '.EMAIL_FILTER_RULE_TABLE.' rule ';
+$from='FROM '.FILTER_RULE_TABLE.' rule ';
 $where='WHERE rule.filter_id='.db_input($filter->getId());
 $search=false;
 if($_REQUEST['q'] && strlen($_REQUEST['q'])>3) {
diff --git a/include/staff/filter.inc.php b/include/staff/filter.inc.php
index c2aad0bcf4456d5bade4fa323a4ba3c991c39929..ccba2502ef2fbf40030dadaf58f11f1f292b6f21 100644
--- a/include/staff/filter.inc.php
+++ b/include/staff/filter.inc.php
@@ -33,7 +33,7 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
         <tr>
             <th colspan="2">
                 <h4><?php echo $title; ?></h4>
-                <em>Filters are executed based on execution order.</em>
+                <em>Filters are executed based on execution order. Filter can target specific ticket source.</em>
             </th>
         </tr>
     </thead>
@@ -71,31 +71,36 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
             </td>
         </tr>
         <tr>
-            <td width="180">
-                To Email Address:
+            <td width="180" class="required">
+                Target:
             </td>
             <td>
-                <select name="email_id">
-                    <option value="0">&mdash; Filter applies to ALL incoming emails &dash;</option>
+                <select name="target">
+                    <option value="All" <?php echo ($info['target']=='All')?'selected="selected"':''; ?>>&mdash; Applies to ALL Tickets &dash;</option>
+                    <option value="Web" <?php echo ($info['target']=='Web')?'selected="selected"':''; ?>>Web Forms</option>
+                    <option value="API" <?php echo ($info['target']=='API')?'selected="selected"':''; ?>>API Calls</option>
+                    <option value="Email" <?php echo ($info['target']=='Email')?'selected="selected"':''; ?>>Emails</option>
                     <?php
                     $sql='SELECT email_id,email,name FROM '.EMAIL_TABLE.' email ORDER by name';
-                    if(($res=db_query($sql)) && db_num_rows($res)){
-                        while(list($id,$email,$name)=db_fetch_row($res)){
+                    if(($res=db_query($sql)) && db_num_rows($res)) {
+                        echo '<OPTGROUP label="Specific Incoming Emails">';
+                        while(list($id,$email,$name)=db_fetch_row($res)) {
                             $selected=($info['email_id'] && $id==$info['email_id'])?'selected="selected"':'';
                             if($name)
                                 $email=Format::htmlchars("$name <$email>");
                             echo sprintf('<option value="%d" %s>%s</option>',$id,$selected,$email);
                         }
+                        echo '</OPTGROUP>';
                     }
                     ?>
                 </select>
-                <br><em>(Highly recommended if the filter is specific to one incoming email address)</em>
+                &nbsp;
+                <span class="error">&nbsp;<?php echo $errors['target']; ?></span>
             </td>
         </tr>
         <tr>
             <th colspan="2">
-                <em><strong>Filter Rules</strong>: Rules are applied based on the criteria.&nbsp;
-                    <span class="error">*&nbsp;<?php echo $errors['rules']; ?></span></em>
+                <em><strong>Filter Rules</strong>: Rules are applied based on the criteria.&nbsp;<span class="error">*&nbsp;<?php echo $errors['rules']; ?></span></em>
             </th>
         </tr>
         <tr>
diff --git a/include/staff/filters.inc.php b/include/staff/filters.inc.php
index 7f3aab393f56cb3b1eb3f8dc3da0113204d35e41..7573eceec7d3a82950a52e9e04ce2fce213754e8 100644
--- a/include/staff/filters.inc.php
+++ b/include/staff/filters.inc.php
@@ -1,13 +1,13 @@
 <?php
 if(!defined('OSTADMININC') || !$thisstaff->isAdmin()) die('Access Denied');
-
+$targets = Filter::getTargets();
 $qstr='';
 $sql='SELECT filter.*,count(rule.id) as rules '.
-     'FROM '.EMAIL_FILTER_TABLE.' filter '.
-     'LEFT JOIN '.EMAIL_FILTER_RULE_TABLE.' rule ON(rule.filter_id=filter.id) '.
+     'FROM '.FILTER_TABLE.' filter '.
+     'LEFT JOIN '.FILTER_RULE_TABLE.' rule ON(rule.filter_id=filter.id) '.
      'GROUP BY filter.id';
 $sortOptions=array('name'=>'filter.name','status'=>'filter.isactive','order'=>'filter.execorder','rules'=>'rules',
-                   'created'=>'filter.created','updated'=>'filter.updated');
+                   'target'=>'filter.target', 'created'=>'filter.created','updated'=>'filter.updated');
 $orderWays=array('DESC'=>'DESC','ASC'=>'ASC');
 $sort=($_REQUEST['sort'] && $sortOptions[strtolower($_REQUEST['sort'])])?strtolower($_REQUEST['sort']):'name';
 //Sorting options...
@@ -28,7 +28,7 @@ $x=$sort.'_sort';
 $$x=' class="'.strtolower($order).'" ';
 $order_by="$order_column $order ";
 
-$total=db_count('SELECT count(*) FROM '.EMAIL_FILTER_TABLE.' filter ');
+$total=db_count('SELECT count(*) FROM '.FILTER_TABLE.' filter ');
 $page=($_GET['p'] && is_numeric($_GET['p']))?$_GET['p']:1;
 $pageNav=new Pagenate($total, $page, PAGE_LIMIT);
 $pageNav->setURL('filters.php',$qstr.'&sort='.urlencode($_REQUEST['sort']).'&order='.urlencode($_REQUEST['order']));
@@ -44,7 +44,7 @@ else
 ?>
 
 <div style="width:700;padding-top:5px; float:left;">
- <h2>Email Filters</h2>
+ <h2>Ticket Filters</h2>
 </div>
 <div style="float:right;text-align:right;padding-top:5px;padding-right:5px;">
  <b><a href="filters.php?a=add" class="Icon newEmailFilter">Add New Filter</a></b></div>
@@ -58,9 +58,10 @@ else
         <tr>
             <th width="7">&nbsp;</th>        
             <th width="320"><a <?php echo $name_sort; ?> href="filters.php?<?php echo $qstr; ?>&sort=name">Name</a></th>
-            <th width="100"><a  <?php echo $status_sort; ?> href="filters.php?<?php echo $qstr; ?>&sort=status">Status</a></th>
+            <th width="80"><a  <?php echo $status_sort; ?> href="filters.php?<?php echo $qstr; ?>&sort=status">Status</a></th>
             <th width="80" style="text-align:center;"><a  <?php echo $order_sort; ?> href="filters.php?<?php echo $qstr; ?>&sort=order">Order</a></th>
             <th width="80" style="text-align:center;"><a  <?php echo $rules_sort; ?> href="filters.php?<?php echo $qstr; ?>&sort=rules">Rules</a></th>
+            <th width="100"><a  <?php echo $target_sort; ?> href="filters.php?<?php echo $qstr; ?>&sort=target">Target</a></th>
             <th width="120" nowrap><a  <?php echo $created_sort; ?>href="filters.php?<?php echo $qstr; ?>&sort=created">Date Added</a></th>
             <th width="150" nowrap><a  <?php echo $updated_sort; ?>href="filters.php?<?php echo $qstr; ?>&sort=updated">Last Updated</a></th>
         </tr>
@@ -85,6 +86,7 @@ else
                 <td><?php echo $row['isactive']?'Active':'<b>Disabled</b>'; ?></td>
                 <td style="text-align:right;padding-right:25px;"><?php echo $row['execorder']; ?>&nbsp;</td>
                 <td style="text-align:right;padding-right:25px;"><?php echo $row['rules']; ?>&nbsp;</td>
+                <td>&nbsp;<?php echo Format::htmlchars($targets[$row['target']]); ?></td>
                 <td>&nbsp;<?php echo Format::db_date($row['created']); ?></td>
                 <td>&nbsp;<?php echo Format::db_datetime($row['updated']); ?></td>
             </tr>
@@ -93,7 +95,7 @@ else
         endif; ?>
     <tfoot>
      <tr>
-        <td colspan="7">
+        <td colspan="8">
             <?php if($res && $num){ ?>
             Select:&nbsp;
             <a href="#" onclick="return select_all(document.forms['filters'],true)">All</a>&nbsp;&nbsp;
diff --git a/include/upgrader/sql/d0e37dca-58ef694d.patch.sql b/include/upgrader/sql/d0e37dca-58ef694d.patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..337cffa7932d89f92206dabe77c509397cdf11ba
--- /dev/null
+++ b/include/upgrader/sql/d0e37dca-58ef694d.patch.sql
@@ -0,0 +1,19 @@
+/**
+ * @version v1.7 RC3
+ * @signature 58ef694d5ebf73cc291e07e597c6f85d
+ *
+ *  Upgrade from 1.6 RC3 + filters
+ *  
+ */
+
+RENAME TABLE  `%TABLE_PREFIX%email_filter` TO  `%TABLE_PREFIX%filter`;
+
+RENAME TABLE  `%TABLE_PREFIX%email_filter_rule` TO  `%TABLE_PREFIX%filter_rule`;
+
+ALTER TABLE  `%TABLE_PREFIX%filter` 
+    ADD  `target` ENUM(  'All',  'Web',  'Email',  'API' ) NOT NULL DEFAULT  'All' AFTER  `sla_id` ,
+    ADD INDEX (  `target` );
+
+-- Finished with patch
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='58ef694d5ebf73cc291e07e597c6f85d';
diff --git a/main.inc.php b/main.inc.php
index abcbfeabdaee005bdd83abb7719ac163e0e531af..d9ee629e1081af76d3c7f906a12750a7f51d297c 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -63,8 +63,7 @@
 
     #Current version && schema signature (Changes from version to version)
     define('THIS_VERSION','1.7-RC2'); //Shown on admin panel
-    define('SCHEMA_SIGNATURE','d0e37dca324648f1ce2d10528a6026d4'); //MD5 signature of the db schema. (used to trigger upgrades)
-
+    define('SCHEMA_SIGNATURE','58ef694d5ebf73cc291e07e597c6f85d'); //MD5 signature of the db schema. (used to trigger upgrades)
     #load config info
     $configfile='';
     if(file_exists(ROOT_DIR.'ostconfig.php')) //Old installs prior to v 1.6 RC5
@@ -159,8 +158,10 @@
   
     define('EMAIL_TABLE',TABLE_PREFIX.'email');
     define('EMAIL_TEMPLATE_TABLE',TABLE_PREFIX.'email_template');
-    define('EMAIL_FILTER_TABLE',TABLE_PREFIX.'email_filter');
-    define('EMAIL_FILTER_RULE_TABLE',TABLE_PREFIX.'email_filter_rule');
+
+    define('FILTER_TABLE',TABLE_PREFIX.'filter');
+    define('FILTER_RULE_TABLE',TABLE_PREFIX.'filter_rule');
+    
     define('BANLIST_TABLE',TABLE_PREFIX.'email_banlist'); //Not in use anymore....as of v 1.7
 
     define('SLA_TABLE',TABLE_PREFIX.'sla');
diff --git a/scp/banlist.php b/scp/banlist.php
index 081fde9b4ed0cd18713cab78e795c2e0eaf1df1b..a31d91d7e8d2392c2d7e23dba570a07257532ec8 100644
--- a/scp/banlist.php
+++ b/scp/banlist.php
@@ -68,7 +68,7 @@ if($_POST && !$errors && $filter){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET isactive=1 WHERE filter_id='.
+                    $sql='UPDATE '.FILTER_RULE_TABLE.' SET isactive=1 WHERE filter_id='.
                             db_input($filter->getId()).
                          ' AND id IN ('.
                             implode(',', db_input($_POST['ids'])).')';
@@ -81,7 +81,7 @@ if($_POST && !$errors && $filter){
                         $errors['err']='Unable to enable selected emails';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.EMAIL_FILTER_RULE_TABLE.' SET isactive=0 WHERE filter_id='.
+                    $sql='UPDATE '.FILTER_RULE_TABLE.' SET isactive=0 WHERE filter_id='.
                             db_input($filter->getId()).
                          ' AND id IN ('.
                             implode(',', db_input($_POST['ids'])).')';
diff --git a/scp/filters.php b/scp/filters.php
index 2fe1f9fb7c06f9848f958d1e2e8b6ebe62b17390..29045410fe685f10a86a362942f34259a6401edd 100644
--- a/scp/filters.php
+++ b/scp/filters.php
@@ -49,7 +49,7 @@ if($_POST){
             }else{
                 $count=count($_POST['ids']);
                 if($_POST['enable']){
-                    $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET isactive=1 WHERE id IN ('.
+                    $sql='UPDATE '.FILTER_TABLE.' SET isactive=1 WHERE id IN ('.
                         implode(',', db_input($_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())){
                         if($num==$count)
@@ -60,7 +60,7 @@ if($_POST){
                         $errors['err']='Unable to enable selected filters';
                     }
                 }elseif($_POST['disable']){
-                    $sql='UPDATE '.EMAIL_FILTER_TABLE.' SET isactive=0  WHERE id IN ('.
+                    $sql='UPDATE '.FILTER_TABLE.' SET isactive=0  WHERE id IN ('.
                         implode(',', db_input($_POST['ids'])).')';
                     if(db_query($sql) && ($num=db_affected_rows())) {
                         if($num==$count)
diff --git a/setup/inc/sql/osTicket-mysql.sql b/setup/inc/sql/osTicket-mysql.sql
index 5cfba00d6538506e29e136f188610df4508551cb..614a0fa07ec72c19bc7b2ca985eed443eec6b036 100644
--- a/setup/inc/sql/osTicket-mysql.sql
+++ b/setup/inc/sql/osTicket-mysql.sql
@@ -228,8 +228,8 @@ CREATE TABLE `%TABLE_PREFIX%email` (
   KEY `dept_id` (`dept_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-DROP TABLE IF EXISTS `%TABLE_PREFIX%email_filter`;
-CREATE TABLE `%TABLE_PREFIX%email_filter` (
+DROP TABLE IF EXISTS `%TABLE_PREFIX%filter`;
+CREATE TABLE `%TABLE_PREFIX%filter` (
   `id` int(11) unsigned NOT NULL auto_increment,
   `execorder` int(10) unsigned NOT NULL default '99',
   `isactive` tinyint(1) unsigned NOT NULL default '1',
@@ -245,20 +245,22 @@ CREATE TABLE `%TABLE_PREFIX%email_filter` (
   `staff_id` int(10) unsigned NOT NULL default '0',
   `team_id` int(10) unsigned NOT NULL default '0',
   `sla_id` int(10) unsigned NOT NULL default '0',
+  `target` ENUM(  'All',  'Web',  'Email',  'API' ) NOT NULL DEFAULT  'All',
   `name` varchar(32) NOT NULL default '',
   `notes` text,
   `created` datetime NOT NULL,
   `updated` datetime NOT NULL,
   PRIMARY KEY  (`id`),
+  KEY `target` (`target`),
   KEY `email_id` (`email_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
 
-INSERT INTO `%TABLE_PREFIX%email_filter` (
+INSERT INTO `%TABLE_PREFIX%filter` (
   `id`,`isactive`,`execorder`,`reject_email`,`name`,`notes`,`created`)
     VALUES (1, 1, 99, 1, 'SYSTEM BAN LIST', 'Internal list for email banning. Do not remove', NOW());
 
-DROP TABLE IF EXISTS `%TABLE_PREFIX%email_filter_rule`;
+DROP TABLE IF EXISTS `%TABLE_PREFIX%filter_rule`;
 CREATE TABLE `%TABLE_PREFIX%email_filter_rule` (
   `id` int(11) unsigned NOT NULL auto_increment,
   `filter_id` int(10) unsigned NOT NULL default '0',
@@ -274,7 +276,7 @@ CREATE TABLE `%TABLE_PREFIX%email_filter_rule` (
   UNIQUE `filter` (`filter_id`, `what`, `how`, `val`) 
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-INSERT INTO `%TABLE_PREFIX%email_filter_rule` (
+INSERT INTO `%TABLE_PREFIX%filter_rule` (
   `id`, `filter_id`, `isactive`, `what`,`how`,`val`,`created`)
     VALUES (1, 1, 1, 'email', 'equal', 'test@example.com',NOW());
 
diff --git a/setup/inc/sql/osTicket-mysql.sql.md5 b/setup/inc/sql/osTicket-mysql.sql.md5
index 63d2ce443b0448ca776ebc37b298a3c4ff93c387..bf779b6ab7e045bbf0cb92fc286e337572f89c05 100644
--- a/setup/inc/sql/osTicket-mysql.sql.md5
+++ b/setup/inc/sql/osTicket-mysql.sql.md5
@@ -1 +1 @@
-d0e37dca324648f1ce2d10528a6026d4
+58ef694d5ebf73cc291e07e597c6f85d