diff --git a/CRM/Dataprocessor/BAO/DataProcessor.php b/CRM/Dataprocessor/BAO/DataProcessor.php
index 1671ce7f4ed13b91ac211fe016e87be514822ff1..fe00305050b36959f0b53e569cef673fc82f913c 100644
--- a/CRM/Dataprocessor/BAO/DataProcessor.php
+++ b/CRM/Dataprocessor/BAO/DataProcessor.php
@@ -28,6 +28,11 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
     while ($dataProcessor->fetch()) {
       $row = array();
       self::storeValues($dataProcessor, $row);
+      if (!empty($row['aggregation'])) {
+        $row['aggregation'] = json_decode($row['aggregation'], true);
+      } else {
+        $row['aggregation'] = array();
+      }
       $result[$row['id']] = $row;
     }
     return $result;
@@ -71,6 +76,9 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
     if (isset($dataProcessor->configuration) && is_array($dataProcessor->configuration)) {
       $dataProcessor->configuration = json_encode($dataProcessor->configuration);
     }
+    if (isset($dataProcessor->aggregation) && is_array($dataProcessor->aggregation)) {
+      $dataProcessor->aggregation = json_encode($dataProcessor->aggregation);
+    }
     if (isset($dataProcessor->storage_configuration) && is_array($dataProcessor->storage_configuration)) {
       $dataProcessor->storage_configuration = json_encode($dataProcessor->storage_configuration);
     }
@@ -230,6 +238,17 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
       $dataProcessor->addDataSource($source, $join);
     }
 
+    $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId);
+    if (is_string($this->aggregation)) {
+      $this->aggregation = json_decode($this->aggregation, true);
+    }
+    foreach($this->aggregation as $alias) {
+      $dataSource = $dataProcessor->getDataSourceByName($aggregationFields[$alias]->dataSource->getSourceName());
+      if ($dataSource) {
+        $dataSource->ensureAggregationFieldInSource($aggregationFields[$alias]->fieldSpecification);
+      }
+    }
+
     $fields = CRM_Dataprocessor_BAO_Field::getValues(array('data_processor_id' => $this->id));
     $outputHandlers = $dataProcessor->getAvailableOutputHandlers();
     foreach($fields as $field) {
@@ -266,6 +285,21 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
     return $dataProcessor->getAvailableOutputHandlers();
   }
 
