diff --git a/plugins/module_utils/gcp_utils.py b/plugins/module_utils/gcp_utils.py
index ffa5b5c..ae4f885 100644
--- a/plugins/module_utils/gcp_utils.py
+++ b/plugins/module_utils/gcp_utils.py
@@ -62,16 +62,9 @@ def replace_resource_dict(item, value):
     else:
         if not item:
             return item
-        if isinstance(item, dict):
+        else:
             return item.get(value)
 
-        # Item could be a string or a string representing a dictionary.
-        try:
-            new_item = ast.literal_eval(item)
-            return replace_resource_dict(new_item, value)
-        except ValueError:
-            return item
-
 
 # Handles all authentication and HTTP sessions for GCP API calls.
 class GcpSession(object):
diff --git a/plugins/modules/gcp_compute_address.py b/plugins/modules/gcp_compute_address.py
index 1c2054a..df536ed 100644
--- a/plugins/modules/gcp_compute_address.py
+++ b/plugins/modules/gcp_compute_address.py
@@ -101,9 +101,10 @@ options:
     - This field can only be used with INTERNAL type with GCE_ENDPOINT/DNS_RESOLVER
       purposes.
     - 'This field represents a link to a Subnetwork resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_subnetwork
-      task and then set this subnetwork field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_subnetwork task and then set this subnetwork field to "{{ name-of-resource
+      }}"'
     required: false
     version_added: 2.7
   region:
@@ -181,7 +182,7 @@ subnetwork:
   - This field can only be used with INTERNAL type with GCE_ENDPOINT/DNS_RESOLVER
     purposes.
   returned: success
-  type: str
+  type: dict
 users:
   description:
   - The URLs of the resources that are using this address.
@@ -219,7 +220,7 @@ def main():
             description=dict(type='str'),
             name=dict(required=True, type='str'),
             network_tier=dict(type='str', choices=['PREMIUM', 'STANDARD']),
-            subnetwork=dict(),
+            subnetwork=dict(type='dict'),
             region=dict(required=True, type='str'),
         )
     )
diff --git a/plugins/modules/gcp_compute_address_facts.py b/plugins/modules/gcp_compute_address_facts.py
index a6a3d67..4ad4457 100644
--- a/plugins/modules/gcp_compute_address_facts.py
+++ b/plugins/modules/gcp_compute_address_facts.py
@@ -122,7 +122,7 @@ items:
       - This field can only be used with INTERNAL type with GCE_ENDPOINT/DNS_RESOLVER
         purposes.
       returned: success
-      type: str
+      type: dict
     users:
       description:
       - The URLs of the resources that are using this address.
diff --git a/plugins/modules/gcp_compute_backend_service.py b/plugins/modules/gcp_compute_backend_service.py
index 306f538..40350a8 100644
--- a/plugins/modules/gcp_compute_backend_service.py
+++ b/plugins/modules/gcp_compute_backend_service.py
@@ -98,10 +98,10 @@ options:
         - When the BackendService has load balancing scheme INTERNAL, the instance
           group must be in a zone within the same region as the BackendService.
         - 'This field represents a link to a InstanceGroup resource in GCP. It can
-          be specified in two ways. First, you can place in the selfLink of the resource
-          here as a string Alternatively, you can add `register: name-of-resource`
-          to a gcp_compute_instance_group task and then set this group field to "{{
-          name-of-resource }}"'
+          be specified in two ways. First, you can place a dictionary with key ''selfLink''
+          and value of your resource''s selfLink Alternatively, you can add `register:
+          name-of-resource` to a gcp_compute_instance_group task and then set this
+          group field to "{{ name-of-resource }}"'
         required: false
       max_connections:
         description:
@@ -401,7 +401,7 @@ backends:
       - When the BackendService has load balancing scheme INTERNAL, the instance group
         must be in a zone within the same region as the BackendService.
       returned: success
-      type: str
+      type: dict
     maxConnections:
       description:
       - The max number of simultaneous connections for the group. Can be used with
@@ -658,7 +658,7 @@ def main():
                     balancing_mode=dict(default='UTILIZATION', type='str', choices=['UTILIZATION', 'RATE', 'CONNECTION']),
                     capacity_scaler=dict(default=1.0, type='str'),
                     description=dict(type='str'),
-                    group=dict(),
+                    group=dict(type='dict'),
                     max_connections=dict(type='int'),
                     max_connections_per_instance=dict(type='int'),
                     max_rate=dict(type='int'),
diff --git a/plugins/modules/gcp_compute_backend_service_facts.py b/plugins/modules/gcp_compute_backend_service_facts.py
index 3a23e0c..aa8713d 100644
--- a/plugins/modules/gcp_compute_backend_service_facts.py
+++ b/plugins/modules/gcp_compute_backend_service_facts.py
@@ -115,7 +115,7 @@ items:
           - When the BackendService has load balancing scheme INTERNAL, the instance
             group must be in a zone within the same region as the BackendService.
           returned: success
-          type: str
+          type: dict
         maxConnections:
           description:
           - The max number of simultaneous connections for the group. Can be used
diff --git a/plugins/modules/gcp_compute_disk.py b/plugins/modules/gcp_compute_disk.py
index a96ca00..051683f 100644
--- a/plugins/modules/gcp_compute_disk.py
+++ b/plugins/modules/gcp_compute_disk.py
@@ -163,9 +163,10 @@ options:
     - The source snapshot used to create this disk. You can provide this as a partial
       or full URL to the resource.
     - 'This field represents a link to a Snapshot resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_snapshot
-      task and then set this source_snapshot field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_snapshot task and then set this source_snapshot field to "{{
+      name-of-resource }}"'
     required: false
   source_snapshot_encryption_key:
     description:
@@ -374,7 +375,7 @@ sourceSnapshot:
   - The source snapshot used to create this disk. You can provide this as a partial
     or full URL to the resource.
   returned: success
-  type: str
+  type: dict
 sourceSnapshotEncryptionKey:
   description:
   - The customer-supplied encryption key of the source snapshot. Required if the source
@@ -441,7 +442,7 @@ def main():
             zone=dict(required=True, type='str'),
             source_image_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), kms_key_name=dict(type='str'))),
             disk_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), kms_key_name=dict(type='str'))),
-            source_snapshot=dict(),
+            source_snapshot=dict(type='dict'),
             source_snapshot_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'), kms_key_name=dict(type='str'))),
         )
     )
diff --git a/plugins/modules/gcp_compute_disk_facts.py b/plugins/modules/gcp_compute_disk_facts.py
index 0eac0ae..7d727de 100644
--- a/plugins/modules/gcp_compute_disk_facts.py
+++ b/plugins/modules/gcp_compute_disk_facts.py
@@ -243,7 +243,7 @@ items:
       - The source snapshot used to create this disk. You can provide this as a partial
         or full URL to the resource.
       returned: success
-      type: str
+      type: dict
     sourceSnapshotEncryptionKey:
       description:
       - The customer-supplied encryption key of the source snapshot. Required if the
diff --git a/plugins/modules/gcp_compute_firewall.py b/plugins/modules/gcp_compute_firewall.py
index ab70325..082d697 100644
--- a/plugins/modules/gcp_compute_firewall.py
+++ b/plugins/modules/gcp_compute_firewall.py
@@ -146,9 +146,10 @@ options:
       networks/my-network projects/myproject/global/networks/my-network global/networks/default
       .'
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: false
     default:
       selfLink: global/networks/default
@@ -341,7 +342,7 @@ network:
     networks/my-network projects/myproject/global/networks/my-network global/networks/default
     .'
   returned: success
-  type: str
+  type: dict
 priority:
   description:
   - Priority for this rule. This is an integer between 0 and 65535, both inclusive.
@@ -433,7 +434,7 @@ def main():
             direction=dict(type='str', choices=['INGRESS', 'EGRESS']),
             disabled=dict(type='bool'),
             name=dict(required=True, type='str'),
-            network=dict(default=dict(selfLink='global/networks/default')),
+            network=dict(default=dict(selfLink='global/networks/default'), type='dict'),
             priority=dict(default=1000, type='int'),
             source_ranges=dict(type='list', elements='str'),
             source_service_accounts=dict(type='list', elements='str'),
diff --git a/plugins/modules/gcp_compute_firewall_facts.py b/plugins/modules/gcp_compute_firewall_facts.py
index ecc39b5..6c266d3 100644
--- a/plugins/modules/gcp_compute_firewall_facts.py
+++ b/plugins/modules/gcp_compute_firewall_facts.py
@@ -170,7 +170,7 @@ items:
         networks/my-network projects/myproject/global/networks/my-network global/networks/default
         .'
       returned: success
-      type: str
+      type: dict
     priority:
       description:
       - Priority for this rule. This is an integer between 0 and 65535, both inclusive.
diff --git a/plugins/modules/gcp_compute_forwarding_rule.py b/plugins/modules/gcp_compute_forwarding_rule.py
index 7813b2b..d004854 100644
--- a/plugins/modules/gcp_compute_forwarding_rule.py
+++ b/plugins/modules/gcp_compute_forwarding_rule.py
@@ -95,10 +95,10 @@ options:
     - This is used for internal load balancing.
     - "(not used for external load balancing) ."
     - 'This field represents a link to a BackendService resource in GCP. It can be
-      specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_backend_service task and then set this backend_service field to
-      "{{ name-of-resource }}"'
+      specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_backend_service task and then set this backend_service
+      field to "{{ name-of-resource }}"'
     required: false
   ip_version:
     description:
@@ -135,9 +135,10 @@ options:
       specified, the default network will be used.
     - This field is not used for external load balancing.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: false
   port_range:
     description:
@@ -170,9 +171,10 @@ options:
       if the network is in custom subnet mode, a subnetwork must be specified.
     - This field is not used for external load balancing.
     - 'This field represents a link to a Subnetwork resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_subnetwork
-      task and then set this subnetwork field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_subnetwork task and then set this subnetwork field to "{{ name-of-resource
+      }}"'
     required: false
   target:
     description:
@@ -183,9 +185,10 @@ options:
       target object.
     - This field is not used for internal load balancing.
     - 'This field represents a link to a TargetPool resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_target_pool
-      task and then set this target field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_target_pool task and then set this target field to "{{ name-of-resource
+      }}"'
     required: false
     version_added: 2.7
   all_ports:
@@ -317,7 +320,7 @@ backendService:
   - This is used for internal load balancing.
   - "(not used for external load balancing) ."
   returned: success
-  type: str
+  type: dict
 ipVersion:
   description:
   - The IP Version that will be used by this forwarding rule. Valid options are IPV4
@@ -350,7 +353,7 @@ network:
     the default network will be used.
   - This field is not used for external load balancing.
   returned: success
-  type: str
+  type: dict
 portRange:
   description:
   - This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy,
@@ -383,7 +386,7 @@ subnetwork:
     if the network is in custom subnet mode, a subnetwork must be specified.
   - This field is not used for external load balancing.
   returned: success
-  type: str
+  type: dict
 target:
   description:
   - A reference to a TargetPool resource to receive the matched traffic.
@@ -393,7 +396,7 @@ target:
     target object.
   - This field is not used for internal load balancing.
   returned: success
