Repository: EnMasseProject/enmasse
Pull request #2539 (2019-03-28 11:50:09)

Revert to pre-0.26 behavior of using micro version of image in YAML
This ensures that there are no unexpected image update if a new release
is created, which is a safer default.


Patch:
diff --git a/.travis/build.sh b/.travis/build.sh
index eb63e9702..07505a92c 100755
--- a/.travis/build.sh
+++ b/.travis/build.sh
@@ -13,7 +13,7 @@ SYSTEMTEST_PROFILE=${SYSTEMTEST_PROFILE:-"smoke"}
 
 if use_external_registry
 then
-    export IMAGE_VERSION=${VERSION}
+    export IMAGE_VERSION=${TAG}
 else
     export DOCKER_REGISTRY="localhost:5000"
 fi
diff --git a/Makefile.env.mk b/Makefile.env.mk
index 6fada8ba5..d779d0ea2 100644
--- a/Makefile.env.mk
+++ b/Makefile.env.mk
@@ -52,7 +52,11 @@ QDR_PROXY_CONFIGURATOR_IMAGE       ?= "$(DOCKER_REGISTRY_PREFIX)$(DOCKER_ORG)/qd
 
 DEFAULT_PROJECT ?= "enmasse-infra"
 HONO_VERSION ?= "0.9"
+ifeq ($(TAG),latest)
 IMAGE_PULL_POLICY ?= "Always"
+else
+IMAGE_PULL_POLICY ?= "IfNotPresent"
+endif
 
 IMAGE_ENV=ADDRESS_SPACE_CONTROLLER_IMAGE=$(ADDRESS_SPACE_CONTROLLER_IMAGE) \
 			API_SERVER_IMAGE=$(API_SERVER_IMAGE) \
diff --git a/address-space-controller/pom.xml b/address-space-controller/pom.xml
index 6413303c7..b5a08b2e8 100644
--- a/address-space-controller/pom.xml
+++ b/address-space-controller/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>address-space-controller</artifactId>
diff --git a/address-space-controller/src/main/java/io/enmasse/controller/TemplateInfraResourceFactory.java b/address-space-controller/src/main/java/io/enmasse/controller/TemplateInfraResourceFactory.java
index fe17b916d..836e575a2 100644
--- a/address-space-controller/src/main/java/io/enmasse/controller/TemplateInfraResourceFactory.java
+++ b/address-space-controller/src/main/java/io/enmasse/controller/TemplateInfraResourceFactory.java
@@ -179,6 +179,14 @@ public class TemplateInfraResourceFactory implements InfraResourceFactory {
                 parameters.put(TemplateParameter.ROUTER_HANDSHAKE_TIMEOUT, String.valueOf(standardInfraConfig.getSpec().getRouter().getHandshakeTimeout()));
             }
 
+            if (standardInfraConfig.getSpec().getRouter().getIdleTimeout() != null) {
+                parameters.put(TemplateParameter.ROUTER_IDLE_TIMEOUT, String.valueOf(standardInfraConfig.getSpec().getRouter().getIdleTimeout()));
+            }
+
+            if (standardInfraConfig.getSpec().getRouter().getWorkerThreads() != null) {
+                parameters.put(TemplateParameter.ROUTER_WORKER_THREADS, String.valueOf(standardInfraConfig.getSpec().getRouter().getWorkerThreads()));
+            }
+
         }
 
         if (standardInfraConfig.getSpec().getAdmin() != null && standardInfraConfig.getSpec().getAdmin().getResources() != null && standardInfraConfig.getSpec().getAdmin().getResources().getMemory() != null) {
diff --git a/address-space-controller/src/main/java/io/enmasse/controller/common/TemplateParameter.java b/address-space-controller/src/main/java/io/enmasse/controller/common/TemplateParameter.java
index 86b89d16e..e15b8dc4b 100644
--- a/address-space-controller/src/main/java/io/enmasse/controller/common/TemplateParameter.java
+++ b/address-space-controller/src/main/java/io/enmasse/controller/common/TemplateParameter.java
@@ -35,5 +35,7 @@ public interface TemplateParameter {
     String ROUTER_MEMORY_LIMIT = "ROUTER_MEMORY_LIMIT";
     String ROUTER_LINK_CAPACITY = "ROUTER_LINK_CAPACITY";
     String ROUTER_HANDSHAKE_TIMEOUT = "ROUTER_HANDSHAKE_TIMEOUT";
+    String ROUTER_IDLE_TIMEOUT = "ROUTER_IDLE_TIMEOUT";
+    String ROUTER_WORKER_THREADS = "ROUTER_WORKER_THREADS";
     String STANDARD_INFRA_CONFIG_NAME = "STANDARD_INFRA_CONFIG_NAME";
 }
diff --git a/address-space-controller/src/main/resources/templates/brokered-space-infra.yaml b/address-space-controller/src/main/resources/templates/brokered-space-infra.yaml
index ddd50f602..f1c6ae08d 100644
--- a/address-space-controller/src/main/resources/templates/brokered-space-infra.yaml
+++ b/address-space-controller/src/main/resources/templates/brokered-space-infra.yaml
@@ -220,6 +220,10 @@ objects:
     - name: amqps-normal
       port: 55671
       targetPort: amqps-normal
+    - name: health
+      port: 8080
+      protocol: TCP
+      targetPort: artemismetrics
     selector:
       role: broker
       infraUuid: ${INFRA_UUID}
diff --git a/address-space-controller/src/main/resources/templates/standard-space-infra.yaml b/address-space-controller/src/main/resources/templates/standard-space-infra.yaml
index 02ea39fdd..b9d31ff01 100644
--- a/address-space-controller/src/main/resources/templates/standard-space-infra.yaml
+++ b/address-space-controller/src/main/resources/templates/standard-space-infra.yaml
@@ -60,8 +60,10 @@ objects:
       router {
         mode: interior
         id: ${HOSTNAME}
+        workerThreads: ${ROUTER_WORKER_THREADS}
         defaultDistribution: unavailable
         allowResumableLinkRoute: false
+        timestampsInUTC: true
       }
 
       sslProfile {
@@ -93,6 +95,7 @@ objects:
         port: 5672
         saslPlugin: auth_service
         authenticatePeer: yes
+        idleTimeoutSeconds: ${ROUTER_IDLE_TIMEOUT}
         linkCapacity: ${ROUTER_LINK_CAPACITY}
         initialHandshakeTimeoutSeconds: ${ROUTER_HANDSHAKE_TIMEOUT}
       }
@@ -104,6 +107,7 @@ objects:
         authenticatePeer: yes
         sslProfile: inter_router_tls
         saslMechanisms: EXTERNAL
+        idleTimeoutSeconds: ${ROUTER_IDLE_TIMEOUT}
         linkCapacity: ${ROUTER_LINK_CAPACITY}
       }
 
@@ -114,6 +118,7 @@ objects:
         sslProfile: ssl_details
         http: true
         authenticatePeer: yes
+        idleTimeoutSeconds: ${ROUTER_IDLE_TIMEOUT}
         linkCapacity: ${ROUTER_LINK_CAPACITY}
       }
 
@@ -130,6 +135,7 @@ objects:
         sslProfile: ssl_details
         requireSsl: true
         authenticatePeer: yes
+        idleTimeoutSeconds: ${ROUTER_IDLE_TIMEOUT}
         linkCapacity: ${ROUTER_LINK_CAPACITY}
         initialHandshakeTimeoutSeconds: ${ROUTER_HANDSHAKE_TIMEOUT}
       }
@@ -147,6 +153,7 @@ objects:
         sslProfile: inter_router_tls
         saslMechanisms: EXTERNAL
         authenticatePeer: yes
+        idleTimeoutSeconds: ${ROUTER_IDLE_TIMEOUT}
         linkCapacity: ${ROUTER_LINK_CAPACITY}
       }
 
@@ -157,6 +164,7 @@ objects:
         saslMechanisms: EXTERNAL
         role: route-container
         authenticatePeer: yes
+        idleTimeoutSeconds: ${ROUTER_IDLE_TIMEOUT}
         linkCapacity: ${ROUTER_LINK_CAPACITY}
       }
 
@@ -548,6 +556,10 @@ objects:
     - name: inter-router
       port: 55672
       targetPort: 55672
+    - name: health
+      port: 8080
+      protocol: TCP
+      targetPort: http
     selector:
       capability: router
       infraUuid: ${INFRA_UUID}
@@ -694,3 +706,9 @@ parameters:
 - description: Memory limits for router
   name: ROUTER_MEMORY_LIMIT
   value: 512Mi
