Fix DynamoDB local libs
diff --git a/bin/Dockerfile.base b/bin/Dockerfile.base
index 70296b4f3109f..e8c93a5f46496 100644
--- a/bin/Dockerfile.base
+++ b/bin/Dockerfile.base
@@ -33,7 +33,7 @@ RUN apk add --no-cache nss
 # https://github.com/carlossg/docker-maven/blob/master/jdk-8/Dockerfile)
 ARG MAVEN_VERSION=3.6.2
 ARG USER_HOME_DIR="/root"
-ARG SHA=ce50b1c91364cb77efe3776f756a6d92b76d9038b0a0782f7d53acf1e997a14d
+ARG SHA=3fbc92d1961482d6fbd57fbf3dd6d27a4de70778528ee3fb44aa7d27eb32dfdc
 ARG BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries
 RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
   && curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-$MAVEN_VERSION-bin.tar.gz \
@@ -63,6 +63,7 @@ RUN ln -s /usr/bin/python3 /usr/bin/python; ln -s /usr/bin/pip3 /usr/bin/pip
 RUN pip install supervisor
 
 # init environment and cache some dependencies
+ARG DYNAMODB_ZIP_URL=https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.zip
 RUN mkdir -p /opt/code/localstack/localstack/infra && \
     curl -o /tmp/localstack.es.zip \
         https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.0.zip && \
@@ -81,8 +82,7 @@ RUN mkdir -p /opt/code/localstack/localstack/infra && \
         bin/elasticsearch-plugin install analysis-stempel && \
         bin/elasticsearch-plugin install analysis-ukrainian) && \
     mkdir -p /opt/code/localstack/localstack/infra/dynamodb && \
-    curl -o /tmp/localstack.ddb.zip \
-        https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.zip && \
+    curl -o /tmp/localstack.ddb.zip ${DYNAMODB_ZIP_URL} && \
     (cd localstack/infra/dynamodb && unzip -q /tmp/localstack.ddb.zip && rm /tmp/localstack.ddb.zip)
 ADD requirements.txt .
 RUN (pip install --upgrade pip) && \
diff --git a/localstack/constants.py b/localstack/constants.py
index b786d2643a648..80c6bc1ca8363 100644
--- a/localstack/constants.py
+++ b/localstack/constants.py
@@ -82,11 +82,14 @@
  'mapper-murmur3', 'mapper-size', 'analysis-phonetic', 'analysis-smartcn', 'analysis-stempel', 'analysis-ukrainian']
 # Default ES modules to exclude (save apprx 66MB in the final image)
 ELASTICSEARCH_DELETE_MODULES = ['ingest-geoip']
-DYNAMODB_JAR_URL = 'https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.zip'
 ELASTICMQ_JAR_URL = 'https://s3-eu-west-1.amazonaws.com/softwaremill-public/elasticmq-server-0.15.2.jar'
 STS_JAR_URL = 'https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-sts/1.11.14/aws-java-sdk-sts-1.11.14.jar'
 STEPFUNCTIONS_ZIP_URL = 'https://s3.amazonaws.com/stepfunctionslocal/StepFunctionsLocal.zip'
 
+# TODO: Temporarily using a fixed version of DDB in Alpine, as we're hitting a SIGSEGV JVM crash with latest
+DYNAMODB_JAR_URL_ALPINE = 'https://github.com/whummer/dynamodb-local/raw/master/etc/DynamoDBLocal.zip'
+DYNAMODB_JAR_URL = 'https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.zip'
+
 # API endpoint for analytics events
 API_ENDPOINT = os.environ.get('API_ENDPOINT') or 'https://api.localstack.cloud/v1'
 
diff --git a/localstack/dashboard/web/css/style.css b/localstack/dashboard/web/css/style.css
index 14fcae6385cb6..c8845107b86b6 100644
--- a/localstack/dashboard/web/css/style.css
+++ b/localstack/dashboard/web/css/style.css
@@ -8,8 +8,8 @@ body {
 }
 
 #logo {
