Add support to import resources when using projects
diff --git a/cloudstack/resource_cloudstack_affinity_group.go b/cloudstack/resource_cloudstack_affinity_group.go
index 1b6ffc6..a6af3e0 100644
--- a/cloudstack/resource_cloudstack_affinity_group.go
+++ b/cloudstack/resource_cloudstack_affinity_group.go
@@ -15,7 +15,7 @@
 		Read:   resourceCloudStackAffinityGroupRead,
 		Delete: resourceCloudStackAffinityGroupDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_disk.go b/cloudstack/resource_cloudstack_disk.go
index c79ed6c..42f0c45 100644
--- a/cloudstack/resource_cloudstack_disk.go
+++ b/cloudstack/resource_cloudstack_disk.go
@@ -15,7 +15,7 @@
 		Update: resourceCloudStackDiskUpdate,
 		Delete: resourceCloudStackDiskDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_instance.go b/cloudstack/resource_cloudstack_instance.go
index b047964..99cb2a9 100644
--- a/cloudstack/resource_cloudstack_instance.go
+++ b/cloudstack/resource_cloudstack_instance.go
@@ -620,7 +620,7 @@
 	// We set start_vm to true as that matches the default and we assume that
 	// when you need to import an instance it means it is already running.
 	d.Set("start_vm", true)
-	return []*schema.ResourceData{d}, nil
+	return importStatePassthrough(d, meta)
 }
 
 // getUserData returns the user data as a base64 encoded string
diff --git a/cloudstack/resource_cloudstack_instance_test.go b/cloudstack/resource_cloudstack_instance_test.go
index 395ffdd..611545d 100644
--- a/cloudstack/resource_cloudstack_instance_test.go
+++ b/cloudstack/resource_cloudstack_instance_test.go
@@ -172,6 +172,27 @@
 	})
 }
 
+func TestAccCloudStackInstance_importProject(t *testing.T) {
+	resource.Test(t, resource.TestCase{
+		PreCheck:     func() { testAccPreCheck(t) },
+		Providers:    testAccProviders,
+		CheckDestroy: testAccCheckCloudStackInstanceDestroy,
+		Steps: []resource.TestStep{
+			{
+				Config: testAccCloudStackInstance_project,
+			},
+
+			{
+				ResourceName:            "cloudstack_instance.foobar",
+				ImportState:             true,
+				ImportStateIdPrefix:     "terraform/",
+				ImportStateVerify:       true,
+				ImportStateVerifyIgnore: []string{"expunge", "user_data"},
+			},
+		},
+	})
+}
+
 func testAccCheckCloudStackInstanceExists(
 	n string, instance *cloudstack.VirtualMachine) resource.TestCheckFunc {
 	return func(s *terraform.State) error {
@@ -185,7 +206,10 @@
 		}
 
 		cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
-		vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(rs.Primary.ID)
+		vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(
+			rs.Primary.ID,
+			cloudstack.WithProject(rs.Primary.Attributes["project"]),
+		)
 
 		if err != nil {
 			return err
diff --git a/cloudstack/resource_cloudstack_network.go b/cloudstack/resource_cloudstack_network.go
index 74d1891..b10c675 100644
--- a/cloudstack/resource_cloudstack_network.go
+++ b/cloudstack/resource_cloudstack_network.go
@@ -38,7 +38,7 @@
 		Update: resourceCloudStackNetworkUpdate,
 		Delete: resourceCloudStackNetworkDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_network_acl.go b/cloudstack/resource_cloudstack_network_acl.go
index 0f3dcb1..6552a05 100644
--- a/cloudstack/resource_cloudstack_network_acl.go
+++ b/cloudstack/resource_cloudstack_network_acl.go
@@ -15,7 +15,7 @@
 		Read:   resourceCloudStackNetworkACLRead,
 		Delete: resourceCloudStackNetworkACLDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_network_test.go b/cloudstack/resource_cloudstack_network_test.go
index 7e5b6cf..144bfef 100644
--- a/cloudstack/resource_cloudstack_network_test.go
+++ b/cloudstack/resource_cloudstack_network_test.go
@@ -30,6 +30,27 @@
 	})
 }
 
