diff --git a/Build/PackageFiles/ExtensionBundleTemplates-1.x.nuspec b/Build/PackageFiles/ExtensionBundleTemplates-1.x.nuspec
index 0ef71518c..2a81f6eaf 100644
--- a/Build/PackageFiles/ExtensionBundleTemplates-1.x.nuspec
+++ b/Build/PackageFiles/ExtensionBundleTemplates-1.x.nuspec
@@ -39,19 +39,27 @@
+
+
+
+
+
+
+
+
@@ -95,6 +103,8 @@
+
+
@@ -155,6 +165,8 @@
+
+
@@ -167,6 +179,8 @@
+
+
@@ -179,6 +193,8 @@
+
+
@@ -190,6 +206,8 @@
+
+
@@ -206,6 +224,8 @@
+
+
@@ -218,6 +238,8 @@
+
+
@@ -289,6 +311,8 @@
+
+
diff --git a/Build/PackageFiles/ExtensionBundleTemplates-2.x.nuspec b/Build/PackageFiles/ExtensionBundleTemplates-2.x.nuspec
index 2a1133255..7a7ef1f02 100644
--- a/Build/PackageFiles/ExtensionBundleTemplates-2.x.nuspec
+++ b/Build/PackageFiles/ExtensionBundleTemplates-2.x.nuspec
@@ -39,19 +39,27 @@
+
+
+
+
+
+
+
+
@@ -97,6 +105,8 @@
+
+
@@ -155,6 +165,8 @@
+
+
@@ -167,6 +179,8 @@
+
+
@@ -179,6 +193,8 @@
+
+
@@ -190,6 +206,8 @@
+
+
@@ -206,6 +224,8 @@
+
+
@@ -218,6 +238,8 @@
+
+
@@ -289,6 +311,8 @@
+
+
diff --git a/Build/PackageFiles/Templates.nuspec b/Build/PackageFiles/Templates.nuspec
index 76d712775..d6ce63f34 100644
--- a/Build/PackageFiles/Templates.nuspec
+++ b/Build/PackageFiles/Templates.nuspec
@@ -39,19 +39,27 @@
+
+
+
+
+
+
+
+
@@ -95,6 +103,8 @@
+
+
@@ -155,6 +165,8 @@
+
+
@@ -167,6 +179,8 @@
+
+
@@ -179,6 +193,8 @@
+
+
@@ -190,6 +206,8 @@
+
+
@@ -206,6 +224,8 @@
+
+
@@ -218,6 +238,8 @@
+
+
@@ -289,6 +311,8 @@
+
+
diff --git a/Functions.Templates/Templates/BlobTrigger-Custom/function.json b/Functions.Templates/Templates/BlobTrigger-Custom/function.json
new file mode 100644
index 000000000..1ab9968b8
--- /dev/null
+++ b/Functions.Templates/Templates/BlobTrigger-Custom/function.json
@@ -0,0 +1,11 @@
+{
+ "bindings": [
+ {
+ "name": "myBlob",
+ "type": "blobTrigger",
+ "direction": "in",
+ "path": "samples-workitems/{name}",
+ "connection":""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/BlobTrigger-Custom/metadata.json b/Functions.Templates/Templates/BlobTrigger-Custom/metadata.json
new file mode 100644
index 000000000..fc47757e8
--- /dev/null
+++ b/Functions.Templates/Templates/BlobTrigger-Custom/metadata.json
@@ -0,0 +1,21 @@
+{
+ "defaultFunctionName": "BlobTrigger",
+ "description": "$BlobTrigger_description",
+ "name": "Azure Blob Storage trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "blob",
+ "enabledInTryMode": true,
+ "userPrompt": [
+ "connection",
+ "path"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.Storage", "version": "3.0.10"
+ }
+ ]
+ }
diff --git a/Functions.Templates/Templates/CosmosDBTrigger-Custom/function.json b/Functions.Templates/Templates/CosmosDBTrigger-Custom/function.json
new file mode 100644
index 000000000..14bf71aa9
--- /dev/null
+++ b/Functions.Templates/Templates/CosmosDBTrigger-Custom/function.json
@@ -0,0 +1,14 @@
+{
+ "bindings": [
+ {
+ "type": "cosmosDBTrigger",
+ "name": "documents",
+ "direction": "in",
+ "leaseCollectionName": "leases",
+ "connectionStringSetting": "",
+ "databaseName": "",
+ "collectionName": "",
+ "createLeaseCollectionIfNotExists" : true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/CosmosDBTrigger-Custom/metadata.json b/Functions.Templates/Templates/CosmosDBTrigger-Custom/metadata.json
new file mode 100644
index 000000000..3c7363e10
--- /dev/null
+++ b/Functions.Templates/Templates/CosmosDBTrigger-Custom/metadata.json
@@ -0,0 +1,24 @@
+{
+ "defaultFunctionName": "CosmosTrigger",
+ "description": "$CosmosDBTrigger_description",
+ "name": "Azure Cosmos DB trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "cosmosDB",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "connectionStringSetting",
+ "databaseName",
+ "collectionName",
+ "leaseCollectionName",
+ "createLeaseCollectionIfNotExists"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.CosmosDB", "version": "3.0.5"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/EventGridTrigger-Custom/function.json b/Functions.Templates/Templates/EventGridTrigger-Custom/function.json
new file mode 100644
index 000000000..4e0328b14
--- /dev/null
+++ b/Functions.Templates/Templates/EventGridTrigger-Custom/function.json
@@ -0,0 +1,9 @@
+{
+ "bindings": [
+ {
+ "type": "eventGridTrigger",
+ "name": "eventGridEvent",
+ "direction": "in"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/EventGridTrigger-Custom/metadata.json b/Functions.Templates/Templates/EventGridTrigger-Custom/metadata.json
new file mode 100644
index 000000000..620e1d663
--- /dev/null
+++ b/Functions.Templates/Templates/EventGridTrigger-Custom/metadata.json
@@ -0,0 +1,18 @@
+{
+ "defaultFunctionName": "EventGridTrigger",
+ "description": "$EventGridTrigger_description",
+ "name": "Azure Event Grid trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "eventGrid",
+ "enabledInTryMode": false,
+ "userPrompt": [],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.EventGrid", "version": "2.1.0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/EventHubTrigger-Custom/function.json b/Functions.Templates/Templates/EventHubTrigger-Custom/function.json
new file mode 100644
index 000000000..2e9d61532
--- /dev/null
+++ b/Functions.Templates/Templates/EventHubTrigger-Custom/function.json
@@ -0,0 +1,13 @@
+{
+ "bindings": [
+ {
+ "type": "eventHubTrigger",
+ "name": "eventHubMessages",
+ "direction": "in",
+ "eventHubName": "samples-workitems",
+ "connection": "",
+ "cardinality": "many",
+ "consumerGroup": "$Default"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/EventHubTrigger-Custom/metadata.json b/Functions.Templates/Templates/EventHubTrigger-Custom/metadata.json
new file mode 100644
index 000000000..77f5d0263
--- /dev/null
+++ b/Functions.Templates/Templates/EventHubTrigger-Custom/metadata.json
@@ -0,0 +1,22 @@
+{
+ "defaultFunctionName": "EventHubTrigger",
+ "description": "$EventHubTrigger_description",
+ "name": "Azure Event Hub trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "eventHub",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "connection",
+ "eventHubName",
+ "consumerGroup"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.EventHubs", "version": "4.1.1"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/HttpTrigger-Custom/function.json b/Functions.Templates/Templates/HttpTrigger-Custom/function.json
new file mode 100644
index 000000000..63ae31931
--- /dev/null
+++ b/Functions.Templates/Templates/HttpTrigger-Custom/function.json
@@ -0,0 +1,19 @@
+{
+ "bindings": [
+ {
+ "authLevel": "function",
+ "type": "httpTrigger",
+ "direction": "in",
+ "name": "req",
+ "methods": [
+ "get",
+ "post"
+ ]
+ },
+ {
+ "type": "http",
+ "direction": "out",
+ "name": "res"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/HttpTrigger-Custom/metadata.json b/Functions.Templates/Templates/HttpTrigger-Custom/metadata.json
new file mode 100644
index 000000000..1045e115e
--- /dev/null
+++ b/Functions.Templates/Templates/HttpTrigger-Custom/metadata.json
@@ -0,0 +1,16 @@
+{
+ "defaultFunctionName": "HttpTrigger",
+ "description": "$HttpTrigger_description",
+ "name": "HTTP trigger",
+ "trigger": "HttpTrigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_api"
+ ],
+ "categoryStyle": "http",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "authLevel"
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/IoTHubTrigger-Custom/function.json b/Functions.Templates/Templates/IoTHubTrigger-Custom/function.json
new file mode 100644
index 000000000..55a3fdcf4
--- /dev/null
+++ b/Functions.Templates/Templates/IoTHubTrigger-Custom/function.json
@@ -0,0 +1,13 @@
+{
+ "bindings": [
+ {
+ "type": "eventHubTrigger",
+ "name": "IoTHubMessages",
+ "direction": "in",
+ "eventHubName": "samples-workitems",
+ "connection": "",
+ "cardinality": "many",
+ "consumerGroup": "$Default"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/IoTHubTrigger-Custom/metadata.json b/Functions.Templates/Templates/IoTHubTrigger-Custom/metadata.json
new file mode 100644
index 000000000..c2a4afd10
--- /dev/null
+++ b/Functions.Templates/Templates/IoTHubTrigger-Custom/metadata.json
@@ -0,0 +1,21 @@
+{
+ "defaultFunctionName": "IoTHub_EventHub",
+ "description": "$IoTHubTrigger_description",
+ "name": "IoT Hub (Event Hub)",
+ "language": "Custom",
+ "category": [
+ "$temp_category_IoTHub"
+ ],
+ "categoryStyle": "iot",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "connection",
+ "path",
+ "consumerGroup"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.EventHubs", "version": "4.1.1"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/QueueTrigger-Custom/function.json b/Functions.Templates/Templates/QueueTrigger-Custom/function.json
new file mode 100644
index 000000000..6659dcf12
--- /dev/null
+++ b/Functions.Templates/Templates/QueueTrigger-Custom/function.json
@@ -0,0 +1,11 @@
+{
+ "bindings": [
+ {
+ "name": "myQueueItem",
+ "type": "queueTrigger",
+ "direction": "in",
+ "queueName": "js-queue-items",
+ "connection":""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/QueueTrigger-Custom/metadata.json b/Functions.Templates/Templates/QueueTrigger-Custom/metadata.json
new file mode 100644
index 000000000..961bcd82c
--- /dev/null
+++ b/Functions.Templates/Templates/QueueTrigger-Custom/metadata.json
@@ -0,0 +1,21 @@
+{
+ "defaultFunctionName": "QueueTrigger",
+ "description": "$QueueTrigger_description",
+ "name": "Azure Queue Storage trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "queue",
+ "enabledInTryMode": true,
+ "userPrompt": [
+ "connection",
+ "queueName"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.Storage", "version": "3.0.10"
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/Functions.Templates/Templates/SendGrid-Custom/function.json b/Functions.Templates/Templates/SendGrid-Custom/function.json
new file mode 100644
index 000000000..4363e341f
--- /dev/null
+++ b/Functions.Templates/Templates/SendGrid-Custom/function.json
@@ -0,0 +1,20 @@
+{
+ "bindings": [
+ {
+ "type": "queueTrigger",
+ "name": "order",
+ "direction": "in",
+ "queueName": "samples-orders"
+ },
+ {
+ "type": "sendGrid",
+ "name": "message",
+ "direction": "out",
+ "apiKey": "SendGridApiKey",
+ "from": "Azure Functions ",
+ "to": "{customerEmail}",
+ "subject": "",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/SendGrid-Custom/metadata.json b/Functions.Templates/Templates/SendGrid-Custom/metadata.json
new file mode 100644
index 000000000..64b34303d
--- /dev/null
+++ b/Functions.Templates/Templates/SendGrid-Custom/metadata.json
@@ -0,0 +1,27 @@
+{
+ "defaultFunctionName": "SendGrid",
+ "description": "$SendGrid_description",
+ "name": "SendGrid",
+ "language": "Custom",
+ "category": [
+ "$temp_category_samples",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "other",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "to",
+ "from",
+ "subject",
+ "text",
+ "apiKey"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.SendGrid", "version": "3.0.0"
+ },
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.Storage", "version": "3.0.10"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/ServiceBusQueueTrigger-Custom/function.json b/Functions.Templates/Templates/ServiceBusQueueTrigger-Custom/function.json
new file mode 100644
index 000000000..31b833509
--- /dev/null
+++ b/Functions.Templates/Templates/ServiceBusQueueTrigger-Custom/function.json
@@ -0,0 +1,11 @@
+{
+ "bindings": [
+ {
+ "name": "mySbMsg",
+ "type": "serviceBusTrigger",
+ "direction": "in",
+ "queueName": "myinputqueue",
+ "connection": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/ServiceBusQueueTrigger-Custom/metadata.json b/Functions.Templates/Templates/ServiceBusQueueTrigger-Custom/metadata.json
new file mode 100644
index 000000000..8c77f0cc7
--- /dev/null
+++ b/Functions.Templates/Templates/ServiceBusQueueTrigger-Custom/metadata.json
@@ -0,0 +1,21 @@
+{
+ "defaultFunctionName": "ServiceBusQueueTrigger",
+ "description": "$ServiceBusQueueTrigger_description",
+ "name": "Azure Service Bus Queue trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "serviceBus",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "connection",
+ "queueName"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.ServiceBus", "version": "4.1.0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/ServiceBusTopicTrigger-Custom/function.json b/Functions.Templates/Templates/ServiceBusTopicTrigger-Custom/function.json
new file mode 100644
index 000000000..f80cae853
--- /dev/null
+++ b/Functions.Templates/Templates/ServiceBusTopicTrigger-Custom/function.json
@@ -0,0 +1,12 @@
+{
+ "bindings": [
+ {
+ "name": "mySbMsg",
+ "type": "serviceBusTrigger",
+ "direction": "in",
+ "topicName": "mytopic",
+ "subscriptionName": "mysubscription",
+ "connection": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/ServiceBusTopicTrigger-Custom/metadata.json b/Functions.Templates/Templates/ServiceBusTopicTrigger-Custom/metadata.json
new file mode 100644
index 000000000..237acc0dc
--- /dev/null
+++ b/Functions.Templates/Templates/ServiceBusTopicTrigger-Custom/metadata.json
@@ -0,0 +1,22 @@
+{
+ "defaultFunctionName": "ServiceBusTopicTrigger",
+ "description": "$ServiceBusTopicTrigger_description",
+ "name": "Azure Service Bus Topic trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+ "categoryStyle": "serviceBus",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "connection",
+ "topicName",
+ "subscriptionName"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.ServiceBus", "version": "4.1.0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/SignalRConnectionInfoHttpTrigger-Custom/function.json b/Functions.Templates/Templates/SignalRConnectionInfoHttpTrigger-Custom/function.json
new file mode 100644
index 000000000..6bbe17d30
--- /dev/null
+++ b/Functions.Templates/Templates/SignalRConnectionInfoHttpTrigger-Custom/function.json
@@ -0,0 +1,27 @@
+{
+ "disabled": false,
+ "bindings": [
+ {
+ "authLevel": "anonymous",
+ "type": "httpTrigger",
+ "direction": "in",
+ "methods": [
+ "post"
+ ],
+ "name": "req",
+ "route": "negotiate"
+ },
+ {
+ "type": "http",
+ "direction": "out",
+ "name": "res"
+ },
+ {
+ "type": "signalRConnectionInfo",
+ "name": "connectionInfo",
+ "hubName": "default",
+ "connectionStringSetting": "AzureSignalRConnectionString",
+ "direction": "in"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/SignalRConnectionInfoHttpTrigger-Custom/metadata.json b/Functions.Templates/Templates/SignalRConnectionInfoHttpTrigger-Custom/metadata.json
new file mode 100644
index 000000000..f2aefaf4a
--- /dev/null
+++ b/Functions.Templates/Templates/SignalRConnectionInfoHttpTrigger-Custom/metadata.json
@@ -0,0 +1,22 @@
+{
+ "defaultFunctionName": "negotiate",
+ "description": "$signalRConnectionInfoNegotiate_description",
+ "name": "SignalR negotiate HTTP trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_api"
+ ],
+ "categoryStyle": "other",
+ "enabledInTryMode": false,
+ "userPrompt": [
+ "hubName",
+ "connectionStringSetting",
+ "route"
+ ],
+ "extensions": [
+ {
+ "id": "Microsoft.Azure.WebJobs.Extensions.SignalRService", "version": "1.0.2"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/TimerTrigger-Custom/function.json b/Functions.Templates/Templates/TimerTrigger-Custom/function.json
new file mode 100644
index 000000000..7dadeeae2
--- /dev/null
+++ b/Functions.Templates/Templates/TimerTrigger-Custom/function.json
@@ -0,0 +1,10 @@
+{
+ "bindings": [
+ {
+ "name": "myTimer",
+ "type": "timerTrigger",
+ "direction": "in",
+ "schedule": "0 */5 * * * *"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Functions.Templates/Templates/TimerTrigger-Custom/metadata.json b/Functions.Templates/Templates/TimerTrigger-Custom/metadata.json
new file mode 100644
index 000000000..f94894b97
--- /dev/null
+++ b/Functions.Templates/Templates/TimerTrigger-Custom/metadata.json
@@ -0,0 +1,16 @@
+{
+ "defaultFunctionName": "TimerTrigger",
+ "description": "$TimerTrigger_description",
+ "name": "Timer trigger",
+ "language": "Custom",
+ "category": [
+ "$temp_category_core",
+ "$temp_category_dataProcessing"
+ ],
+
+ "categoryStyle": "timer",
+ "enabledInTryMode": true,
+ "userPrompt": [
+ "schedule"
+ ]
+}
\ No newline at end of file