-    padding-top: 5px;
-    padding-bottom: 5px;
+    padding-top: 7px;
+    padding-bottom: 8px;
     padding-left: 20px;
 }
 
@@ -50,7 +50,7 @@ sidebar div {
     top: 0px;
     bottom: 0px;
     position: absolute;
-    margin-top: 83px;
+    margin-top: 55px;
 }
 
 /* elements */
diff --git a/localstack/dashboard/web/index.html b/localstack/dashboard/web/index.html
index cf9b7fa525c65..0d922ec13a4c7 100644
--- a/localstack/dashboard/web/index.html
+++ b/localstack/dashboard/web/index.html
@@ -23,7 +23,8 @@
         <div class="aui-header-primary">
           <h1 id="logo" class="aui-header-logo aui-header-logo-textonly">
           		<span class="aui-header-logo-device">
-                <img src="img/localstack_small.png" style="height: 30px; padding: 2px; margin-right: 10px;"/></span>
+                <img src="img/localstack_small.png" style="height: 30px; padding: 2px; margin-right: 10px;"/>
+              </span>
           </h1>
         </div>
       </div>
diff --git a/localstack/dashboard/web/views/infra.html b/localstack/dashboard/web/views/infra.html
index 19aa69914b83e..eacf67ff0f657 100644
--- a/localstack/dashboard/web/views/infra.html
+++ b/localstack/dashboard/web/views/infra.html
@@ -37,11 +37,15 @@ <h2>Settings</h2>
     </div>
   </div>
 
-  <div style="position: absolute; top: 20px; left: 80px">
+  <div style="position: absolute; top: 0px; left: 80px">
     <header class="aui-page-header">
       <div class="aui-page-header-inner">
         <div class="aui-page-header-main">
-          <h1 style="margin: 0px">Overview of Deployed Resources</h1>
+          <h1 style="margin: 3px; float: left">Overview of Deployed Resources</h1>
+          <span style="float: right; line-height: 50px">
+            <img src="https://upload.wikimedia.org/wikipedia/commons/2/24/Warning_icon.svg" style="height: 20px" />
+            Please note: This dashboard is outdated and may be removed in a future version. Please check out <a href="https://app.localstack.cloud">LocalStack Pro</a> for a more up-to-date UI.
+          </span>
         </div>
       </div>
     </header>
diff --git a/localstack/services/cloudformation/cloudformation_starter.py b/localstack/services/cloudformation/cloudformation_starter.py
index 024418900167a..2b34e46474c51 100644
--- a/localstack/services/cloudformation/cloudformation_starter.py
+++ b/localstack/services/cloudformation/cloudformation_starter.py
@@ -108,6 +108,22 @@ def fix_ids(obj, **kwargs):
     return recurse_object(resource_json, fix_ids)
 
 
+def update_physical_resource_id(resource):
+    phys_res_id = getattr(resource, 'physical_resource_id', None)
+    if not phys_res_id:
+        if isinstance(resource, lambda_models.LambdaFunction):
+            func_arn = aws_stack.lambda_function_arn(resource.function_name)
+            resource.function_arn = resource.physical_resource_id = func_arn
+        elif isinstance(resource, sfn_models.StateMachine):
+            sm_arn = aws_stack.state_machine_arn(resource.name)
+            resource.physical_resource_id = sm_arn
+        elif isinstance(resource, service_models.StepFunctionsActivity):
+            act_arn = aws_stack.stepfunctions_activity_arn(resource.params.get('Name'))
+            resource.physical_resource_id = act_arn
+        else:
+            LOG.warning('Unable to determine physical_resource_id for resource %s' % type(resource))
+
+
 def apply_patches():
     """ Apply patches to make LocalStack seamlessly interact with the moto backend.
         TODO: Eventually, these patches should be contributed to the upstream repo! """
