diff --git a/lib/ansible/modules/cloud/google/gcp_compute_image.py b/lib/ansible/modules/cloud/google/gcp_compute_image.py
index 5695b6663b..7a1ec37526 100644
--- a/lib/ansible/modules/cloud/google/gcp_compute_image.py
+++ b/lib/ansible/modules/cloud/google/gcp_compute_image.py
@@ -435,6 +435,7 @@ sourceType:
 
 from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest, remove_nones_from_dict, replace_resource_dict
 import json
+import re
 import time
 
 ################################################################################
@@ -628,6 +629,15 @@ def response_to_hash(module, response):
     }
 
 
+def license_selflink(name, params):
+    if name is None:
+        return
+    url = r"https://www.googleapis.com/compute/v1//projects/.*/global/licenses/[a-z1-9\-]*"
+    if not re.match(url, name):
+        name = "https://www.googleapis.com/compute/v1//projects/{project}/global/licenses/%s".format(**params) % name
+    return name
+
+
 def async_op_url(module, extra_data=None):
     if extra_data is None:
         extra_data = {}
diff --git a/lib/ansible/modules/cloud/google/gcp_compute_instance.py b/lib/ansible/modules/cloud/google/gcp_compute_instance.py
index 2908a15126..73237ad5af 100644
--- a/lib/ansible/modules/cloud/google/gcp_compute_instance.py
+++ b/lib/ansible/modules/cloud/google/gcp_compute_instance.py
@@ -54,6 +54,8 @@ options:
       routes.
     required: false
     type: bool
+    aliases:
+    - ip_forward
   disks:
     description:
     - An array of disks that are associated with the instances that are created from
@@ -137,6 +139,9 @@ options:
               create a disk with one of the public operating system images, specify
               the image by its family name.
             required: false
+            aliases:
+            - image
+            - image_family
           source_image_encryption_key:
             description:
             - The customer-supplied encryption key of the source image. Required if
@@ -889,7 +894,7 @@ def main():
     module = GcpModule(
         argument_spec=dict(
             state=dict(default='present', choices=['present', 'absent'], type='str'),
-            can_ip_forward=dict(type='bool'),
+            can_ip_forward=dict(type='bool', aliases=['ip_forward']),
             disks=dict(
                 type='list',
                 elements='dict',
@@ -905,7 +910,7 @@ def main():
                             disk_name=dict(type='str'),
                             disk_size_gb=dict(type='int'),
                             disk_type=dict(type='str'),
-                            source_image=dict(type='str'),
+                            source_image=dict(type='str', aliases=['image', 'image_family']),
                             source_image_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), sha256=dict(type='str'))),
                         ),
                     ),
diff --git a/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment.py b/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment.py
index c9a483bd22..f4ad618e0e 100644
--- a/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment.py
+++ b/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment.py
@@ -51,12 +51,30 @@ options:
   interconnect:
     description:
     - URL of the underlying Interconnect object that this attachment's traffic will
-      traverse through.
-    required: true
+      traverse through. Required if type is DEDICATED, must not be set if type is
+      PARTNER.
+    required: false
   description:
     description:
     - An optional description of this resource.
     required: false
+  edge_availability_domain:
+    description:
+    - Desired availability domain for the attachment. Only available for type PARTNER,
+      at creation time. For improved reliability, customers should configure a pair
+      of attachments with one per availability domain. The selected availability domain
+      will be provided to the Partner via the pairing key so that the provisioned
+      circuit will lie in the specified domain. If not specified, the value will default
+      to AVAILABILITY_DOMAIN_ANY.
+    required: false
+  type:
+    description:
+    - The type of InterconnectAttachment you wish to create. Defaults to DEDICATED.
+    required: false
+    choices:
+    - DEDICATED
+    - PARTNER
+    - PARTNER_PROVIDER
   router:
     description:
     - URL of the cloud router to be used for dynamic routing. This router must be
@@ -128,7 +146,7 @@ customerRouterIpAddress:
 interconnect:
   description:
   - URL of the underlying Interconnect object that this attachment's traffic will
-    traverse through.
+    traverse through. Required if type is DEDICATED, must not be set if type is PARTNER.
   returned: success
   type: str
 description:
@@ -136,6 +154,30 @@ description:
   - An optional description of this resource.
   returned: success
   type: str
+edgeAvailabilityDomain:
+  description:
+  - Desired availability domain for the attachment. Only available for type PARTNER,
+    at creation time. For improved reliability, customers should configure a pair
+    of attachments with one per availability domain. The selected availability domain
+    will be provided to the Partner via the pairing key so that the provisioned circuit
+    will lie in the specified domain. If not specified, the value will default to
+    AVAILABILITY_DOMAIN_ANY.
+  returned: success
+  type: str
+pairingKey:
+  description:
+  - '[Output only for type PARTNER. Not present for DEDICATED]. The opaque identifier
+    of an PARTNER attachment used to initiate provisioning with a selected partner.
+    Of the form "XXXXX/region/domain" .'
+  returned: success
+  type: str
+partnerAsn:
+  description:
+  - "[Output only for type PARTNER. Not present for DEDICATED]. Optional BGP ASN for
+    the router that should be supplied by a layer 3 Partner if they configured BGP
+    on behalf of the customer."
+  returned: success
+  type: str
 privateInterconnectInfo:
   description:
   - Information specific to an InterconnectAttachment. This property is populated