+  public static function getAvailableAggregationFields($data_processor_id) {
+    $availableAggregationFields = array();
+    $factory = dataprocessor_get_factory();
+    $sources = CRM_Dataprocessor_BAO_Source::getValues(array('data_processor_id' => $data_processor_id));
+    foreach($sources as $sourceDao) {
+      $source = $factory->getDataSourceByName($sourceDao['type']);
+      $source->setSourceName($sourceDao['name']);
+      $source->setSourceTitle($sourceDao['title']);
+      $source->initialize($sourceDao['configuration']);
+      $availableAggregationFields = array_merge($availableAggregationFields, $source->getAvailableAggregationFields());
+    }
+
+    return $availableAggregationFields;
+  }
+
   /**
    * Returns the id of the data processor.
    *
diff --git a/CRM/Dataprocessor/DAO/DataProcessor.php b/CRM/Dataprocessor/DAO/DataProcessor.php
index 105e15a288f40dea82a6e68aeb94c812e40151bf..b21b9f076da5e00985c99e8f1c18703a11d25d18 100644
--- a/CRM/Dataprocessor/DAO/DataProcessor.php
+++ b/CRM/Dataprocessor/DAO/DataProcessor.php
@@ -77,6 +77,11 @@ class CRM_Dataprocessor_DAO_DataProcessor extends CRM_Core_DAO {
           'title' => E::ts('Configuration'),
           'type' => CRM_Utils_Type::T_TEXT,
         ),
+        'aggregation' => array(
+          'name' => 'aggregation',
+          'title' => E::ts('Aggregation'),
+          'type' => CRM_Utils_Type::T_TEXT,
+        ),
         'storage_type' => array(
           'name' => 'storage_type',
           'title' => E::ts('Storage Type'),
diff --git a/CRM/Dataprocessor/Form/AggregateField.php b/CRM/Dataprocessor/Form/AggregateField.php
new file mode 100644
index 0000000000000000000000000000000000000000..2658c9c40029fec36d366c788c586319851e6630
--- /dev/null
+++ b/CRM/Dataprocessor/Form/AggregateField.php
@@ -0,0 +1,96 @@
+<?php
+
+use CRM_Dataprocessor_ExtensionUtil as E;
+
+/**
+ * Form controller class
+ *
+ * @see https://wiki.civicrm.org/confluence/display/CRMDOC/QuickForm+Reference
+ */
+class CRM_Dataprocessor_Form_AggregateField extends CRM_Core_Form {
+
+  private $dataProcessorId;
+
+  private $id;
+
+  /**
+   * Function to perform processing before displaying form (overrides parent function)
+   *
+   * @access public
+   */
+  function preProcess() {
+    $session = CRM_Core_Session::singleton();
+    $this->dataProcessorId = CRM_Utils_Request::retrieve('id', 'Integer');
+    $this->assign('data_processor_id', $this->dataProcessorId);
+
+    $title = E::ts('Data Processor Field');
+    CRM_Utils_System::setTitle($title);
+
+    $url = CRM_Utils_System::url('civicrm/dataprocessor/form/edit', array('id' => $this->dataProcessorId, 'action' => 'update', 'reset' => 1));
+    $session->pushUserContext($url);
+  }
+
+  public function buildQuickForm() {
+    $this->add('hidden', 'id');
+    $this->add('hidden', 'alias');
+    if ($this->_action != CRM_Core_Action::DELETE) {
+      $fields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId);
+      $fieldSelect = array(E::ts('- Select -'));
+      foreach($fields as $field) {
+        $fieldSelect[$field->fieldSpecification->alias] = $field->dataSource->getSourceTitle()." :: ".$field->fieldSpecification->title;
+      }
+
+      $this->add('select', 'field', E::ts('Select Field'), $fieldSelect, true, array('class' => 'crm-select2 crm-huge40'));
+    }
+    if ($this->_action == CRM_Core_Action::ADD) {
+      $this->addButtons(array(
+        array('type' => 'next', 'name' => E::ts('Add'), 'isDefault' => TRUE,),
+        array('type' => 'cancel', 'name' => E::ts('Cancel'))));
+    } elseif ($this->_action == CRM_Core_Action::DELETE) {
+      $this->addButtons(array(
+        array('type' => 'next', 'name' => E::ts('Delete'), 'isDefault' => TRUE,),
+        array('type' => 'cancel', 'name' => E::ts('Cancel'))));
+    }
+    parent::buildQuickForm();
+  }
+
+  function setDefaultValues() {
+    $defaults = [];
+    $defaults['id'] = $this->dataProcessorId;
+    $defaults['alias'] =CRM_Utils_Request::retrieve('alias', 'String');
+    return $defaults;
+  }
+
+  public function postProcess() {
+    $session = CRM_Core_Session::singleton();
+    $redirectUrl = $session->readUserContext();
+    if ($this->_action == CRM_Core_Action::DELETE) {
+      $values = $this->exportValues();
+      $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId));
+      $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation'];
+      $dataProcessor[$this->dataProcessorId]['aggregation'] = array();
+      foreach($aggregation as $alias) {
+        if ($alias != $values['alias']) {
+          $dataProcessor[$this->dataProcessorId]['aggregation'][] = $alias;
+        }
+      }
+      $result = CRM_Dataprocessor_BAO_DataProcessor::add($dataProcessor[$this->dataProcessorId]);
+
+      $session->setStatus(E::ts('Field removed'), E::ts('Removed'), 'success');
+      CRM_Utils_System::redirect($redirectUrl);
+    }
+
+    $values = $this->exportValues();
+    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId));
+    $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation'];
+    if (!in_array($values['field'], $aggregation)) {
+      $aggregation[] = $values['field'];
+    }
+    $dataProcessor[$this->dataProcessorId]['aggregation'] = $aggregation;
+    $result = CRM_Dataprocessor_BAO_DataProcessor::add($dataProcessor[$this->dataProcessorId]);
+
+    CRM_Utils_System::redirect($redirectUrl);
+    parent::postProcess();
+  }
+
+}
\ No newline at end of file
diff --git a/CRM/Dataprocessor/Form/DataProcessor.php b/CRM/Dataprocessor/Form/DataProcessor.php
index 48ab7e0a96ebf6dd5a5ac8d34badcc5bf5d9e784..66ee1bbe449eb86b168c650368d06a6ffb223c1f 100644
--- a/CRM/Dataprocessor/Form/DataProcessor.php
+++ b/CRM/Dataprocessor/Form/DataProcessor.php
@@ -45,11 +45,14 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
     if ($this->dataProcessorId) {
       $this->addSources();
       $this->addFields();
+      $this->addAggregateFields();
       $this->assign('outputs', CRM_Dataprocessor_BAO_Output::getValues(array('data_processor_id' => $this->dataProcessorId)));
       $dataSourceAddUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/source', 'reset=1&action=add&data_processor_id='.$this->dataProcessorId, TRUE);
+      $addAggregateFieldUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/aggregate_field', 'reset=1&action=add&id='.$this->dataProcessorId, TRUE);
       $addFieldUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/field', 'reset=1&action=add&data_processor_id='.$this->dataProcessorId, TRUE);
       $outputAddUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/output', 'reset=1&action=add&data_processor_id='.$this->dataProcessorId, TRUE);
       $this->assign('addDataSourceUrl', $dataSourceAddUrl);
+      $this->assign('addAggregateFieldUrl', $addAggregateFieldUrl);
       $this->assign('addFieldUrl', $addFieldUrl);
       $this->assign('addOutputUrl', $outputAddUrl);
     }