@@ -195,8 +211,7 @@ def _parse_and_create_resource(logical_id, resource_json, resources_map, region_
             # This resource is either not deployable or already exists. Check if it can be updated
             if not template_deployer.is_updateable(logical_id, resource_wrapped, stack_name):
                 LOG.debug('Resource %s need not be deployed: %s' % (logical_id, resource_json))
-                if resource:
-                    return resource
+                return resource
 
         # fix resource ARNs, make sure to convert account IDs 000000000000 to 123456789012
         resource_json_arns_fixed = clone(json_safe(convert_objs_to_ids(resource_json)))
@@ -215,7 +230,7 @@ def _parse_and_create_resource(logical_id, resource_json, resources_map, region_
 
         # Apply some fixes/patches to the resource names, then deploy resource in LocalStack
         update_resource_name(resource, resource_json)
-        LOG.debug('Deploying CloudFormation resource: %s' % resource_json)
+        LOG.debug('Deploying CloudFormation resource (update=%s): %s' % (update, resource_json))
 
         try:
             CURRENTLY_UPDATING_RESOURCES[resource_hash_key] = True
@@ -303,21 +318,6 @@ def update_resource_id(resource, new_id, props, region_name):
         else:
             LOG.warning('Unexpected resource type when updating ID: %s' % type(resource))
 
-    def update_physical_resource_id(resource):
-        phys_res_id = getattr(resource, 'physical_resource_id', None)
-        if not phys_res_id:
-            if isinstance(resource, lambda_models.LambdaFunction):
-                func_arn = aws_stack.lambda_function_arn(resource.function_name)
-                resource.function_arn = resource.physical_resource_id = func_arn
-            elif isinstance(resource, sfn_models.StateMachine):
-                sm_arn = aws_stack.state_machine_arn(resource.name)
-                resource.physical_resource_id = sm_arn
-            elif isinstance(resource, service_models.StepFunctionsActivity):
-                act_arn = aws_stack.stepfunctions_activity_arn(resource.params.get('Name'))
-                resource.physical_resource_id = act_arn
-            else:
-                LOG.warning('Unable to determine physical_resource_id for resource %s' % type(resource))
-
     parse_and_create_resource_orig = parsing.parse_and_create_resource
     parsing.parse_and_create_resource = parse_and_create_resource
     parse_and_update_resource_orig = parsing.parse_and_update_resource
diff --git a/localstack/services/install.py b/localstack/services/install.py
index 05ef07e6e31de..b1d1b073038e0 100644
--- a/localstack/services/install.py
+++ b/localstack/services/install.py
@@ -10,12 +10,13 @@
 from localstack.utils import bootstrap
 from localstack.constants import (DEFAULT_SERVICE_PORTS, ELASTICMQ_JAR_URL, STS_JAR_URL,
     ELASTICSEARCH_JAR_URL, ELASTICSEARCH_PLUGIN_LIST, ELASTICSEARCH_DELETE_MODULES,
-    DYNAMODB_JAR_URL, LOCALSTACK_MAVEN_VERSION, STEPFUNCTIONS_ZIP_URL, LOCALSTACK_INFRA_PROCESS)
+    DYNAMODB_JAR_URL, DYNAMODB_JAR_URL_ALPINE, LOCALSTACK_MAVEN_VERSION, STEPFUNCTIONS_ZIP_URL,
+    LOCALSTACK_INFRA_PROCESS)
 if __name__ == '__main__':
     bootstrap.bootstrap_installation()
 # flake8: noqa: E402
 from localstack.utils.common import (
-    download, parallelize, run, mkdir, load_file, save_file, unzip, rm_rf, chmod_r, is_alpine)
+    download, parallelize, run, mkdir, load_file, save_file, unzip, rm_rf, chmod_r, is_alpine, in_docker)
 
 THIS_PATH = os.path.dirname(os.path.realpath(__file__))
 ROOT_PATH = os.path.realpath(os.path.join(THIS_PATH, '..'))
@@ -34,6 +35,11 @@
 # Target version for javac, to ensure compatibility with earlier JREs
 JAVAC_TARGET_VERSION = '1.8'
 