@@ -149,6 +191,16 @@ privateInterconnectInfo:
         going to and from this network and region.
       returned: success
       type: int
+type:
+  description:
+  - The type of InterconnectAttachment you wish to create. Defaults to DEDICATED.
+  returned: success
+  type: str
+state:
+  description:
+  - "[Output Only] The current state of this attachment's functionality."
+  returned: success
+  type: str
 googleReferenceId:
   description:
   - Google reference ID, to be used when raising support tickets with Google or otherwise
@@ -226,8 +278,10 @@ def main():
     module = GcpModule(
         argument_spec=dict(
             state=dict(default='present', choices=['present', 'absent'], type='str'),
-            interconnect=dict(required=True, type='str'),
+            interconnect=dict(type='str'),
             description=dict(type='str'),
+            edge_availability_domain=dict(type='str'),
+            type=dict(type='str', choices=['DEDICATED', 'PARTNER', 'PARTNER_PROVIDER']),
             router=dict(required=True),
             name=dict(required=True, type='str'),
             candidate_subnets=dict(type='list', elements='str'),
@@ -286,6 +340,8 @@ def resource_to_request(module):
         u'kind': 'compute#interconnectAttachment',
         u'interconnect': module.params.get('interconnect'),
         u'description': module.params.get('description'),
+        u'edgeAvailabilityDomain': module.params.get('edge_availability_domain'),
+        u'type': module.params.get('type'),
         u'router': replace_resource_dict(module.params.get(u'router', {}), 'selfLink'),
         u'name': module.params.get('name'),
         u'candidateSubnets': module.params.get('candidate_subnets'),
@@ -359,7 +415,12 @@ def response_to_hash(module, response):
         u'customerRouterIpAddress': response.get(u'customerRouterIpAddress'),
         u'interconnect': response.get(u'interconnect'),
         u'description': response.get(u'description'),
+        u'edgeAvailabilityDomain': response.get(u'edgeAvailabilityDomain'),
+        u'pairingKey': response.get(u'pairingKey'),
+        u'partnerAsn': response.get(u'partnerAsn'),
         u'privateInterconnectInfo': InterconnectAttachmentPrivateinterconnectinfo(response.get(u'privateInterconnectInfo', {}), module).from_response(),
+        u'type': response.get(u'type'),
+        u'state': response.get(u'state'),
         u'googleReferenceId': response.get(u'googleReferenceId'),
         u'router': response.get(u'router'),
         u'creationTimestamp': response.get(u'creationTimestamp'),
diff --git a/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment_facts.py b/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment_facts.py
index 1605afc995..0e638dc73f 100644
--- a/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment_facts.py
+++ b/lib/ansible/modules/cloud/google/gcp_compute_interconnect_attachment_facts.py
@@ -84,7 +84,8 @@ items:
     interconnect:
       description:
       - URL of the underlying Interconnect object that this attachment's traffic will
-        traverse through.
+        traverse through. Required if type is DEDICATED, must not be set if type is
+        PARTNER.
       returned: success
       type: str
     description:
@@ -92,6 +93,30 @@ items:
       - An optional description of this resource.
       returned: success
       type: str
+    edgeAvailabilityDomain:
+      description:
+      - Desired availability domain for the attachment. Only available for type PARTNER,
+        at creation time. For improved reliability, customers should configure a pair
+        of attachments with one per availability domain. The selected availability
+        domain will be provided to the Partner via the pairing key so that the provisioned
+        circuit will lie in the specified domain. If not specified, the value will
+        default to AVAILABILITY_DOMAIN_ANY.
+      returned: success
+      type: str
+    pairingKey:
+      description:
+      - '[Output only for type PARTNER. Not present for DEDICATED]. The opaque identifier
+        of an PARTNER attachment used to initiate provisioning with a selected partner.
+        Of the form "XXXXX/region/domain" .'
+      returned: success
+      type: str
+    partnerAsn:
+      description:
+      - "[Output only for type PARTNER. Not present for DEDICATED]. Optional BGP ASN
+        for the router that should be supplied by a layer 3 Partner if they configured
+        BGP on behalf of the customer."
+      returned: success
+      type: str
     privateInterconnectInfo:
       description:
       - Information specific to an InterconnectAttachment. This property is populated
@@ -105,6 +130,16 @@ items:
             customer, going to and from this network and region.
           returned: success
           type: int
+    type:
+      description:
+      - The type of InterconnectAttachment you wish to create. Defaults to DEDICATED.
+      returned: success
+      type: str
+    state:
+      description:
+      - "[Output Only] The current state of this attachment's functionality."
+      returned: success
+      type: str
     googleReferenceId:
       description:
       - Google reference ID, to be used when raising support tickets with Google or