+- description: Idle timeout for router listeners
+  name: ROUTER_IDLE_TIMEOUT
+  value: '16'
+- description: Router worker threads
+  name: ROUTER_WORKER_THREADS
+  value: '4'
diff --git a/agent/npm-shrinkwrap.json b/agent/npm-shrinkwrap.json
index 6fee34052..05411669b 100644
--- a/agent/npm-shrinkwrap.json
+++ b/agent/npm-shrinkwrap.json
@@ -364,9 +364,9 @@
             "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
         },
         "commander": {
-            "version": "2.17.1",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
-            "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+            "version": "2.19.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+            "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
             "optional": true
         },
         "component-emitter": {
@@ -567,9 +567,9 @@
             }
         },
         "eslint": {
-            "version": "5.15.1",
-            "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.1.tgz",
-            "integrity": "sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg==",
+            "version": "5.15.3",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.3.tgz",
+            "integrity": "sha512-vMGi0PjCHSokZxE0NLp2VneGw5sio7SSiDNgIUn2tC0XkWJRNOIoHIg3CliLVfXnJsiHxGAYrkw0PieAu8+KYQ==",
             "requires": {
                 "@babel/code-frame": "^7.0.0",
                 "ajv": "^6.9.1",
@@ -577,7 +577,7 @@
                 "cross-spawn": "^6.0.5",
                 "debug": "^4.0.1",
                 "doctrine": "^3.0.0",
-                "eslint-scope": "^4.0.2",
+                "eslint-scope": "^4.0.3",
                 "eslint-utils": "^1.3.1",
                 "eslint-visitor-keys": "^1.0.0",
                 "espree": "^5.0.1",
@@ -620,9 +620,9 @@
             }
         },
         "eslint-scope": {
-            "version": "4.0.2",
-            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz",
-            "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==",
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+            "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
             "requires": {
                 "esrecurse": "^4.1.0",
                 "estraverse": "^4.1.1"
@@ -1027,24 +1027,16 @@
             "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
         },
         "handlebars": {
-            "version": "4.0.12",
-            "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz",
-            "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==",
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz",
+            "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==",
             "requires": {
-                "async": "^2.5.0",
+                "neo-async": "^2.6.0",
                 "optimist": "^0.6.1",
                 "source-map": "^0.6.1",
                 "uglify-js": "^3.1.4"
             },
             "dependencies": {
-                "async": {
-                    "version": "2.6.1",
-                    "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-                    "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-                    "requires": {
-                        "lodash": "^4.17.10"
-                    }
-                },
                 "source-map": {
                     "version": "0.6.1",
                     "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -1203,9 +1195,9 @@
                     "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
                 },
                 "strip-ansi": {
-                    "version": "5.1.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz",
-                    "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==",
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+                    "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
                     "requires": {
                         "ansi-regex": "^4.1.0"
                     }
@@ -1439,9 +1431,9 @@
             "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
         },
         "js-yaml": {
-            "version": "3.12.0",
-            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
-            "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+            "version": "3.13.0",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz",
+            "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==",
             "requires": {
                 "argparse": "^1.0.7",
                 "esprima": "^4.0.0"
@@ -1551,13 +1543,20 @@
             }
         },
         "mem": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz",
-            "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==",
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz",
+            "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==",
             "requires": {
                 "map-age-cleaner": "^0.1.1",
-                "mimic-fn": "^1.0.0",
+                "mimic-fn": "^2.0.0",
                 "p-is-promise": "^2.0.0"
+            },
+            "dependencies": {
+                "mimic-fn": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz",
+                    "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA=="
+                }
             }
         },
         "micromatch": {
@@ -1605,7 +1604,7 @@
         },
         "minimist": {
             "version": "0.0.8",
-            "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
             "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
         },
         "mixin-deep": {
@@ -1629,7 +1628,7 @@
         },
         "mkdirp": {
             "version": "0.5.1",
-            "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
             "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
             "requires": {
                 "minimist": "0.0.8"
@@ -1665,6 +1664,15 @@
                 "yargs-unparser": "1.5.0"
             },
             "dependencies": {
+                "js-yaml": {
+                    "version": "3.12.0",
+                    "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+                    "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+                    "requires": {
+                        "argparse": "^1.0.7",
+                        "esprima": "^4.0.0"
+                    }
+                },
                 "supports-color": {
                     "version": "6.0.0",
                     "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
@@ -1735,6 +1743,11 @@
             "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
             "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
         },
+        "neo-async": {
+            "version": "2.6.0",
+            "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
+            "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA=="
+        },
         "nice-try": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -1930,9 +1943,9 @@
             }
         },
         "p-try": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
-            "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.1.0.tgz",
+            "integrity": "sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA=="
         },
         "parent-module": {
             "version": "1.0.0",
@@ -2124,9 +2137,9 @@
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
         "semver": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-            "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+            "version": "5.7.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+            "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
         },
         "set-blocking": {
             "version": "2.0.0",
@@ -2407,19 +2420,19 @@
                     "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
                 },
                 "string-width": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz",
-                    "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==",
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+                    "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
                     "requires": {
                         "emoji-regex": "^7.0.1",
                         "is-fullwidth-code-point": "^2.0.0",
-                        "strip-ansi": "^5.0.0"
+                        "strip-ansi": "^5.1.0"
                     }
                 },
                 "strip-ansi": {
-                    "version": "5.1.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz",
-                    "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==",
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+                    "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
                     "requires": {
                         "ansi-regex": "^4.1.0"
                     }
@@ -2433,7 +2446,7 @@
         },
         "through": {
             "version": "2.3.8",
-            "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
             "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
         },
         "tmp": {
@@ -2496,12 +2509,12 @@
             }
         },
         "uglify-js": {
-            "version": "3.4.9",
-            "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
-            "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
+            "version": "3.5.2",
+            "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.2.tgz",
+            "integrity": "sha512-imog1WIsi9Yb56yRt5TfYVxGmnWs3WSGU73ieSOlMVFwhJCA9W8fqFFMMj4kgDqiS/80LGdsYnWL7O9UcjEBlg==",
             "optional": true,
             "requires": {
-                "commander": "~2.17.1",
+                "commander": "~2.19.0",
                 "source-map": "~0.6.1"
             },
             "dependencies": {
diff --git a/agent/pom.xml b/agent/pom.xml
index 8c943b2d5..bcb24928c 100644
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.enmasse</groupId>
diff --git a/amqp-utils/pom.xml b/amqp-utils/pom.xml
index 234d96c44..cd88b1f9b 100644
--- a/amqp-utils/pom.xml
+++ b/amqp-utils/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>amqp-utils</artifactId>
diff --git a/api-common/pom.xml b/api-common/pom.xml
index 4ce6a1e61..e1f1b0839 100644
--- a/api-common/pom.xml
+++ b/api-common/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>api-common</artifactId>
diff --git a/api-model/pom.xml b/api-model/pom.xml
index 12d368ff4..e7815cfb2 100644
--- a/api-model/pom.xml
+++ b/api-model/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>api-model</artifactId>
diff --git a/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecBroker.java b/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecBroker.java
index f016d8e7b..50caaff5d 100644
--- a/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecBroker.java
+++ b/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecBroker.java
@@ -22,7 +22,7 @@ import io.sundr.builder.annotations.Inline;
         refs = {@BuildableReference(AbstractHasMetadataWithAdditionalProperties.class)},
         inline = @Inline(type = Doneable.class, prefix = "Doneable", value = "done")
 )
-@JsonPropertyOrder({"resources", "addressFullPolicy", "globalMaxSize", "storageClassName", "updatePersistentVolumeClaim", "podTemplate"})
+@JsonPropertyOrder({"resources", "addressFullPolicy", "globalMaxSize", "storageClassName", "updatePersistentVolumeClaim", "podTemplate", "connectorIdleTimeout", "connectorWorkerThreads"})
 @JsonInclude(JsonInclude.Include.NON_NULL)
 public class StandardInfraConfigSpecBroker extends AbstractWithAdditionalProperties {
     private StandardInfraConfigSpecBrokerResources resources;
@@ -31,6 +31,8 @@ public class StandardInfraConfigSpecBroker extends AbstractWithAdditionalPropert
     private String storageClassName;
     private Boolean updatePersistentVolumeClaim;
     private PodTemplateSpec podTemplate;
+    private Integer connectorIdleTimeout;
+    private Integer connectorWorkerThreads;
 
     public void setResources(StandardInfraConfigSpecBrokerResources resources) {
         this.resources = resources;
@@ -89,6 +91,22 @@ public class StandardInfraConfigSpecBroker extends AbstractWithAdditionalPropert
         this.podTemplate = podTemplate;
     }
 
+    public Integer getConnectorIdleTimeout() {
+        return connectorIdleTimeout;
+    }
+
+    public void setConnectorIdleTimeout(Integer connectorIdleTimeout) {
+        this.connectorIdleTimeout = connectorIdleTimeout;
+    }
+
+    public Integer getConnectorWorkerThreads() {
+        return connectorWorkerThreads;
+    }
+
+    public void setConnectorWorkerThreads(Integer connectorWorkerThreads) {
+        this.connectorWorkerThreads = connectorWorkerThreads;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -99,12 +117,14 @@ public class StandardInfraConfigSpecBroker extends AbstractWithAdditionalPropert
                 Objects.equals(globalMaxSize, that.globalMaxSize) &&
                 Objects.equals(storageClassName, that.storageClassName) &&
                 Objects.equals(updatePersistentVolumeClaim, that.updatePersistentVolumeClaim) &&
-                Objects.equals(podTemplate, that.podTemplate);
+                Objects.equals(podTemplate, that.podTemplate) &&
+                Objects.equals(connectorIdleTimeout, that.connectorIdleTimeout) &&
+                Objects.equals(connectorWorkerThreads, that.connectorWorkerThreads);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(resources, addressFullPolicy, globalMaxSize, storageClassName, updatePersistentVolumeClaim, podTemplate);
+        return Objects.hash(resources, addressFullPolicy, globalMaxSize, storageClassName, updatePersistentVolumeClaim, podTemplate, connectorIdleTimeout, connectorWorkerThreads);
     }
 
     @Override
@@ -116,6 +136,8 @@ public class StandardInfraConfigSpecBroker extends AbstractWithAdditionalPropert
                 ", globalMaxSize='" + globalMaxSize + '\'' +
                 ", updatePersistentVolumeClaim=" + updatePersistentVolumeClaim +
                 ", podTemplate=" + podTemplate +
+                ", connectorIdleTimeout=" + connectorIdleTimeout +
+                ", connectorWorkerThreads=" + connectorWorkerThreads +
                 '}';
     }
 }