-  type: str
+  type: dict
 allPorts:
   description:
   - When the load balancing scheme is INTERNAL and protocol is TCP/UDP, omit `port`/`port_range`
@@ -456,15 +459,15 @@ def main():
             description=dict(type='str'),
             ip_address=dict(type='str'),
             ip_protocol=dict(type='str', choices=['TCP', 'UDP', 'ESP', 'AH', 'SCTP', 'ICMP']),
-            backend_service=dict(),
+            backend_service=dict(type='dict'),
             ip_version=dict(type='str', choices=['IPV4', 'IPV6']),
             load_balancing_scheme=dict(type='str', choices=['INTERNAL', 'EXTERNAL']),
             name=dict(required=True, type='str'),
-            network=dict(),
+            network=dict(type='dict'),
             port_range=dict(type='str'),
             ports=dict(type='list', elements='str'),
-            subnetwork=dict(),
-            target=dict(),
+            subnetwork=dict(type='dict'),
+            target=dict(type='dict'),
             all_ports=dict(type='bool'),
             network_tier=dict(type='str', choices=['PREMIUM', 'STANDARD']),
             service_label=dict(type='str'),
diff --git a/plugins/modules/gcp_compute_forwarding_rule_facts.py b/plugins/modules/gcp_compute_forwarding_rule_facts.py
index d0dce15..99f2e16 100644
--- a/plugins/modules/gcp_compute_forwarding_rule_facts.py
+++ b/plugins/modules/gcp_compute_forwarding_rule_facts.py
@@ -123,7 +123,7 @@ items:
       - This is used for internal load balancing.
       - "(not used for external load balancing) ."
       returned: success
-      type: str
+      type: dict
     ipVersion:
       description:
       - The IP Version that will be used by this forwarding rule. Valid options are
@@ -156,7 +156,7 @@ items:
         specified, the default network will be used.
       - This field is not used for external load balancing.
       returned: success
-      type: str
+      type: dict
     portRange:
       description:
       - This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy,
@@ -191,7 +191,7 @@ items:
         if the network is in custom subnet mode, a subnetwork must be specified.
       - This field is not used for external load balancing.
       returned: success
-      type: str
+      type: dict
     target:
       description:
       - A reference to a TargetPool resource to receive the matched traffic.
@@ -201,7 +201,7 @@ items:
         to the target object.
       - This field is not used for internal load balancing.
       returned: success
-      type: str
+      type: dict
     allPorts:
       description:
       - When the load balancing scheme is INTERNAL and protocol is TCP/UDP, omit `port`/`port_range`
diff --git a/plugins/modules/gcp_compute_global_forwarding_rule.py b/plugins/modules/gcp_compute_global_forwarding_rule.py
index 4f05ea2..9f4ef2d 100644
--- a/plugins/modules/gcp_compute_global_forwarding_rule.py
+++ b/plugins/modules/gcp_compute_global_forwarding_rule.py
@@ -97,10 +97,10 @@ options:
     - This is used for internal load balancing.
     - "(not used for external load balancing) ."
     - 'This field represents a link to a BackendService resource in GCP. It can be
-      specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_backend_service task and then set this backend_service field to
-      "{{ name-of-resource }}"'
+      specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_backend_service task and then set this backend_service
+      field to "{{ name-of-resource }}"'
     required: false
   ip_version:
     description:
@@ -137,9 +137,10 @@ options:
       specified, the default network will be used.
     - This field is not used for external load balancing.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: false
   port_range:
     description:
@@ -172,9 +173,10 @@ options:
       if the network is in custom subnet mode, a subnetwork must be specified.
     - This field is not used for external load balancing.
     - 'This field represents a link to a Subnetwork resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_subnetwork
-      task and then set this subnetwork field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_subnetwork task and then set this subnetwork field to "{{ name-of-resource
+      }}"'
     required: false
   target:
     description:
@@ -318,7 +320,7 @@ backendService:
   - This is used for internal load balancing.
   - "(not used for external load balancing) ."
   returned: success
-  type: str
+  type: dict
 ipVersion:
   description:
   - The IP Version that will be used by this forwarding rule. Valid options are IPV4
@@ -351,7 +353,7 @@ network:
     the default network will be used.
   - This field is not used for external load balancing.
   returned: success
-  type: str
+  type: dict
 portRange:
   description:
   - This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy,
@@ -384,7 +386,7 @@ subnetwork:
     if the network is in custom subnet mode, a subnetwork must be specified.
   - This field is not used for external load balancing.
   returned: success
-  type: str
+  type: dict
 region:
   description:
   - A reference to the region where the regional forwarding rule resides.
@@ -422,14 +424,14 @@ def main():
             description=dict(type='str'),
             ip_address=dict(type='str'),
             ip_protocol=dict(type='str', choices=['TCP', 'UDP', 'ESP', 'AH', 'SCTP', 'ICMP']),
-            backend_service=dict(),
+            backend_service=dict(type='dict'),
             ip_version=dict(type='str', choices=['IPV4', 'IPV6']),
             load_balancing_scheme=dict(type='str', choices=['INTERNAL_SELF_MANAGED', 'EXTERNAL']),
             name=dict(required=True, type='str'),
-            network=dict(),
+            network=dict(type='dict'),
             port_range=dict(type='str'),
             ports=dict(type='list', elements='str'),
-            subnetwork=dict(),
+            subnetwork=dict(type='dict'),
             target=dict(type='str'),
         )
     )
diff --git a/plugins/modules/gcp_compute_global_forwarding_rule_facts.py b/plugins/modules/gcp_compute_global_forwarding_rule_facts.py
index a9bc165..c419041 100644
--- a/plugins/modules/gcp_compute_global_forwarding_rule_facts.py
+++ b/plugins/modules/gcp_compute_global_forwarding_rule_facts.py
@@ -117,7 +117,7 @@ items:
       - This is used for internal load balancing.
       - "(not used for external load balancing) ."
       returned: success
-      type: str
+      type: dict
     ipVersion:
       description:
       - The IP Version that will be used by this forwarding rule. Valid options are
@@ -150,7 +150,7 @@ items:
         specified, the default network will be used.
       - This field is not used for external load balancing.
       returned: success
-      type: str
+      type: dict
     portRange:
       description:
       - This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy,
@@ -185,7 +185,7 @@ items:
         if the network is in custom subnet mode, a subnetwork must be specified.
       - This field is not used for external load balancing.
       returned: success
-      type: str
+      type: dict
     region:
       description:
       - A reference to the region where the regional forwarding rule resides.
diff --git a/plugins/modules/gcp_compute_image.py b/plugins/modules/gcp_compute_image.py
index fc6baa1..f8db6b4 100644
--- a/plugins/modules/gcp_compute_image.py
+++ b/plugins/modules/gcp_compute_image.py
@@ -153,9 +153,10 @@ options:
     - You must provide either this property or the rawDisk.source property but not
       both to create an image.
     - 'This field represents a link to a Disk resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_disk
-      task and then set this source_disk field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_disk task and then set this source_disk field to "{{ name-of-resource
+      }}"'
     required: false
   source_disk_encryption_key:
     description:
@@ -384,7 +385,7 @@ sourceDisk:
   - You must provide either this property or the rawDisk.source property but not both
     to create an image.
   returned: success
-  type: str
+  type: dict
 sourceDiskEncryptionKey:
   description:
   - The customer-supplied encryption key of the source disk. Required if the source
@@ -451,7 +452,7 @@ def main():
                 type='dict',
                 options=dict(container_type=dict(type='str', choices=['TAR']), sha1_checksum=dict(type='str'), source=dict(required=True, type='str')),
             ),
-            source_disk=dict(),
+            source_disk=dict(type='dict'),
             source_disk_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'))),
             source_disk_id=dict(type='str'),
             source_type=dict(type='str', choices=['RAW']),
diff --git a/plugins/modules/gcp_compute_image_facts.py b/plugins/modules/gcp_compute_image_facts.py
index bcf494a..e6f19b0 100644
--- a/plugins/modules/gcp_compute_image_facts.py
+++ b/plugins/modules/gcp_compute_image_facts.py
@@ -244,7 +244,7 @@ items:
       - You must provide either this property or the rawDisk.source property but not
         both to create an image.
       returned: success
-      type: str
+      type: dict
     sourceDiskEncryptionKey:
       description:
       - The customer-supplied encryption key of the source disk. Required if the source
diff --git a/plugins/modules/gcp_compute_instance.py b/plugins/modules/gcp_compute_instance.py
index e5790c2..2b922c6 100644
--- a/plugins/modules/gcp_compute_instance.py
+++ b/plugins/modules/gcp_compute_instance.py
@@ -176,9 +176,10 @@ options:
         - If desired, you can also attach existing non-root persistent disks using
           this property. This field is only applicable for persistent disks.
         - 'This field represents a link to a Disk resource in GCP. It can be specified
-          in two ways. First, you can place in the selfLink of the resource here as
-          a string Alternatively, you can add `register: name-of-resource` to a gcp_compute_disk
-          task and then set this source field to "{{ name-of-resource }}"'
+          in two ways. First, you can place a dictionary with key ''selfLink'' and
+          value of your resource''s selfLink Alternatively, you can add `register:
+          name-of-resource` to a gcp_compute_disk task and then set this source field
+          to "{{ name-of-resource }}"'
         required: false
       type:
         description:
@@ -261,10 +262,10 @@ options:
               address pool. If you specify a static external IP address, it must live
               in the same region as the zone of the instance.
             - 'This field represents a link to a Address resource in GCP. It can be
-              specified in two ways. First, you can place in the address of the resource
-              here as a string Alternatively, you can add `register: name-of-resource`
-              to a gcp_compute_address task and then set this nat_ip field to "{{
-              name-of-resource }}"'
+              specified in two ways. First, you can place a dictionary with key ''address''
+              and value of your resource''s address Alternatively, you can add `register:
+              name-of-resource` to a gcp_compute_address task and then set this nat_ip
+              field to "{{ name-of-resource }}"'
             required: false
           type:
             description:
@@ -299,9 +300,10 @@ options:
           global/networks/default is used; if the network is not specified but the
           subnetwork is specified, the network is inferred.
         - 'This field represents a link to a Network resource in GCP. It can be specified
-          in two ways. First, you can place in the selfLink of the resource here as
-          a string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-          task and then set this network field to "{{ name-of-resource }}"'
+          in two ways. First, you can place a dictionary with key ''selfLink'' and
+          value of your resource''s selfLink Alternatively, you can add `register:
+          name-of-resource` to a gcp_compute_network task and then set this network
+          field to "{{ name-of-resource }}"'
         required: false
       network_ip:
         description:
@@ -316,10 +318,10 @@ options:
           If the network is in auto subnet mode, providing the subnetwork is optional.
           If the network is in custom subnet mode, then this field should be specified.
         - 'This field represents a link to a Subnetwork resource in GCP. It can be