@@ -74,15 +77,28 @@ class CRM_Dataprocessor_Form_DataProcessor extends CRM_Core_Form {
   }
 
   protected function addFields() {
-    $factory = dataprocessor_get_factory();
     $fields = CRM_Dataprocessor_BAO_Field::getValues(array('data_processor_id' => $this->dataProcessorId));
     foreach($fields as $idx => $field) {
       $fields[$idx]['configuration_link'] = '';
-      $fields[$idx]['aggregate'] = $field['aggregate'] ? E::ts('Aggregate field') : '';
     }
     $this->assign('fields', $fields);
   }
 
+  protected function addAggregateFields() {
+    $fields = array();
+    $aggregationFields = CRM_Dataprocessor_BAO_DataProcessor::getAvailableAggregationFields($this->dataProcessorId);
+    $aggregationFieldsFormatted = array();
+    foreach($aggregationFields as $field) {
+      $aggregationFieldsFormatted[$field->fieldSpecification->alias] = $field->dataSource->getSourceTitle()." :: ".$field->fieldSpecification->title;
+    }
+    $dataProcessor = CRM_Dataprocessor_BAO_DataProcessor::getValues(array('id' => $this->dataProcessorId));
+    $aggregation = $dataProcessor[$this->dataProcessorId]['aggregation'];
+    foreach($aggregation as $alias) {
+      $fields[$alias] = $aggregationFieldsFormatted[$alias];
+    }
+    $this->assign('aggregateFields', $fields);
+  }
+
   public function buildQuickForm() {
     $this->add('hidden', 'id');
     if ($this->_action != CRM_Core_Action::DELETE) {
diff --git a/CRM/Dataprocessor/Form/Field.php b/CRM/Dataprocessor/Form/Field.php
index c08aaf620b0d130c541f5e985f4ec924a19dd1f1..d47d79d4509533b712541228dd2a1002229e606f 100644
--- a/CRM/Dataprocessor/Form/Field.php
+++ b/CRM/Dataprocessor/Form/Field.php
@@ -52,8 +52,6 @@ class CRM_Dataprocessor_Form_Field extends CRM_Core_Form {
       }
 
       $this->add('select', 'type', E::ts('Select Field'), $outputHandlersSelect, true, array('class' => 'crm-select2 crm-huge40'));
-
-      $this->add('checkbox', 'aggregate', E::ts('Aggregate field'));
     }
     if ($this->_action == CRM_Core_Action::ADD) {
       $this->addButtons(array(
@@ -86,9 +84,6 @@ class CRM_Dataprocessor_Form_Field extends CRM_Core_Form {
     if (isset($field[$this->id]['name'])) {
       $defaults['name'] = $field[$this->id]['name'];
     }
-    if (isset($field[$this->id]['aggregate'])) {
-      $defaults['aggregate'] = $field[$this->id]['aggregate'];
-    }
     return $defaults;
   }
 
@@ -109,7 +104,6 @@ class CRM_Dataprocessor_Form_Field extends CRM_Core_Form {
     }
     $params['title'] = $values['title'];
     $params['type'] = $values['type'];
-    $params['aggregate'] = isset($values['aggregate']) && !empty($values['aggregate']) ? 1 : 0;
     if ($this->dataProcessorId) {
       $params['data_processor_id'] = $this->dataProcessorId;
     }
diff --git a/Civi/DataProcessor/DataSpecification/AggregationField.php b/Civi/DataProcessor/DataSpecification/AggregationField.php
new file mode 100644
index 0000000000000000000000000000000000000000..57189dd2a7865522c883c14b4c68ab9a2d5b8aaf
--- /dev/null
+++ b/Civi/DataProcessor/DataSpecification/AggregationField.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @author Jaap Jansma <jaap.jansma@civicoop.org>
+ * @license AGPL-3.0
+ */
+
+namespace Civi\DataProcessor\DataSpecification;
+
+use Civi\DataProcessor\Source\SourceInterface;
+
+class AggregationField {
+
+  /**
+   * @var \Civi\DataProcessor\DataSpecification\FieldSpecification
+   */
+  public $fieldSpecification;
+
+  /**
+   * @var \Civi\DataProcessor\Source\SourceInterface
+   */
+  public $dataSource;
+
+  public function __construct(FieldSpecification $fieldSpecification, SourceInterface $dataSource) {
+    $this->dataSource = $dataSource;
+    $this->fieldSpecification = $fieldSpecification;
+  }
+
+}
\ No newline at end of file
diff --git a/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php b/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php
index 9ff836612ec55bc480b7bfb528dccd6c06c4f2ba..f8a0c75dee622e5dfbead11efc488ed2ea69def0 100644
--- a/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php
+++ b/Civi/DataProcessor/ProcessorType/AbstractProcessorType.php
@@ -58,6 +58,21 @@ abstract class AbstractProcessorType {
     }
   }
 
+  /**
+   * Returns the data source
+   *
+   * @param $source_name
+   * @return null|\Civi\DataProcessor\Source\SourceInterface
+   */
+  public function getDataSourceByName($source_name) {
+    foreach($this->dataSources as $dataSource) {
+      if ($dataSource['datasource']->getSourceName() == $source_name) {
+        return $dataSource['datasource'];
+      }
+    }
+    return null;
+  }
+
   /**
    * @return \Civi\DataProcessor\FieldOutputHandler\AbstractFieldOutputHandler[]
    */
diff --git a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
index 00a2ea95820c78311fda1d02b2ffb7c9671447b8..87632b783bf9d84b810e284978bc7e3cdcbd2af2 100644
--- a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
+++ b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
@@ -12,6 +12,7 @@ use Civi\DataProcessor\DataFlow\SqlTableDataFlow;
 use Civi\DataProcessor\DataFlow\CombinedDataFlow\CombinedSqlDataFlow;
 use Civi\DataProcessor\DataFlow\MultipleDataFlows\DataFlowDescription;
 use Civi\DataProcessor\DataFlow\MultipleDataFlows\SimpleJoin;
+use Civi\DataProcessor\DataSpecification\AggregationField;
 use Civi\DataProcessor\DataSpecification\CustomFieldSpecification;
 use Civi\DataProcessor\DataSpecification\DataSpecification;
 use Civi\DataProcessor\DataSpecification\FieldSpecification;
@@ -268,6 +269,19 @@ abstract class AbstractCivicrmEntitySource implements SourceInterface {
     return $this->availableFilterFields;
   }
 
+  /**
+   * @return \Civi\DataProcessor\DataSpecification\AggregationField[]
+   * @throws \Exception
+   */
+  public function getAvailableAggregationFields() {
+    $fields = $this->getAvailableFields();
+    $aggregationFields = array();
+    foreach($fields->getFields() as $field) {
+      $aggregationFields[$field->alias] = new AggregationField($field, $this);
+    }
+    return $aggregationFields;
+  }
+
   /**
    * Ensures a field is in the data source
    *
@@ -276,7 +290,7 @@ abstract class AbstractCivicrmEntitySource implements SourceInterface {
    * @throws \Exception
    */
   public function ensureFieldInSource(FieldSpecification $fieldSpecification) {
-    if ($this->availableFields->doesFieldExist($fieldSpecification->name)) {
+    if ($this->getAvailableFields()->doesFieldExist($fieldSpecification->name)) {
       if ($fieldSpecification instanceof CustomFieldSpecification) {
         $customGroupDataFlowDescription = $this->ensureCustomGroup($fieldSpecification->customGroupTableName, $fieldSpecification->customGroupName);
         $customGroupDataFlowDescription->getDataFlow()->getDataSpecification()->addFieldSpecification($fieldSpecification->alias, $fieldSpecification);
@@ -286,6 +300,24 @@ abstract class AbstractCivicrmEntitySource implements SourceInterface {
     }
   }
 
+  /**
+   * Ensures an aggregation field in the data source
+   *
+   * @param \Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpecification
+   * @return \Civi\DataProcessor\Source\SourceInterface
+   * @throws \Exception
+   */
+  public function ensureAggregationFieldInSource(FieldSpecification $fieldSpecification) {
+    if ($this->getAvailableFields()->doesFieldExist($fieldSpecification->name)) {
+      if ($fieldSpecification instanceof CustomFieldSpecification) {
+        $customGroupDataFlowDescription = $this->ensureCustomGroup($fieldSpecification->customGroupTableName, $fieldSpecification->customGroupName);
+        $customGroupDataFlowDescription->getDataFlow()->addAggregateField($fieldSpecification);
+      } else {
+        $this->primaryDataFlow->addAggregateField($fieldSpecification);
+      }
+    }
+  }
+
   /**
    * @return String
    */
diff --git a/Civi/DataProcessor/Source/SourceInterface.php b/Civi/DataProcessor/Source/SourceInterface.php
index 76eaf3cf13e927441370a355ca687814842b9dc7..cb3d001bc58028570267eaeaf9fc8d655b269efc 100644
--- a/Civi/DataProcessor/Source/SourceInterface.php
+++ b/Civi/DataProcessor/Source/SourceInterface.php
@@ -38,6 +38,11 @@ interface SourceInterface {
    */
   public function getAvailableFilterFields();
 
+  /**
+   * @return \Civi\DataProcessor\DataSpecification\AggregationField[]
+   */
+  public function getAvailableAggregationFields();
+
   /**
    * Returns URL to configuration screen
    *
@@ -54,6 +59,15 @@ interface SourceInterface {
    */
   public function ensureFieldInSource(FieldSpecification $fieldSpecification);
 
+  /**
+   * Ensures an aggregation field in the data source
+   *
+   * @param \Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpecification
+   *
+   * @return \Civi\DataProcessor\Source\SourceInterface
+   */
+  public function ensureAggregationFieldInSource(FieldSpecification $fieldSpecification);
+
   /**
    * @return String
    */
diff --git a/api/v3/DataProcessor/Create.php b/api/v3/DataProcessor/Create.php
index 2cf01de4a253ada256576e4fbb0ac986676f6529..268aeb3255514247196a2e4f8c1aa6172e6c2153 100644
--- a/api/v3/DataProcessor/Create.php
+++ b/api/v3/DataProcessor/Create.php
@@ -47,6 +47,11 @@ function _civicrm_api3_data_processor_create_spec(&$spec) {
     'type' => CRM_Utils_Type::T_TEXT,
     'api.required' => false,
   );
+  $spec['aggregation'] = array(
+    'title' => E::ts('Aggregation'),
+    'type' => CRM_Utils_Type::T_TEXT,
+    'api.required' => false,
+  );
   $spec['storage_type'] = array(
     'title' => E::ts('Storage Type'),
     'type' => CRM_Utils_Type::T_STRING,
diff --git a/sql/create_civicrm_data_processor.sql b/sql/create_civicrm_data_processor.sql
index c92272cd79b5dec844279e50549a140e36a080db..914b3764a8f2680dcd2c908bfe515bee980e860e 100644
--- a/sql/create_civicrm_data_processor.sql
+++ b/sql/create_civicrm_data_processor.sql
@@ -2,6 +2,7 @@ CREATE TABLE IF NOT EXISTS `civicrm_data_processor` (
   `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
   `type` VARCHAR(128) NOT NULL,
   `configuration` TEXT NULL,
+  `aggregation` TEXT NULL,
   `name` VARCHAR(128) NOT NULL,
   `title` VARCHAR(128) NULL,
   `is_active` TINYINT NULL DEFAULT 1,
diff --git a/templates/CRM/Dataprocessor/Form/AggregateField.tpl b/templates/CRM/Dataprocessor/Form/AggregateField.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..b33955e14680de2e74698062a4be2527d418fa95
--- /dev/null
+++ b/templates/CRM/Dataprocessor/Form/AggregateField.tpl
@@ -0,0 +1,28 @@
+{crmScope extensionKey='dataprocessor'}
+<div class="crm-submit-buttons">
+    {include file="CRM/common/formButtons.tpl" location="top"}
+</div>
+
+{if $action eq 8}
+    {* Are you sure to delete form *}
+    <h3>{ts}Delete Field{/ts}</h3>
+    <div class="crm-block crm-form-block crm-data-processor_label-block">
+        <div class="crm-section">{ts}Are you sure to remove this field?{/ts}</div>
+    </div>
+{else}
+
+    {* block for rule data *}
+    <h3>{ts}Aggregation Field{/ts}</h3>
+    <div class="crm-block crm-form-block crm-data-processor_source-block">
+        <div class="crm-section">
+            <div class="label">{$form.field.label}</div>
+            <div class="content">{$form.field.html}</div>
+            <div class="clear"></div>
+        </div>
+    </div>
+{/if}
+
+<div class="crm-submit-buttons">
+    {include file="CRM/common/formButtons.tpl" location="bottom"}
+</div>
+{/crmScope}
\ No newline at end of file
diff --git a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
index 4969869060f9fcf2beffc5b5ba96d13123389fb4..6bb449cf1268cbc7401f554cfd60275c26a66bee 100644
--- a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
+++ b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
@@ -49,6 +49,7 @@
 
   {if $data_processor_id}
     {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Sources.tpl"}
+    {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl"}
     {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl"}
     {include file="CRM/Dataprocessor/Form/DataProcessorBlocks/Outputs.tpl"}
   {/if}
diff --git a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..49cd0981a139e4355f97a8c18bf7dbb820bf33bf
--- /dev/null
+++ b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/AggregateFields.tpl
@@ -0,0 +1,23 @@
+{crmScope extensionKey='dataprocessor'}
+<div class="crm-block crm-form-block crm-data-processor_source-block">
+    <table>
+        <tr>
+            <th>{ts}Field{/ts}</th>
+            <th></th>
+        </tr>
+        {foreach from=$aggregateFields item=field key=alias}
+            <tr>
+                <td>{$field}</td>
+                <td>
+                    <a href="{crmURL p="civicrm/dataprocessor/form/aggregate_field" q="reset=1&action=delete&id=`$data_processor_id`&alias=`$alias`"}">{ts}Remove{/ts}</a>
+                </td>
+            </tr>
+        {/foreach}
+    </table>
+
+    <div class="crm-submit-buttons">
+        <a class="add button" title="{ts}Add Aggregate Field{/ts}" href="{$addAggregateFieldUrl}">
+            <span><div class="icon add-icon ui-icon-circle-plus"></div>{ts}Add Aggregate Field{/ts}</span></a>
+    </div>
+</div>
+{/crmScope}
\ No newline at end of file
diff --git a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl
index a7765fe77b45e190d97bea2194615c0269cb721f..91737000459d912888a1c5311a06c06836e7d983 100644
--- a/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl
+++ b/templates/CRM/Dataprocessor/Form/DataProcessorBlocks/Fields.tpl
@@ -4,7 +4,6 @@
         <tr>
             <th>{ts}Title{/ts}</th>
             <th>{ts}Name{/ts}</th>
-            <th>{ts}Aggregate{/ts}</th>
             <th></th>
             <th></th>
             <th></th>
@@ -14,7 +13,6 @@
             <tr>
                 <td>{$field.title}</td>
                 <td>{$field.name}</td>
-                <td>{$field.aggregate}</td>
                 <td>
                     {if $field.configuration_link}
                         <a href="{$source.configuration_link}">{ts}Configure Field{/ts}</a>
diff --git a/templates/CRM/Dataprocessor/Form/Field.tpl b/templates/CRM/Dataprocessor/Form/Field.tpl
index 56aae0ec65c8dbeab723d2da52ff47ff0f154d02..711b32c77977fbeda6f5e991cc37bc804b876c9f 100644
--- a/templates/CRM/Dataprocessor/Form/Field.tpl
+++ b/templates/CRM/Dataprocessor/Form/Field.tpl
@@ -29,11 +29,6 @@
             <div class="content">{$form.name.html}</div>
             <div class="clear"></div>
         </div>
-        <div class="crm-section">
-            <div class="label">{$form.aggregate.label}</div>
-            <div class="content">{$form.aggregate.html}</div>
-            <div class="clear"></div>
-        </div>
     </div>
 {/if}
 
diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml
index ac96e2b7750bc569b85253f5cad85b99c0535cb9..6b2419d315cc3b608327ed5d66b13c6dbd272ec1 100644
--- a/xml/Menu/dataprocessor.xml
+++ b/xml/Menu/dataprocessor.xml
@@ -21,6 +21,13 @@
     <access_arguments>access CiviCRM</access_arguments>
     <access_arguments>administer CiviCRM</access_arguments>
   </item>
+  <item>
+    <path>civicrm/dataprocessor/form/aggregate_field</path>
+    <page_callback>CRM_Dataprocessor_Form_AggregateField</page_callback>
+    <title>DataProcessor</title>
+    <access_arguments>access CiviCRM</access_arguments>
+    <access_arguments>administer CiviCRM</access_arguments>
+  </item>
   <item>
     <path>civicrm/dataprocessor/form/output</path>
     <page_callback>CRM_Dataprocessor_Form_Output</page_callback>