diff --git a/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecRouter.java b/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecRouter.java
index 7f5f845fb..26f806973 100644
--- a/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecRouter.java
+++ b/api-model/src/main/java/io/enmasse/admin/model/v1/StandardInfraConfigSpecRouter.java
@@ -22,13 +22,15 @@ import io.sundr.builder.annotations.Inline;
         refs = {@BuildableReference(AbstractHasMetadataWithAdditionalProperties.class)},
         inline = @Inline(type = Doneable.class, prefix = "Doneable", value = "done")
 )
-@JsonPropertyOrder({"minReplicas", "resources", "linkCapacity", "handshakeTimeout", "podTemplate"})
+@JsonPropertyOrder({"minReplicas", "resources", "linkCapacity", "handshakeTimeout", "idleTimeout", "workerThreads", "podTemplate"})
 @JsonInclude(JsonInclude.Include.NON_NULL)
 public class StandardInfraConfigSpecRouter extends AbstractWithAdditionalProperties {
     private StandardInfraConfigSpecRouterResources resources;
     private Integer minReplicas;
     private Integer linkCapacity;
     private Integer handshakeTimeout;
+    private Integer idleTimeout;
+    private Integer workerThreads;
     private PodTemplateSpec podTemplate;
 
     public void setResources(StandardInfraConfigSpecRouterResources resources) {
@@ -71,6 +73,22 @@ public class StandardInfraConfigSpecRouter extends AbstractWithAdditionalPropert
         this.podTemplate = podTemplate;
     }
 
+    public Integer getIdleTimeout() {
+        return idleTimeout;
+    }
+
+    public void setIdleTimeout(Integer idleTimeout) {
+        this.idleTimeout = idleTimeout;
+    }
+
+    public Integer getWorkerThreads() {
+        return workerThreads;
+    }
+
+    public void setWorkerThreads(Integer workerThreads) {
+        this.workerThreads = workerThreads;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -79,13 +97,15 @@ public class StandardInfraConfigSpecRouter extends AbstractWithAdditionalPropert
         return Objects.equals(resources, that.resources) &&
                 Objects.equals(minReplicas, that.minReplicas) &&
                 Objects.equals(handshakeTimeout, that.handshakeTimeout) &&
+                Objects.equals(idleTimeout, that.idleTimeout) &&
                 Objects.equals(linkCapacity, that.linkCapacity) &&
+                Objects.equals(workerThreads, that.workerThreads) &&
                 Objects.equals(podTemplate, that.podTemplate);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(resources, linkCapacity, minReplicas, handshakeTimeout, podTemplate);
+        return Objects.hash(resources, linkCapacity, minReplicas, handshakeTimeout, idleTimeout, workerThreads, podTemplate);
     }
 
     @Override
@@ -95,6 +115,8 @@ public class StandardInfraConfigSpecRouter extends AbstractWithAdditionalPropert
                 ", minReplicas=" + minReplicas +
                 ", linkCapacity=" + linkCapacity +
                 ", handshakeTimeout=" + handshakeTimeout +
+                ", idleTimeout=" + idleTimeout +
+                ", workerThreads=" + workerThreads +
                 ", podTemplate=" + podTemplate +
                 '}';
     }
diff --git a/api-server/pom.xml b/api-server/pom.xml
index 76b2c3ff8..1c34ab9eb 100644
--- a/api-server/pom.xml
+++ b/api-server/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>api-server</artifactId>
diff --git a/api-server/src/main/resources/swagger.json b/api-server/src/main/resources/swagger.json
index 895c4ee66..da1de1d37 100644
--- a/api-server/src/main/resources/swagger.json
+++ b/api-server/src/main/resources/swagger.json
@@ -2112,6 +2112,12 @@
                 },
                 "updatePersistentVolumeClaim": {
                     "type": "boolean"
+                },
+                "connectorIdleTimeout": {
+                    "type": "integer"
+                },
+                "connectorWorkerThreads": {
+                    "type": "integer"
                 }
             }
         },
@@ -2134,6 +2140,15 @@
                 },
                 "linkCapacity": {
                     "type": "integer"
+                },
+                "initialHandshakeTimeout": {
+                    "type": "integer"
+                },
+                "idleTimeout": {
+                    "type": "integer"
+                },
+                "workerThreads": {
+                    "type": "integer"
                 }
             }
         },