-          specified in two ways. First, you can place in the selfLink of the resource
-          here as a string Alternatively, you can add `register: name-of-resource`
-          to a gcp_compute_subnetwork task and then set this subnetwork field to "{{
-          name-of-resource }}"'
+          specified in two ways. First, you can place a dictionary with key ''selfLink''
+          and value of your resource''s selfLink Alternatively, you can add `register:
+          name-of-resource` to a gcp_compute_subnetwork task and then set this subnetwork
+          field to "{{ name-of-resource }}"'
         required: false
   scheduling:
     description:
@@ -617,7 +619,7 @@ disks:
       - If desired, you can also attach existing non-root persistent disks using this
         property. This field is only applicable for persistent disks.
       returned: success
-      type: str
+      type: dict
     type:
       description:
       - Specifies the type of the disk, either SCRATCH or PERSISTENT. If not specified,
@@ -713,7 +715,7 @@ networkInterfaces:
             address pool. If you specify a static external IP address, it must live
             in the same region as the zone of the instance.
           returned: success
-          type: str
+          type: dict
         type:
           description:
           - The type of configuration. The default and only option is ONE_TO_ONE_NAT.
@@ -755,7 +757,7 @@ networkInterfaces:
         is used; if the network is not specified but the subnetwork is specified,
         the network is inferred.
       returned: success
-      type: str
+      type: dict
     networkIP:
       description:
       - An IPv4 internal network address to assign to the instance for this network
@@ -770,7 +772,7 @@ networkInterfaces:
         the network is in auto subnet mode, providing the subnetwork is optional.
         If the network is in custom subnet mode, then this field should be specified.
       returned: success
-      type: str
+      type: dict
 scheduling:
   description:
   - Sets the scheduling options for this instance.
@@ -901,7 +903,7 @@ def main():
                     ),
                     interface=dict(type='str', choices=['SCSI', 'NVME']),
                     mode=dict(type='str', choices=['READ_WRITE', 'READ_ONLY']),
-                    source=dict(),
+                    source=dict(type='dict'),
                     type=dict(type='str', choices=['SCRATCH', 'PERSISTENT']),
                 ),
             ),
@@ -918,12 +920,14 @@ def main():
                     access_configs=dict(
                         type='list',
                         elements='dict',
-                        options=dict(name=dict(required=True, type='str'), nat_ip=dict(), type=dict(required=True, type='str', choices=['ONE_TO_ONE_NAT'])),
+                        options=dict(
+                            name=dict(required=True, type='str'), nat_ip=dict(type='dict'), type=dict(required=True, type='str', choices=['ONE_TO_ONE_NAT'])
+                        ),
                     ),
                     alias_ip_ranges=dict(type='list', elements='dict', options=dict(ip_cidr_range=dict(type='str'), subnetwork_range_name=dict(type='str'))),
-                    network=dict(),
+                    network=dict(type='dict'),
                     network_ip=dict(type='str'),
-                    subnetwork=dict(),
+                    subnetwork=dict(type='dict'),
                 ),
             ),
             scheduling=dict(
diff --git a/plugins/modules/gcp_compute_instance_facts.py b/plugins/modules/gcp_compute_instance_facts.py
index dbc0431..950d95a 100644
--- a/plugins/modules/gcp_compute_instance_facts.py
+++ b/plugins/modules/gcp_compute_instance_facts.py
@@ -226,7 +226,7 @@ items:
           - If desired, you can also attach existing non-root persistent disks using
             this property. This field is only applicable for persistent disks.
           returned: success
-          type: str
+          type: dict
         type:
           description:
           - Specifies the type of the disk, either SCRATCH or PERSISTENT. If not specified,
@@ -324,7 +324,7 @@ items:
                 IP address pool. If you specify a static external IP address, it must
                 live in the same region as the zone of the instance.
               returned: success
-              type: str
+              type: dict
             type:
               description:
               - The type of configuration. The default and only option is ONE_TO_ONE_NAT.
@@ -366,7 +366,7 @@ items:
             global/networks/default is used; if the network is not specified but the
             subnetwork is specified, the network is inferred.
           returned: success
-          type: str
+          type: dict
         networkIP:
           description:
           - An IPv4 internal network address to assign to the instance for this network
@@ -381,7 +381,7 @@ items:
             If the network is in auto subnet mode, providing the subnetwork is optional.
             If the network is in custom subnet mode, then this field should be specified.
           returned: success
-          type: str
+          type: dict
     scheduling:
       description:
       - Sets the scheduling options for this instance.
diff --git a/plugins/modules/gcp_compute_instance_group.py b/plugins/modules/gcp_compute_instance_group.py
index 7c7b9d7..228cd8d 100644
--- a/plugins/modules/gcp_compute_instance_group.py
+++ b/plugins/modules/gcp_compute_instance_group.py
@@ -83,9 +83,10 @@ options:
     description:
     - The network to which all instances in the instance group belong.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: false
   region:
     description:
@@ -95,9 +96,10 @@ options:
     description:
     - The subnetwork to which all instances in the instance group belong.
     - 'This field represents a link to a Subnetwork resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_subnetwork
-      task and then set this subnetwork field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_subnetwork task and then set this subnetwork field to "{{ name-of-resource
+      }}"'
     required: false
   zone:
     description:
@@ -188,7 +190,7 @@ network:
   description:
   - The network to which all instances in the instance group belong.
   returned: success
-  type: str
+  type: dict
 region:
   description:
   - The region where the instance group is located (for regional resources).
@@ -198,7 +200,7 @@ subnetwork:
   description:
   - The subnetwork to which all instances in the instance group belong.
   returned: success
-  type: str
+  type: dict
 zone:
   description:
   - A reference to the zone where the instance group resides.
@@ -238,11 +240,11 @@ def main():
             description=dict(type='str'),
             name=dict(type='str'),
             named_ports=dict(type='list', elements='dict', options=dict(name=dict(type='str'), port=dict(type='int'))),
-            network=dict(),
+            network=dict(type='dict'),
             region=dict(type='str'),
-            subnetwork=dict(),
+            subnetwork=dict(type='dict'),
             zone=dict(required=True, type='str'),
-            instances=dict(type='list'),
+            instances=dict(type='list', elements='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_compute_instance_group_facts.py b/plugins/modules/gcp_compute_instance_group_facts.py
index a875420..890758f 100644
--- a/plugins/modules/gcp_compute_instance_group_facts.py
+++ b/plugins/modules/gcp_compute_instance_group_facts.py
@@ -118,7 +118,7 @@ items:
       description:
       - The network to which all instances in the instance group belong.
       returned: success
-      type: str
+      type: dict
     region:
       description:
       - The region where the instance group is located (for regional resources).
@@ -128,7 +128,7 @@ items:
       description:
       - The subnetwork to which all instances in the instance group belong.
       returned: success
-      type: str
+      type: dict
     zone:
       description:
       - A reference to the zone where the instance group resides.
diff --git a/plugins/modules/gcp_compute_instance_group_manager.py b/plugins/modules/gcp_compute_instance_group_manager.py
index 6153fc3..cca5ee0 100644
--- a/plugins/modules/gcp_compute_instance_group_manager.py
+++ b/plugins/modules/gcp_compute_instance_group_manager.py
@@ -70,10 +70,10 @@ options:
       group uses this template to create all new instances in the managed instance
       group.
     - 'This field represents a link to a InstanceTemplate resource in GCP. It can
-      be specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_instance_template task and then set this instance_template field
-      to "{{ name-of-resource }}"'
+      be specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_instance_template task and then set this
+      instance_template field to "{{ name-of-resource }}"'
     required: true
   name:
     description:
@@ -261,13 +261,13 @@ instanceGroup:
   description:
   - The instance group being managed.
   returned: success
-  type: str
+  type: dict
 instanceTemplate:
   description:
   - The instance template that is specified for this managed instance group. The group
     uses this template to create all new instances in the managed instance group.
   returned: success
-  type: str
+  type: dict
 name:
   description:
   - The name of the managed instance group. The name must be 1-63 characters long,
@@ -339,10 +339,10 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             base_instance_name=dict(required=True, type='str'),
             description=dict(type='str'),
-            instance_template=dict(required=True),
+            instance_template=dict(required=True, type='dict'),
             name=dict(required=True, type='str'),
             named_ports=dict(type='list', elements='dict', options=dict(name=dict(type='str'), port=dict(type='int'))),
-            target_pools=dict(type='list'),
+            target_pools=dict(type='list', elements='dict'),
             target_size=dict(type='int'),
             zone=dict(required=True, type='str'),
         )
diff --git a/plugins/modules/gcp_compute_instance_group_manager_facts.py b/plugins/modules/gcp_compute_instance_group_manager_facts.py
index 0d13073..4f0d703 100644
--- a/plugins/modules/gcp_compute_instance_group_manager_facts.py
+++ b/plugins/modules/gcp_compute_instance_group_manager_facts.py
@@ -162,14 +162,14 @@ items:
       description:
       - The instance group being managed.
       returned: success
-      type: str
+      type: dict
     instanceTemplate:
       description:
       - The instance template that is specified for this managed instance group. The
         group uses this template to create all new instances in the managed instance
         group.
       returned: success
-      type: str
+      type: dict
     name:
       description:
       - The name of the managed instance group. The name must be 1-63 characters long,
diff --git a/plugins/modules/gcp_compute_instance_template.py b/plugins/modules/gcp_compute_instance_template.py
index 68ffdab..566efea 100644
--- a/plugins/modules/gcp_compute_instance_template.py
+++ b/plugins/modules/gcp_compute_instance_template.py
@@ -201,10 +201,10 @@ options:
             - Note that for InstanceTemplate, specify the disk name, not the URL for
               the disk.
             - 'This field represents a link to a Disk resource in GCP. It can be specified
-              in two ways. First, you can place in the name of the resource here as
-              a string Alternatively, you can add `register: name-of-resource` to
-              a gcp_compute_disk task and then set this source field to "{{ name-of-resource
-              }}"'
+              in two ways. First, you can place a dictionary with key ''name'' and
+              value of your resource''s name Alternatively, you can add `register:
+              name-of-resource` to a gcp_compute_disk task and then set this source
+              field to "{{ name-of-resource }}"'
             required: false
           type:
             description:
@@ -273,10 +273,10 @@ options:
                   IP address pool. If you specify a static external IP address, it
                   must live in the same region as the zone of the instance.
                 - 'This field represents a link to a Address resource in GCP. It can
-                  be specified in two ways. First, you can place in the address of
-                  the resource here as a string Alternatively, you can add `register:
-                  name-of-resource` to a gcp_compute_address task and then set this
-                  nat_ip field to "{{ name-of-resource }}"'
+                  be specified in two ways. First, you can place a dictionary with
+                  key ''address'' and value of your resource''s address Alternatively,
+                  you can add `register: name-of-resource` to a gcp_compute_address
+                  task and then set this nat_ip field to "{{ name-of-resource }}"'
                 required: false
               type:
                 description:
@@ -312,10 +312,10 @@ options:
               network global/networks/default is used; if the network is not specified
               but the subnetwork is specified, the network is inferred.
             - 'This field represents a link to a Network resource in GCP. It can be