+# As of 2019-10-09, the DDB fix (see below) doesn't seem to be required anymore
+APPLY_DDB_ALPINE_FIX = False
+# TODO: 2019-10-09: Temporarily overwriting DDB, as we're hitting a SIGSEGV JVM crash with the latest version
+OVERWRITE_DDB_FILES_IN_DOCKER = True
+
 # set up logger
 LOGGER = logging.getLogger(__name__)
 
@@ -109,18 +115,21 @@ def install_stepfunctions_local():
 
 
 def install_dynamodb_local():
+    if OVERWRITE_DDB_FILES_IN_DOCKER and in_docker():
+        rm_rf(INSTALL_DIR_DDB)
     if not os.path.exists(INSTALL_DIR_DDB):
         log_install_msg('DynamoDB')
         # download and extract archive
         tmp_archive = os.path.join(tempfile.gettempdir(), 'localstack.ddb.zip')
-        download_and_extract_with_retry(DYNAMODB_JAR_URL, tmp_archive, INSTALL_DIR_DDB)
+        dynamodb_url = DYNAMODB_JAR_URL_ALPINE if in_docker() else DYNAMODB_JAR_URL
+        download_and_extract_with_retry(dynamodb_url, tmp_archive, INSTALL_DIR_DDB)
 
     # fix for Alpine, otherwise DynamoDBLocal fails with:
     # DynamoDBLocal_lib/libsqlite4java-linux-amd64.so: __memcpy_chk: symbol not found
     if is_alpine():
         ddb_libs_dir = '%s/DynamoDBLocal_lib' % INSTALL_DIR_DDB
         patched_marker = '%s/alpine_fix_applied' % ddb_libs_dir
-        if not os.path.exists(patched_marker):
+        if APPLY_DDB_ALPINE_FIX and not os.path.exists(patched_marker):
             patched_lib = ('https://rawgit.com/bhuisgen/docker-alpine/master/alpine-dynamodb/' +
                 'rootfs/usr/local/dynamodb/DynamoDBLocal_lib/libsqlite4java-linux-amd64.so')
             patched_jar = ('https://rawgit.com/bhuisgen/docker-alpine/master/alpine-dynamodb/' +
diff --git a/localstack/utils/cloudformation/template_deployer.py b/localstack/utils/cloudformation/template_deployer.py
index c5a6b8a2d853c..689d7b001fbec 100644
--- a/localstack/utils/cloudformation/template_deployer.py
+++ b/localstack/utils/cloudformation/template_deployer.py
@@ -283,7 +283,6 @@ def get_service_name(resource):
     if res_type.endswith('Cognito::UserPool'):
         return 'cognito-idp'
     if parts[-2] == 'Cognito':
-        # TODO add mappings for "cognito-identity"
         return 'cognito-idp'
     return parts[1].lower()
 
@@ -544,11 +543,14 @@ def update_resource(resource_id, resources, stack_name):
     if resource_type not in UPDATEABLE_RESOURCES:
         LOG.warning('Unable to update resource type "%s", id "%s"' % (resource_type, resource_id))
         return
+    LOG.info('Updating resource %s of type %s' % (resource_id, resource_type))
     props = resource['Properties']
     if resource_type == 'Lambda::Function':
         client = aws_stack.connect_to_service('lambda')
         keys = ('FunctionName', 'Role', 'Handler', 'Description', 'Timeout', 'MemorySize', 'Environment', 'Runtime')
         update_props = dict([(k, props[k]) for k in keys if k in props])
+        if 'Code' in props:
+            client.update_function_code(FunctionName=props['FunctionName'], **props['Code'])
         return client.update_function_configuration(**update_props)
     if resource_type == 'ApiGateway::Method':
         client = aws_stack.connect_to_service('apigateway')

* Fix DynamoDB local libs (currently breaking builds on `master`)
* Minor update to dashboard - add deprecation notice
* Small fix in CloudFormation update for Lambda function code