diff --git a/lib/ansible/modules/network/aci/aci_fabric_scheduler.py b/lib/ansible/modules/network/aci/aci_fabric_scheduler.py
new file mode 100644
index 00000000000..e3c6442d3e7
--- /dev/null
+++ b/lib/ansible/modules/network/aci/aci_fabric_scheduler.py
@@ -0,0 +1,317 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+    'metadata_version': '1.1',
+    'status': ['preview'],
+    'supported_by': 'community'
+}
+
+DOCUMENTATION = '''
+---
+module: aci_fabric_scheduler
+
+short_description: This modules creates ACI schedulers.
+
+version_added: "2.8"
+
+description:
+    -   With the module you can create schedule policies that can be a shell, onetime execution or recurring
+
+options:
+  name:
+    description:
+    - The name of the Scheduler.
+    required: yes
+    aliases: [ name, scheduler_name ]
+  description:
+    description:
+    - Description for the Scheduler.
+    aliases: [ descr ]
+  recurring:
+    description:
+    - If you want to make the Scheduler a recurring it would be a "True" and for a
+      oneTime execution it would be "False". For a shell just exclude this option from
+      the task
+    type: bool
+    default: 'no'
+  windowname:
+    description:
+       - This is the name for your what recurring or oneTime execution
+  concurCap:
+    description:
+       - This is the amount of devices that can be executed on at a time
+    type: int
+  maxTime:
+    description:
+       - This is the amount MAX amount of time a process can be executed
+  date:
+    description:
+       - This is the date and time that the scheduler will execute
+  hour:
+    description:
+       - This set the hour of execution
+  minute:
+    description:
+       - This sets the minute of execution, used in conjuntion with hour
+  day:
+    description:
+       - This sets the day when execution will take place
+    default: "every-day"
+    choices: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday', 'even-day', 'odd-day', 'every-day']
+  state:
+    description:
+       - Use C(present) or C(absent) for adding or removing.
+       - Use C(query) for listing an object or multiple objects.
+    default: present
+    choices: [ absent, present, query ]
+
+extends_documentation_fragment: aci
+
+author:
+    - Steven Gerhart (@sgerhart)
+'''
+
+EXAMPLES = '''
+   - name: Simple Scheduler (Empty)
+     aci_fabric_scheduler:
+        host: "{{ inventory_hostname }}"
+        username: "{{ user }}"
+        password: "{{ pass }}"
+        validate_certs: no
+        name: simpleScheduler
+        state: present
+   - name: Remove Simple Scheduler
+     aci_fabric_scheduler:
+        host: "{{ inventory_hostname }}"
+        username: "{{ user }}"
+        password: "{{ pass }}"
+        validate_certs: no
+        name: simpleScheduler
+        state: absent
+   - name: One Time Scheduler
+     aci_fabric_scheduler:
+        host: "{{ inventory_hostname }}"
+        username: "{{ user }}"
+        password: "{{ pass }}"
+        validate_certs: no
+        name: OneTime
+        windowname: OneTime
+        recurring: False
+        concurCap: 20
+        date: "2018-11-20T24:00:00"
+        state: present
+   - name: Recurring Scheduler
+     aci_fabric_scheduler:
+        host: "{{ inventory_hostname }}"
+        username: "{{ user }}"
+        password: "{{ pass }}"
+        validate_certs: no
+        name: Recurring
+        windowname: Recurring
+        recurring: True
+        concurCap: 20
+        hour: 13
+        minute: 30
+        day: Tuesday
+        state: present
+'''
+
+RETURN = '''
+current:
+  description: The existing configuration from the APIC after the module has finished
+  returned: success
+  type: list
+  sample:
+    [
+        {
+            "fvTenant": {
+                "attributes": {
+                    "descr": "Production environment",
+                    "dn": "uni/tn-production",
+                    "name": "production",
+                    "nameAlias": "",
+                    "ownerKey": "",
+                    "ownerTag": ""
+                }
+            }
+        }
+    ]
+error:
+  description: The error information as returned from the APIC
+  returned: failure
+  type: dict
+  sample:
+    {
+        "code": "122",
+        "text": "unknown managed object class foo"
+    }
+raw:
+  description: The raw output returned by the APIC REST API (xml or json)
+  returned: parse error
+  type: string
+  sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+  description: The actual/minimal configuration pushed to the APIC
+  returned: info
+  type: list
+  sample:
+    {
+        "fvTenant": {
+            "attributes": {
+                "descr": "Production environment"
+            }
+        }
+    }
+previous:
+  description: The original configuration from the APIC before the module has started
+  returned: info
+  type: list
+  sample:
+    [
+        {
+            "fvTenant": {
+                "attributes": {
+                    "descr": "Production",
+                    "dn": "uni/tn-production",
+                    "name": "production",
+                    "nameAlias": "",
+                    "ownerKey": "",
+                    "ownerTag": ""
+                }
+            }
+        }
+    ]
+proposed:
+  description: The assembled configuration from the user-provided parameters
+  returned: info
+  type: dict
+  sample:
+    {
+        "fvTenant": {
+            "attributes": {
+                "descr": "Production environment",
+                "name": "production"
+            }
+        }
+    }
+filter_string:
+  description: The filter string used for the request
+  returned: failure or debug
+  type: string
+  sample: ?rsp-prop-include=config-only
+method:
+  description: The HTTP method used for the request to the APIC
+  returned: failure or debug
+  type: string
+  sample: POST
+response:
+  description: The HTTP response from the APIC
+  returned: failure or debug
+  type: string
+  sample: OK (30 bytes)
+status:
+  description: The HTTP status from the APIC
+  returned: failure or debug
+  type: int
+  sample: 200
+url:
+  description: The HTTP url used for the request to the APIC
+  returned: failure or debug
+  type: string
+  sample: https://10.11.12.13/api/mo/uni/tn-production.json
+'''
+
+import json
+from ansible.module_utils.network.aci.aci import ACIModule, aci_argument_spec
+from ansible.module_utils.basic import AnsibleModule
+
+
+def main():
+    argument_spec = aci_argument_spec()
+    argument_spec.update(
+        name=dict(type='str', aliases=['name', 'scheduler_name']),  # Not required for querying all objects
+        description=dict(type='str', aliases=['descr']),
+        windowname=dict(type='str', aliases=['windowname']),
+        recurring=dict(type='bool'),
+        concurCap=dict(type='int'),  # Number of devices it will run against concurrently
+        maxTime=dict(type='str'),  # The amount of minutes a process will be able to run (unlimited or dd:hh:mm:ss)
+        date=dict(type='str', aliases=['date']),  # The date the process will run YYYY-MM-DDTHH:MM:SS
+        state=dict(type='str', default='present', choices=['absent', 'present', 'query']),
+        hour=dict(type='int'),
+        minute=dict(type='int'),
+        day=dict(type='str', default='every-day', choices=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
+                                                           'Saturday', 'Sunday', 'every-day', 'even-day', 'odd-day']),
+    )
+
+    module = AnsibleModule(
+        argument_spec=argument_spec,
+        supports_check_mode=True,
+        required_if=[
+            ['state', 'absent', ['name']],
+            ['state', 'present', ['name']],
+        ],
+    )
+
+    state = module.params['state']
+    name = module.params['name']
+    windowname = module.params['windowname']
+    recurring = module.params['recurring']
+    date = module.params['date']
+    hour = module.params['hour']
+    minute = module.params['minute']
+    maxTime = module.params['maxTime']
+    concurCap = module.params['concurCap']
+    day = module.params['day']
+    description = module.params['description']
+
+    if recurring:
+        child_configs = [dict(trigRecurrWindowP=dict(attributes=dict(name=windowname, hour=hour, minute=minute,
+                                                                     procCa=maxTime, concurCap=concurCap, day=day,)))]
+    elif recurring is False:
+        child_configs = [dict(trigAbsWindowP=dict(attributes=dict(name=windowname, procCap=maxTime,
+                                                                  concurCap=concurCap, date=date,)))]
+    else:
+        child_configs = []
+
+    aci = ACIModule(module)
+    aci.construct_url(
+        root_class=dict(
+            aci_class='trigSchedP',
+            aci_rn='fabric/schedp-{0}'.format(name),
+            target_filter={'name': name},
+            module_object=name,
+        ),
+
+    )
+
+    aci.get_existing()
+
+    if state == 'present':
+        aci.payload(
+            aci_class='trigSchedP',
+            class_config=dict(
+                name=name,
+                descr=description,
+            ),
+            child_configs=child_configs,
+
+        )
+
+        aci.get_diff(aci_class='trigSchedP')
+
+        aci.post_config()
+
+    elif state == 'absent':
+        aci.delete_config()
+
+    aci.exit_json()
+
+
+if __name__ == "__main__":
+    main()