-              specified in two ways. First, you can place in the selfLink of the resource
-              here as a string Alternatively, you can add `register: name-of-resource`
-              to a gcp_compute_network task and then set this network field to "{{
-              name-of-resource }}"'
+              specified in two ways. First, you can place a dictionary with key ''selfLink''
+              and value of your resource''s selfLink Alternatively, you can add `register:
+              name-of-resource` to a gcp_compute_network task and then set this network
+              field to "{{ name-of-resource }}"'
             required: false
           network_ip:
             description:
@@ -330,10 +330,10 @@ options:
               If the network is in auto subnet mode, providing the subnetwork is optional.
               If the network is in custom subnet mode, then this field should be specified.
             - 'This field represents a link to a Subnetwork resource in GCP. It can
-              be specified in two ways. First, you can place in the selfLink of the
-              resource here as a string Alternatively, you can add `register: name-of-resource`
-              to a gcp_compute_subnetwork task and then set this subnetwork field
-              to "{{ name-of-resource }}"'
+              be specified in two ways. First, you can place a dictionary with key
+              ''selfLink'' and value of your resource''s selfLink Alternatively, you
+              can add `register: name-of-resource` to a gcp_compute_subnetwork task
+              and then set this subnetwork field to "{{ name-of-resource }}"'
             required: false
       scheduling:
         description:
@@ -626,7 +626,7 @@ properties:
           - Note that for InstanceTemplate, specify the disk name, not the URL for
             the disk.
           returned: success
-          type: str
+          type: dict
         type:
           description:
           - Specifies the type of the disk, either SCRATCH or PERSISTENT. If not specified,
@@ -699,7 +699,7 @@ properties:
                 IP address pool. If you specify a static external IP address, it must
                 live in the same region as the zone of the instance.
               returned: success
-              type: str
+              type: dict
             type:
               description:
               - The type of configuration. The default and only option is ONE_TO_ONE_NAT.
@@ -741,7 +741,7 @@ properties:
             global/networks/default is used; if the network is not specified but the
             subnetwork is specified, the network is inferred.
           returned: success
-          type: str
+          type: dict
         networkIP:
           description:
           - An IPv4 internal network address to assign to the instance for this network
@@ -756,7 +756,7 @@ properties:
             If the network is in auto subnet mode, providing the subnetwork is optional.
             If the network is in custom subnet mode, then this field should be specified.
           returned: success
-          type: str
+          type: dict
     scheduling:
       description:
       - Sets the scheduling options for this instance.
@@ -877,7 +877,7 @@ def main():
                             ),
                             interface=dict(type='str', choices=['SCSI', 'NVME']),
                             mode=dict(type='str', choices=['READ_WRITE', 'READ_ONLY']),
-                            source=dict(),
+                            source=dict(type='dict'),
                             type=dict(type='str', choices=['SCRATCH', 'PERSISTENT']),
                         ),
                     ),
@@ -893,15 +893,17 @@ def main():
                                 type='list',
                                 elements='dict',
                                 options=dict(
-                                    name=dict(required=True, type='str'), nat_ip=dict(), type=dict(required=True, type='str', choices=['ONE_TO_ONE_NAT'])
+                                    name=dict(required=True, type='str'),
+                                    nat_ip=dict(type='dict'),
+                                    type=dict(required=True, type='str', choices=['ONE_TO_ONE_NAT']),
                                 ),
                             ),
                             alias_ip_ranges=dict(
                                 type='list', elements='dict', options=dict(ip_cidr_range=dict(type='str'), subnetwork_range_name=dict(type='str'))
                             ),
-                            network=dict(),
+                            network=dict(type='dict'),
                             network_ip=dict(type='str'),
-                            subnetwork=dict(),
+                            subnetwork=dict(type='dict'),
                         ),
                     ),
                     scheduling=dict(
diff --git a/plugins/modules/gcp_compute_instance_template_facts.py b/plugins/modules/gcp_compute_instance_template_facts.py
index b6f57d9..6120274 100644
--- a/plugins/modules/gcp_compute_instance_template_facts.py
+++ b/plugins/modules/gcp_compute_instance_template_facts.py
@@ -251,7 +251,7 @@ items:
               - Note that for InstanceTemplate, specify the disk name, not the URL
                 for the disk.
               returned: success
-              type: str
+              type: dict
             type:
               description:
               - Specifies the type of the disk, either SCRATCH or PERSISTENT. If not
@@ -327,7 +327,7 @@ items:
                     ephemeral IP address pool. If you specify a static external IP
                     address, it must live in the same region as the zone of the instance.
                   returned: success
-                  type: str
+                  type: dict
                 type:
                   description:
                   - The type of configuration. The default and only option is ONE_TO_ONE_NAT.
@@ -371,7 +371,7 @@ items:
                 network global/networks/default is used; if the network is not specified
                 but the subnetwork is specified, the network is inferred.
               returned: success
-              type: str
+              type: dict
             networkIP:
               description:
               - An IPv4 internal network address to assign to the instance for this
@@ -387,7 +387,7 @@ items:
                 optional. If the network is in custom subnet mode, then this field
                 should be specified.
               returned: success
-              type: str
+              type: dict
         scheduling:
           description:
           - Sets the scheduling options for this instance.
diff --git a/plugins/modules/gcp_compute_interconnect_attachment.py b/plugins/modules/gcp_compute_interconnect_attachment.py
index 3ce52d4..92b951e 100644
--- a/plugins/modules/gcp_compute_interconnect_attachment.py
+++ b/plugins/modules/gcp_compute_interconnect_attachment.py
@@ -82,9 +82,10 @@ options:
       will automatically connect the Interconnect to the network & region within which
       the Cloud Router is configured.
     - 'This field represents a link to a Router resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_router
-      task and then set this router field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_router task and then set this router field to "{{ name-of-resource
+      }}"'
     required: true
   name:
     description:
@@ -214,7 +215,7 @@ router:
     automatically connect the Interconnect to the network & region within which the
     Cloud Router is configured.
   returned: success
-  type: str
+  type: dict
 creationTimestamp:
   description:
   - Creation timestamp in RFC3339 text format.
@@ -282,7 +283,7 @@ def main():
             description=dict(type='str'),
             edge_availability_domain=dict(type='str'),
             type=dict(type='str', choices=['DEDICATED', 'PARTNER', 'PARTNER_PROVIDER']),
-            router=dict(required=True),
+            router=dict(required=True, type='dict'),
             name=dict(required=True, type='str'),
             candidate_subnets=dict(type='list', elements='str'),
             vlan_tag8021q=dict(type='int'),
diff --git a/plugins/modules/gcp_compute_interconnect_attachment_facts.py b/plugins/modules/gcp_compute_interconnect_attachment_facts.py
index 2d43ab0..b374f4f 100644
--- a/plugins/modules/gcp_compute_interconnect_attachment_facts.py
+++ b/plugins/modules/gcp_compute_interconnect_attachment_facts.py
@@ -154,7 +154,7 @@ items:
         will automatically connect the Interconnect to the network & region within
         which the Cloud Router is configured.
       returned: success
-      type: str
+      type: dict
     creationTimestamp:
       description:
       - Creation timestamp in RFC3339 text format.
diff --git a/plugins/modules/gcp_compute_region_disk.py b/plugins/modules/gcp_compute_region_disk.py
index f789eac..12beabc 100644
--- a/plugins/modules/gcp_compute_region_disk.py
+++ b/plugins/modules/gcp_compute_region_disk.py
@@ -131,9 +131,10 @@ options:
     - The source snapshot used to create this disk. You can provide this as a partial
       or full URL to the resource.
     - 'This field represents a link to a Snapshot resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_snapshot
-      task and then set this source_snapshot field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_snapshot task and then set this source_snapshot field to "{{
+      name-of-resource }}"'
     required: false
   source_snapshot_encryption_key:
     description:
@@ -293,7 +294,7 @@ sourceSnapshot:
   - The source snapshot used to create this disk. You can provide this as a partial
     or full URL to the resource.
   returned: success
-  type: str
+  type: dict
 sourceSnapshotEncryptionKey:
   description:
   - The customer-supplied encryption key of the source snapshot. Required if the source
@@ -354,7 +355,7 @@ def main():
             type=dict(type='str'),
             region=dict(required=True, type='str'),
             disk_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'))),
-            source_snapshot=dict(),
+            source_snapshot=dict(type='dict'),
             source_snapshot_encryption_key=dict(type='dict', options=dict(raw_key=dict(type='str'))),
         )
     )
diff --git a/plugins/modules/gcp_compute_region_disk_facts.py b/plugins/modules/gcp_compute_region_disk_facts.py
index d571944..4ce0dfe 100644
--- a/plugins/modules/gcp_compute_region_disk_facts.py
+++ b/plugins/modules/gcp_compute_region_disk_facts.py
@@ -194,7 +194,7 @@ items:
       - The source snapshot used to create this disk. You can provide this as a partial
         or full URL to the resource.
       returned: success
-      type: str
+      type: dict
     sourceSnapshotEncryptionKey:
       description:
       - The customer-supplied encryption key of the source snapshot. Required if the
diff --git a/plugins/modules/gcp_compute_route.py b/plugins/modules/gcp_compute_route.py
index e0b4759..8f62a2f 100644
--- a/plugins/modules/gcp_compute_route.py
+++ b/plugins/modules/gcp_compute_route.py
@@ -86,9 +86,10 @@ options:
     description:
     - The network that this route applies to.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: true
   priority:
     description:
@@ -117,9 +118,10 @@ options:
       instances/instance * projects/project/zones/zone/instances/instance * zones/zone/instances/instance
       .'
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_instance
-      task and then set this next_hop_instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_instance task and then set this next_hop_instance field to
+      "{{ name-of-resource }}"'
     required: false
   next_hop_ip:
     description:
@@ -129,9 +131,10 @@ options:
     description:
     - URL to a VpnTunnel that should handle matching packets.
     - 'This field represents a link to a VpnTunnel resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_vpn_tunnel
-      task and then set this next_hop_vpn_tunnel field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_vpn_tunnel task and then set this next_hop_vpn_tunnel field
+      to "{{ name-of-resource }}"'
     required: false
 extends_documentation_fragment: gcp
 notes:
@@ -191,7 +194,7 @@ network:
   description:
   - The network that this route applies to.
   returned: success
-  type: str
+  type: dict
 priority:
   description:
   - The priority of this route. Priority is used to break ties in cases where there
@@ -222,7 +225,7 @@ nextHopInstance:
     instances/instance * projects/project/zones/zone/instances/instance * zones/zone/instances/instance
     .'
   returned: success
-  type: str
+  type: dict
 nextHopIp:
   description:
   - Network IP address of an instance that should handle matching packets.
@@ -232,7 +235,7 @@ nextHopVpnTunnel:
   description:
   - URL to a VpnTunnel that should handle matching packets.
   returned: success
-  type: str
+  type: dict
 nextHopNetwork:
   description:
   - URL to a Network that should handle matching packets.
@@ -262,13 +265,13 @@ def main():
             dest_range=dict(required=True, type='str'),
             description=dict(type='str'),
             name=dict(required=True, type='str'),
-            network=dict(required=True),
+            network=dict(required=True, type='dict'),
             priority=dict(type='int'),
             tags=dict(type='list', elements='str'),
             next_hop_gateway=dict(type='str'),
