diff --git a/_states/avinetworks.py b/_states/avinetworks.py
new file mode 100644
index 0000000..9b7cba2
--- /dev/null
+++ b/_states/avinetworks.py
@@ -0,0 +1,215 @@
+#!/usr/bin/python
+# Copyright 2017 Mirantis, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+'''
+Management of Contrail resources
+================================
+
+:depends:   - vnc_api Python module
+
+
+Enforce the pool existence
+--------------------------
+
+.. code-block:: yaml
+
+    create pool:
+      avinetworks.pool_present:
+        - name: testing_pool
+        - lb_algorithm: LB_ALGORITHM_ROUND_ROBIN
+        - server_port: 8080
+        - servers:
+          - "192.168.0.122"
+          - "192.168.0.123"
+          - "192.168.0.124"
+
+
+Enforce the pool absence
+------------------------
+
+.. code-block:: yaml
+
+    delete pool:
+      avinetworks.pool_absent:
+        - name: testing_pool
+
+
+Enforce the cloud existence
+---------------------------
+
+.. code-block:: yaml
+
+    create cloud:
+      avinetworks.cloud_present:
+        - name: testing_cloud
+        - mtu: 1450
+        - dhcp_enabled: True
+        - openstack:
+            username: admin
+            password: password1*
+            admin_tenant: avi-networks
+            auth_url: http://10.167.4.100:5000/v2.0
+            mgmt_network_name: avi-net
+            privilege: WRITE_ACCESS
+            region: RegionOne
+            hypervisor: KVM
+            free_floatingips: True
+            img_format: OS_IMG_FMT_QCOW2
+            use_internal_endpoints: True
+            insecure: False
+            contrail_endpoint: http://10.167.4.200:9100
+            os_role: '*'
+            avi_role: Tenant-Admin
+
+
+Enforce the cloud absence
+-------------------------
+
+.. code-block:: yaml
+
+    delete cloud:
+      avinetworks.cloud_absent:
+        - name: testing_cloud
+
+
+Enforce the cluster present
+---------------------------
+
+.. code-block:: yaml
+
+    update cluster:
+      avinetworks.cluster_present:
+        - name: my_cluster
+        - virtual_ip: 172.17.32.252
+        - nodes:
+          - name: avi01
+            addr: 172.17.32.228
+          - name: avi02
+            addr: 172.17.32.235
+          - name: avi03
+            addr: 172.17.32.232
+
+'''
+
+
+def __virtual__():
+    '''
+    Load Avinetworks module
+    '''
+    return 'avinetworks'
+
+
+def pool_present(name, lb_algorithm='LB_ALGORITHM_ROUND_ROBIN', server_port=80, servers=None, **kwargs):
+    '''
+    Ensures that the Avinetworks pool exists.
+
+    :param name:          Pool name
+    :param server_port:   Traffic sent to servers will use this destination server port unless overridden by the server's specific port attribute.
+    :param lb_algorithm:  The load balancing algorithm will pick a server within the pool's list of available servers
+    :param servers:       The pool directs load balanced traffic to this list of destination servers. The servers can be configured by IP address, name, network or via IP Address
+
+    lb_algorithm choices:
+      - LB_ALGORITHM_ROUND_ROBIN
+      - LB_ALGORITHM_LEAST_LOAD
+      - LB_ALGORITHM_FEWEST_TASKS
+      - LB_ALGORITHM_RANDOM
+      - LB_ALGORITHM_FEWEST_SERVERS
+      - LB_ALGORITHM_CONSISTENT_HASH
+      - LB_ALGORITHM_FASTEST_RESPONSE
+      - LB_ALGORITHM_LEAST_CONNECTIONS
+    '''
+    ret = __salt__['avinetworks.pool_create'](name, lb_algorithm, server_port, servers, **kwargs)
+    if len(ret['changes']) == 0:
+        pass
+    return ret
+
+
+def pool_absent(name, **kwargs):
+    '''
+    Ensure that the Avinetworks pool doesn't exist
+
+    :param name: The name of the pool that should not exist
+    '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Pool "{0}" is already absent'.format(name)}
+    result = __salt__['avinetworks.pool_get'](name, **kwargs)
+    if 'Error' not in result:
+        ret = __salt__['avinetworks.pool_delete'](name, **kwargs)
+    return ret
+
+
+def cloud_present(name, mtu=1500, dhcp_enabled=False, openstack=None, **kwargs):
+    '''
+    Ensures that the Avinetworks Cloud exists.
+
+    :param name:            Cloud name [string]
+    :param mtu:             MTU setting for the cloud [uint32]
+    :param dhcp_enabled:    Select the IP address management scheme [bool]
+    :param openstack:       The OpenStack configuration [dict]
+
+    openstack_params:
+        :param username:                The username Avi Vantage will use when authenticating to Keystone. [string]
+        :param password:                The password Avi Vantage will use when authenticating to Keystone. [string]
+        :param admin_tenant:            OpenStack admin tenant (or project) information. [string]
+        :param auth_url:                Auth URL for connecting to keystone. If this is specified, any value provided for keystone_host is ignored. [string]
+        :param mgmt_network_name:       Avi Management network name or cidr [string]
+        :param privilege:               Access privilege. [enum] {WRITE_ACCESS, READ_ACCESS, NO_ACCESS}
+        :param region:                  Region name [string]
+        :param hypervisor:              Default hypervisor type. [enum] {DEFAULT, VMWARE_VSAN, VMWARE_ESX, KVM}
+        :param free_floatingips:        Free unused floating IPs. [bool]
+        :param img_format:              If OS_IMG_FMT_RAW, use RAW images else use QCOW2 or streamOptimized/flat VMDK as appropriate. [enum]
+        :param use_internal_endpoints:  Use internalURL for OpenStack endpoints instead of the default publicURL [bool]
+        :param insecure:                Allow self-signed certificates when communicating with https service endpoints. [bool]
+        :param contrail_endpoint:       Contrail VNC endpoint url (example http://10.10.10.100:8082). [string]
+        :param os_role:                 Role name in OpenStack [string]
+        :param avi_role:                Role name in Avi [string]
+
+    '''
+
+    ret = __salt__['avinetworks.cloud_create'](name, mtu, dhcp_enabled, openstack, **kwargs)
+    if len(ret['changes']) == 0:
+        pass
+    return ret
+
+def cloud_absent(name, **kwargs):
+    '''
+    Ensure that the Avinetworks cloud doesn't exist
+
+    :param name: The name of the cloud that should not exist
+    '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Cloud "{0}" is already absent'.format(name)}
+    result = __salt__['avinetworks.cloud_get'](name, **kwargs)
+    if 'Error' not in result:
+        ret = __salt__['avinetworks.cloud_delete'](name, **kwargs)
+    return ret
+
+
+def cluster_present(name, nodes, virtual_ip=None, **kwargs):
+    '''
+    Ensures that the Avinetworks pool exists.
+
+    :param name:          Pool name
+    :param server_port:   Traffic sent to servers will use this destination server port unless overridden by the server's specific port attribute.
+    :param lb_algorithm:  The load balancing algorithm will pick a server within the pool's list of available servers
+    :param servers:       The pool directs load balanced traffic to this list of destination servers. The servers can be configured by IP address, name, network or via IP Address
+    '''
+    ret = __salt__['avinetworks.cluster_update'](name, nodes, virtual_ip, **kwargs)
+    if len(ret['changes']) == 0:
+        pass
+    return ret
