diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 46022b789..f54032556 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 1.6.0b5
+current_version = 1.8.0a1
 parse = (?P<major>[\d]+) # major version number
 	\.(?P<minor>[\d]+) # minor version number
 	\.(?P<patch>[\d]+) # patch version number
diff --git a/.changes/0.0.0.md b/.changes/0.0.0.md
index 4c3cb6b65..f6d8d31d5 100644
--- a/.changes/0.0.0.md
+++ b/.changes/0.0.0.md
@@ -1,5 +1,6 @@
 ## Previous Releases
 For information on prior major and minor releases, see their changelogs:
+- [1.6](https://github.com/dbt-labs/dbt-redshift/blob/1.6.latest/CHANGELOG.md)
 - [1.5](https://github.com/dbt-labs/dbt-redshift/blob/1.5.latest/CHANGELOG.md)
 - [1.4](https://github.com/dbt-labs/dbt-redshift/blob/1.4.latest/CHANGELOG.md)
 - [1.3](https://github.com/dbt-labs/dbt-redshift/blob/1.3.latest/CHANGELOG.md)
diff --git a/.changes/1.6.0-a1.md b/.changes/1.6.0-a1.md
deleted file mode 100644
index 57e14b79c..000000000
--- a/.changes/1.6.0-a1.md
+++ /dev/null
@@ -1 +0,0 @@
-## dbt-redshift 1.6.0-a1 - April 17, 2023
diff --git a/.changes/1.6.0-b1.md b/.changes/1.6.0-b1.md
deleted file mode 100644
index 07e7c693a..000000000
--- a/.changes/1.6.0-b1.md
+++ /dev/null
@@ -1,10 +0,0 @@
-## dbt-redshift 1.6.0-b1 - May 12, 2023
-
-### Fixes
-
-- Adding region as independent param in profiles ([#419](https://github.com/dbt-labs/dbt-redshift/issues/419))
-- Update signature for execute method ([#'](https://github.com/dbt-labs/dbt-redshift/issues/'), [#'](https://github.com/dbt-labs/dbt-redshift/issues/'))
-
-### Dependencies
-
-- Update pytest requirement from ~=7.2 to ~=7.3 ([#414](https://github.com/dbt-labs/dbt-redshift/pull/414))
diff --git a/.changes/1.6.0-b2.md b/.changes/1.6.0-b2.md
deleted file mode 100644
index d0f1d2871..000000000
--- a/.changes/1.6.0-b2.md
+++ /dev/null
@@ -1,11 +0,0 @@
-## dbt-redshift 1.6.0-b2 - May 25, 2023
-
-### Fixes
-
-- Fix redshift_connector issue of timing out after 30s ([#427](https://github.com/dbt-labs/dbt-redshift/issues/427))
-- Add a new connection param to reenable certain Redshift commands in macros. ([#463](https://github.com/dbt-labs/dbt-redshift/issues/463))
-- Escape `%` symbols in table/view/column comments ([#441](https://github.com/dbt-labs/dbt-redshift/issues/441))
-- Use smaller default batch size for seeds ([#347](https://github.com/dbt-labs/dbt-redshift/issues/347))
-
-### Contributors
-- [@jiezhen-chen](https://github.com/jiezhen-chen) ([#427](https://github.com/dbt-labs/dbt-redshift/issues/427))
diff --git a/.changes/1.6.0-b3.md b/.changes/1.6.0-b3.md
deleted file mode 100644
index 31cc589a9..000000000
--- a/.changes/1.6.0-b3.md
+++ /dev/null
@@ -1,23 +0,0 @@
-## dbt-redshift 1.6.0-b3 - June 09, 2023
-
-### Breaking Changes
-
-- sslmode behavior has changed. To connect without ssl, set sslmode = disable. To connect using ssl, set sslmode to verify-ca, or verify-full. ([#429](https://github.com/dbt-labs/dbt-redshift/issues/429))
-- Drop support for python 3.7 ([#dbt-core/7082](https://github.com/dbt-labs/dbt-redshift/issues/dbt-core/7082))
-
-### Features
-
-- Standardize the _connection_keys and debug_query for `dbt debug`. ([#PR754](https://github.com/dbt-labs/dbt-redshift/issues/PR754))
-
-### Fixes
-
-- translate psycopg2 sslmode to ssl and sslmode in redshift_connector ([#429](https://github.com/dbt-labs/dbt-redshift/issues/429))
-- Get autocommit on by default to restore old semantics users had relied on prior to 1.5. Add tests. ([#425](https://github.com/dbt-labs/dbt-redshift/issues/425))
-- remove depdency on postgres__list_relations_without_caching macro ([#488](https://github.com/dbt-labs/dbt-redshift/issues/488))
-
-### Under the Hood
-
-- test constraint rendering of foreign key and unique constraints ([#7417](https://github.com/dbt-labs/dbt-redshift/issues/7417))
-
-### Contributors
-- [@jiezhen-chen](https://github.com/jiezhen-chen) ([#429](https://github.com/dbt-labs/dbt-redshift/issues/429), [#429](https://github.com/dbt-labs/dbt-redshift/issues/429))
diff --git a/.changes/1.6.0-b4.md b/.changes/1.6.0-b4.md
deleted file mode 100644
index d633633ea..000000000
--- a/.changes/1.6.0-b4.md
+++ /dev/null
@@ -1,12 +0,0 @@
-## dbt-redshift 1.6.0-b4 - June 16, 2023
-
-### Breaking Changes
-
-- require latest version of redshift_connector driver ([#492](https://github.com/dbt-labs/dbt-redshift/issues/492))
-
-### Fixes
-
-- remove requirement for region param ([#484](https://github.com/dbt-labs/dbt-redshift/issues/484))
-
-### Contributors
-- [@dataders](https://github.com/dataders) ([#492](https://github.com/dbt-labs/dbt-redshift/issues/492))
diff --git a/.changes/1.6.0-b5.md b/.changes/1.6.0-b5.md
deleted file mode 100644
index 3263cb06e..000000000
--- a/.changes/1.6.0-b5.md
+++ /dev/null
@@ -1,5 +0,0 @@
-## dbt-redshift 1.6.0-b5 - June 23, 2023
-
-### Features
-
-- Add support for materialized views ([#dbt-labs/dbt-core#6911](https://github.com/dbt-labs/dbt-redshift/issues/dbt-labs/dbt-core#6911))
diff --git a/.changes/1.6.0/Breaking Changes-20230522-111945.yaml b/.changes/1.6.0/Breaking Changes-20230522-111945.yaml
deleted file mode 100644
index 63a03b3ba..000000000
--- a/.changes/1.6.0/Breaking Changes-20230522-111945.yaml	
+++ /dev/null
@@ -1,7 +0,0 @@
-kind: Breaking Changes
-body: sslmode behavior has changed. To connect without ssl, set sslmode = disable.
-  To connect using ssl, set sslmode to verify-ca, or verify-full.
-time: 2023-05-22T11:19:45.927903-07:00
-custom:
-  Author: jiezhen-chen
-  Issue: "429"
diff --git a/.changes/1.6.0/Breaking Changes-20230530-165542.yaml b/.changes/1.6.0/Breaking Changes-20230530-165542.yaml
deleted file mode 100644
index 68b4bfdda..000000000
--- a/.changes/1.6.0/Breaking Changes-20230530-165542.yaml	
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Breaking Changes
-body: Drop support for python 3.7
-time: 2023-05-30T16:55:42.393416-04:00
-custom:
-  Author: mikealfare
-  Issue: dbt-core/7082
diff --git a/.changes/1.6.0/Breaking Changes-20230614-144743.yaml b/.changes/1.6.0/Breaking Changes-20230614-144743.yaml
deleted file mode 100644
index c83a7db5e..000000000
--- a/.changes/1.6.0/Breaking Changes-20230614-144743.yaml	
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Breaking Changes
-body: require latest version of redshift_connector driver
-time: 2023-06-14T14:47:43.90505-04:00
-custom:
-  Author: dataders
-  Issue: "492"
diff --git a/.changes/1.6.0/Dependencies-20230421-032407.yaml b/.changes/1.6.0/Dependencies-20230421-032407.yaml
deleted file mode 100644
index 5b08ed592..000000000
--- a/.changes/1.6.0/Dependencies-20230421-032407.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Dependencies
-body: "Update pytest requirement from ~=7.2 to ~=7.3"
-time: 2023-04-21T03:24:07.00000Z
-custom:
-  Author: mikealfare
-  PR: 414
diff --git a/.changes/1.6.0/Features-20230330-165842.yaml b/.changes/1.6.0/Features-20230330-165842.yaml
deleted file mode 100644
index 4f03197aa..000000000
--- a/.changes/1.6.0/Features-20230330-165842.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Features
-body: Add support for materialized views
-time: 2023-03-30T16:58:42.413699-04:00
-custom:
-  Author: mikealfare McKnight-42
-  Issue: dbt-labs/dbt-core#6911
diff --git a/.changes/1.6.0/Features-20230604-041410.yaml b/.changes/1.6.0/Features-20230604-041410.yaml
deleted file mode 100644
index e617e3561..000000000
--- a/.changes/1.6.0/Features-20230604-041410.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Features
-body: Standardize the _connection_keys and debug_query for `dbt debug`.
-time: 2023-06-04T04:14:10.191263-07:00
-custom:
-  Author: versusfacit
-  Issue: PR754
diff --git a/.changes/1.6.0/Fixes-20230428-142321.yaml b/.changes/1.6.0/Fixes-20230428-142321.yaml
deleted file mode 100644
index c7fefda43..000000000
--- a/.changes/1.6.0/Fixes-20230428-142321.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Adding region as independent param in profiles
-time: 2023-04-28T14:23:21.041865-07:00
-custom:
-  Author: nssalian
-  Issue: "419"
diff --git a/.changes/1.6.0/Fixes-20230508-094834.yaml b/.changes/1.6.0/Fixes-20230508-094834.yaml
deleted file mode 100644
index 378c428e3..000000000
--- a/.changes/1.6.0/Fixes-20230508-094834.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Fix redshift_connector issue of timing out after 30s
-time: 2023-05-08T09:48:34.019843-07:00
-custom:
-  Author: jiezhen-chen
-  Issue: "427"
diff --git a/.changes/1.6.0/Fixes-20230509-143721.yaml b/.changes/1.6.0/Fixes-20230509-143721.yaml
deleted file mode 100644
index 6d80abf7c..000000000
--- a/.changes/1.6.0/Fixes-20230509-143721.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Update signature for execute method
-time: 2023-05-09T14:37:21.163869-07:00
-custom:
-  Author: nssalian
-  Issue: ''' '''
diff --git a/.changes/1.6.0/Fixes-20230512-082027.yaml b/.changes/1.6.0/Fixes-20230512-082027.yaml
deleted file mode 100644
index 7116257d8..000000000
--- a/.changes/1.6.0/Fixes-20230512-082027.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: translate psycopg2 sslmode to ssl and sslmode in redshift_connector
-time: 2023-05-12T08:20:27.486301-07:00
-custom:
-  Author: jiezhen-chen
-  Issue: "429"
diff --git a/.changes/1.6.0/Fixes-20230520-043039.yaml b/.changes/1.6.0/Fixes-20230520-043039.yaml
deleted file mode 100644
index 1cb97526e..000000000
--- a/.changes/1.6.0/Fixes-20230520-043039.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Add a new connection param to reenable certain Redshift commands in macros.
-time: 2023-05-20T04:30:39.358755-07:00
-custom:
-  Author: versusfacit
-  Issue: "463"
diff --git a/.changes/1.6.0/Fixes-20230524-151825.yaml b/.changes/1.6.0/Fixes-20230524-151825.yaml
deleted file mode 100644
index bed2f78e4..000000000
--- a/.changes/1.6.0/Fixes-20230524-151825.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Escape `%` symbols in table/view/column comments
-time: 2023-05-24T15:18:25.834088-06:00
-custom:
-  Author: dbeatty10
-  Issue: "441"
diff --git a/.changes/1.6.0/Fixes-20230524-165236.yaml b/.changes/1.6.0/Fixes-20230524-165236.yaml
deleted file mode 100644
index 083191405..000000000
--- a/.changes/1.6.0/Fixes-20230524-165236.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Use smaller default batch size for seeds
-time: 2023-05-24T16:52:36.915348-06:00
-custom:
-  Author: dbeatty10
-  Issue: "347"
diff --git a/.changes/1.6.0/Fixes-20230531-153347.yaml b/.changes/1.6.0/Fixes-20230531-153347.yaml
deleted file mode 100644
index 4c4d324ad..000000000
--- a/.changes/1.6.0/Fixes-20230531-153347.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-kind: Fixes
-body: Get autocommit on by default to restore old semantics users had relied on prior
-  to 1.5. Add tests.
-time: 2023-05-31T15:33:47.180508-07:00
-custom:
-  Author: versusfacit
-  Issue: "425"
diff --git a/.changes/1.6.0/Fixes-20230608-180130.yaml b/.changes/1.6.0/Fixes-20230608-180130.yaml
deleted file mode 100644
index 47dfda72c..000000000
--- a/.changes/1.6.0/Fixes-20230608-180130.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: remove depdency on postgres__list_relations_without_caching macro
-time: 2023-06-08T18:01:30.954976-07:00
-custom:
-  Author: colin-rogers-dbt
-  Issue: "488"
diff --git a/.changes/1.6.0/Fixes-20230612-114853.yaml b/.changes/1.6.0/Fixes-20230612-114853.yaml
deleted file mode 100644
index 1650c5704..000000000
--- a/.changes/1.6.0/Fixes-20230612-114853.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: remove requirement for region param
-time: 2023-06-12T11:48:53.980327-07:00
-custom:
-  Author: colin-rogers-dbt
-  Issue: "484"
diff --git a/.changes/1.6.0/Under the Hood-20230511-162623.yaml b/.changes/1.6.0/Under the Hood-20230511-162623.yaml
deleted file mode 100644
index 9166641af..000000000
--- a/.changes/1.6.0/Under the Hood-20230511-162623.yaml	
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Under the Hood
-body: test constraint rendering of foreign key and unique constraints
-time: 2023-05-11T16:26:23.49096-04:00
-custom:
-  Author: michelleark
-  Issue: "7417"
diff --git a/.changes/unreleased/Dependencies-20230515-195952.yaml b/.changes/unreleased/Dependencies-20230515-195952.yaml
deleted file mode 100644
index 6cfb3a14c..000000000
--- a/.changes/unreleased/Dependencies-20230515-195952.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Update pytest-xdist requirement from ~=3.2 to ~=3.3"
-time: 2023-05-15T19:59:52.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 449
diff --git a/.changes/unreleased/Dependencies-20230523-195945.yaml b/.changes/unreleased/Dependencies-20230523-195945.yaml
deleted file mode 100644
index c2a8a363d..000000000
--- a/.changes/unreleased/Dependencies-20230523-195945.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Update types-requests requirement from ~=2.28 to ~=2.31"
-time: 2023-05-23T19:59:45.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 461
diff --git a/.changes/unreleased/Dependencies-20230605-195944.yaml b/.changes/unreleased/Dependencies-20230605-195944.yaml
deleted file mode 100644
index 52e3ab254..000000000
--- a/.changes/unreleased/Dependencies-20230605-195944.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Update tox requirement from ~=4.5 to ~=4.6"
-time: 2023-06-05T19:59:44.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 481
diff --git a/.changes/unreleased/Dependencies-20230620-195844.yaml b/.changes/unreleased/Dependencies-20230620-195844.yaml
deleted file mode 100644
index 86b482554..000000000
--- a/.changes/unreleased/Dependencies-20230620-195844.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Bump mypy from 1.2.0 to 1.4.0"
-time: 2023-06-20T19:58:44.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 503
diff --git a/.changes/unreleased/Dependencies-20230624-182902.yaml b/.changes/unreleased/Dependencies-20230624-182902.yaml
deleted file mode 100644
index 763f74040..000000000
--- a/.changes/unreleased/Dependencies-20230624-182902.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Update pre-commit requirement from ~=2.21 to ~=3.3"
-time: 2023-06-24T18:29:02.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 426
diff --git a/.changes/unreleased/Dependencies-20230626-195917.yaml b/.changes/unreleased/Dependencies-20230626-195917.yaml
deleted file mode 100644
index c1dcdc504..000000000
--- a/.changes/unreleased/Dependencies-20230626-195917.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Update pytest requirement from ~=7.3 to ~=7.4"
-time: 2023-06-26T19:59:17.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 507
diff --git a/.changes/unreleased/Dependencies-20230626-195934.yaml b/.changes/unreleased/Dependencies-20230626-195934.yaml
deleted file mode 100644
index 4bb681e34..000000000
--- a/.changes/unreleased/Dependencies-20230626-195934.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Bump mypy from 1.4.0 to 1.4.1"
-time: 2023-06-26T19:59:34.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 508
diff --git a/.changes/unreleased/Dependencies-20230703-190419.yaml b/.changes/unreleased/Dependencies-20230703-190419.yaml
deleted file mode 100644
index d736196a3..000000000
--- a/.changes/unreleased/Dependencies-20230703-190419.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: "Dependencies"
-body: "Update pip-tools requirement from ~=6.13 to ~=6.14"
-time: 2023-07-03T19:04:19.00000Z
-custom:
-  Author: dependabot[bot]
-  PR: 517
diff --git a/.changes/unreleased/Features-20230407-104723.yaml b/.changes/unreleased/Features-20230407-104723.yaml
deleted file mode 100644
index 44344e249..000000000
--- a/.changes/unreleased/Features-20230407-104723.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-kind: Features
-time: 2023-04-07T10:47:23.105369-07:00
-custom:
-  Author: jiezhen-chen
-  Issue: 179
diff --git a/.changes/unreleased/Features-20230613-144752.yaml b/.changes/unreleased/Features-20230613-144752.yaml
deleted file mode 100644
index 2b254a9ce..000000000
--- a/.changes/unreleased/Features-20230613-144752.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Features
-body: add merge as a new incremental strategy for redshift
-time: 2023-06-13T14:47:52.054853-07:00
-custom:
-  Author: jiezhen-chen
-  Issue: "402"
diff --git a/.changes/unreleased/Features-20230622-144649.yaml b/.changes/unreleased/Features-20230622-144649.yaml
deleted file mode 100644
index 009dcb861..000000000
--- a/.changes/unreleased/Features-20230622-144649.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Features
-body: add dbt-redshift portion of dbt_clone functionality
-time: 2023-06-22T14:46:49.037145-05:00
-custom:
-  Author: McKnight-42 aranke
-  Issue: "504"
diff --git a/.changes/unreleased/Features-20230714-160100.yaml b/.changes/unreleased/Features-20230714-160100.yaml
deleted file mode 100644
index 44bddf227..000000000
--- a/.changes/unreleased/Features-20230714-160100.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Features
-body: Enumerate implemented materialized view features via integration test flags  and change `autorefresh` to `auto_refresh`
-time: 2023-07-14T16:01:00.54015-04:00
-custom:
-  Author: mikealfare
-  Issue: dbt-labs/dbt-core#6911
diff --git a/.changes/unreleased/Fixes-20230628-123227.yaml b/.changes/unreleased/Fixes-20230628-123227.yaml
deleted file mode 100644
index 4ece8f404..000000000
--- a/.changes/unreleased/Fixes-20230628-123227.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Remove dependent_projects argument from PartialProject call in unit tests
-time: 2023-06-28T12:32:27.637669-04:00
-custom:
-  Author: mikealfare
-  Issue: "7955"
diff --git a/.changes/unreleased/Fixes-20230706-001056.yaml b/.changes/unreleased/Fixes-20230706-001056.yaml
deleted file mode 100644
index 79b205caf..000000000
--- a/.changes/unreleased/Fixes-20230706-001056.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Fix regression in redshift-connector==2.0.912
-time: 2023-07-06T00:10:56.337407-04:00
-custom:
-  Author: mikealfare
-  Issue: "518"
diff --git a/.changes/unreleased/Fixes-20230706-012233.yaml b/.changes/unreleased/Fixes-20230706-012233.yaml
deleted file mode 100644
index bc28b2eec..000000000
--- a/.changes/unreleased/Fixes-20230706-012233.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: Fixed unit test that broke following dbt clone work
-time: 2023-07-06T01:22:33.840137-04:00
-custom:
-  Author: mikealfare
-  Issue: "518"
diff --git a/.changes/unreleased/Fixes-20230706-123329.yaml b/.changes/unreleased/Fixes-20230706-123329.yaml
deleted file mode 100644
index afda869d0..000000000
--- a/.changes/unreleased/Fixes-20230706-123329.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: cast the port as an int
-time: 2023-07-06T12:33:29.799921-07:00
-custom:
-  Author: jiezhen-chen
-  Issue: "518"
diff --git a/.changes/unreleased/Fixes-20230713-105351.yaml b/.changes/unreleased/Fixes-20230713-105351.yaml
deleted file mode 100644
index 47193a357..000000000
--- a/.changes/unreleased/Fixes-20230713-105351.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: hard pin dep on redshift_connector
-time: 2023-07-13T10:53:51.463072-04:00
-custom:
-  Author: dataders
-  Issue: 531 532
diff --git a/.changes/unreleased/Fixes-20230713-190412.yaml b/.changes/unreleased/Fixes-20230713-190412.yaml
deleted file mode 100644
index d50ab7a1f..000000000
--- a/.changes/unreleased/Fixes-20230713-190412.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-kind: Fixes
-body: re-enable query commenting
-time: 2023-07-13T19:04:12.580073-04:00
-custom:
-  Author: dataders
-  Issue: "536"
diff --git a/.github/workflows/bot-changelog.yml b/.github/workflows/bot-changelog.yml
index 94498d25f..fcd344802 100644
--- a/.github/workflows/bot-changelog.yml
+++ b/.github/workflows/bot-changelog.yml
@@ -57,4 +57,4 @@ jobs:
         commit_message: "Add automated changelog yaml from template for bot PR"
         changie_kind: ${{ matrix.changie_kind }}
         label: ${{ matrix.label }}
-        custom_changelog_string: "custom:\n  Author: ${{ github.event.pull_request.user.login }}\n  PR: ${{ github.event.pull_request.number }}\n"
+        custom_changelog_string: "custom:\n  Author: ${{ github.event.pull_request.user.login }}\n  PR: ${{ github.event.pull_request.number }}"
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index 0d6d91855..9d1fe0807 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -134,6 +134,11 @@ jobs:
       TOXENV: integration-${{ matrix.adapter }}
       PYTEST_ADDOPTS: "-v --color=yes -n4 --csv integration_results.csv"
       DBT_INVOCATION_ENV: github-actions
+      DD_CIVISIBILITY_AGENTLESS_ENABLED: true
+      DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}
+      DD_SITE: datadoghq.com
+      DD_ENV: ci
+      DD_SERVICE: ${{ github.event.repository.name }}
 
     steps:
       - name: Check out the repository
@@ -180,7 +185,7 @@ jobs:
           DBT_TEST_USER_1: dbt_test_user_1
           DBT_TEST_USER_2: dbt_test_user_2
           DBT_TEST_USER_3: dbt_test_user_3
-        run: tox
+        run: tox -- --ddtrace
 
       - uses: actions/upload-artifact@v3
         if: always()
@@ -236,4 +241,4 @@ jobs:
           notification_title: 'Redshift nightly integration test failed'
           status: ${{ job.status }}
     env:
-      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEV_CORE_ALERTS }}
+      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEV_ADAPTER_ALERTS }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 1c0885001..88942e251 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -225,4 +225,4 @@ jobs:
       status: "failure"
 
     secrets:
-      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEV_CORE_ALERTS }}
+      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_DEV_ADAPTER_ALERTS }}
diff --git a/.github/workflows/repository-cleanup.yml b/.github/workflows/repository-cleanup.yml
new file mode 100644
index 000000000..c1d780281
--- /dev/null
+++ b/.github/workflows/repository-cleanup.yml
@@ -0,0 +1,30 @@
+# **what?**
+# Cleanup branches left over from automation and testing.  Also cleanup
+# draft releases from release testing.
+
+# **why?**
+# The automations are leaving behind branches and releases that clutter
+# the repository.  Sometimes we need them to debug processes so we don't
+# want them immediately deleted.  Running on Saturday to avoid running
+# at the same time as an actual release to prevent breaking a release
+# mid-release.
+
+# **when?**
+# Mainly on a schedule of 12:00 Saturday.
+# Manual trigger can also run on demand
+
+name: Repository Cleanup
+
+on:
+  schedule:
+    - cron: '0 12 * * SAT' # At 12:00 on Saturday - details in `why` above
+
+  workflow_dispatch: # for manual triggering
+
+permissions:
+  contents: write
+
+jobs:
+  cleanup-repo:
+    uses: dbt-labs/actions/.github/workflows/repository-cleanup.yml@main
+    secrets: inherit
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index a56455d55..d902340a9 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -1,15 +1,12 @@
-name: 'Close stale issues and PRs'
+name: "Close stale issues and PRs"
 on:
   schedule:
     - cron: "30 1 * * *"
+
+permissions:
+  issues: write
+  pull-requests: write
+
 jobs:
   stale:
-    runs-on: ubuntu-latest
-    steps:
-      # pinned at v4 (https://github.com/actions/stale/releases/tag/v4.0.0)
-      - uses: actions/stale@cdf15f641adb27a71842045a94023bef6945e3aa
-        with:
-          stale-issue-message: "This issue has been marked as Stale because it has been open for 180 days with no activity. If you would like the issue to remain open, please remove the stale label or comment on the issue, or it will be closed in 7 days."
-          stale-pr-message: "This PR has been marked as Stale because it has been open for 180 days with no activity. If you would like the PR to remain open, please remove the stale label or comment on the PR, or it will be closed in 7 days."
-          # mark issues/PRs stale when they haven't seen activity in 180 days
-          days-before-stale: 180
+    uses: dbt-labs/actions/.github/workflows/stale-bot-matrix.yml@main
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd2d5cafc..04a8e7db1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,78 +5,9 @@
 - "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version.
 - Do not edit this file directly. This file is auto-generated using [changie](https://github.com/miniscruff/changie). For details on how to document a change, see [the contributing guide](https://github.com/dbt-labs/dbt-redshift/blob/main/CONTRIBUTING.md#adding-changelog-entry)
 
-## dbt-redshift 1.6.0-b5 - June 23, 2023
-
-### Features
-
-- Add support for materialized views ([#dbt-labs/dbt-core#6911](https://github.com/dbt-labs/dbt-redshift/issues/dbt-labs/dbt-core#6911))
-
-
-
-## dbt-redshift 1.6.0-b4 - June 16, 2023
-
-### Breaking Changes
-
-- require latest version of redshift_connector driver ([#492](https://github.com/dbt-labs/dbt-redshift/issues/492))
-
-### Fixes
-
-- remove requirement for region param ([#484](https://github.com/dbt-labs/dbt-redshift/issues/484))
-
-### Contributors
-- [@dataders](https://github.com/dataders) ([#492](https://github.com/dbt-labs/dbt-redshift/issues/492))
-
-## dbt-redshift 1.6.0-b3 - June 09, 2023
-
-### Breaking Changes
-
-- sslmode behavior has changed. To connect without ssl, set sslmode = disable. To connect using ssl, set sslmode to verify-ca, or verify-full. ([#429](https://github.com/dbt-labs/dbt-redshift/issues/429))
-- Drop support for python 3.7 ([#dbt-core/7082](https://github.com/dbt-labs/dbt-redshift/issues/dbt-core/7082))
-
-### Features
-
-- Standardize the _connection_keys and debug_query for `dbt debug`. ([#PR754](https://github.com/dbt-labs/dbt-redshift/issues/PR754))
-
-### Fixes
-
-- translate psycopg2 sslmode to ssl and sslmode in redshift_connector ([#429](https://github.com/dbt-labs/dbt-redshift/issues/429))
-- Get autocommit on by default to restore old semantics users had relied on prior to 1.5. Add tests. ([#425](https://github.com/dbt-labs/dbt-redshift/issues/425))
-- remove depdency on postgres__list_relations_without_caching macro ([#488](https://github.com/dbt-labs/dbt-redshift/issues/488))
-
-### Under the Hood
-
-- test constraint rendering of foreign key and unique constraints ([#7417](https://github.com/dbt-labs/dbt-redshift/issues/7417))
-
-### Contributors
-- [@jiezhen-chen](https://github.com/jiezhen-chen) ([#429](https://github.com/dbt-labs/dbt-redshift/issues/429), [#429](https://github.com/dbt-labs/dbt-redshift/issues/429))
-
-## dbt-redshift 1.6.0-b2 - May 25, 2023
-
-### Fixes
-
-- Fix redshift_connector issue of timing out after 30s ([#427](https://github.com/dbt-labs/dbt-redshift/issues/427))
-- Add a new connection param to reenable certain Redshift commands in macros. ([#463](https://github.com/dbt-labs/dbt-redshift/issues/463))
-- Escape `%` symbols in table/view/column comments ([#441](https://github.com/dbt-labs/dbt-redshift/issues/441))
-- Use smaller default batch size for seeds ([#347](https://github.com/dbt-labs/dbt-redshift/issues/347))
-
-### Contributors
-- [@jiezhen-chen](https://github.com/jiezhen-chen) ([#427](https://github.com/dbt-labs/dbt-redshift/issues/427))
-
-## dbt-redshift 1.6.0-b1 - May 12, 2023
-
-### Fixes
-
-- Adding region as independent param in profiles ([#419](https://github.com/dbt-labs/dbt-redshift/issues/419))
-- Update signature for execute method ([#'](https://github.com/dbt-labs/dbt-redshift/issues/'), [#'](https://github.com/dbt-labs/dbt-redshift/issues/'))
-
-### Dependencies
-
-- Update pytest requirement from ~=7.2 to ~=7.3 ([#414](https://github.com/dbt-labs/dbt-redshift/pull/414))
-
-## dbt-redshift 1.6.0-a1 - April 17, 2023
-
 ## Previous Releases
 For information on prior major and minor releases, see their changelogs:
+- [1.6](https://github.com/dbt-labs/dbt-redshift/blob/1.6.latest/CHANGELOG.md)
 - [1.5](https://github.com/dbt-labs/dbt-redshift/blob/1.5.latest/CHANGELOG.md)
 - [1.4](https://github.com/dbt-labs/dbt-redshift/blob/1.4.latest/CHANGELOG.md)
 - [1.3](https://github.com/dbt-labs/dbt-redshift/blob/1.3.latest/CHANGELOG.md)
diff --git a/dbt/adapters/redshift/__version__.py b/dbt/adapters/redshift/__version__.py
index da9f11e34..f15b401d1 100644
--- a/dbt/adapters/redshift/__version__.py
+++ b/dbt/adapters/redshift/__version__.py
@@ -1 +1 @@
-version = "1.6.0b5"
+version = "1.8.0a1"
diff --git a/dbt/adapters/redshift/connections.py b/dbt/adapters/redshift/connections.py
index 500de430f..0c9d1b7ed 100644
--- a/dbt/adapters/redshift/connections.py
+++ b/dbt/adapters/redshift/connections.py
@@ -1,7 +1,7 @@
 import re
 from multiprocessing import Lock
 from contextlib import contextmanager
-from typing import NewType, Tuple, Union, Optional, List
+from typing import Tuple, Union, Optional, List
 from dataclasses import dataclass, field
 
 import agate
@@ -12,7 +12,7 @@
 from dbt.adapters.sql import SQLConnectionManager
 from dbt.contracts.connection import AdapterResponse, Connection, Credentials
 from dbt.contracts.util import Replaceable
-from dbt.dataclass_schema import FieldEncoder, dbtClassMixin, StrEnum, ValidationError
+from dbt.dataclass_schema import dbtClassMixin, StrEnum, ValidationError
 from dbt.events import AdapterLogger
 from dbt.exceptions import DbtRuntimeError, CompilationError
 import dbt.flags
@@ -36,18 +36,6 @@ def get_message(self) -> str:
 drop_lock: Lock = dbt.flags.MP_CONTEXT.Lock()  # type: ignore
 
 
-IAMDuration = NewType("IAMDuration", int)
-
-
-class IAMDurationEncoder(FieldEncoder):
-    @property
-    def json_schema(self):
-        return {"type": "integer", "minimum": 0, "maximum": 65535}
-
-
-dbtClassMixin.register_field_encoders({IAMDuration: IAMDurationEncoder()})
-
-
 class RedshiftConnectionMethod(StrEnum):
     DATABASE = "database"
     IAM = "iam"
@@ -252,8 +240,9 @@ class RedshiftConnectionManager(SQLConnectionManager):
     def _get_backend_pid(self):
         sql = "select pg_backend_pid()"
         _, cursor = self.add_query(sql)
+
         res = cursor.fetchone()
-        return res
+        return res[0]
 
     def cancel(self, connection: Connection):
         try:
@@ -265,9 +254,10 @@ def cancel(self, connection: Connection):
             raise
 
         sql = f"select pg_terminate_backend({pid})"
-        _, cursor = self.add_query(sql)
-        res = cursor.fetchone()
-        logger.debug(f"Cancel query '{connection.name}': {res}")
+        cursor = connection.handle.cursor()
+        logger.debug(f"Cancel query on: '{connection.name}' with PID: {pid}")
+        logger.debug(sql)
+        cursor.execute(sql)
 
     @classmethod
     def get_response(cls, cursor: redshift_connector.Cursor) -> AdapterResponse:
diff --git a/dbt/adapters/redshift/relation.py b/dbt/adapters/redshift/relation.py
index 0ef4fe276..182b9b810 100644
--- a/dbt/adapters/redshift/relation.py
+++ b/dbt/adapters/redshift/relation.py
@@ -32,6 +32,17 @@ class RedshiftRelation(BaseRelation):
     relation_configs = {
         RelationType.MaterializedView.value: RedshiftMaterializedViewConfig,
     }
+    renameable_relations = frozenset(
+        {
+            RelationType.View,
+            RelationType.Table,
+        }
+    )
+    replaceable_relations = frozenset(
+        {
+            RelationType.View,
+        }
+    )
 
     def __post_init__(self):
         # Check for length of Redshift table/view names.
diff --git a/dbt/adapters/redshift/relation_configs/materialized_view.py b/dbt/adapters/redshift/relation_configs/materialized_view.py
index 5c76e949b..1c6fb229a 100644
--- a/dbt/adapters/redshift/relation_configs/materialized_view.py
+++ b/dbt/adapters/redshift/relation_configs/materialized_view.py
@@ -23,6 +23,7 @@
     RedshiftSortConfig,
     RedshiftSortConfigChange,
 )
+from dbt.adapters.redshift.utility import evaluate_bool
 
 
 @dataclass(frozen=True, eq=True, unsafe_hash=True)
@@ -122,10 +123,17 @@ def parse_model_node(cls, model_node: ModelNode) -> dict:
             "mv_name": model_node.identifier,
             "schema_name": model_node.schema,
             "database_name": model_node.database,
-            "backup": model_node.config.extra.get("backup"),
-            "autorefresh": model_node.config.extra.get("auto_refresh"),
         }
 
+        # backup/autorefresh can be bools or strings
+        backup_value = model_node.config.extra.get("backup")
+        if backup_value is not None:
+            config_dict["backup"] = evaluate_bool(backup_value)
+
+        autorefresh_value = model_node.config.extra.get("auto_refresh")
+        if autorefresh_value is not None:
+            config_dict["autorefresh"] = evaluate_bool(autorefresh_value)
+
         if query := model_node.compiled_code:
             config_dict.update({"query": query.strip()})
 
diff --git a/dbt/adapters/redshift/utility.py b/dbt/adapters/redshift/utility.py
new file mode 100644
index 000000000..64f5e9cd8
--- /dev/null
+++ b/dbt/adapters/redshift/utility.py
@@ -0,0 +1,25 @@
+from typing import Union
+
+
+def evaluate_bool_str(value: str) -> bool:
+    value = value.strip().lower()
+    if value == "true":
+        return True
+    elif value == "false":
+        return False
+    else:
+        raise ValueError(f"Invalid boolean string value: {value}")
+
+
+def evaluate_bool(value: Union[str, bool]) -> bool:
+    if not value:
+        return False
+    if isinstance(value, bool):
+        return value
+    elif isinstance(value, str):
+        return evaluate_bool_str(value)
+    else:
+        raise TypeError(
+            f"Invalid type for boolean evaluation, "
+            f"expecting boolean or str, recieved: {type(value)}"
+        )
diff --git a/dbt/include/redshift/macros/adapters.sql b/dbt/include/redshift/macros/adapters.sql
index 557f582a5..5da047f58 100644
--- a/dbt/include/redshift/macros/adapters.sql
+++ b/dbt/include/redshift/macros/adapters.sql
@@ -312,12 +312,3 @@
   {% endif %}
 
 {% endmacro %}
-
-
-{% macro redshift__get_drop_relation_sql(relation) %}
-    {%- if relation.is_materialized_view -%}
-        {{ redshift__drop_materialized_view(relation) }}
-    {%- else -%}
-        drop {{ relation.type }} if exists {{ relation }} cascade
-    {%- endif -%}
-{% endmacro %}
diff --git a/dbt/include/redshift/macros/materializations/incremental_merge.sql b/dbt/include/redshift/macros/materializations/incremental_merge.sql
index fb49a3820..59a3391e3 100644
--- a/dbt/include/redshift/macros/materializations/incremental_merge.sql
+++ b/dbt/include/redshift/macros/materializations/incremental_merge.sql
@@ -16,6 +16,7 @@
     {%- set merge_update_columns = config.get('merge_update_columns') -%}
     {%- set merge_exclude_columns = config.get('merge_exclude_columns') -%}
     {%- set update_columns = get_merge_update_columns(merge_update_columns, merge_exclude_columns, dest_columns) -%}
+    {%- set insert_columns = get_merge_update_columns(none, none, dest_columns) -%}
     {%- set sql_header = config.get('sql_header', none) -%}
 
     {% if unique_key %}
@@ -51,13 +52,13 @@
     {% endif %}
 
     when not matched then insert (
-        {% for column_name in update_columns -%}
+        {% for column_name in insert_columns -%}
             {{ column_name }}
             {%- if not loop.last %}, {% endif %}
         {% endfor %}
     )
     values (
-        {% for column_name in update_columns -%}
+        {% for column_name in insert_columns -%}
             DBT_INTERNAL_SOURCE.{{ column_name }}
             {%- if not loop.last %}, {% endif %}
         {% endfor %}
diff --git a/dbt/include/redshift/macros/materializations/materialized_view.sql b/dbt/include/redshift/macros/materializations/materialized_view.sql
index 736eaacca..5cdb26504 100644
--- a/dbt/include/redshift/macros/materializations/materialized_view.sql
+++ b/dbt/include/redshift/macros/materializations/materialized_view.sql
@@ -1,106 +1,5 @@
-{% macro redshift__get_alter_materialized_view_as_sql(
-    relation,
-    configuration_changes,
-    sql,
-    existing_relation,
-    backup_relation,
-    intermediate_relation
-) %}
-
-    -- apply a full refresh immediately if needed
-    {% if configuration_changes.requires_full_refresh %}
-
-        {{ get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) }}
-
-    -- otherwise apply individual changes as needed
-    {% else %}
-
-        {%- set autorefresh = configuration_changes.autorefresh -%}
-        {%- if autorefresh -%}{{- log('Applying UPDATE AUTOREFRESH to: ' ~ relation) -}}{%- endif -%}
-
-        alter materialized view {{ relation }}
-            auto refresh {% if autorefresh.context %}yes{% else %}no{% endif %}
-
-    {%- endif -%}
-
-{% endmacro %}
-
-
-{% macro redshift__get_create_materialized_view_as_sql(relation, sql) %}
-
-    {%- set materialized_view = relation.from_runtime_config(config) -%}
-
-    create materialized view {{ materialized_view.path }}
-        backup {% if materialized_view.backup %}yes{% else %}no{% endif %}
-        diststyle {{ materialized_view.dist.diststyle }}
-        {% if materialized_view.dist.distkey %}distkey ({{ materialized_view.dist.distkey }}){% endif %}
-        {% if materialized_view.sort.sortkey %}sortkey ({{ ','.join(materialized_view.sort.sortkey) }}){% endif %}
-        auto refresh {% if materialized_view.autorefresh %}yes{% else %}no{% endif %}
-    as (
-        {{ materialized_view.query }}
-    );
-
-{% endmacro %}
-
-
-{% macro redshift__get_replace_materialized_view_as_sql(relation, sql, existing_relation, backup_relation, intermediate_relation) %}
-    {{ redshift__get_drop_relation_sql(existing_relation) }};
-    {{ get_create_materialized_view_as_sql(relation, sql) }}
-{% endmacro %}
-
-
 {% macro redshift__get_materialized_view_configuration_changes(existing_relation, new_config) %}
     {% set _existing_materialized_view = redshift__describe_materialized_view(existing_relation) %}
     {% set _configuration_changes = existing_relation.materialized_view_config_changeset(_existing_materialized_view, new_config) %}
     {% do return(_configuration_changes) %}
 {% endmacro %}
-
-
-{% macro redshift__refresh_materialized_view(relation) -%}
-    refresh materialized view {{ relation }}
-{% endmacro %}
-
-
-{% macro redshift__describe_materialized_view(relation) %}
-    {#-
-        These need to be separate queries because redshift will not let you run queries
-        against svv_table_info and pg_views in the same query. The same is true of svv_redshift_columns.
-    -#}
-
-    {%- set _materialized_view_sql -%}
-        select
-            tb.database,
-            tb.schema,
-            tb.table,
-            tb.diststyle,
-            tb.sortkey1,
-            mv.autorefresh
-        from svv_table_info tb
-        left join stv_mv_info mv
-            on mv.db_name = tb.database
-            and mv.schema = tb.schema
-            and mv.name = tb.table
-        where tb.table ilike '{{ relation.identifier }}'
-        and tb.schema ilike '{{ relation.schema }}'
-        and tb.database ilike '{{ relation.database }}'
-    {%- endset %}
-    {% set _materialized_view = run_query(_materialized_view_sql) %}
-
-    {%- set _query_sql -%}
-        select
-            vw.definition
-        from pg_views vw
-        where vw.viewname = '{{ relation.identifier }}'
-        and vw.schemaname = '{{ relation.schema }}'
-        and vw.definition ilike '%create materialized view%'
-    {%- endset %}
-    {% set _query = run_query(_query_sql) %}
-
-    {% do return({'materialized_view': _materialized_view, 'query': _query}) %}
-
-{% endmacro %}
-
-
-{% macro redshift__drop_materialized_view(relation) -%}
-    drop materialized view if exists {{ relation }}
-{%- endmacro %}
diff --git a/dbt/include/redshift/macros/materializations/seeds/helpers.sql b/dbt/include/redshift/macros/materializations/seeds/helpers.sql
index 34f83548a..32afdae81 100644
--- a/dbt/include/redshift/macros/materializations/seeds/helpers.sql
+++ b/dbt/include/redshift/macros/materializations/seeds/helpers.sql
@@ -1,3 +1,27 @@
+{% macro redshift__create_csv_table(model, agate_table) %}
+  {%- set column_override = model['config'].get('column_types', {}) -%}
+  {%- set quote_seed_column = model['config'].get('quote_columns', None) -%}
+  {%- set _dist = model['config'].get('dist', None) -%}
+
+  {% set sql %}
+    create table {{ this.render() }} (
+        {%- for col_name in agate_table.column_names -%}
+            {%- set inferred_type = adapter.convert_type(agate_table, loop.index0) -%}
+            {%- set type = column_override.get(col_name, inferred_type) -%}
+            {%- set column_name = (col_name | string) -%}
+            {{ adapter.quote_seed_column(column_name, quote_seed_column) }} {{ type }} {%- if not loop.last -%}, {%- endif -%}
+        {%- endfor -%}
+    )
+    {{ dist(_dist) }}
+  {% endset %}
+
+  {% call statement('_') -%}
+    {{ sql }}
+  {%- endcall %}
+
+  {{ return(sql) }}
+{% endmacro %}
+
 {% macro redshift__get_batch_size() %}
   {{ return(500) }}
 {% endmacro %}
diff --git a/dbt/include/redshift/macros/materializations/table.sql b/dbt/include/redshift/macros/materializations/table.sql
new file mode 100644
index 000000000..907c83874
--- /dev/null
+++ b/dbt/include/redshift/macros/materializations/table.sql
@@ -0,0 +1,69 @@
+{% materialization table, adapter='redshift' %}
+
+  {%- set existing_relation = load_cached_relation(this) -%}
+  {%- set target_relation = this.incorporate(type='table') %}
+  {%- set intermediate_relation =  make_intermediate_relation(target_relation) -%}
+  -- the intermediate_relation should not already exist in the database; get_relation
+  -- will return None in that case. Otherwise, we get a relation that we can drop
+  -- later, before we try to use this name for the current operation
+  {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}
+  /*
+      See ../view/view.sql for more information about this relation.
+  */
+  {%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}
+  {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}
+  -- as above, the backup_relation should not already exist
+  {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}
+  -- grab current tables grants config for comparision later on
+  {% set grant_config = config.get('grants') %}
+
+  -- drop the temp relations if they exist already in the database
+  {{ drop_relation_if_exists(preexisting_intermediate_relation) }}
+  {{ drop_relation_if_exists(preexisting_backup_relation) }}
+
+  {{ run_hooks(pre_hooks, inside_transaction=False) }}
+
+  -- `BEGIN` happens here:
+  {{ run_hooks(pre_hooks, inside_transaction=True) }}
+
+  -- build model
+  {% call statement('main') -%}
+    {{ get_create_table_as_sql(False, intermediate_relation, sql) }}
+  {%- endcall %}
+
+  -- cleanup
+  {% if existing_relation is not none %}
+     /* Do the equivalent of rename_if_exists. 'existing_relation' could have been dropped
+        since the variable was first set. */
+    {% set existing_relation = load_cached_relation(existing_relation) %}
+    {% if existing_relation is not none %}
+        {% if existing_relation.can_be_renamed %}
+            {{ adapter.rename_relation(existing_relation, backup_relation) }}
+        {% else  %}
+            {{ drop_relation_if_exists(existing_relation) }}
+        {% endif %}
+    {% endif %}
+  {% endif %}
+
+
+  {{ adapter.rename_relation(intermediate_relation, target_relation) }}
+
+  {% do create_indexes(target_relation) %}
+
+  {{ run_hooks(post_hooks, inside_transaction=True) }}
+
+  {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}
+  {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}
+
+  {% do persist_docs(target_relation, model) %}
+
+  -- `COMMIT` happens here
+  {{ adapter.commit() }}
+
+  -- finally, drop the existing/backup relation after the commit
+  {{ drop_relation_if_exists(backup_relation) }}
+
+  {{ run_hooks(post_hooks, inside_transaction=False) }}
+
+  {{ return({'relations': [target_relation]}) }}
+{% endmaterialization %}
diff --git a/dbt/include/redshift/macros/materializations/view.sql b/dbt/include/redshift/macros/materializations/view.sql
new file mode 100644
index 000000000..f353f913f
--- /dev/null
+++ b/dbt/include/redshift/macros/materializations/view.sql
@@ -0,0 +1,77 @@
+{%- materialization view, adapter='redshift' -%}
+
+  {%- set existing_relation = load_cached_relation(this) -%}
+  {%- set target_relation = this.incorporate(type='view') -%}
+  {%- set intermediate_relation =  make_intermediate_relation(target_relation) -%}
+
+  -- the intermediate_relation should not already exist in the database; get_relation
+  -- will return None in that case. Otherwise, we get a relation that we can drop
+  -- later, before we try to use this name for the current operation
+  {%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}
+  /*
+     This relation (probably) doesn't exist yet. If it does exist, it's a leftover from
+     a previous run, and we're going to try to drop it immediately. At the end of this
+     materialization, we're going to rename the "existing_relation" to this identifier,
+     and then we're going to drop it. In order to make sure we run the correct one of:
+       - drop view ...
+       - drop table ...
+
+     We need to set the type of this relation to be the type of the existing_relation, if it exists,
+     or else "view" as a sane default if it does not. Note that if the existing_relation does not
+     exist, then there is nothing to move out of the way and subsequentally drop. In that case,
+     this relation will be effectively unused.
+  */
+  {%- set backup_relation_type = 'view' if existing_relation is none else existing_relation.type -%}
+  {%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}
+  -- as above, the backup_relation should not already exist
+  {%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}
+  -- grab current tables grants config for comparision later on
+  {% set grant_config = config.get('grants') %}
+
+  {{ run_hooks(pre_hooks, inside_transaction=False) }}
+
+  -- drop the temp relations if they exist already in the database
+  {{ drop_relation_if_exists(preexisting_intermediate_relation) }}
+  {{ drop_relation_if_exists(preexisting_backup_relation) }}
+
+  -- `BEGIN` happens here:
+  {{ run_hooks(pre_hooks, inside_transaction=True) }}
+
+  -- build model
+  {% call statement('main') -%}
+    {{ get_create_view_as_sql(intermediate_relation, sql) }}
+  {%- endcall %}
+
+  -- cleanup
+  -- move the existing view out of the way
+  {% if existing_relation is not none %}
+     /* Do the equivalent of rename_if_exists. 'existing_relation' could have been dropped
+        since the variable was first set. */
+    {% set existing_relation = load_cached_relation(existing_relation) %}
+    {% if existing_relation is not none %}
+        {% if existing_relation.can_be_renamed %}
+            {{ adapter.rename_relation(existing_relation, backup_relation) }}
+        {% else  %}
+            {{ drop_relation_if_exists(existing_relation) }}
+        {% endif %}
+    {% endif %}
+  {% endif %}
+
+  {{ adapter.rename_relation(intermediate_relation, target_relation) }}
+
+  {% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}
+  {% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}
+
+  {% do persist_docs(target_relation, model) %}
+
+  {{ run_hooks(post_hooks, inside_transaction=True) }}
+
+  {{ adapter.commit() }}
+
+  {{ drop_relation_if_exists(backup_relation) }}
+
+  {{ run_hooks(post_hooks, inside_transaction=False) }}
+
+  {{ return({'relations': [target_relation]}) }}
+
+{%- endmaterialization -%}
diff --git a/dbt/include/redshift/macros/relations.sql b/dbt/include/redshift/macros/relations.sql
index 28c6bc377..6d83c36b9 100644
--- a/dbt/include/redshift/macros/relations.sql
+++ b/dbt/include/redshift/macros/relations.sql
@@ -24,6 +24,7 @@ with
         from pg_depend
         left join pg_rewrite
           on pg_depend.objid = pg_rewrite.oid
+        where coalesce(pg_rewrite.ev_class, pg_depend.objid) != pg_depend.refobjid
     )
 
 select distinct
@@ -36,7 +37,6 @@ join relation ref
     on dependency.ref_relation_id = ref.relation_id
 join relation dep
     on dependency.dep_relation_id = dep.relation_id
-where ref.relation_name != dep.relation_name
 
 {%- endcall -%}
 
diff --git a/dbt/include/redshift/macros/relations/materialized_view/alter.sql b/dbt/include/redshift/macros/relations/materialized_view/alter.sql
new file mode 100644
index 000000000..7f0379847
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/materialized_view/alter.sql
@@ -0,0 +1,26 @@
+{% macro redshift__get_alter_materialized_view_as_sql(
+    relation,
+    configuration_changes,
+    sql,
+    existing_relation,
+    backup_relation,
+    intermediate_relation
+) %}
+
+    -- apply a full refresh immediately if needed
+    {% if configuration_changes.requires_full_refresh %}
+
+        {{ get_replace_sql(existing_relation, relation,  sql) }}
+
+    -- otherwise apply individual changes as needed
+    {% else %}
+
+        {%- set autorefresh = configuration_changes.autorefresh -%}
+        {%- if autorefresh -%}{{- log('Applying UPDATE AUTOREFRESH to: ' ~ relation) -}}{%- endif -%}
+
+        alter materialized view {{ relation }}
+            auto refresh {% if autorefresh.context %}yes{% else %}no{% endif %}
+
+    {%- endif -%}
+
+{% endmacro %}
diff --git a/dbt/include/redshift/macros/relations/materialized_view/create.sql b/dbt/include/redshift/macros/relations/materialized_view/create.sql
new file mode 100644
index 000000000..b84680525
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/materialized_view/create.sql
@@ -0,0 +1,15 @@
+{% macro redshift__get_create_materialized_view_as_sql(relation, sql) %}
+
+    {%- set materialized_view = relation.from_runtime_config(config) -%}
+
+    create materialized view {{ materialized_view.path }}
+        backup {% if materialized_view.backup %}yes{% else %}no{% endif %}
+        diststyle {{ materialized_view.dist.diststyle }}
+        {% if materialized_view.dist.distkey %}distkey ({{ materialized_view.dist.distkey }}){% endif %}
+        {% if materialized_view.sort.sortkey %}sortkey ({{ ','.join(materialized_view.sort.sortkey) }}){% endif %}
+        auto refresh {% if materialized_view.autorefresh %}yes{% else %}no{% endif %}
+    as (
+        {{ materialized_view.query }}
+    );
+
+{% endmacro %}
diff --git a/dbt/include/redshift/macros/relations/materialized_view/describe.sql b/dbt/include/redshift/macros/relations/materialized_view/describe.sql
new file mode 100644
index 000000000..5a8213068
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/materialized_view/describe.sql
@@ -0,0 +1,38 @@
+{% macro redshift__describe_materialized_view(relation) %}
+    {#-
+        These need to be separate queries because redshift will not let you run queries
+        against svv_table_info and pg_views in the same query. The same is true of svv_redshift_columns.
+    -#}
+
+    {%- set _materialized_view_sql -%}
+        select
+            tb.database,
+            tb.schema,
+            tb.table,
+            tb.diststyle,
+            tb.sortkey1,
+            mv.autorefresh
+        from svv_table_info tb
+        left join stv_mv_info mv
+            on mv.db_name = tb.database
+            and mv.schema = tb.schema
+            and mv.name = tb.table
+        where tb.table ilike '{{ relation.identifier }}'
+        and tb.schema ilike '{{ relation.schema }}'
+        and tb.database ilike '{{ relation.database }}'
+    {%- endset %}
+    {% set _materialized_view = run_query(_materialized_view_sql) %}
+
+    {%- set _query_sql -%}
+        select
+            vw.definition
+        from pg_views vw
+        where vw.viewname = '{{ relation.identifier }}'
+        and vw.schemaname = '{{ relation.schema }}'
+        and vw.definition ilike '%create materialized view%'
+    {%- endset %}
+    {% set _query = run_query(_query_sql) %}
+
+    {% do return({'materialized_view': _materialized_view, 'query': _query}) %}
+
+{% endmacro %}
diff --git a/dbt/include/redshift/macros/relations/materialized_view/drop.sql b/dbt/include/redshift/macros/relations/materialized_view/drop.sql
new file mode 100644
index 000000000..76f92e0e9
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/materialized_view/drop.sql
@@ -0,0 +1,3 @@
+{% macro redshift__drop_materialized_view(relation) -%}
+    drop materialized view if exists {{ relation }}
+{%- endmacro %}
diff --git a/dbt/include/redshift/macros/relations/materialized_view/refresh.sql b/dbt/include/redshift/macros/relations/materialized_view/refresh.sql
new file mode 100644
index 000000000..c53ed2786
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/materialized_view/refresh.sql
@@ -0,0 +1,3 @@
+{% macro redshift__refresh_materialized_view(relation) -%}
+    refresh materialized view {{ relation }}
+{% endmacro %}
diff --git a/dbt/include/redshift/macros/relations/table/drop.sql b/dbt/include/redshift/macros/relations/table/drop.sql
new file mode 100644
index 000000000..64ffc1f22
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/table/drop.sql
@@ -0,0 +1,3 @@
+{%- macro redshift__drop_table(relation) -%}
+    drop table if exists {{ relation }} cascade
+{%- endmacro -%}
diff --git a/dbt/include/redshift/macros/relations/table/rename.sql b/dbt/include/redshift/macros/relations/table/rename.sql
new file mode 100644
index 000000000..08fd5a172
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/table/rename.sql
@@ -0,0 +1,3 @@
+{% macro redshift__get_rename_table_sql(relation, new_name) %}
+    alter table {{ relation }} rename to {{ new_name }}
+{% endmacro %}
diff --git a/dbt/include/redshift/macros/relations/view/drop.sql b/dbt/include/redshift/macros/relations/view/drop.sql
new file mode 100644
index 000000000..cba066a53
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/view/drop.sql
@@ -0,0 +1,3 @@
+{%- macro redshift__drop_view(relation) -%}
+    drop view if exists {{ relation }} cascade
+{%- endmacro -%}
diff --git a/dbt/include/redshift/macros/relations/view/rename.sql b/dbt/include/redshift/macros/relations/view/rename.sql
new file mode 100644
index 000000000..0c6cdcdfa
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/view/rename.sql
@@ -0,0 +1,3 @@
+{% macro redshift__get_rename_view_sql(relation, new_name) %}
+    alter view {{ relation }} rename to {{ new_name }}
+{% endmacro %}
diff --git a/dbt/include/redshift/macros/relations/view/replace.sql b/dbt/include/redshift/macros/relations/view/replace.sql
new file mode 100644
index 000000000..25a9d8b38
--- /dev/null
+++ b/dbt/include/redshift/macros/relations/view/replace.sql
@@ -0,0 +1,18 @@
+{% macro redshift__get_replace_view_sql(relation, sql) -%}
+
+  {%- set binding = config.get('bind', default=True) -%}
+
+  {% set bind_qualifier = '' if binding else 'with no schema binding' %}
+  {%- set sql_header = config.get('sql_header', none) -%}
+
+  {{ sql_header if sql_header is not none }}
+
+  create or replace view {{ relation }}
+  {%- set contract_config = config.get('contract') -%}
+  {%- if contract_config.enforced -%}
+    {{ get_assert_columns_equivalent(sql) }}
+  {%- endif %} as (
+    {{ sql }}
+  ) {{ bind_qualifier }};
+
+{%- endmacro %}
diff --git a/dev-requirements.txt b/dev-requirements.txt
index f4e1ecdae..4b3b09cda 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -6,16 +6,17 @@ git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-postgres&subdirectory=plugi
 
 # if version 1.x or greater -> pin to major version
 # if version 0.x -> pin to minor
-black~=23.3
+black~=23.9
 bumpversion~=0.6.0
 click~=8.1
-flake8~=6.0
+ddtrace~=1.19
+flake8~=6.1
 flaky~=3.7
 freezegun~=1.2
 ipdb~=0.13.13
-mypy==1.4.1  # patch updates have historically introduced breaking changes
-pip-tools~=6.14
-pre-commit~=3.3
+mypy==1.5.1  # patch updates have historically introduced breaking changes
+pip-tools~=7.3
+pre-commit~=3.4
 pre-commit-hooks~=4.4
 pytest~=7.4
 pytest-csv~=3.0
@@ -23,8 +24,8 @@ pytest-dotenv~=0.5.2
 pytest-logbook~=1.2
 pytest-xdist~=3.3
 pytz~=2023.3
-tox~=4.6
+tox~=4.11
 types-pytz~=2023.3
 types-requests~=2.31
 twine~=4.0
-wheel~=0.40
+wheel~=0.41
diff --git a/tests/functional/adapter/dbt_show/test_dbt_show.py b/tests/functional/adapter/dbt_show/test_dbt_show.py
new file mode 100644
index 000000000..808a7733c
--- /dev/null
+++ b/tests/functional/adapter/dbt_show/test_dbt_show.py
@@ -0,0 +1,9 @@
+from dbt.tests.adapter.dbt_show.test_dbt_show import BaseShowSqlHeader, BaseShowLimit
+
+
+class TestRedshiftShowLimit(BaseShowLimit):
+    pass
+
+
+class TestRedshiftShowSqlHeader(BaseShowSqlHeader):
+    pass
diff --git a/tests/functional/adapter/expected_stats.py b/tests/functional/adapter/expected_stats.py
index 9e635bdbb..265ae225a 100644
--- a/tests/functional/adapter/expected_stats.py
+++ b/tests/functional/adapter/expected_stats.py
@@ -1,4 +1,4 @@
-from dbt.tests.util import AnyStringWith, AnyFloat, AnyString
+from dbt.tests.util import AnyStringWith, AnyInteger, AnyString, AnyFloat
 
 
 def redshift_stats():
@@ -27,14 +27,14 @@ def redshift_stats():
         "max_varchar": {
             "id": "max_varchar",
             "label": "Max Varchar",
-            "value": AnyFloat(),
+            "value": AnyInteger(),
             "description": "Size of the largest column that uses a VARCHAR data type.",
             "include": True,
         },
         "size": {
             "id": "size",
             "label": "Approximate Size",
-            "value": AnyFloat(),
+            "value": AnyInteger(),
             "description": "Approximate size of the table, calculated from a count of 1MB blocks",
             "include": True,
         },
diff --git a/tests/functional/adapter/incremental/test_incremental_merge_exclude_columns.py b/tests/functional/adapter/incremental/test_incremental_merge_exclude_columns.py
index c719ae059..022ebca07 100644
--- a/tests/functional/adapter/incremental/test_incremental_merge_exclude_columns.py
+++ b/tests/functional/adapter/incremental/test_incremental_merge_exclude_columns.py
@@ -1,17 +1,7 @@
-import pytest
 from dbt.tests.adapter.incremental.test_incremental_merge_exclude_columns import (
     BaseMergeExcludeColumns,
 )
 
 
-seeds__expected_merge_exclude_columns_csv = """id,msg,color
-1,hello,blue
-2,goodbye,green
-3,NULL,purple
-"""
-
-
 class TestMergeExcludeColumns(BaseMergeExcludeColumns):
-    @pytest.fixture(scope="class")
-    def seeds(self):
-        return {"expected_merge_exclude_columns.csv": seeds__expected_merge_exclude_columns_csv}
+    pass
diff --git a/tests/functional/adapter/materialized_view_tests/test_materialized_views.py b/tests/functional/adapter/materialized_view_tests/test_materialized_views.py
index d4c3e8a11..cf7d433c7 100644
--- a/tests/functional/adapter/materialized_view_tests/test_materialized_views.py
+++ b/tests/functional/adapter/materialized_view_tests/test_materialized_views.py
@@ -11,17 +11,22 @@
     MaterializedViewChangesContinueMixin,
     MaterializedViewChangesFailMixin,
 )
-from dbt.tests.adapter.materialized_view.files import MY_TABLE, MY_VIEW
-from dbt.tests.util import get_model_file, set_model_file
+from dbt.tests.adapter.materialized_view.files import MY_TABLE, MY_VIEW, MY_SEED
+from dbt.tests.util import (
+    assert_message_in_logs,
+    get_model_file,
+    set_model_file,
+    run_dbt,
+)
 
 from tests.functional.adapter.materialized_view_tests.utils import (
     query_autorefresh,
     query_dist,
     query_relation_type,
     query_sort,
+    run_dbt_and_capture_with_retries_redshift_mv,
 )
 
-
 MY_MATERIALIZED_VIEW = """
 {{ config(
     materialized='materialized_view',
@@ -61,17 +66,13 @@ def query_row_count(project, relation: BaseRelation) -> int:
     def query_relation_type(project, relation: BaseRelation) -> Optional[str]:
         return query_relation_type(project, relation)
 
-    @pytest.mark.skip(
-        "The current implementation does not support overwriting materialized views with tables."
-    )
-    def test_table_replaces_materialized_view(self, project, my_materialized_view):
-        super().test_table_replaces_materialized_view(project, my_materialized_view)
-
-    @pytest.mark.skip(
-        "The current implementation does not support overwriting materialized views with views."
-    )
-    def test_view_replaces_materialized_view(self, project, my_materialized_view):
-        super().test_view_replaces_materialized_view(project, my_materialized_view)
+    def test_materialized_view_create_idempotent(self, project, my_materialized_view):
+        # setup creates it once; verify it's there and run once
+        assert self.query_relation_type(project, my_materialized_view) == "materialized_view"
+        run_dbt_and_capture_with_retries_redshift_mv(
+            ["run", "--models", my_materialized_view.identifier]
+        )
+        assert self.query_relation_type(project, my_materialized_view) == "materialized_view"
 
 
 class RedshiftMaterializedViewChanges(MaterializedViewChanges):
@@ -99,10 +100,26 @@ def change_config_via_alter(project, materialized_view):
         new_model = initial_model.replace("dist='id',", "dist='id', auto_refresh=True")
         set_model_file(project, materialized_view, new_model)
 
+    @staticmethod
+    def change_config_via_alter_str_true(project, materialized_view):
+        initial_model = get_model_file(project, materialized_view)
+        new_model = initial_model.replace("dist='id',", "dist='id', auto_refresh='true'")
+        set_model_file(project, materialized_view, new_model)
+
+    @staticmethod
+    def change_config_via_alter_str_false(project, materialized_view):
+        initial_model = get_model_file(project, materialized_view)
+        new_model = initial_model.replace("dist='id',", "dist='id', auto_refresh='False'")
+        set_model_file(project, materialized_view, new_model)
+
     @staticmethod
     def check_state_alter_change_is_applied(project, materialized_view):
         assert query_autorefresh(project, materialized_view) is True
 
+    @staticmethod
+    def check_state_alter_change_is_applied_str_false(project, materialized_view):
+        assert query_autorefresh(project, materialized_view) is False
+
     @staticmethod
     def change_config_via_replace(project, materialized_view):
         initial_model = get_model_file(project, materialized_view)
@@ -120,16 +137,129 @@ def check_state_replace_change_is_applied(project, materialized_view):
 class TestRedshiftMaterializedViewChangesApply(
     RedshiftMaterializedViewChanges, MaterializedViewChangesApplyMixin
 ):
-    pass
+    def test_change_is_applied_via_alter(self, project, my_materialized_view):
+        self.check_start_state(project, my_materialized_view)
+
+        self.change_config_via_alter(project, my_materialized_view)
+        _, logs = run_dbt_and_capture_with_retries_redshift_mv(
+            ["--debug", "run", "--models", my_materialized_view.name]
+        )
+
+        self.check_state_alter_change_is_applied(project, my_materialized_view)
+
+        assert_message_in_logs(f"Applying ALTER to: {my_materialized_view}", logs)
+        assert_message_in_logs(f"Applying REPLACE to: {my_materialized_view}", logs, False)
+
+    def test_change_is_applied_via_alter_str_true(self, project, my_materialized_view):
+        self.check_start_state(project, my_materialized_view)
+
+        self.change_config_via_alter_str_true(project, my_materialized_view)
+        _, logs = run_dbt_and_capture_with_retries_redshift_mv(
+            ["--debug", "run", "--models", my_materialized_view.name]
+        )
+
+        self.check_state_alter_change_is_applied(project, my_materialized_view)
+
+        assert_message_in_logs(f"Applying ALTER to: {my_materialized_view}", logs)
+        assert_message_in_logs(f"Applying REPLACE to: {my_materialized_view}", logs, False)
+
+    def test_change_is_applied_via_alter_str_false(self, project, my_materialized_view):
+        self.check_start_state(project, my_materialized_view)
+
+        self.change_config_via_alter_str_false(project, my_materialized_view)
+        _, logs = run_dbt_and_capture_with_retries_redshift_mv(
+            ["--debug", "run", "--models", my_materialized_view.name]
+        )
+
+        self.check_state_alter_change_is_applied_str_false(project, my_materialized_view)
+
+        assert_message_in_logs(f"Applying ALTER to: {my_materialized_view}", logs)
+        assert_message_in_logs(f"Applying REPLACE to: {my_materialized_view}", logs, False)
+
+    def test_change_is_applied_via_replace(self, project, my_materialized_view):
+        self.check_start_state(project, my_materialized_view)
+
+        self.change_config_via_alter(project, my_materialized_view)
+        self.change_config_via_replace(project, my_materialized_view)
+        _, logs = run_dbt_and_capture_with_retries_redshift_mv(
+            ["--debug", "run", "--models", my_materialized_view.name]
+        )
+
+        self.check_state_alter_change_is_applied(project, my_materialized_view)
+        self.check_state_replace_change_is_applied(project, my_materialized_view)
+
+        assert_message_in_logs(f"Applying REPLACE to: {my_materialized_view}", logs)
 
 
 class TestRedshiftMaterializedViewChangesContinue(
     RedshiftMaterializedViewChanges, MaterializedViewChangesContinueMixin
 ):
-    pass
+    def test_change_is_not_applied_via_alter(self, project, my_materialized_view):
+        self.check_start_state(project, my_materialized_view)
+
+        self.change_config_via_alter(project, my_materialized_view)
+        _, logs = run_dbt_and_capture_with_retries_redshift_mv(
+            ["--debug", "run", "--models", my_materialized_view.name]
+        )
+
+        self.check_start_state(project, my_materialized_view)
+
+        assert_message_in_logs(
+            f"Configuration changes were identified and `on_configuration_change` was set"
+            f" to `continue` for `{my_materialized_view}`",
+            logs,
+        )
+        assert_message_in_logs(f"Applying ALTER to: {my_materialized_view}", logs, False)
+        assert_message_in_logs(f"Applying REPLACE to: {my_materialized_view}", logs, False)
+
+    def test_change_is_not_applied_via_replace(self, project, my_materialized_view):
+        self.check_start_state(project, my_materialized_view)
+
+        self.change_config_via_alter(project, my_materialized_view)
+        self.change_config_via_replace(project, my_materialized_view)
+        _, logs = run_dbt_and_capture_with_retries_redshift_mv(
+            ["--debug", "run", "--models", my_materialized_view.name]
+        )
+
+        self.check_start_state(project, my_materialized_view)
+
+        assert_message_in_logs(
+            f"Configuration changes were identified and `on_configuration_change` was set"
+            f" to `continue` for `{my_materialized_view}`",
+            logs,
+        )
+        assert_message_in_logs(f"Applying ALTER to: {my_materialized_view}", logs, False)
+        assert_message_in_logs(f"Applying REPLACE to: {my_materialized_view}", logs, False)
 
 
 class TestRedshiftMaterializedViewChangesFail(
     RedshiftMaterializedViewChanges, MaterializedViewChangesFailMixin
 ):
+    # Note: using retries doesn't work when we expect `dbt_run` to fail
     pass
+
+
+NO_BACKUP_MATERIALIZED_VIEW = """
+{{ config(
+    materialized='materialized_view',
+    backup=False
+) }}
+select * from {{ ref('my_seed') }}
+"""
+
+
+class TestRedshiftMaterializedViewWithBackupConfig:
+    @pytest.fixture(scope="class", autouse=True)
+    def models(self):
+        yield {
+            "my_materialized_view.sql": NO_BACKUP_MATERIALIZED_VIEW,
+        }
+
+    @pytest.fixture(scope="class", autouse=True)
+    def seeds(self):
+        return {"my_seed.csv": MY_SEED}
+
+    def test_running_mv_with_backup_false_succeeds(self, project):
+        run_dbt(["seed"])
+        result = run_dbt(["run"])
+        assert result[0].node.config_call_dict["backup"] is False
diff --git a/tests/functional/adapter/materialized_view_tests/utils.py b/tests/functional/adapter/materialized_view_tests/utils.py
index 5ca1b939b..112ae3057 100644
--- a/tests/functional/adapter/materialized_view_tests/utils.py
+++ b/tests/functional/adapter/materialized_view_tests/utils.py
@@ -1,6 +1,7 @@
-from typing import Optional
+from typing import List, Optional
 
 from dbt.adapters.base.relation import BaseRelation
+from dbt.tests.util import run_dbt_and_capture
 
 from dbt.adapters.redshift.relation import RedshiftRelation
 
@@ -67,3 +68,21 @@ def query_autorefresh(project, relation: RedshiftRelation) -> bool:
         and trim(mv.db_name) ilike '{ relation.database }'
     """
     return project.run_sql(sql, fetch="one")[0]
+
+
+def run_dbt_and_capture_with_retries_redshift_mv(args: List[str], max_retries: int = 10):
+    """
+    We need to retry `run_dbt` calls on Redshift because we get sporadic failures of the form:
+
+        Database Error in model my_materialized_view (models/my_materialized_view.sql)
+        could not open relation with OID 14957412
+    """
+    retries = 0
+    while retries < max_retries:
+        try:
+            # there's no point to using this with expect_pass=False
+            return run_dbt_and_capture(args, expect_pass=True)
+        except AssertionError as e:
+            retries += 1
+            if retries == max_retries:
+                raise e
diff --git a/tests/functional/adapter/test_simple_seed.py b/tests/functional/adapter/test_simple_seed.py
index 1e8cc1cd5..3e5ea5b23 100644
--- a/tests/functional/adapter/test_simple_seed.py
+++ b/tests/functional/adapter/test_simple_seed.py
@@ -53,6 +53,24 @@
 """.lstrip()
 
 
+properties__schema_yml = """
+version: 2
+
+seeds:
+  - name: seed_dist_all
+    config:
+      dist: all
+"""
+
+
+seeds__dist_all_csv = """
+seed_id,weekday
+1,Saturday
+2,Sunday
+3,Monday
+""".lstrip()
+
+
 class TestSimpleSeedColumnOverride(BaseSimpleSeedColumnOverride):
     @pytest.fixture(scope="class")
     def schema(self):
@@ -82,3 +100,23 @@ def test_redshift_simple_seed_with_column_override_redshift(self, project):
         assert len(seed_results) == 2
         test_results = run_dbt(["test"])
         assert len(test_results) == 10
+
+
+class BaseSimpleSeedDiststyleAll:
+    @pytest.fixture(scope="class")
+    def models(self):
+        return {
+            "schema.yml": properties__schema_yml,
+        }
+
+    @pytest.fixture(scope="class")
+    def seeds(self):
+        return {"seed_dist_all.csv": seeds__dist_all_csv}
+
+    def test_simple_seed_with_diststyle_all(self, project):
+        seed_results = run_dbt(["seed", "--show"])
+        assert len(seed_results) == 1
+
+
+class TestSimpleSeedDiststyleAll(BaseSimpleSeedDiststyleAll):
+    pass
diff --git a/tests/functional/adapter/test_store_test_failures.py b/tests/functional/adapter/test_store_test_failures.py
index 5d6b70fbb..7f591654e 100644
--- a/tests/functional/adapter/test_store_test_failures.py
+++ b/tests/functional/adapter/test_store_test_failures.py
@@ -1,7 +1,32 @@
+from dbt.tests.adapter.store_test_failures_tests import basic
 from dbt.tests.adapter.store_test_failures_tests.test_store_test_failures import (
     TestStoreTestFailures,
 )
 
 
-class RedshiftTestStoreTestFailures(TestStoreTestFailures):
+class TestRedshiftTestStoreTestFailures(TestStoreTestFailures):
+    pass
+
+
+class TestStoreTestFailuresAsInteractions(basic.StoreTestFailuresAsInteractions):
+    pass
+
+
+class TestStoreTestFailuresAsProjectLevelOff(basic.StoreTestFailuresAsProjectLevelOff):
+    pass
+
+
+class TestStoreTestFailuresAsProjectLevelView(basic.StoreTestFailuresAsProjectLevelView):
+    pass
+
+
+class TestStoreTestFailuresAsGeneric(basic.StoreTestFailuresAsGeneric):
+    pass
+
+
+class TestStoreTestFailuresAsProjectLevelEphemeral(basic.StoreTestFailuresAsProjectLevelEphemeral):
+    pass
+
+
+class TestStoreTestFailuresAsExceptions(basic.StoreTestFailuresAsExceptions):
     pass
diff --git a/tests/functional/adapter/utils/test_utils.py b/tests/functional/adapter/utils/test_utils.py
index 266103fbc..61a706f4d 100644
--- a/tests/functional/adapter/utils/test_utils.py
+++ b/tests/functional/adapter/utils/test_utils.py
@@ -8,9 +8,13 @@
 from dbt.tests.adapter.utils.test_current_timestamp import BaseCurrentTimestampNaive
 from dbt.tests.adapter.utils.test_dateadd import BaseDateAdd
 from dbt.tests.adapter.utils.test_datediff import BaseDateDiff
+from dbt.tests.adapter.utils.test_date_spine import BaseDateSpine
 from dbt.tests.adapter.utils.test_date_trunc import BaseDateTrunc
 from dbt.tests.adapter.utils.test_escape_single_quotes import BaseEscapeSingleQuotesQuote
 from dbt.tests.adapter.utils.test_except import BaseExcept
+from dbt.tests.adapter.utils.test_generate_series import BaseGenerateSeries
+from dbt.tests.adapter.utils.test_get_intervals_between import BaseGetIntervalsBetween
+from dbt.tests.adapter.utils.test_get_powers_of_two import BaseGetPowersOfTwo
 from dbt.tests.adapter.utils.test_hash import BaseHash
 from dbt.tests.adapter.utils.test_intersect import BaseIntersect
 from dbt.tests.adapter.utils.test_last_day import BaseLastDay
@@ -65,6 +69,10 @@ class TestDateDiff(BaseDateDiff):
     pass
 
 
+class TestDateSpine(BaseDateSpine):
+    pass
+
+
 class TestDateTrunc(BaseDateTrunc):
     pass
 
@@ -77,6 +85,18 @@ class TestExcept(BaseExcept):
     pass
 
 
+class TestGenerateSeries(BaseGenerateSeries):
+    pass
+
+
+class TestGetIntervalsBeteween(BaseGetIntervalsBetween):
+    pass
+
+
+class TestGetPowersOfTwo(BaseGetPowersOfTwo):
+    pass
+
+
 class TestHash(BaseHash):
     pass
 
diff --git a/tests/unit/relation_configs/test_materialized_view.py b/tests/unit/relation_configs/test_materialized_view.py
new file mode 100644
index 000000000..42a3223d0
--- /dev/null
+++ b/tests/unit/relation_configs/test_materialized_view.py
@@ -0,0 +1,55 @@
+from unittest.mock import Mock
+
+import pytest
+
+from dbt.adapters.redshift.relation_configs import RedshiftMaterializedViewConfig
+
+
+@pytest.mark.parametrize("bool_value", [True, False, "True", "False", "true", "false"])
+def test_redshift_materialized_view_config_handles_all_valid_bools(bool_value):
+    config = RedshiftMaterializedViewConfig(
+        database_name="somedb",
+        schema_name="public",
+        mv_name="someview",
+        query="select * from sometable",
+    )
+    model_node = Mock()
+    model_node.config.extra.get = (
+        lambda x, y=None: bool_value if x in ["auto_refresh", "backup"] else "someDistValue"
+    )
+    config_dict = config.parse_model_node(model_node)
+    assert isinstance(config_dict["autorefresh"], bool)
+    assert isinstance(config_dict["backup"], bool)
+
+
+@pytest.mark.parametrize("bool_value", [1])
+def test_redshift_materialized_view_config_throws_expected_exception_with_invalid_types(
+    bool_value,
+):
+    config = RedshiftMaterializedViewConfig(
+        database_name="somedb",
+        schema_name="public",
+        mv_name="someview",
+        query="select * from sometable",
+    )
+    model_node = Mock()
+    model_node.config.extra.get = (
+        lambda x, y=None: bool_value if x in ["auto_refresh", "backup"] else "someDistValue"
+    )
+    with pytest.raises(TypeError):
+        config.parse_model_node(model_node)
+
+
+def test_redshift_materialized_view_config_throws_expected_exception_with_invalid_str():
+    config = RedshiftMaterializedViewConfig(
+        database_name="somedb",
+        schema_name="public",
+        mv_name="someview",
+        query="select * from sometable",
+    )
+    model_node = Mock()
+    model_node.config.extra.get = (
+        lambda x, y=None: "notABool" if x in ["auto_refresh", "backup"] else "someDistValue"
+    )
+    with pytest.raises(ValueError):
+        config.parse_model_node(model_node)
diff --git a/tests/unit/test_redshift_adapter.py b/tests/unit/test_redshift_adapter.py
index c31366a1e..1edea565e 100644
--- a/tests/unit/test_redshift_adapter.py
+++ b/tests/unit/test_redshift_adapter.py
@@ -471,14 +471,13 @@ def test_cancel_open_connections_single(self):
         with mock.patch.object(self.adapter.connections, "add_query") as add_query:
             query_result = mock.MagicMock()
             cursor = mock.Mock()
-            cursor.fetchone.return_value = 42
+            cursor.fetchone.return_value = (42,)
             add_query.side_effect = [(None, cursor), (None, query_result)]
 
             self.assertEqual(len(list(self.adapter.cancel_open_connections())), 1)
             add_query.assert_has_calls(
                 [
                     call("select pg_backend_pid()"),
-                    call("select pg_terminate_backend(42)"),
                 ]
             )
 
diff --git a/tox.ini b/tox.ini
index 285c1e738..c490fed9a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -20,9 +20,15 @@ passenv =
     DBT_*
     REDSHIFT_TEST_*
     PYTEST_ADDOPTS
+    DD_CIVISIBILITY_AGENTLESS_ENABLED
+    DD_API_KEY
+    DD_SITE
+    DD_ENV
+    DD_SERVICE
 commands =
-  {envpython} -m pytest --dist=loadscope {posargs} tests/functional -k "not tests/functional/adapter/utils"
+  {envpython} -m pytest --dist=loadscope {posargs} tests/functional -k "not tests/functional/adapter/utils and not tests/functional/adapter/incremental"
   {envpython} -m pytest --dist=loadscope {posargs} tests/functional/adapter/utils
+  {envpython} -m pytest --dist=loadscope {posargs} tests/functional/adapter/incremental
 deps =
   -rdev-requirements.txt
   -e.