-            next_hop_instance=dict(),
+            next_hop_instance=dict(type='dict'),
             next_hop_ip=dict(type='str'),
-            next_hop_vpn_tunnel=dict(),
+            next_hop_vpn_tunnel=dict(type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_compute_route_facts.py b/plugins/modules/gcp_compute_route_facts.py
index 34de7c0..9e3fc2b 100644
--- a/plugins/modules/gcp_compute_route_facts.py
+++ b/plugins/modules/gcp_compute_route_facts.py
@@ -91,7 +91,7 @@ items:
       description:
       - The network that this route applies to.
       returned: success
-      type: str
+      type: dict
     priority:
       description:
       - The priority of this route. Priority is used to break ties in cases where
@@ -122,7 +122,7 @@ items:
         instances/instance * projects/project/zones/zone/instances/instance * zones/zone/instances/instance
         .'
       returned: success
-      type: str
+      type: dict
     nextHopIp:
       description:
       - Network IP address of an instance that should handle matching packets.
@@ -132,7 +132,7 @@ items:
       description:
       - URL to a VpnTunnel that should handle matching packets.
       returned: success
-      type: str
+      type: dict
     nextHopNetwork:
       description:
       - URL to a Network that should handle matching packets.
diff --git a/plugins/modules/gcp_compute_router.py b/plugins/modules/gcp_compute_router.py
index 83ecca8..d15a4b1 100644
--- a/plugins/modules/gcp_compute_router.py
+++ b/plugins/modules/gcp_compute_router.py
@@ -63,9 +63,10 @@ options:
     description:
     - A reference to the network to which this router belongs.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: true
   bgp:
     description:
@@ -181,7 +182,7 @@ network:
   description:
   - A reference to the network to which this router belongs.
   returned: success
-  type: str
+  type: dict
 bgp:
   description:
   - BGP information specific to this router.
@@ -258,7 +259,7 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             name=dict(required=True, type='str'),
             description=dict(type='str'),
-            network=dict(required=True),
+            network=dict(required=True, type='dict'),
             bgp=dict(
                 type='dict',
                 options=dict(
diff --git a/plugins/modules/gcp_compute_router_facts.py b/plugins/modules/gcp_compute_router_facts.py
index 45c00d8..fd454ea 100644
--- a/plugins/modules/gcp_compute_router_facts.py
+++ b/plugins/modules/gcp_compute_router_facts.py
@@ -98,7 +98,7 @@ items:
       description:
       - A reference to the network to which this router belongs.
       returned: success
-      type: str
+      type: dict
     bgp:
       description:
       - BGP information specific to this router.
diff --git a/plugins/modules/gcp_compute_subnetwork.py b/plugins/modules/gcp_compute_subnetwork.py
index 5f4762a..22a045b 100644
--- a/plugins/modules/gcp_compute_subnetwork.py
+++ b/plugins/modules/gcp_compute_subnetwork.py
@@ -89,9 +89,10 @@ options:
     - The network this subnet belongs to.
     - Only networks that are in the distributed mode can have subnetworks.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: true
   enable_flow_logs:
     description:
@@ -206,7 +207,7 @@ network:
   - The network this subnet belongs to.
   - Only networks that are in the distributed mode can have subnetworks.
   returned: success
-  type: str
+  type: dict
 enableFlowLogs:
   description:
   - Whether to enable flow logging for this subnetwork.
@@ -276,7 +277,7 @@ def main():
             description=dict(type='str'),
             ip_cidr_range=dict(required=True, type='str'),
             name=dict(required=True, type='str'),
-            network=dict(required=True),
+            network=dict(required=True, type='dict'),
             enable_flow_logs=dict(type='bool'),
             secondary_ip_ranges=dict(
                 type='list', elements='dict', options=dict(range_name=dict(required=True, type='str'), ip_cidr_range=dict(required=True, type='str'))
diff --git a/plugins/modules/gcp_compute_subnetwork_facts.py b/plugins/modules/gcp_compute_subnetwork_facts.py
index 9d24ddd..58d67c3 100644
--- a/plugins/modules/gcp_compute_subnetwork_facts.py
+++ b/plugins/modules/gcp_compute_subnetwork_facts.py
@@ -115,7 +115,7 @@ items:
       - The network this subnet belongs to.
       - Only networks that are in the distributed mode can have subnetworks.
       returned: success
-      type: str
+      type: dict
     enableFlowLogs:
       description:
       - Whether to enable flow logging for this subnetwork.
diff --git a/plugins/modules/gcp_compute_target_http_proxy.py b/plugins/modules/gcp_compute_target_http_proxy.py
index 3e69a97..77ac93c 100644
--- a/plugins/modules/gcp_compute_target_http_proxy.py
+++ b/plugins/modules/gcp_compute_target_http_proxy.py
@@ -66,9 +66,10 @@ options:
     - A reference to the UrlMap resource that defines the mapping from URL to the
       BackendService.
     - 'This field represents a link to a UrlMap resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_url_map
-      task and then set this url_map field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_url_map task and then set this url_map field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 notes:
@@ -164,7 +165,7 @@ urlMap:
   description:
   - A reference to the UrlMap resource that defines the mapping from URL to the BackendService.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -188,7 +189,7 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             description=dict(type='str'),
             name=dict(required=True, type='str'),
-            url_map=dict(required=True),
+            url_map=dict(required=True, type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_compute_target_http_proxy_facts.py b/plugins/modules/gcp_compute_target_http_proxy_facts.py
index 1a6e68a..0ae4f89 100644
--- a/plugins/modules/gcp_compute_target_http_proxy_facts.py
+++ b/plugins/modules/gcp_compute_target_http_proxy_facts.py
@@ -95,7 +95,7 @@ items:
       - A reference to the UrlMap resource that defines the mapping from URL to the
         BackendService.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
diff --git a/plugins/modules/gcp_compute_target_https_proxy.py b/plugins/modules/gcp_compute_target_https_proxy.py
index c9dd72c..e32c47c 100644
--- a/plugins/modules/gcp_compute_target_https_proxy.py
+++ b/plugins/modules/gcp_compute_target_https_proxy.py
@@ -86,9 +86,10 @@ options:
       resource. If not set, the TargetHttpsProxy resource will not have any SSL policy
       configured.
     - 'This field represents a link to a SslPolicy resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_ssl_policy
-      task and then set this ssl_policy field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_ssl_policy task and then set this ssl_policy field to "{{ name-of-resource
+      }}"'
     required: false
     version_added: 2.8
   url_map:
@@ -96,9 +97,10 @@ options:
     - A reference to the UrlMap resource that defines the mapping from URL to the
       BackendService.
     - 'This field represents a link to a UrlMap resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_url_map
-      task and then set this url_map field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_url_map task and then set this url_map field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 notes:
@@ -235,12 +237,12 @@ sslPolicy:
     resource. If not set, the TargetHttpsProxy resource will not have any SSL policy
     configured.
   returned: success
-  type: str
+  type: dict
 urlMap:
   description:
   - A reference to the UrlMap resource that defines the mapping from URL to the BackendService.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -265,9 +267,9 @@ def main():
             description=dict(type='str'),
             name=dict(required=True, type='str'),
             quic_override=dict(type='str', choices=['NONE', 'ENABLE', 'DISABLE']),
-            ssl_certificates=dict(required=True, type='list'),
-            ssl_policy=dict(),
-            url_map=dict(required=True),
+            ssl_certificates=dict(required=True, type='list', elements='dict'),
+            ssl_policy=dict(type='dict'),
+            url_map=dict(required=True, type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_compute_target_https_proxy_facts.py b/plugins/modules/gcp_compute_target_https_proxy_facts.py
index bd79ec0..423fe90 100644
--- a/plugins/modules/gcp_compute_target_https_proxy_facts.py
+++ b/plugins/modules/gcp_compute_target_https_proxy_facts.py
@@ -112,13 +112,13 @@ items:
         resource. If not set, the TargetHttpsProxy resource will not have any SSL
         policy configured.
       returned: success
-      type: str
+      type: dict
     urlMap:
       description:
       - A reference to the UrlMap resource that defines the mapping from URL to the
         BackendService.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
diff --git a/plugins/modules/gcp_compute_target_pool.py b/plugins/modules/gcp_compute_target_pool.py
index 270e1a0..4d9e693 100644
--- a/plugins/modules/gcp_compute_target_pool.py
+++ b/plugins/modules/gcp_compute_target_pool.py
@@ -61,9 +61,10 @@ options:
       pool in the "force" mode, where traffic will be spread to the healthy instances
       with the best effort, or to all instances when no instance is healthy.
     - 'This field represents a link to a TargetPool resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_target_pool
-      task and then set this backup_pool field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_target_pool task and then set this backup_pool field to "{{
+      name-of-resource }}"'
     required: false
   description:
     description:
@@ -90,10 +91,10 @@ options:
       checks pass. If not specified it means all member instances will be considered
       healthy at all times.
     - 'This field represents a link to a HttpHealthCheck resource in GCP. It can be
-      specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_http_health_check task and then set this health_check field to
-      "{{ name-of-resource }}"'
+      specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_http_health_check task and then set this
+      health_check field to "{{ name-of-resource }}"'
     required: false
   instances:
     description:
@@ -158,7 +159,7 @@ backupPool:
     pool in the "force" mode, where traffic will be spread to the healthy instances
     with the best effort, or to all instances when no instance is healthy.
   returned: success
-  type: str
+  type: dict
 creationTimestamp:
   description:
   - Creation timestamp in RFC3339 text format.
@@ -191,7 +192,7 @@ healthCheck:
     checks pass. If not specified it means all member instances will be considered
     healthy at all times.
   returned: success
-  type: str
+  type: dict
 id:
   description:
   - The unique identifier for the resource.
@@ -249,11 +250,11 @@ def main():
     module = GcpModule(
         argument_spec=dict(
             state=dict(default='present', choices=['present', 'absent'], type='str'),
-            backup_pool=dict(),
+            backup_pool=dict(type='dict'),
             description=dict(type='str'),
             failover_ratio=dict(type='str'),
-            health_check=dict(),
-            instances=dict(type='list'),
+            health_check=dict(type='dict'),
+            instances=dict(type='list', elements='dict'),
             name=dict(required=True, type='str'),
             session_affinity=dict(type='str', choices=['NONE', 'CLIENT_IP', 'CLIENT_IP_PROTO']),
             region=dict(required=True, type='str'),
diff --git a/plugins/modules/gcp_compute_target_pool_facts.py b/plugins/modules/gcp_compute_target_pool_facts.py
index 48923e1..884cc6d 100644
--- a/plugins/modules/gcp_compute_target_pool_facts.py
+++ b/plugins/modules/gcp_compute_target_pool_facts.py
@@ -84,7 +84,7 @@ items:
         primary pool in the "force" mode, where traffic will be spread to the healthy
         instances with the best effort, or to all instances when no instance is healthy.
       returned: success
-      type: str
+      type: dict
     creationTimestamp:
       description:
       - Creation timestamp in RFC3339 text format.
@@ -117,7 +117,7 @@ items:
         checks pass. If not specified it means all member instances will be considered
         healthy at all times.
       returned: success
-      type: str
+      type: dict
     id:
       description:
       - The unique identifier for the resource.
diff --git a/plugins/modules/gcp_compute_target_ssl_proxy.py b/plugins/modules/gcp_compute_target_ssl_proxy.py
index ec6f54c..108d271 100644
--- a/plugins/modules/gcp_compute_target_ssl_proxy.py
+++ b/plugins/modules/gcp_compute_target_ssl_proxy.py
@@ -73,10 +73,10 @@ options:
     description:
     - A reference to the BackendService resource.
     - 'This field represents a link to a BackendService resource in GCP. It can be
-      specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_backend_service task and then set this service field to "{{ name-of-resource
-      }}"'
+      specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_backend_service task and then set this service
+      field to "{{ name-of-resource }}"'
     required: true
   ssl_certificates:
     description:
@@ -90,9 +90,10 @@ options:
       resource. If not set, the TargetSslProxy resource will not have any SSL policy
       configured.
     - 'This field represents a link to a SslPolicy resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_ssl_policy
-      task and then set this ssl_policy field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_ssl_policy task and then set this ssl_policy field to "{{ name-of-resource
+      }}"'
     required: false
     version_added: 2.8
 extends_documentation_fragment: gcp