diff --git a/artemis/pom.xml b/artemis/pom.xml
index 566ed644f..1498110b8 100644
--- a/artemis/pom.xml
+++ b/artemis/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
diff --git a/broker-plugin/amqp-connector/pom.xml b/broker-plugin/amqp-connector/pom.xml
index a7ece4a42..6d0732a49 100644
--- a/broker-plugin/amqp-connector/pom.xml
+++ b/broker-plugin/amqp-connector/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>broker-plugin</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>amqp-connector</artifactId>
diff --git a/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPClientConnectionFactory.java b/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPClientConnectionFactory.java
index 88a47ceb7..ea0df3aad 100644
--- a/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPClientConnectionFactory.java
+++ b/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPClientConnectionFactory.java
@@ -39,14 +39,14 @@ public class AMQPClientConnectionFactory {
    private final ActiveMQServer server;
    private final String containerId;
    private final Map<Symbol, Object> connectionProperties;
-   private final int ttl;
+   private final int idleTimeout;
    private final boolean useCoreSubscriptionNaming;
 
-   public AMQPClientConnectionFactory(ActiveMQServer server, String containerId, Map<Symbol, Object> connectionProperties, int ttl) {
+   public AMQPClientConnectionFactory(ActiveMQServer server, String containerId, Map<Symbol, Object> connectionProperties, int idleTimeout) {
       this.server = server;
       this.containerId = containerId;
       this.connectionProperties = connectionProperties;
-      this.ttl = ttl;
+      this.idleTimeout = idleTimeout;
       this.useCoreSubscriptionNaming = false;
    }
 
@@ -55,7 +55,7 @@ public class AMQPClientConnectionFactory {
 
       Executor executor = server.getExecutorFactory().getExecutor();
 
-      AMQPConnectionContext amqpConnection = new AMQPConnectionContext(protocolManager, connectionCallback, containerId, ttl, protocolManager.getMaxFrameSize(), AMQPConstants.Connection.DEFAULT_CHANNEL_MAX, useCoreSubscriptionNaming, server.getScheduledPool(), false, clientSASLFactory, connectionProperties);
+      AMQPConnectionContext amqpConnection = new AMQPConnectionContext(protocolManager, connectionCallback, containerId, idleTimeout, protocolManager.getMaxFrameSize(), AMQPConstants.Connection.DEFAULT_CHANNEL_MAX, useCoreSubscriptionNaming, server.getScheduledPool(), false, clientSASLFactory, connectionProperties);
       eventHandler.ifPresent(amqpConnection::addEventHandler);
 
       ActiveMQProtonRemotingConnection delegate = new ActiveMQProtonRemotingConnection(protocolManager, amqpConnection, connection, executor);
diff --git a/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorService.java b/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorService.java
index 1292840e2..af868607f 100644
--- a/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorService.java
+++ b/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorService.java
@@ -53,18 +53,19 @@ public class AMQPConnectorService implements ConnectorService, BaseConnectionLif
    private final ActiveMQServer server;
    private volatile RemotingConnection connection;
    private final ExecutorService closeExecutor = Executors.newSingleThreadExecutor();
-   private final ExecutorService threadPool = Executors.newFixedThreadPool(4);
+   private final ExecutorService nettyThreadPool;
    private final ScheduledExecutorService scheduledExecutorService;
    private final ProtonClientConnectionManager lifecycleHandler;
    private volatile boolean started = false;
    private final Map<String, Object> connectorConfig;
 
-   public AMQPConnectorService(String connectorName, Map<String, Object> connectorConfig, String containerId, String groupId, Optional<SubscriberInfo> subscriberInfo, ActiveMQServer server, ScheduledExecutorService scheduledExecutorService) {
+   public AMQPConnectorService(String connectorName, Map<String, Object> connectorConfig, String containerId, String groupId, Optional<SubscriberInfo> subscriberInfo, ActiveMQServer server, ScheduledExecutorService scheduledExecutorService, ExecutorService nettyThreadPool, int idleTimeout) {
       this.name = connectorName;
       this.connectorConfig = connectorConfig;
       this.server = server;
       this.scheduledExecutorService = scheduledExecutorService;
-      AMQPClientConnectionFactory factory = new AMQPClientConnectionFactory(server, containerId, Collections.singletonMap(groupSymbol, groupId), 5000);
+      this.nettyThreadPool = nettyThreadPool;
+      AMQPClientConnectionFactory factory = new AMQPClientConnectionFactory(server, containerId, Collections.singletonMap(groupSymbol, groupId), idleTimeout);
       boolean sslEnabled = ConfigurationHelper.getBooleanProperty(TransportConstants.SSL_ENABLED_PROP_NAME, TransportConstants.DEFAULT_SSL_ENABLED, connectorConfig);
 
       ClientSASLFactory saslClientFactory = null;
@@ -104,7 +105,7 @@ public class AMQPConnectorService implements ConnectorService, BaseConnectionLif
       scheduledExecutorService.submit(() -> {
          ActiveMQAMQPLogger.LOGGER.infov("Starting connector {0}", name);
          ProtonClientProtocolManager protocolManager = new ProtonClientProtocolManager(new ProtonProtocolManagerFactory(), server);
-         NettyConnector connector = new NettyConnector(connectorConfig, lifecycleHandler, AMQPConnectorService.this, closeExecutor, threadPool, server.getScheduledPool(), protocolManager);
+         NettyConnector connector = new NettyConnector(connectorConfig, lifecycleHandler, AMQPConnectorService.this, closeExecutor, nettyThreadPool, server.getScheduledPool(), protocolManager);
          connector.start();
          Connection connection = connector.createConnection();
 
@@ -129,7 +130,7 @@ public class AMQPConnectorService implements ConnectorService, BaseConnectionLif
             lifecycleHandler.stop();
          }
          closeExecutor.shutdown();
-         threadPool.shutdown();
+         nettyThreadPool.shutdown();
          ActiveMQAMQPLogger.LOGGER.infov("Stopped connector {0}", name);
       });
    }
diff --git a/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorServiceFactory.java b/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorServiceFactory.java
index 6e1f305d4..9a45bc7ad 100644
--- a/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorServiceFactory.java
+++ b/broker-plugin/amqp-connector/src/main/java/org/apache/activemq/artemis/integration/amqp/AMQPConnectorServiceFactory.java
@@ -20,6 +20,7 @@
  */
 package org.apache.activemq.artemis.integration.amqp;
 
+import io.netty.util.concurrent.DefaultThreadFactory;
 import org.apache.activemq.artemis.core.persistence.StorageManager;
 import org.apache.activemq.artemis.core.postoffice.PostOffice;
 import org.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl;
@@ -28,6 +29,8 @@ import org.apache.activemq.artemis.core.server.ConnectorService;
 import org.apache.activemq.artemis.core.server.ConnectorServiceFactory;
 
 import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
 /**
@@ -38,6 +41,8 @@ public class AMQPConnectorServiceFactory implements ConnectorServiceFactory {
    private static final String CLUSTER = "clusterId";
    private static final String SOURCE_ADDRESS = "sourceAddress";
    private static final String CLIENT_ADDRESS = "clientAddress";
+   private static final String NETTY_THREADS = "nettyThreads";
+   private static final String IDLE_TIMEOUT = "idleTimeoutMs";
 
    private static final Set<String> requiredProperties = initializeRequiredProperties();
    private static final Set<String> allowedProperties = initializeAllowedProperties();
@@ -58,6 +63,8 @@ public class AMQPConnectorServiceFactory implements ConnectorServiceFactory {
       properties.add(TransportConstants.USE_GLOBAL_WORKER_POOL_PROP_NAME);
       properties.add(TransportConstants.REMOTING_THREADS_PROPNAME);
       properties.add(TransportConstants.NETTY_CONNECT_TIMEOUT);
+      properties.add(IDLE_TIMEOUT);
+      properties.add(NETTY_THREADS);
       return properties;
    }
 
@@ -95,6 +102,9 @@ public class AMQPConnectorServiceFactory implements ConnectorServiceFactory {
       Optional<String> clientAddress = Optional.ofNullable((String)configuration.get(CLIENT_ADDRESS));
       Optional<String> container = Optional.ofNullable((String)configuration.get(CONTAINER));
 
+      int nettyThreads = Optional.ofNullable((String)configuration.get(NETTY_THREADS)).map(Integer::parseInt).orElse(4);
+      int idleTimeout = Optional.ofNullable((String)configuration.get(IDLE_TIMEOUT)).map(Integer::parseInt).orElse(16_000);
+
       Optional<SubscriberInfo> info = sourceAddress.flatMap(s ->
               clientAddress.flatMap(c ->
                       container.map(o -> new SubscriberInfo(o, s, c))));
@@ -104,7 +114,17 @@ public class AMQPConnectorServiceFactory implements ConnectorServiceFactory {
       if (container.isPresent()) {
          containerId = container.get();
       }
-      return new AMQPConnectorService(connectorName, connectorConfig, containerId, clusterId, info, ((PostOfficeImpl)postOffice).getServer(), scheduledExecutorService);
+
+      ExecutorService nettyThreadPool = Executors.newFixedThreadPool(nettyThreads, new DefaultThreadFactory("connector-" + connectorName));
+      return new AMQPConnectorService(connectorName,
+              connectorConfig,
+              containerId,
+              clusterId,
+              info,
+              ((PostOfficeImpl)postOffice).getServer(),
+              scheduledExecutorService,
+              nettyThreadPool,
+              idleTimeout);
    }
 
    @Override
diff --git a/broker-plugin/jmx_exporter/pom.xml b/broker-plugin/jmx_exporter/pom.xml
index 9cafbf12a..00ecdc388 100644
--- a/broker-plugin/jmx_exporter/pom.xml
+++ b/broker-plugin/jmx_exporter/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>broker-plugin</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jmx_exporter</artifactId>
diff --git a/broker-plugin/plugin/pom.xml b/broker-plugin/plugin/pom.xml
index 47495a705..d0d3e4323 100644
--- a/broker-plugin/plugin/pom.xml
+++ b/broker-plugin/plugin/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>broker-plugin</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
diff --git a/broker-plugin/plugin/src/main/resources/standard/colocated/broker.xml b/broker-plugin/plugin/src/main/resources/standard/colocated/broker.xml
index 63b58212f..dc54c820c 100644
--- a/broker-plugin/plugin/src/main/resources/standard/colocated/broker.xml
+++ b/broker-plugin/plugin/src/main/resources/standard/colocated/broker.xml
@@ -114,6 +114,8 @@ under the License.
           <param key="port" value="$MESSAGING_SERVICE_PORT_AMQPS_BROKER" />
           <param key="containerId" value="$CONTAINER_ID-in" />
           <param key="clusterId" value="$CLUSTER_ID" />
+          <param key="idleTimeoutMs" value="$CONNECTOR_IN_IDLE_TIMEOUT_MS" />
+          <param key="nettyThreads" value="$CONNECTOR_IN_NETTY_THREADS" />
         </connector-service>
         <connector-service name="router-connector-out">
           <factory-class>org.apache.activemq.artemis.integration.amqp.AMQPConnectorServiceFactory</factory-class>
@@ -121,6 +123,8 @@ under the License.
           <param key="port" value="$MESSAGING_SERVICE_PORT_AMQPS_BROKER" />
           <param key="containerId" value="$CONTAINER_ID-out" />
           <param key="clusterId" value="$CLUSTER_ID" />
+          <param key="idleTimeoutMs" value="$CONNECTOR_OUT_IDLE_TIMEOUT_MS" />
+          <param key="nettyThreads" value="$CONNECTOR_OUT_NETTY_THREADS" />
         </connector-service>
       </connector-services>
    </core>
diff --git a/broker-plugin/plugin/src/main/resources/standard/sharded-queue/broker.xml b/broker-plugin/plugin/src/main/resources/standard/sharded-queue/broker.xml
index 2c0e29be0..5e9c76f81 100644
--- a/broker-plugin/plugin/src/main/resources/standard/sharded-queue/broker.xml
+++ b/broker-plugin/plugin/src/main/resources/standard/sharded-queue/broker.xml
@@ -115,6 +115,8 @@ under the License.
           <param key="port" value="$MESSAGING_SERVICE_PORT_AMQPS_BROKER" />
           <param key="containerId" value="$QUEUE_NAME-in" />
           <param key="clusterId" value="$QUEUE_NAME" />
+          <param key="idleTimeoutMs" value="$CONNECTOR_IN_IDLE_TIMEOUT_MS" />
+          <param key="nettyThreads" value="$CONNECTOR_IN_NETTY_THREADS" />
         </connector-service>
         <connector-service name="amqp-connector-out">
           <factory-class>org.apache.activemq.artemis.integration.amqp.AMQPConnectorServiceFactory</factory-class>
@@ -122,6 +124,8 @@ under the License.
           <param key="port" value="$MESSAGING_SERVICE_PORT_AMQPS_BROKER" />
           <param key="containerId" value="$QUEUE_NAME-out" />
           <param key="clusterId" value="$QUEUE_NAME" />
+          <param key="idleTimeoutMs" value="$CONNECTOR_OUT_IDLE_TIMEOUT_MS" />
+          <param key="nettyThreads" value="$CONNECTOR_OUT_NETTY_THREADS" />
         </connector-service>
       </connector-services>
    </core>
diff --git a/broker-plugin/plugin/src/main/resources/standard/sharded-topic/broker.xml b/broker-plugin/plugin/src/main/resources/standard/sharded-topic/broker.xml
index 258de8811..018f816ad 100644
--- a/broker-plugin/plugin/src/main/resources/standard/sharded-topic/broker.xml
+++ b/broker-plugin/plugin/src/main/resources/standard/sharded-topic/broker.xml
@@ -137,6 +137,8 @@ under the License.
           <param key="port" value="$MESSAGING_SERVICE_PORT_AMQPS_BROKER" />
           <param key="containerId" value="$TOPIC_NAME-in" />
           <param key="clusterId" value="$TOPIC_NAME" />
+          <param key="idleTimeoutMs" value="$CONNECTOR_IN_IDLE_TIMEOUT_MS" />
+          <param key="nettyThreads" value="$CONNECTOR_IN_NETTY_THREADS" />
         </connector-service>
         <connector-service name="address-connector-out">
           <factory-class>org.apache.activemq.artemis.integration.amqp.AMQPConnectorServiceFactory</factory-class>
@@ -144,6 +146,8 @@ under the License.
           <param key="port" value="$MESSAGING_SERVICE_PORT_AMQPS_BROKER" />
           <param key="containerId" value="$TOPIC_NAME-out" />
           <param key="clusterId" value="$TOPIC_NAME" />
+          <param key="idleTimeoutMs" value="$CONNECTOR_OUT_IDLE_TIMEOUT_MS" />
+          <param key="nettyThreads" value="$CONNECTOR_OUT_NETTY_THREADS" />
         </connector-service>
       </connector-services>
    </core>
diff --git a/broker-plugin/pom.xml b/broker-plugin/pom.xml
index c6588de05..c234a4358 100644
--- a/broker-plugin/pom.xml
+++ b/broker-plugin/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
diff --git a/broker-plugin/sasl-delegation/pom.xml b/broker-plugin/sasl-delegation/pom.xml
index f48b47e67..3aed018ef 100644
--- a/broker-plugin/sasl-delegation/pom.xml
+++ b/broker-plugin/sasl-delegation/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>broker-plugin</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>sasl-delegation</artifactId>
diff --git a/broker-plugin/tcnative/pom.xml b/broker-plugin/tcnative/pom.xml
index 547b34f0c..a153a7316 100644
--- a/broker-plugin/tcnative/pom.xml
+++ b/broker-plugin/tcnative/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>broker-plugin</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>tcnative</artifactId>
diff --git a/bundle/pom.xml b/bundle/pom.xml
index 8d4bfa787..ab9ef84e4 100644
--- a/bundle/pom.xml
+++ b/bundle/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <artifactId>enmasse</artifactId>
         <groupId>io.enmasse</groupId>
-        <version>0.27-SNAPSHOT</version>
+        <version>0.28-SNAPSHOT</version>
     </parent>
     <packaging>pom</packaging>
     <name>EnMasse Bundles</name>
diff --git a/discovery-lib/pom.xml b/discovery-lib/pom.xml
index 39ebe2c5d..976befff1 100644
--- a/discovery-lib/pom.xml
+++ b/discovery-lib/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>discovery-lib</artifactId>
diff --git a/documentation/common/restapi-reference.adoc b/documentation/common/restapi-reference.adoc
index cc0255b22..a435c7eaf 100644
--- a/documentation/common/restapi-reference.adoc
+++ b/documentation/common/restapi-reference.adoc
@@ -1591,6 +1591,10 @@ __optional__|string
 |Name|Schema
 |**addressFullPolicy** +
 __optional__|enum (PAGE, BLOCK, FAIL)
+|**connectorIdleTimeout** +
+__optional__|integer
+|**connectorWorkerThreads** +
+__optional__|integer
 |**podTemplate** +
 __optional__|<<_io_enmasse_admin_v1beta1_infraconfigpodspec,io.enmasse.admin.v1beta1.InfraConfigPodSpec>>
 |**resources** +
@@ -1620,6 +1624,10 @@ __optional__|string
 [options="header", cols=".^3a,.^4a"]
 |===
 |Name|Schema
+|**idleTimeout** +
+__optional__|integer
+|**initialHandshakeTimeout** +
+__optional__|integer
 |**linkCapacity** +
 __optional__|integer
 |**minReplicas** +
@@ -1628,6 +1636,8 @@ __optional__|integer
 __optional__|<<_io_enmasse_admin_v1beta1_infraconfigpodspec,io.enmasse.admin.v1beta1.InfraConfigPodSpec>>
 |**resources** +
 __optional__|<<_io_enmasse_admin_v1beta1_standardinfraconfigspecrouter_resources,resources>>
+|**workerThreads** +
+__optional__|integer
 |===
 
 [[_io_enmasse_admin_v1beta1_standardinfraconfigspecrouter_resources]]
diff --git a/enmasse-controller-manager/pom.xml b/enmasse-controller-manager/pom.xml
index 47209ba64..62c50f863 100644
--- a/enmasse-controller-manager/pom.xml
+++ b/enmasse-controller-manager/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
diff --git a/iot/iot-application-base/pom.xml b/iot/iot-application-base/pom.xml
index e08904e68..c01a20b28 100644
--- a/iot/iot-application-base/pom.xml
+++ b/iot/iot-application-base/pom.xml
@@ -8,7 +8,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
 
   <artifactId>iot-application-base</artifactId>
diff --git a/iot/iot-auth-service/pom.xml b/iot/iot-auth-service/pom.xml
index e33ee921b..7a9f06a32 100644
--- a/iot/iot-auth-service/pom.xml
+++ b/iot/iot-auth-service/pom.xml
@@ -8,7 +8,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
 
diff --git a/iot/iot-device-registry/pom.xml b/iot/iot-device-registry/pom.xml
index aacccc3a4..ae658978e 100644
--- a/iot/iot-device-registry/pom.xml
+++ b/iot/iot-device-registry/pom.xml
@@ -8,7 +8,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
 
diff --git a/iot/iot-gc/pom.xml b/iot/iot-gc/pom.xml
index 8c944a5e7..8bf2c623c 100644
--- a/iot/iot-gc/pom.xml
+++ b/iot/iot-gc/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
   <packaging>pom</packaging>
diff --git a/iot/iot-http-adapter/pom.xml b/iot/iot-http-adapter/pom.xml
index d96f9f5ac..4f6067efc 100644
--- a/iot/iot-http-adapter/pom.xml
+++ b/iot/iot-http-adapter/pom.xml
@@ -8,7 +8,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
 
diff --git a/iot/iot-mqtt-adapter/pom.xml b/iot/iot-mqtt-adapter/pom.xml
index 4ba52f2a0..a33d28e35 100644
--- a/iot/iot-mqtt-adapter/pom.xml
+++ b/iot/iot-mqtt-adapter/pom.xml
@@ -8,7 +8,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
 
diff --git a/iot/iot-tenant-service/pom.xml b/iot/iot-tenant-service/pom.xml
index aa3a18f6f..33118c73f 100644
--- a/iot/iot-tenant-service/pom.xml
+++ b/iot/iot-tenant-service/pom.xml
@@ -8,7 +8,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
 
diff --git a/iot/pom.xml b/iot/pom.xml
index cc44b5687..308144904 100644
--- a/iot/pom.xml
+++ b/iot/pom.xml
@@ -7,7 +7,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <artifactId>iot</artifactId>
   <packaging>pom</packaging>
diff --git a/iot/qdr-proxy-configurator/pom.xml b/iot/qdr-proxy-configurator/pom.xml
index 5230d6d26..2fcca69c2 100644
--- a/iot/qdr-proxy-configurator/pom.xml
+++ b/iot/qdr-proxy-configurator/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>iot-application-base</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
     <relativePath>../iot-application-base</relativePath>
   </parent>
   <packaging>pom</packaging>
diff --git a/k8s-api/pom.xml b/k8s-api/pom.xml
index 45406e018..95390b8f8 100644
--- a/k8s-api/pom.xml
+++ b/k8s-api/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.enmasse</groupId>
diff --git a/keycloak-plugin/pom.xml b/keycloak-plugin/pom.xml
index 5eb650b0c..34895c70f 100644
--- a/keycloak-plugin/pom.xml
+++ b/keycloak-plugin/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
diff --git a/keycloak-plugin/sasl-plugin/pom.xml b/keycloak-plugin/sasl-plugin/pom.xml
index d28664aca..4fe757bcd 100644
--- a/keycloak-plugin/sasl-plugin/pom.xml
+++ b/keycloak-plugin/sasl-plugin/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>keycloak</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>sasl-plugin</artifactId>
diff --git a/keycloak-user-api/pom.xml b/keycloak-user-api/pom.xml
index 419146327..5346dc071 100644
--- a/keycloak-user-api/pom.xml
+++ b/keycloak-user-api/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.enmasse</groupId>
diff --git a/metrics-api/pom.xml b/metrics-api/pom.xml
index 141214491..afbdab5da 100644
--- a/metrics-api/pom.xml
+++ b/metrics-api/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.enmasse</groupId>
diff --git a/mqtt-gateway/pom.xml b/mqtt-gateway/pom.xml
index 02b7e4902..16a68e397 100644
--- a/mqtt-gateway/pom.xml
+++ b/mqtt-gateway/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>mqtt-gateway</artifactId>
diff --git a/mqtt-lwt/pom.xml b/mqtt-lwt/pom.xml
index 5b9320057..dcb3b0542 100644
--- a/mqtt-lwt/pom.xml
+++ b/mqtt-lwt/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>mqtt-lwt</artifactId>
diff --git a/none-authservice/pom.xml b/none-authservice/pom.xml
index 4ba277d08..003d99d3f 100644
--- a/none-authservice/pom.xml
+++ b/none-authservice/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>none-authservice</artifactId>
diff --git a/none-authservice/src/main/java/io/enmasse/authservice/none/HealthServer.java b/none-authservice/src/main/java/io/enmasse/authservice/none/HealthServer.java
new file mode 100644
index 000000000..3d8c77c51
--- /dev/null
+++ b/none-authservice/src/main/java/io/enmasse/authservice/none/HealthServer.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019, EnMasse authors.
+ * License: Apache License 2.0 (see the file LICENSE or http://apache.org/licenses/LICENSE-2.0.html).
+ */
+package io.enmasse.authservice.none;
+
+import io.vertx.core.AbstractVerticle;
+import io.vertx.core.Future;
+import io.vertx.core.http.HttpServer;
+import io.vertx.core.http.HttpServerOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HealthServer extends AbstractVerticle  {
+    private static final Logger log = LoggerFactory.getLogger(HealthServer.class);
+    private final HttpServerOptions serverOptions;
+    public HealthServer(HttpServerOptions serverOptions) {
+        this.serverOptions = serverOptions;
+    }
+
+    @Override
+    public void start(Future<Void> startPromise) {
+        HttpServer httpServer = vertx.createHttpServer(serverOptions);
+        httpServer.requestHandler(httpServerRequest -> httpServerRequest.response().end("OK"));
+        httpServer.listen(result -> {
+            if (result.succeeded()) {
+                log.info("HealthServer started");
+                startPromise.complete();
+            } else {
+                log.error("Error starting HealthServer");
+                startPromise.fail(result.cause());
+            }
+        });
+
+    }
+}
diff --git a/none-authservice/src/main/java/io/enmasse/authservice/none/NoneAuthService.java b/none-authservice/src/main/java/io/enmasse/authservice/none/NoneAuthService.java
index 910e0464c..3d5bf060f 100644
--- a/none-authservice/src/main/java/io/enmasse/authservice/none/NoneAuthService.java
+++ b/none-authservice/src/main/java/io/enmasse/authservice/none/NoneAuthService.java
@@ -5,66 +5,41 @@
 package io.enmasse.authservice.none;
 
 import io.vertx.core.Vertx;
+import io.vertx.core.http.HttpServerOptions;
 import io.vertx.core.net.PemKeyCertOptions;
-import io.vertx.proton.ProtonConnection;
-import io.vertx.proton.ProtonServer;
 import io.vertx.proton.ProtonServerOptions;
-import org.apache.qpid.proton.amqp.Symbol;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 
 public class NoneAuthService {
     private static final Logger log = LoggerFactory.getLogger(NoneAuthService.class);
-    private static final Symbol AUTHENTICATED_IDENTITY = Symbol.getSymbol("authenticated-identity");
-    private static final Symbol GROUPS = Symbol.getSymbol("groups");
 
     public static void main(String[] args) {
         Map<String, String> env = System.getenv();
         String certDir = env.getOrDefault("CERT_DIR", "/opt/none-authservice/cert");
         int listenPort = Integer.parseInt(env.getOrDefault("LISTENPORT", "5671"));
+        int healthPort = Integer.parseInt(env.getOrDefault("HEALTHPORT", "8080"));
 
         Vertx vertx = Vertx.vertx();
 
-        ProtonServerOptions options = new ProtonServerOptions();
-        options.setSsl(true);
-        options.setPemKeyCertOptions(new PemKeyCertOptions()
-                .setCertPath(new File(certDir, "tls.crt").getAbsolutePath())
-                .setKeyPath(new File(certDir, "tls.key").getAbsolutePath()));
-
-        ProtonServer server = ProtonServer.create(vertx, options);
-        server.connectHandler(NoneAuthService::connectHandler);
-        server.saslAuthenticatorFactory(NoneAuthServiceAuthenticator::new);
-        server.listen(listenPort, "0.0.0.0", result -> {
-            if (result.succeeded()) {
-                log.info("Listening on {}", listenPort);
-            } else {
-                log.error("Error listening on {}", listenPort, result.cause());
-            }
-        });
-    }
-
-    private static void connectHandler(ProtonConnection connection) {
-        connection.setContainer("none-authservice");
-        connection.openHandler(conn -> {
-            Map<Symbol, Object> properties = new HashMap<>();
-
-            properties.put(AUTHENTICATED_IDENTITY, Collections.singletonMap("sub", "anonymous"));
-            properties.put(GROUPS, Collections.singletonList("manage"));
-
-            connection.setProperties(properties);
-            connection.open();
-            connection.close();
-
-        }).closeHandler(conn -> {
-            connection.close();
-            connection.disconnect();
-        }).disconnectHandler(protonConnection -> {
-            connection.disconnect();
-        });
+        ProtonServerOptions protonServerOptions = new ProtonServerOptions()
+                .setSsl(true)
+                .setPort(listenPort)
+                .setHost("0.0.0.0")
+                .setPemKeyCertOptions(new PemKeyCertOptions()
+                        .setCertPath(new File(certDir, "tls.crt").getAbsolutePath())
+                        .setKeyPath(new File(certDir, "tls.key").getAbsolutePath()));
+        SaslServer saslServer = new SaslServer(protonServerOptions);
+
+        HttpServerOptions httpServerOptions = new HttpServerOptions()
+                .setHost("0.0.0.0")
+                .setPort(healthPort);
+        HealthServer healthServer = new HealthServer(httpServerOptions);
+
+        vertx.deployVerticle(saslServer);
+        vertx.deployVerticle(healthServer);
     }
 }
diff --git a/none-authservice/src/main/java/io/enmasse/authservice/none/SaslServer.java b/none-authservice/src/main/java/io/enmasse/authservice/none/SaslServer.java
new file mode 100644
index 000000000..076d16e53
--- /dev/null
+++ b/none-authservice/src/main/java/io/enmasse/authservice/none/SaslServer.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2019, EnMasse authors.
+ * License: Apache License 2.0 (see the file LICENSE or http://apache.org/licenses/LICENSE-2.0.html).
+ */
+package io.enmasse.authservice.none;
+
+import io.vertx.core.AbstractVerticle;
+import io.vertx.core.Future;
+import io.vertx.proton.ProtonConnection;
+import io.vertx.proton.ProtonServer;
+import io.vertx.proton.ProtonServerOptions;
+import org.apache.qpid.proton.amqp.Symbol;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SaslServer extends AbstractVerticle {
+    private static final Logger log = LoggerFactory.getLogger(SaslServer.class);
+    private static final Symbol AUTHENTICATED_IDENTITY = Symbol.getSymbol("authenticated-identity");
+    private static final Symbol GROUPS = Symbol.getSymbol("groups");
+    private final ProtonServerOptions options;
+    public SaslServer(ProtonServerOptions options) {
+        this.options  = options;
+    }
+
+    @Override
+    public void start(Future<Void> startPromise) {
+
+        ProtonServer server = ProtonServer.create(vertx, options);
+        server.connectHandler(SaslServer::connectHandler);
+        server.saslAuthenticatorFactory(NoneAuthServiceAuthenticator::new);
+        server.listen(result -> {
+            if (result.succeeded()) {
+                log.info("SaslServer started");
+                startPromise.complete();
+            } else {
+                log.error("Error starting SaslServer");
+                startPromise.fail(result.cause());
+            }
+        });
+    }
+
+    private static void connectHandler(ProtonConnection connection) {
+        connection.setContainer("none-authservice");
+        connection.openHandler(conn -> {
+            Map<Symbol, Object> properties = new HashMap<>();
+
+            properties.put(AUTHENTICATED_IDENTITY, Collections.singletonMap("sub", "anonymous"));
+            properties.put(GROUPS, Collections.singletonList("manage"));
+
+            connection.setProperties(properties);
+            connection.open();
+            connection.close();
+
+        }).closeHandler(conn -> {
+            connection.close();
+            connection.disconnect();
+        }).disconnectHandler(protonConnection -> {
+            connection.disconnect();
+        });
+    }
+}
diff --git a/pkg/controller/authenticationservice/none.go b/pkg/controller/authenticationservice/none.go
index f8253f9af..3857b5c66 100644
--- a/pkg/controller/authenticationservice/none.go
+++ b/pkg/controller/authenticationservice/none.go
@@ -47,21 +47,33 @@ func applyNoneAuthServiceDeployment(authservice *adminv1beta1.AuthenticationServ
 				Name:  "LISTENPORT",
 				Value: "5671",
 			},
+			{
+				Name:  "HEALTHPORT",
+				Value: "8080",
+			},
 		}
 
 		container.LivenessProbe = &corev1.Probe{
-			InitialDelaySeconds: 60,
+			InitialDelaySeconds: 30,
 			Handler: corev1.Handler{
-				TCPSocket: &corev1.TCPSocketAction{
-					Port: intstr.FromString("amqps"),
+				HTTPGet: &corev1.HTTPGetAction{
+					Port:   intstr.FromString("http"),
+					Path:   "/healthz",
+					Scheme: "HTTP",
 				},
 			},
 		}
 
-		container.Ports = []corev1.ContainerPort{{
-			ContainerPort: 5671,
-			Name:          "amqps",
-		}}
+		container.Ports = []corev1.ContainerPort{
+			{
+				ContainerPort: 5671,
+				Name:          "amqps",
+			},
+			{
+				ContainerPort: 8080,
+				Name:          "http",
+			},
+		}
 
 		install.ApplyVolumeMountSimple(container, "none-authservice-cert", "/opt/none-authservice/cert", true)
 	})
diff --git a/pom.properties b/pom.properties
index 045c65307..8f8f65c04 100644
--- a/pom.properties
+++ b/pom.properties
@@ -1,5 +1,5 @@
 application.display.name=EnMasse
 application.bundle.prefix=enmasse
 license.advice.text=EnMasse comprises the following components:
-release.version=0.27-SNAPSHOT
-maven.version=0.27-SNAPSHOT
+release.version=0.28-SNAPSHOT
+maven.version=0.28-SNAPSHOT
diff --git a/pom.xml b/pom.xml
index ef15fa172..69a3fc079 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
     <packaging>pom</packaging>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
 
     <name>EnMasse</name>
     <url>http://enmasse.io/</url>
diff --git a/service-broker/pom.xml b/service-broker/pom.xml
index a608b394e..fdb1c80c1 100644
--- a/service-broker/pom.xml
+++ b/service-broker/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>service-broker</artifactId>
diff --git a/standard-controller/pom.xml b/standard-controller/pom.xml
index 20c50f25f..645e9872c 100644
--- a/standard-controller/pom.xml
+++ b/standard-controller/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>standard-controller</artifactId>
diff --git a/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateBrokerSetGenerator.java b/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateBrokerSetGenerator.java
index 663dc67fc..827295d3e 100644
--- a/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateBrokerSetGenerator.java
+++ b/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateBrokerSetGenerator.java
@@ -14,6 +14,7 @@ import io.fabric8.kubernetes.api.model.*;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.api.model.apps.StatefulSet;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 import static io.enmasse.address.model.KubeUtil.applyPodTemplate;
 
@@ -116,6 +117,14 @@ public class TemplateBrokerSetGenerator implements BrokerSetGenerator {
                 paramMap.put(TemplateParameter.BROKER_GLOBAL_MAX_SIZE, standardInfraConfig.getSpec().getBroker().getGlobalMaxSize());
             }
 
+            if (standardInfraConfig.getSpec().getBroker().getConnectorIdleTimeout() != null) {
+                paramMap.put(TemplateParameter.BROKER_CONNECTOR_IDLE_TIMEOUT_MS, String.valueOf(TimeUnit.SECONDS.toMillis(standardInfraConfig.getSpec().getBroker().getConnectorIdleTimeout())));
+            }
+
+            if (standardInfraConfig.getSpec().getBroker().getConnectorWorkerThreads() != null) {
+                paramMap.put(TemplateParameter.BROKER_CONNECTOR_NETTY_THREADS, String.valueOf(standardInfraConfig.getSpec().getBroker().getConnectorWorkerThreads()));
+            }
+
         }
 
         KubernetesList items = kubernetes.processTemplate(templateName, paramMap);
diff --git a/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateParameter.java b/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateParameter.java
index 246020543..fce557c13 100644
--- a/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateParameter.java
+++ b/standard-controller/src/main/java/io/enmasse/controller/standard/TemplateParameter.java
@@ -26,4 +26,6 @@ public interface TemplateParameter {
     String BROKER_ADDRESS_FULL_POLICY = "BROKER_ADDRESS_FULL_POLICY";
     String BROKER_STORAGE_CAPACITY = "BROKER_STORAGE_CAPACITY";
     String BROKER_GLOBAL_MAX_SIZE = "BROKER_GLOBAL_MAX_SIZE";
+    String BROKER_CONNECTOR_NETTY_THREADS = "BROKER_CONNECTOR_NETTY_THREADS";
+    String BROKER_CONNECTOR_IDLE_TIMEOUT_MS = "BROKER_CONNECTOR_IDLE_TIMEOUT_MS";
 }
diff --git a/standard-controller/src/main/resources/templates/queue-persisted.yaml b/standard-controller/src/main/resources/templates/queue-persisted.yaml
index 3e26760b6..6a5cfaa90 100644
--- a/standard-controller/src/main/resources/templates/queue-persisted.yaml
+++ b/standard-controller/src/main/resources/templates/queue-persisted.yaml
@@ -17,6 +17,11 @@ objects:
       infraUuid: ${INFRA_UUID}
     name: ${NAME}
   spec:
+    ports:
+    - name: health
+      port: 8080
+      protocol: TCP
+      targetPort: artemismetrics
     clusterIP: None
     selector:
       name: ${NAME}
@@ -90,6 +95,14 @@ objects:
             value: ${CLUSTER_ID}
           - name: CERT_DIR
             value: /etc/enmasse-certs
+          - name: CONNECTOR_IN_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_OUT_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_IN_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
+          - name: CONNECTOR_OUT_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
           - name: ADDRESS_FULL_POLICY
             value: ${BROKER_ADDRESS_FULL_POLICY}
           - name: AUTHENTICATION_SERVICE_HOST
@@ -164,6 +177,14 @@ objects:
             value: ${ADDRESS}
           - name: CLUSTER_ID
             value: ${CLUSTER_ID}
+          - name: CONNECTOR_IN_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_OUT_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_IN_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
+          - name: CONNECTOR_OUT_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
           - name: GLOBAL_MAX_SIZE
             value: ${BROKER_GLOBAL_MAX_SIZE}
           - name: ADDRESS_FULL_POLICY
@@ -271,3 +292,9 @@ parameters:
     a quarter of BROKER_MEMORY_LIMIT
   name: BROKER_GLOBAL_MAX_SIZE
   value: "-1"
+- name: BROKER_CONNECTOR_NETTY_THREADS
+  description: Number of threads to allocate to connectors
+  value: "4"
+- name: BROKER_CONNECTOR_IDLE_TIMEOUT_MS
+  description: Idle timeout set for connectors
+  value: "16000"
diff --git a/standard-controller/src/main/resources/templates/topic-persisted.yaml b/standard-controller/src/main/resources/templates/topic-persisted.yaml
index f8f7a9465..0f181c369 100644
--- a/standard-controller/src/main/resources/templates/topic-persisted.yaml
+++ b/standard-controller/src/main/resources/templates/topic-persisted.yaml
@@ -17,6 +17,11 @@ objects:
       infraUuid: ${INFRA_UUID}
     name: ${NAME}
   spec:
+    ports:
+    - name: health
+      port: 8080
+      protocol: TCP
+      targetPort: artemismetrics
     clusterIP: None
     selector:
       name: ${NAME}
@@ -91,6 +96,14 @@ objects:
             value: ${CLUSTER_ID}
           - name: CERT_DIR
             value: /etc/enmasse-certs
+          - name: CONNECTOR_IN_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_OUT_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_IN_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
+          - name: CONNECTOR_OUT_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
           - name: ADDRESS_FULL_POLICY
             value: ${BROKER_ADDRESS_FULL_POLICY}
           - name: AUTHENTICATION_SERVICE_HOST
@@ -194,6 +207,14 @@ objects:
             value: ${ADDRESS}
           - name: CLUSTER_ID
             value: ${CLUSTER_ID}
+          - name: CONNECTOR_IN_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_OUT_NETTY_THREADS
+            value: ${BROKER_CONNECTOR_NETTY_THREADS}
+          - name: CONNECTOR_IN_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
+          - name: CONNECTOR_OUT_IDLE_TIMEOUT_MS
+            value: ${BROKER_CONNECTOR_IDLE_TIMEOUT_MS}
           - name: GLOBAL_MAX_SIZE
             value: ${BROKER_GLOBAL_MAX_SIZE}
           - name: ADDRESS_FULL_POLICY
@@ -301,4 +322,9 @@ parameters:
     a quarter of BROKER_MEMORY_LIMIT
   name: BROKER_GLOBAL_MAX_SIZE
   value: "-1"
-
+- name: BROKER_CONNECTOR_NETTY_THREADS
+  description: Number of threads to allocate to connectors
+  value: "4"
+- name: BROKER_CONNECTOR_IDLE_TIMEOUT_MS
+  description: Idle timeout set for connectors
+  value: "16000"
diff --git a/templates/crds/standardinfraconfigs.crd.yaml b/templates/crds/standardinfraconfigs.crd.yaml
index 86e91f003..954243087 100644
--- a/templates/crds/standardinfraconfigs.crd.yaml
+++ b/templates/crds/standardinfraconfigs.crd.yaml
@@ -105,6 +105,10 @@ spec:
                   type: string
                 updatePersistentVolumeClaim:
                   type: boolean
+                connectorIdleTimeout:
+                  type: integer
+                connectorWorkerThreads:
+                  type: integer
             router:
               type: object
               properties:
@@ -136,3 +140,7 @@ spec:
                   type: integer
                 linkCapacity:
                   type: integer
+                idleTimeout:
+                  type: integer
+                workerThreads:
+                  type: integer
diff --git a/templates/iot/api/010-CustomResourceDefinition-iot-project.yaml b/templates/iot/api/010-CustomResourceDefinition-iot-project.yaml
index ff87bd6e3..e2c47ab0a 100644
--- a/templates/iot/api/010-CustomResourceDefinition-iot-project.yaml
+++ b/templates/iot/api/010-CustomResourceDefinition-iot-project.yaml
@@ -3,6 +3,7 @@ kind: CustomResourceDefinition
 metadata:
   name: iotprojects.iot.enmasse.io
   labels:
+    app: enmasse
     enmasse-component: iot
 spec:
   group: iot.enmasse.io
diff --git a/templates/iot/api/020-ClusterRole-iot-tenant-edit.yaml b/templates/iot/api/020-ClusterRole-iot-tenant-edit.yaml
index 13b0364d5..be287585f 100644
--- a/templates/iot/api/020-ClusterRole-iot-tenant-edit.yaml
+++ b/templates/iot/api/020-ClusterRole-iot-tenant-edit.yaml
@@ -3,6 +3,7 @@ kind: ClusterRole
 metadata:
   name: iot.enmasse.io:tenant-edit
   labels:
+    app: enmasse
     enmasse-component: iot
     rbac.authorization.k8s.io/aggregate-to-admin: "true"
     rbac.authorization.k8s.io/aggregate-to-edit: "true"
diff --git a/templates/iot/api/020-ClusterRole-iot-tenant-view.yaml b/templates/iot/api/020-ClusterRole-iot-tenant-view.yaml
index fb2c9a612..e8757a40b 100644
--- a/templates/iot/api/020-ClusterRole-iot-tenant-view.yaml
+++ b/templates/iot/api/020-ClusterRole-iot-tenant-view.yaml
@@ -3,6 +3,7 @@ kind: ClusterRole
 metadata:
   name: iot.enmasse.io:tenant-view
   labels:
+    app: enmasse
     enmasse-component: iot
     rbac.authorization.k8s.io/aggregate-to-view: "true"
 rules:
diff --git a/topic-forwarder/pom.xml b/topic-forwarder/pom.xml
index db0c2bd83..6a6f7b889 100644
--- a/topic-forwarder/pom.xml
+++ b/topic-forwarder/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>topic-forwarder</artifactId>


Test patch:
diff --git a/k8s-api-testutil/pom.xml b/k8s-api-testutil/pom.xml
index 3d32e6458..fbf2e435c 100644
--- a/k8s-api-testutil/pom.xml
+++ b/k8s-api-testutil/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>io.enmasse</groupId>
     <artifactId>enmasse</artifactId>
-    <version>0.27-SNAPSHOT</version>
+    <version>0.28-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.enmasse</groupId>
diff --git a/systemtests/pom.xml b/systemtests/pom.xml
index 6388ab8fb..d01a15e0e 100644
--- a/systemtests/pom.xml
+++ b/systemtests/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>io.enmasse</groupId>
         <artifactId>enmasse</artifactId>
-        <version>0.27-SNAPSHOT</version>
+        <version>0.28-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>systemtests</artifactId>