+func TestAccCloudStackNetwork_project(t *testing.T) {
+	var network cloudstack.Network
+
+	resource.Test(t, resource.TestCase{
+		PreCheck:     func() { testAccPreCheck(t) },
+		Providers:    testAccProviders,
+		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
+		Steps: []resource.TestStep{
+			{
+				Config: testAccCloudStackNetwork_project,
+				Check: resource.ComposeTestCheckFunc(
+					testAccCheckCloudStackNetworkExists(
+						"cloudstack_network.foo", &network),
+					resource.TestCheckResourceAttr(
+						"cloudstack_network.foo", "project", "terraform"),
+				),
+			},
+		},
+	})
+}
+
 func TestAccCloudStackNetwork_vpc(t *testing.T) {
 	var network cloudstack.Network
 
@@ -98,6 +119,26 @@
 	})
 }
 
+func TestAccCloudStackNetwork_importProject(t *testing.T) {
+	resource.Test(t, resource.TestCase{
+		PreCheck:     func() { testAccPreCheck(t) },
+		Providers:    testAccProviders,
+		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
+		Steps: []resource.TestStep{
+			{
+				Config: testAccCloudStackNetwork_project,
+			},
+
+			{
+				ResourceName:        "cloudstack_network.foo",
+				ImportState:         true,
+				ImportStateIdPrefix: "terraform/",
+				ImportStateVerify:   true,
+			},
+		},
+	})
+}
+
 func testAccCheckCloudStackNetworkExists(
 	n string, network *cloudstack.Network) resource.TestCheckFunc {
 	return func(s *terraform.State) error {
@@ -111,8 +152,10 @@
 		}
 
 		cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
-		ntwrk, _, err := cs.Network.GetNetworkByID(rs.Primary.ID)
-
+		ntwrk, _, err := cs.Network.GetNetworkByID(
+			rs.Primary.ID,
+			cloudstack.WithProject(rs.Primary.Attributes["project"]),
+		)
 		if err != nil {
 			return err
 		}
@@ -207,6 +250,15 @@
   #}
 }`
 
+const testAccCloudStackNetwork_project = `
+resource "cloudstack_network" "foo" {
+  name = "terraform-network"
+  cidr = "10.1.1.0/24"
+  network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
+  project = "terraform"
+  zone = "Sandbox-simulator"
+}`
+
 const testAccCloudStackNetwork_vpc = `
 resource "cloudstack_vpc" "foo" {
   name = "terraform-vpc"
diff --git a/cloudstack/resource_cloudstack_security_group.go b/cloudstack/resource_cloudstack_security_group.go
index 17d39bb..37c41b7 100644
--- a/cloudstack/resource_cloudstack_security_group.go
+++ b/cloudstack/resource_cloudstack_security_group.go
@@ -15,7 +15,7 @@
 		Read:   resourceCloudStackSecurityGroupRead,
 		Delete: resourceCloudStackSecurityGroupDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_vpc.go b/cloudstack/resource_cloudstack_vpc.go
index 5ded926..591945b 100644
--- a/cloudstack/resource_cloudstack_vpc.go
+++ b/cloudstack/resource_cloudstack_vpc.go
@@ -16,7 +16,7 @@
 		Update: resourceCloudStackVPCUpdate,
 		Delete: resourceCloudStackVPCDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resource_cloudstack_vpn_customer_gateway.go b/cloudstack/resource_cloudstack_vpn_customer_gateway.go
index 746880c..5043c9e 100644
--- a/cloudstack/resource_cloudstack_vpn_customer_gateway.go
+++ b/cloudstack/resource_cloudstack_vpn_customer_gateway.go
@@ -16,7 +16,7 @@
 		Update: resourceCloudStackVPNCustomerGatewayUpdate,
 		Delete: resourceCloudStackVPNCustomerGatewayDelete,
 		Importer: &schema.ResourceImporter{
-			State: schema.ImportStatePassthrough,
+			State: importStatePassthrough,
 		},
 
 		Schema: map[string]*schema.Schema{
diff --git a/cloudstack/resources.go b/cloudstack/resources.go
index 56174de..004ea47 100644
--- a/cloudstack/resources.go
+++ b/cloudstack/resources.go
@@ -4,6 +4,7 @@
 	"fmt"
 	"log"
 	"regexp"
+	"strings"
 	"time"
 
 	"github.com/hashicorp/terraform/helper/schema"
@@ -135,3 +136,16 @@
 
 	return nil
 }
+
+// importStatePassthrough is a generic importer with project support.
+func importStatePassthrough(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
+	// Try to split the ID to extract the optional project name.
+	s := strings.SplitN(d.Id(), "/", 2)
+	if len(s) == 2 {
+		d.Set("project", s[0])
+	}
+
+	d.SetId(s[len(s)-1])
+
+	return []*schema.ResourceData{d}, nil
+}
diff --git a/website/docs/r/affinity_group.html.markdown b/website/docs/r/affinity_group.html.markdown
index 2cdcd51..a938a39 100644
--- a/website/docs/r/affinity_group.html.markdown
+++ b/website/docs/r/affinity_group.html.markdown
@@ -49,3 +49,10 @@
 ```shell
 terraform import cloudstack_affinity_group.default 6226ea4d-9cbe-4cc9-b30c-b9532146da5b
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_affinity_group.default my-project/6226ea4d-9cbe-4cc9-b30c-b9532146da5b
+```
+
diff --git a/website/docs/r/disk.html.markdown b/website/docs/r/disk.html.markdown
index 418185c..e87396b 100644
--- a/website/docs/r/disk.html.markdown
+++ b/website/docs/r/disk.html.markdown
@@ -68,3 +68,9 @@
 ```shell
 terraform import cloudstack_disk.default 6f3ee798-d417-4e7a-92bc-95ad41cf1244
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_disk.default my-project/6f3ee798-d417-4e7a-92bc-95ad41cf1244
+```
diff --git a/website/docs/r/instance.html.markdown b/website/docs/r/instance.html.markdown
index ceefe94..018b5b0 100644
--- a/website/docs/r/instance.html.markdown
+++ b/website/docs/r/instance.html.markdown
@@ -94,3 +94,9 @@
 ```shell
 terraform import cloudstack_instance.default 5cf69677-7e4b-4bf4-b868-f0b02bb72ee0
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_instance.default my-project/5cf69677-7e4b-4bf4-b868-f0b02bb72ee0
+```
diff --git a/website/docs/r/network.html.markdown b/website/docs/r/network.html.markdown
index c51c087..8b3781a 100644
--- a/website/docs/r/network.html.markdown
+++ b/website/docs/r/network.html.markdown
@@ -88,3 +88,9 @@
 ```shell
 terraform import cloudstack_network.default 36619b20-5584-43bf-9a84-e242bacd5582
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_network.default my-project/36619b20-5584-43bf-9a84-e242bacd5582
+```
diff --git a/website/docs/r/network_acl.html.markdown b/website/docs/r/network_acl.html.markdown
index 58f002a..37f2928 100644
--- a/website/docs/r/network_acl.html.markdown
+++ b/website/docs/r/network_acl.html.markdown
@@ -49,3 +49,9 @@
 ```shell
 terraform import cloudstack_network_acl.default e8b5982a-1b50-4ea9-9920-6ea2290c7359
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_network_acl.default my-project/e8b5982a-1b50-4ea9-9920-6ea2290c7359
+```
diff --git a/website/docs/r/security_group.html.markdown b/website/docs/r/security_group.html.markdown
index c43fbb0..a07d557 100644
--- a/website/docs/r/security_group.html.markdown
+++ b/website/docs/r/security_group.html.markdown
@@ -46,3 +46,9 @@
 ```shell
 terraform import cloudstack_security_group.default e54970f1-f563-46dd-a365-2b2e9b78c54b
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_security_group.default my-project/e54970f1-f563-46dd-a365-2b2e9b78c54b
+```
diff --git a/website/docs/r/vpc.html.markdown b/website/docs/r/vpc.html.markdown
index 9a79aac..526bc30 100644
--- a/website/docs/r/vpc.html.markdown
+++ b/website/docs/r/vpc.html.markdown
@@ -62,3 +62,9 @@
 ```shell
 terraform import cloudstack_vpc.default 84b23264-917a-4712-b8bf-cd7604db43b0
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_vpc.default my-project/84b23264-917a-4712-b8bf-cd7604db43b0
+```
diff --git a/website/docs/r/vpn_customer_gateway.html.markdown b/website/docs/r/vpn_customer_gateway.html.markdown
index 643f817..6678a7e 100644
--- a/website/docs/r/vpn_customer_gateway.html.markdown
+++ b/website/docs/r/vpn_customer_gateway.html.markdown
@@ -69,3 +69,9 @@
 ```shell
 terraform import cloudstack_vpn_customer_gateway.default 741a7fca-1d05-4bb6-9290-1008300f0e5a
 ```
+
+When importing into a project you need to prefix the import ID with the project name:
+
+```shell
+terraform import cloudstack_vpn_customer_gateway.default my-project/741a7fca-1d05-4bb6-9290-1008300f0e5a
+```