@@ -213,7 +214,7 @@ service:
   description:
   - A reference to the BackendService resource.
   returned: success
-  type: str
+  type: dict
 sslCertificates:
   description:
   - A list of SslCertificate resources that are used to authenticate connections between
@@ -226,7 +227,7 @@ sslPolicy:
     resource. If not set, the TargetSslProxy resource will not have any SSL policy
     configured.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -251,9 +252,9 @@ def main():
             description=dict(type='str'),
             name=dict(required=True, type='str'),
             proxy_header=dict(type='str', choices=['NONE', 'PROXY_V1']),
-            service=dict(required=True),
-            ssl_certificates=dict(required=True, type='list'),
-            ssl_policy=dict(),
+            service=dict(required=True, type='dict'),
+            ssl_certificates=dict(required=True, type='list', elements='dict'),
+            ssl_policy=dict(type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_compute_target_ssl_proxy_facts.py b/plugins/modules/gcp_compute_target_ssl_proxy_facts.py
index fe582bf..a193754 100644
--- a/plugins/modules/gcp_compute_target_ssl_proxy_facts.py
+++ b/plugins/modules/gcp_compute_target_ssl_proxy_facts.py
@@ -100,7 +100,7 @@ items:
       description:
       - A reference to the BackendService resource.
       returned: success
-      type: str
+      type: dict
     sslCertificates:
       description:
       - A list of SslCertificate resources that are used to authenticate connections
@@ -114,7 +114,7 @@ items:
         resource. If not set, the TargetSslProxy resource will not have any SSL policy
         configured.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
diff --git a/plugins/modules/gcp_compute_target_tcp_proxy.py b/plugins/modules/gcp_compute_target_tcp_proxy.py
index b10ace3..06acbc3 100644
--- a/plugins/modules/gcp_compute_target_tcp_proxy.py
+++ b/plugins/modules/gcp_compute_target_tcp_proxy.py
@@ -73,10 +73,10 @@ options:
     description:
     - A reference to the BackendService resource.
     - 'This field represents a link to a BackendService resource in GCP. It can be
-      specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_backend_service task and then set this service field to "{{ name-of-resource
-      }}"'
+      specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_backend_service task and then set this service
+      field to "{{ name-of-resource }}"'
     required: true
 extends_documentation_fragment: gcp
 notes:
@@ -173,7 +173,7 @@ service:
   description:
   - A reference to the BackendService resource.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -198,7 +198,7 @@ def main():
             description=dict(type='str'),
             name=dict(required=True, type='str'),
             proxy_header=dict(type='str', choices=['NONE', 'PROXY_V1']),
-            service=dict(required=True),
+            service=dict(required=True, type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_compute_target_tcp_proxy_facts.py b/plugins/modules/gcp_compute_target_tcp_proxy_facts.py
index f563a0b..ab0e0da 100644
--- a/plugins/modules/gcp_compute_target_tcp_proxy_facts.py
+++ b/plugins/modules/gcp_compute_target_tcp_proxy_facts.py
@@ -100,7 +100,7 @@ items:
       description:
       - A reference to the BackendService resource.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
diff --git a/plugins/modules/gcp_compute_target_vpn_gateway.py b/plugins/modules/gcp_compute_target_vpn_gateway.py
index 9bf4d8c..3e26ef4 100644
--- a/plugins/modules/gcp_compute_target_vpn_gateway.py
+++ b/plugins/modules/gcp_compute_target_vpn_gateway.py
@@ -65,9 +65,10 @@ options:
     description:
     - The network this VPN gateway is accepting traffic for.
     - 'This field represents a link to a Network resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_network
-      task and then set this network field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_network task and then set this network field to "{{ name-of-resource
+      }}"'
     required: true
   region:
     description:
@@ -139,7 +140,7 @@ network:
   description:
   - The network this VPN gateway is accepting traffic for.
   returned: success
-  type: str
+  type: dict
 tunnels:
   description:
   - A list of references to VpnTunnel resources associated with this VPN gateway.
@@ -179,7 +180,7 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             description=dict(type='str'),
             name=dict(required=True, type='str'),
-            network=dict(required=True),
+            network=dict(required=True, type='dict'),
             region=dict(required=True, type='str'),
         )
     )
diff --git a/plugins/modules/gcp_compute_target_vpn_gateway_facts.py b/plugins/modules/gcp_compute_target_vpn_gateway_facts.py
index 09c6913..91c2a47 100644
--- a/plugins/modules/gcp_compute_target_vpn_gateway_facts.py
+++ b/plugins/modules/gcp_compute_target_vpn_gateway_facts.py
@@ -99,7 +99,7 @@ items:
       description:
       - The network this VPN gateway is accepting traffic for.
       returned: success
-      type: str
+      type: dict
     tunnels:
       description:
       - A list of references to VpnTunnel resources associated with this VPN gateway.
diff --git a/plugins/modules/gcp_compute_url_map.py b/plugins/modules/gcp_compute_url_map.py
index 5d0c6bd..74ed45a 100644
--- a/plugins/modules/gcp_compute_url_map.py
+++ b/plugins/modules/gcp_compute_url_map.py
@@ -52,10 +52,10 @@ options:
     description:
     - A reference to BackendService resource if none of the hostRules match.
     - 'This field represents a link to a BackendService resource in GCP. It can be
-      specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_backend_service task and then set this default_service field to
-      "{{ name-of-resource }}"'
+      specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_backend_service task and then set this default_service
+      field to "{{ name-of-resource }}"'
     required: true
   description:
     description:
@@ -102,10 +102,10 @@ options:
         - A reference to a BackendService resource. This will be used if none of the
           pathRules defined by this PathMatcher is matched by the URL's path portion.
         - 'This field represents a link to a BackendService resource in GCP. It can
-          be specified in two ways. First, you can place in the selfLink of the resource
-          here as a string Alternatively, you can add `register: name-of-resource`
-          to a gcp_compute_backend_service task and then set this default_service
-          field to "{{ name-of-resource }}"'
+          be specified in two ways. First, you can place a dictionary with key ''selfLink''
+          and value of your resource''s selfLink Alternatively, you can add `register:
+          name-of-resource` to a gcp_compute_backend_service task and then set this
+          default_service field to "{{ name-of-resource }}"'
         required: true
       description:
         description:
@@ -131,10 +131,10 @@ options:
             description:
             - A reference to the BackendService resource if this rule is matched.
             - 'This field represents a link to a BackendService resource in GCP. It
-              can be specified in two ways. First, you can place in the selfLink of
-              the resource here as a string Alternatively, you can add `register:
-              name-of-resource` to a gcp_compute_backend_service task and then set
-              this service field to "{{ name-of-resource }}"'
+              can be specified in two ways. First, you can place a dictionary with
+              key ''selfLink'' and value of your resource''s selfLink Alternatively,
+              you can add `register: name-of-resource` to a gcp_compute_backend_service
+              task and then set this service field to "{{ name-of-resource }}"'
             required: true
   tests:
     description:
@@ -159,10 +159,10 @@ options:
         - A reference to expected BackendService resource the given URL should be
           mapped to.
         - 'This field represents a link to a BackendService resource in GCP. It can
-          be specified in two ways. First, you can place in the selfLink of the resource
-          here as a string Alternatively, you can add `register: name-of-resource`
-          to a gcp_compute_backend_service task and then set this service field to
-          "{{ name-of-resource }}"'
+          be specified in two ways. First, you can place a dictionary with key ''selfLink''
+          and value of your resource''s selfLink Alternatively, you can add `register:
+          name-of-resource` to a gcp_compute_backend_service task and then set this
+          service field to "{{ name-of-resource }}"'
         required: true
 extends_documentation_fragment: gcp
 '''
@@ -225,7 +225,7 @@ defaultService:
   description:
   - A reference to BackendService resource if none of the hostRules match.
   returned: success
-  type: str
+  type: dict
 description:
   description:
   - An optional description of this resource. Provide this property when you create
@@ -289,7 +289,7 @@ pathMatchers:
       - A reference to a BackendService resource. This will be used if none of the
         pathRules defined by this PathMatcher is matched by the URL's path portion.
       returned: success
-      type: str
+      type: dict
     description:
       description:
       - An optional description of this resource.
@@ -318,7 +318,7 @@ pathMatchers:
           description:
           - A reference to the BackendService resource if this rule is matched.
           returned: success
-          type: str
+          type: dict
 tests:
   description:
   - The list of expected URL mappings. Requests to update this UrlMap will succeed
@@ -346,7 +346,7 @@ tests:
       - A reference to expected BackendService resource the given URL should be mapped
         to.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
@@ -368,7 +368,7 @@ def main():
     module = GcpModule(
         argument_spec=dict(
             state=dict(default='present', choices=['present', 'absent'], type='str'),
-            default_service=dict(required=True),
+            default_service=dict(required=True, type='dict'),
             description=dict(type='str'),
             host_rules=dict(
                 type='list',
@@ -382,11 +382,13 @@ def main():
                 type='list',
                 elements='dict',
                 options=dict(
-                    default_service=dict(required=True),
+                    default_service=dict(required=True, type='dict'),
                     description=dict(type='str'),
                     name=dict(required=True, type='str'),
                     path_rules=dict(
-                        type='list', elements='dict', options=dict(paths=dict(required=True, type='list', elements='str'), service=dict(required=True))
+                        type='list',
+                        elements='dict',
+                        options=dict(paths=dict(required=True, type='list', elements='str'), service=dict(required=True, type='dict')),
                     ),
                 ),
             ),
@@ -394,7 +396,10 @@ def main():
                 type='list',
                 elements='dict',
                 options=dict(
-                    description=dict(type='str'), host=dict(required=True, type='str'), path=dict(required=True, type='str'), service=dict(required=True)
+                    description=dict(type='str'),
+                    host=dict(required=True, type='str'),
+                    path=dict(required=True, type='str'),
+                    service=dict(required=True, type='dict'),
                 ),
             ),
         )
diff --git a/plugins/modules/gcp_compute_url_map_facts.py b/plugins/modules/gcp_compute_url_map_facts.py
index 2fd5175..99ed600 100644
--- a/plugins/modules/gcp_compute_url_map_facts.py
+++ b/plugins/modules/gcp_compute_url_map_facts.py
@@ -74,7 +74,7 @@ items:
       description:
       - A reference to BackendService resource if none of the hostRules match.
       returned: success
-      type: str
+      type: dict
     description:
       description:
       - An optional description of this resource. Provide this property when you create
@@ -139,7 +139,7 @@ items:
             the pathRules defined by this PathMatcher is matched by the URL's path
             portion.
           returned: success
-          type: str
+          type: dict
         description:
           description:
           - An optional description of this resource.
@@ -168,7 +168,7 @@ items:
               description:
               - A reference to the BackendService resource if this rule is matched.
               returned: success
-              type: str
+              type: dict
     tests:
       description:
       - The list of expected URL mappings. Requests to update this UrlMap will succeed
@@ -196,7 +196,7 @@ items:
           - A reference to expected BackendService resource the given URL should be
             mapped to.
           returned: success
-          type: str
+          type: dict
 '''
 
 ################################################################################
