diff --git a/library/cloud/ec2_vpc b/library/cloud/ec2_vpc
index e92b9f77ed3..911cb4125df 100644
--- a/library/cloud/ec2_vpc
+++ b/library/cloud/ec2_vpc
@@ -280,10 +280,18 @@ def create_vpc(module, vpc_conn):
                 add_subnet = False
         if add_subnet:
             try:
-                created_subnet = vpc_conn.create_subnet(vpc.id, subnet['cidr'], subnet.get('az', None))
-                subnet_tags = subnet.get('tags', None)
-                if subnet_tags:
-                    vpc_conn.create_tags(created_subnet.id, subnet_tags)
+                new_subnet = vpc_conn.create_subnet(vpc.id, subnet['cidr'], subnet.get('az', None))
+                new_subnet_tags = subnet.get('tags', None)
+                if new_subnet_tags:
+                    # Sometimes AWS takes its time to create a subnet and so using new subnets's id
+                    # to create tags results in exception.
+                    # boto doesn't seem to refresh 'state' of the newly created subnet, i.e.: it's always 'pending'
+                    # so i resorted to polling vpc_conn.get_all_subnets with the id of the newly added subnet
+                    while len(vpc_conn.get_all_subnets(filters={ 'subnet-id': new_subnet.id })) == 0:
+                        time.sleep(0.1)
+
+                    vpc_conn.create_tags(new_subnet.id, new_subnet_tags)
+
                 changed = True
             except EC2ResponseError, e:
                 module.fail_json(msg='Unable to create subnet {0}, error: {1}'.format(subnet['cidr'], e))
@@ -411,14 +419,15 @@ def create_vpc(module, vpc_conn):
     created_vpc_id = vpc.id
     returned_subnets = []
     current_subnets = vpc_conn.get_all_subnets(filters={ 'vpc_id': vpc.id })
+    
     for sn in current_subnets:
         returned_subnets.append({
+            'tags': dict((t.name, t.value) for t in vpc_conn.get_all_tags(filters={'resource-id': sn.id})),
             'cidr': sn.cidr_block, 
             'az': sn.availability_zone,
             'id': sn.id,
         })
 
-
     return (vpc_dict, created_vpc_id, returned_subnets, changed)
 
 def terminate_vpc(module, vpc_conn, vpc_id=None, cidr=None):