diff --git a/CHANGELOG.md b/CHANGELOG.md
index 937f38589..174878909 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,7 @@
 Change log
 ==========
 
-1.9.0 (2016-10-20)
+1.9.0 (2016-11-16)
 -----------------
 
 **Breaking changes**
diff --git a/Jenkinsfile b/Jenkinsfile
index 5de9a3fb1..19ccb4bbc 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -10,7 +10,7 @@ def checkDocs = { ->
 }
 
 def buildImage = { ->
-  wrappedNode(label: "linux && !zfs") {
+  wrappedNode(label: "ubuntu && !zfs", cleanWorkspace: true) {
     stage("build image") {
       deleteDir(); checkout(scm)
       def imageName = "dockerbuildbot/compose:${gitCommit()}"
@@ -37,7 +37,7 @@ def runTests = { Map settings ->
   }
 
   { ->
-    wrappedNode(label: "linux && !zfs") {
+    wrappedNode(label: "ubuntu && !zfs", cleanWorkspace: true) {
       stage("test python=${pythonVersions} / docker=${dockerVersions}") {
         deleteDir(); checkout(scm)
         def storageDriver = sh(script: 'docker info | awk -F \': \' \'$1 == "Storage Driver" { print $2; exit }\'', returnStdout: true).trim()
diff --git a/compose/__init__.py b/compose/__init__.py
index 2638cfd5a..072a6a0b2 100644
--- a/compose/__init__.py
+++ b/compose/__init__.py
@@ -1,4 +1,4 @@
 from __future__ import absolute_import
 from __future__ import unicode_literals
 
-__version__ = '1.9.0-rc4'
+__version__ = '1.9.0'
diff --git a/compose/network.py b/compose/network.py
index 06935a46b..3b57cb94e 100644
--- a/compose/network.py
+++ b/compose/network.py
@@ -111,16 +111,17 @@ def create_ipam_config_from_dict(ipam_dict):
 
 
 def check_remote_network_config(remote, local):
-    if local.driver and remote['Driver'] != local.driver:
+    if local.driver and remote.get('Driver') != local.driver:
         raise ConfigurationError(
             'Network "{}" needs to be recreated - driver has changed'
             .format(local.full_name)
         )
     local_opts = local.driver_opts or {}
-    for k in set.union(set(remote['Options'].keys()), set(local_opts.keys())):
+    remote_opts = remote.get('Options') or {}
+    for k in set.union(set(remote_opts.keys()), set(local_opts.keys())):
         if k in OPTS_EXCEPTIONS:
             continue
-        if remote['Options'].get(k) != local_opts.get(k):
+        if remote_opts.get(k) != local_opts.get(k):
             raise ConfigurationError(
                 'Network "{}" needs to be recreated - options have changed'
                 .format(local.full_name)
diff --git a/compose/service.py b/compose/service.py
index 760d29a7b..ad4267062 100644
--- a/compose/service.py
+++ b/compose/service.py
@@ -10,6 +10,7 @@ from operator import attrgetter
 import enum
 import six
 from docker.errors import APIError
+from docker.errors import NotFound
 from docker.utils import LogConfig
 from docker.utils.ports import build_port_bindings
 from docker.utils.ports import split_port
@@ -829,12 +830,11 @@ class Service(object):
         repo, tag, separator = parse_repository_tag(self.options['image'])
         tag = tag or 'latest'
         log.info('Pulling %s (%s%s%s)...' % (self.name, repo, separator, tag))
-        output = self.client.pull(repo, tag=tag, stream=True)
-
         try:
+            output = self.client.pull(repo, tag=tag, stream=True)
             return progress_stream.get_digest_from_pull(
                 stream_output(output, sys.stdout))
-        except StreamOutputError as e:
+        except (StreamOutputError, NotFound) as e:
             if not ignore_pull_failures:
                 raise
             else:
diff --git a/script/run/run.sh b/script/run/run.sh
index c205cf0f3..85c7e720e 100755
--- a/script/run/run.sh
+++ b/script/run/run.sh
@@ -15,7 +15,7 @@
 
 set -e
 
-VERSION="1.9.0-rc4"
+VERSION="1.9.0"
 IMAGE="docker/compose:$VERSION"
 
 
diff --git a/tests/acceptance/cli_test.py b/tests/acceptance/cli_test.py
index a7cd78f18..f153bd95b 100644
--- a/tests/acceptance/cli_test.py
+++ b/tests/acceptance/cli_test.py
@@ -330,12 +330,13 @@ class CLITestCase(DockerClientTestCase):
     def test_pull_with_ignore_pull_failures(self):
         result = self.dispatch([
             '-f', 'ignore-pull-failures.yml',
-            'pull', '--ignore-pull-failures'])
+            'pull', '--ignore-pull-failures']
+        )
 
         assert 'Pulling simple (busybox:latest)...' in result.stderr
         assert 'Pulling another (nonexisting-image:latest)...' in result.stderr
-        assert 'Error: image library/nonexisting-image' in result.stderr
-        assert 'not found' in result.stderr
+        assert ('repository nonexisting-image not found' in result.stderr or
+                'image library/nonexisting-image:latest not found' in result.stderr)
 
     def test_build_plain(self):
         self.base_dir = 'tests/fixtures/simple-dockerfile'
diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py
index 66ae01474..51c5e226b 100644
--- a/tests/unit/config/config_test.py
+++ b/tests/unit/config/config_test.py
@@ -2493,6 +2493,15 @@ class EnvTest(unittest.TestCase):
             {'ONE': '2', 'TWO': '1', 'THREE': '3', 'FOO': 'bar'},
         )
 
+    def test_environment_overrides_env_file(self):
+        self.assertEqual(
+            resolve_environment({
+                'environment': {'FOO': 'baz'},
+                'env_file': ['tests/fixtures/env/one.env'],
+            }),
+            {'ONE': '2', 'TWO': '1', 'THREE': '3', 'FOO': 'baz'},
+        )
+
     def test_resolve_environment_with_multiple_env_files(self):
         service_dict = {
             'env_file': [
diff --git a/tests/unit/network_test.py b/tests/unit/network_test.py
index 4720b0530..12d06f415 100644
--- a/tests/unit/network_test.py
+++ b/tests/unit/network_test.py
@@ -37,7 +37,9 @@ class NetworkTest(unittest.TestCase):
     def test_check_remote_network_config_driver_mismatch(self):
         net = Network(None, 'compose_test', 'net1', 'overlay')
         with pytest.raises(ConfigurationError):
-            check_remote_network_config({'Driver': 'bridge', 'Options': {}}, net)
+            check_remote_network_config(
+                {'Driver': 'bridge', 'Options': {}}, net
+            )
 
     def test_check_remote_network_config_options_mismatch(self):
         net = Network(None, 'compose_test', 'net1', 'overlay')
@@ -45,3 +47,9 @@ class NetworkTest(unittest.TestCase):
             check_remote_network_config({'Driver': 'overlay', 'Options': {
                 'com.docker.network.driver.foo': 'baz'
             }}, net)
+
+    def test_check_remote_network_config_null_remote(self):
+        net = Network(None, 'compose_test', 'net1', 'overlay')
+        check_remote_network_config(
+            {'Driver': 'overlay', 'Options': None}, net
+        )