diff --git a/plugins/modules/gcp_compute_vpn_tunnel.py b/plugins/modules/gcp_compute_vpn_tunnel.py
index c88d318..ec7be3d 100644
--- a/plugins/modules/gcp_compute_vpn_tunnel.py
+++ b/plugins/modules/gcp_compute_vpn_tunnel.py
@@ -63,18 +63,19 @@ options:
     description:
     - URL of the Target VPN gateway with which this VPN tunnel is associated.
     - 'This field represents a link to a TargetVpnGateway resource in GCP. It can
-      be specified in two ways. First, you can place in the selfLink of the resource
-      here as a string Alternatively, you can add `register: name-of-resource` to
-      a gcp_compute_target_vpn_gateway task and then set this target_vpn_gateway field
-      to "{{ name-of-resource }}"'
+      be specified in two ways. First, you can place a dictionary with key ''selfLink''
+      and value of your resource''s selfLink Alternatively, you can add `register:
+      name-of-resource` to a gcp_compute_target_vpn_gateway task and then set this
+      target_vpn_gateway field to "{{ name-of-resource }}"'
     required: true
   router:
     description:
     - URL of router resource to be used for dynamic routing.
     - 'This field represents a link to a Router resource in GCP. It can be specified
-      in two ways. First, you can place in the selfLink of the resource here as a
-      string Alternatively, you can add `register: name-of-resource` to a gcp_compute_router
-      task and then set this router field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''selfLink'' and value
+      of your resource''s selfLink Alternatively, you can add `register: name-of-resource`
+      to a gcp_compute_router task and then set this router field to "{{ name-of-resource
+      }}"'
     required: false
   peer_ip:
     description:
@@ -193,12 +194,12 @@ targetVpnGateway:
   description:
   - URL of the Target VPN gateway with which this VPN tunnel is associated.
   returned: success
-  type: str
+  type: dict
 router:
   description:
   - URL of router resource to be used for dynamic routing.
   returned: success
-  type: str
+  type: dict
 peerIp:
   description:
   - IP address of the peer VPN gateway. Only IPv4 is supported.
@@ -265,8 +266,8 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             name=dict(required=True, type='str'),
             description=dict(type='str'),
-            target_vpn_gateway=dict(required=True),
-            router=dict(),
+            target_vpn_gateway=dict(required=True, type='dict'),
+            router=dict(type='dict'),
             peer_ip=dict(required=True, type='str'),
             shared_secret=dict(required=True, type='str'),
             ike_version=dict(default=2, type='int'),
diff --git a/plugins/modules/gcp_compute_vpn_tunnel_facts.py b/plugins/modules/gcp_compute_vpn_tunnel_facts.py
index 00d5645..e67c1b4 100644
--- a/plugins/modules/gcp_compute_vpn_tunnel_facts.py
+++ b/plugins/modules/gcp_compute_vpn_tunnel_facts.py
@@ -93,12 +93,12 @@ items:
       description:
       - URL of the Target VPN gateway with which this VPN tunnel is associated.
       returned: success
-      type: str
+      type: dict
     router:
       description:
       - URL of router resource to be used for dynamic routing.
       returned: success
-      type: str
+      type: dict
     peerIp:
       description:
       - IP address of the peer VPN gateway. Only IPv4 is supported.
diff --git a/plugins/modules/gcp_container_node_pool.py b/plugins/modules/gcp_container_node_pool.py
index fc4acf0..79b4e36 100644
--- a/plugins/modules/gcp_container_node_pool.py
+++ b/plugins/modules/gcp_container_node_pool.py
@@ -198,9 +198,10 @@ options:
     description:
     - The cluster this node pool belongs to.
     - 'This field represents a link to a Cluster resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_container_cluster
-      task and then set this cluster field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_container_cluster task and then set this cluster field to "{{ name-of-resource
+      }}"'
     required: true
   location:
     description:
@@ -413,7 +414,7 @@ cluster:
   description:
   - The cluster this node pool belongs to.
   returned: success
-  type: str
+  type: dict
 location:
   description:
   - The location where the node pool is deployed.
@@ -462,7 +463,7 @@ def main():
             management=dict(
                 type='dict', options=dict(auto_upgrade=dict(type='bool'), auto_repair=dict(type='bool'), upgrade_options=dict(type='dict', options=dict()))
             ),
-            cluster=dict(required=True),
+            cluster=dict(required=True, type='dict'),
             location=dict(required=True, type='str', aliases=['region', 'zone']),
         )
     )
diff --git a/plugins/modules/gcp_container_node_pool_facts.py b/plugins/modules/gcp_container_node_pool_facts.py
index a95501e..aae0324 100644
--- a/plugins/modules/gcp_container_node_pool_facts.py
+++ b/plugins/modules/gcp_container_node_pool_facts.py
@@ -52,9 +52,10 @@ options:
     description:
     - The cluster this node pool belongs to.
     - 'This field represents a link to a Cluster resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_container_cluster
-      task and then set this cluster field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_container_cluster task and then set this cluster field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -252,7 +253,7 @@ items:
       description:
       - The cluster this node pool belongs to.
       returned: success
-      type: str
+      type: dict
     location:
       description:
       - The location where the node pool is deployed.
@@ -272,7 +273,7 @@ import json
 
 
 def main():
-    module = GcpModule(argument_spec=dict(location=dict(required=True, type='str', aliases=['region', 'zone']), cluster=dict(required=True)))
+    module = GcpModule(argument_spec=dict(location=dict(required=True, type='str', aliases=['region', 'zone']), cluster=dict(required=True, type='dict')))
 
     if not module.params['scopes']:
         module.params['scopes'] = ['https://www.googleapis.com/auth/cloud-platform']
diff --git a/plugins/modules/gcp_dns_resource_record_set.py b/plugins/modules/gcp_dns_resource_record_set.py
index d9a9725..6acd195 100644
--- a/plugins/modules/gcp_dns_resource_record_set.py
+++ b/plugins/modules/gcp_dns_resource_record_set.py
@@ -85,9 +85,10 @@ options:
     description:
     - Identifies the managed zone addressed by this request.
     - 'This field represents a link to a ManagedZone resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_dns_managed_zone
-      task and then set this managed_zone field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_dns_managed_zone task and then set this managed_zone field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -144,7 +145,7 @@ managed_zone:
   description:
   - Identifies the managed zone addressed by this request.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -172,7 +173,7 @@ def main():
             type=dict(required=True, type='str', choices=['A', 'AAAA', 'CAA', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SOA', 'SPF', 'SRV', 'TLSA', 'TXT']),
             ttl=dict(type='int'),
             target=dict(type='list', elements='str'),
-            managed_zone=dict(required=True),
+            managed_zone=dict(required=True, type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_dns_resource_record_set_facts.py b/plugins/modules/gcp_dns_resource_record_set_facts.py
index 402cc4d..1e3e691 100644
--- a/plugins/modules/gcp_dns_resource_record_set_facts.py
+++ b/plugins/modules/gcp_dns_resource_record_set_facts.py
@@ -44,9 +44,10 @@ options:
     description:
     - Identifies the managed zone addressed by this request.
     - 'This field represents a link to a ManagedZone resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_dns_managed_zone
-      task and then set this managed_zone field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_dns_managed_zone task and then set this managed_zone field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -91,7 +92,7 @@ items:
       description:
       - Identifies the managed zone addressed by this request.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
@@ -106,7 +107,7 @@ import json
 
 
 def main():
-    module = GcpModule(argument_spec=dict(managed_zone=dict(required=True)))
+    module = GcpModule(argument_spec=dict(managed_zone=dict(required=True, type='dict')))
 
     if not module.params['scopes']:
         module.params['scopes'] = ['https://www.googleapis.com/auth/ndev.clouddns.readwrite']
diff --git a/plugins/modules/gcp_iam_service_account_key.py b/plugins/modules/gcp_iam_service_account_key.py
index 50d8ee0..a994c23 100644
--- a/plugins/modules/gcp_iam_service_account_key.py
+++ b/plugins/modules/gcp_iam_service_account_key.py
@@ -67,9 +67,10 @@ options:
     description:
     - The name of the serviceAccount.
     - 'This field represents a link to a ServiceAccount resource in GCP. It can be
-      specified in two ways. First, you can place in the name of the resource here
-      as a string Alternatively, you can add `register: name-of-resource` to a gcp_iam_service_account
-      task and then set this service_account field to "{{ name-of-resource }}"'
+      specified in two ways. First, you can place a dictionary with key ''name'' and
+      value of your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_iam_service_account task and then set this service_account field to
+      "{{ name-of-resource }}"'
     required: false
   path:
     description:
@@ -142,7 +143,7 @@ serviceAccount:
   description:
   - The name of the serviceAccount.
   returned: success
-  type: str
+  type: dict
 path:
   description:
   - The full name of the file that will hold the service account private key. The
@@ -176,7 +177,7 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             private_key_type=dict(type='str', choices=['TYPE_UNSPECIFIED', 'TYPE_PKCS12_FILE', 'TYPE_GOOGLE_CREDENTIALS_FILE']),
             key_algorithm=dict(type='str', choices=['KEY_ALG_UNSPECIFIED', 'KEY_ALG_RSA_1024', 'KEY_ALG_RSA_2048']),
-            service_account=dict(),
+            service_account=dict(type='dict'),
             path=dict(type='path'),
         )
     )
diff --git a/plugins/modules/gcp_pubsub_subscription.py b/plugins/modules/gcp_pubsub_subscription.py
index a71b2a6..503edbd 100644
--- a/plugins/modules/gcp_pubsub_subscription.py
+++ b/plugins/modules/gcp_pubsub_subscription.py
@@ -56,9 +56,10 @@ options:
     description:
     - A reference to a Topic resource.
     - 'This field represents a link to a Topic resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_pubsub_topic
-      task and then set this topic field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_pubsub_topic task and then set this topic field to "{{ name-of-resource
+      }}"'
     required: true
   labels:
     description:
@@ -170,7 +171,7 @@ topic:
   description:
   - A reference to a Topic resource.
   returned: success
-  type: str
+  type: dict
 labels:
   description:
   - A set of key/value label pairs to assign to this Subscription.
@@ -266,7 +267,7 @@ def main():
         argument_spec=dict(
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             name=dict(required=True, type='str'),
-            topic=dict(required=True),
+            topic=dict(required=True, type='dict'),
             labels=dict(type='dict'),
             push_config=dict(type='dict', options=dict(push_endpoint=dict(required=True, type='str'), attributes=dict(type='dict'))),
             ack_deadline_seconds=dict(type='int'),
diff --git a/plugins/modules/gcp_pubsub_subscription_facts.py b/plugins/modules/gcp_pubsub_subscription_facts.py
index 52f2ed9..30e39be 100644
--- a/plugins/modules/gcp_pubsub_subscription_facts.py
+++ b/plugins/modules/gcp_pubsub_subscription_facts.py
@@ -67,7 +67,7 @@ items:
       description:
       - A reference to a Topic resource.
       returned: success
-      type: str
+      type: dict
     labels:
       description:
       - A set of key/value label pairs to assign to this Subscription.
diff --git a/plugins/modules/gcp_spanner_database.py b/plugins/modules/gcp_spanner_database.py
index e9d852e..19306cd 100644
--- a/plugins/modules/gcp_spanner_database.py
+++ b/plugins/modules/gcp_spanner_database.py
@@ -63,9 +63,10 @@ options:
     description:
     - The instance to create the database on.
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_spanner_instance
-      task and then set this instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_spanner_instance task and then set this instance field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 notes:
@@ -117,7 +118,7 @@ instance:
   description:
   - The instance to create the database on.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -140,7 +141,7 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             name=dict(required=True, type='str'),
             extra_statements=dict(type='list', elements='str'),
-            instance=dict(required=True),
+            instance=dict(required=True, type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_spanner_database_facts.py b/plugins/modules/gcp_spanner_database_facts.py
index 23d4f29..e5d02ce 100644
--- a/plugins/modules/gcp_spanner_database_facts.py
+++ b/plugins/modules/gcp_spanner_database_facts.py
@@ -44,9 +44,10 @@ options:
     description:
     - The instance to create the database on.
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_spanner_instance
-      task and then set this instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_spanner_instance task and then set this instance field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -85,7 +86,7 @@ items:
       description:
       - The instance to create the database on.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
@@ -100,7 +101,7 @@ import json
 
 
 def main():
-    module = GcpModule(argument_spec=dict(instance=dict(required=True)))
+    module = GcpModule(argument_spec=dict(instance=dict(required=True, type='dict')))
 
     if not module.params['scopes']:
         module.params['scopes'] = ['https://www.googleapis.com/auth/spanner.admin']
diff --git a/plugins/modules/gcp_sql_database.py b/plugins/modules/gcp_sql_database.py
index ca3e421..af9b199 100644
--- a/plugins/modules/gcp_sql_database.py
+++ b/plugins/modules/gcp_sql_database.py
@@ -64,9 +64,10 @@ options:
     description:
     - The name of the Cloud SQL instance. This does not include the project ID.
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_sql_instance
-      task and then set this instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_sql_instance task and then set this instance field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -120,7 +121,7 @@ instance:
   description:
   - The name of the Cloud SQL instance. This does not include the project ID.
   returned: success
-  type: str
+  type: dict
 '''
 
 ################################################################################
@@ -145,7 +146,7 @@ def main():
             charset=dict(type='str'),
             collation=dict(type='str'),
             name=dict(type='str'),
-            instance=dict(required=True),
+            instance=dict(required=True, type='dict'),
         )
     )
 
diff --git a/plugins/modules/gcp_sql_database_facts.py b/plugins/modules/gcp_sql_database_facts.py
index df677e0..215fef2 100644
--- a/plugins/modules/gcp_sql_database_facts.py
+++ b/plugins/modules/gcp_sql_database_facts.py
@@ -44,9 +44,10 @@ options:
     description:
     - The name of the Cloud SQL instance. This does not include the project ID.
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_sql_instance
-      task and then set this instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_sql_instance task and then set this instance field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -87,7 +88,7 @@ items:
       description:
       - The name of the Cloud SQL instance. This does not include the project ID.
       returned: success
-      type: str
+      type: dict
 '''
 
 ################################################################################
@@ -102,7 +103,7 @@ import json
 
 
 def main():
-    module = GcpModule(argument_spec=dict(instance=dict(required=True)))
+    module = GcpModule(argument_spec=dict(instance=dict(required=True, type='dict')))
 
     if not module.params['scopes']:
         module.params['scopes'] = ['https://www.googleapis.com/auth/sqlservice.admin']
diff --git a/plugins/modules/gcp_sql_user.py b/plugins/modules/gcp_sql_user.py
index 9699a4e..6428e7f 100644
--- a/plugins/modules/gcp_sql_user.py
+++ b/plugins/modules/gcp_sql_user.py
@@ -61,9 +61,10 @@ options:
     description:
     - The name of the Cloud SQL instance. This does not include the project ID.
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_sql_instance
-      task and then set this instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_sql_instance task and then set this instance field to "{{ name-of-resource
+      }}"'
     required: true
   password:
     description:
@@ -118,7 +119,7 @@ instance:
   description:
   - The name of the Cloud SQL instance. This does not include the project ID.
   returned: success
-  type: str
+  type: dict
 password:
   description:
   - The password for the user.
@@ -147,7 +148,7 @@ def main():
             state=dict(default='present', choices=['present', 'absent'], type='str'),
             host=dict(required=True, type='str'),
             name=dict(required=True, type='str'),
-            instance=dict(required=True),
+            instance=dict(required=True, type='dict'),
             password=dict(type='str'),
         )
     )
diff --git a/plugins/modules/gcp_sql_user_facts.py b/plugins/modules/gcp_sql_user_facts.py
index 9511a87..3cfe632 100644
--- a/plugins/modules/gcp_sql_user_facts.py
+++ b/plugins/modules/gcp_sql_user_facts.py
@@ -44,9 +44,10 @@ options:
     description:
     - The name of the Cloud SQL instance. This does not include the project ID.
     - 'This field represents a link to a Instance resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_sql_instance
-      task and then set this instance field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_sql_instance task and then set this instance field to "{{ name-of-resource
+      }}"'
     required: true
 extends_documentation_fragment: gcp
 '''
@@ -83,7 +84,7 @@ items:
       description:
       - The name of the Cloud SQL instance. This does not include the project ID.
       returned: success
-      type: str
+      type: dict
     password:
       description:
       - The password for the user.
@@ -103,7 +104,7 @@ import json
 
 
 def main():
-    module = GcpModule(argument_spec=dict(instance=dict(required=True)))
+    module = GcpModule(argument_spec=dict(instance=dict(required=True, type='dict')))
 
     if not module.params['scopes']:
         module.params['scopes'] = ['https://www.googleapis.com/auth/sqlservice.admin']
diff --git a/plugins/modules/gcp_storage_bucket.py b/plugins/modules/gcp_storage_bucket.py
index 73b13f7..e33cbed 100644
--- a/plugins/modules/gcp_storage_bucket.py
+++ b/plugins/modules/gcp_storage_bucket.py
@@ -61,9 +61,10 @@ options:
         description:
         - The name of the bucket.
         - 'This field represents a link to a Bucket resource in GCP. It can be specified
-          in two ways. First, you can place in the name of the resource here as a
-          string Alternatively, you can add `register: name-of-resource` to a gcp_storage_bucket
-          task and then set this bucket field to "{{ name-of-resource }}"'
+          in two ways. First, you can place a dictionary with key ''name'' and value
+          of your resource''s name Alternatively, you can add `register: name-of-resource`
+          to a gcp_storage_bucket task and then set this bucket field to "{{ name-of-resource
+          }}"'
         required: true
       entity:
         description:
@@ -140,9 +141,10 @@ options:
         description:
         - The name of the bucket.
         - 'This field represents a link to a Bucket resource in GCP. It can be specified
-          in two ways. First, you can place in the name of the resource here as a
-          string Alternatively, you can add `register: name-of-resource` to a gcp_storage_bucket
-          task and then set this bucket field to "{{ name-of-resource }}"'
+          in two ways. First, you can place a dictionary with key ''name'' and value
+          of your resource''s name Alternatively, you can add `register: name-of-resource`
+          to a gcp_storage_bucket task and then set this bucket field to "{{ name-of-resource
+          }}"'
         required: true
       entity:
         description:
@@ -359,7 +361,7 @@ acl:
       description:
       - The name of the bucket.
       returned: success
-      type: str
+      type: dict
     domain:
       description:
       - The domain associated with the entity.
@@ -453,7 +455,7 @@ defaultObjectAcl:
       description:
       - The name of the bucket.
       returned: success
-      type: str
+      type: dict
     domain:
       description:
       - The domain associated with the entity.
@@ -740,7 +742,7 @@ def main():
                 type='list',
                 elements='dict',
                 options=dict(
-                    bucket=dict(required=True),
+                    bucket=dict(required=True, type='dict'),
                     entity=dict(required=True, type='str'),
                     entity_id=dict(type='str'),
                     project_team=dict(
@@ -763,7 +765,7 @@ def main():
                 type='list',
                 elements='dict',
                 options=dict(
-                    bucket=dict(required=True),
+                    bucket=dict(required=True, type='dict'),
                     entity=dict(required=True, type='str'),
                     object=dict(type='str'),
                     role=dict(required=True, type='str', choices=['OWNER', 'READER']),
diff --git a/plugins/modules/gcp_storage_bucket_access_control.py b/plugins/modules/gcp_storage_bucket_access_control.py
index 8e25f11..49c9dc7 100644
--- a/plugins/modules/gcp_storage_bucket_access_control.py
+++ b/plugins/modules/gcp_storage_bucket_access_control.py
@@ -60,9 +60,10 @@ options:
     description:
     - The name of the bucket.
     - 'This field represents a link to a Bucket resource in GCP. It can be specified
-      in two ways. First, you can place in the name of the resource here as a string
-      Alternatively, you can add `register: name-of-resource` to a gcp_storage_bucket
-      task and then set this bucket field to "{{ name-of-resource }}"'
+      in two ways. First, you can place a dictionary with key ''name'' and value of
+      your resource''s name Alternatively, you can add `register: name-of-resource`
+      to a gcp_storage_bucket task and then set this bucket field to "{{ name-of-resource
+      }}"'
     required: true
   entity:
     description:
@@ -131,7 +132,7 @@ bucket:
   description:
   - The name of the bucket.
   returned: success
-  type: str
+  type: dict
 domain:
   description:
   - The domain associated with the entity.
@@ -203,7 +204,7 @@ def main():
     module = GcpModule(
         argument_spec=dict(
             state=dict(default='present', choices=['present', 'absent'], type='str'),
-            bucket=dict(required=True),
+            bucket=dict(required=True, type='dict'),
             entity=dict(required=True, type='str'),
             entity_id=dict(type='str'),
             project_team=dict(type='dict', options=dict(project_number=dict(type='str'), team=dict(type='str', choices=['editors', 'owners', 'viewers']))),