diff --git a/README.md b/README.md
index 52d84fe3..366b8307 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,8 @@ the read in progress and so direct sequencing capacity towards reads of interest
 
 **This implementation of readfish requires Guppy version >= 6.0.0 and MinKNOW version core >= 5.0.0 . It will not work on earlier versions.**
 
+**Since MinKNOW version core >=5.9.0 and Dorado server version >=7.3.9, Dorado requires an alternate library, `ont-pybasecall-client-lib`. We have introduced a new`dorado` module to handle this.**
+
 
 The code here has been tested with Guppy in GPU mode using GridION Mk1 and
 NVIDIA RTX2080 on live sequencing runs and an NVIDIA GTX1080 using playback
@@ -121,9 +123,9 @@ conda env create -f development.yml
 conda activate readfish_dev
 ```
 
-| <h2>‼️ Important! </h2> |
-|:---------------------------|
-|  The listed `ont-pyguppy-client-lib` version will probably not match the version installed on your system. To fix this, Please see this [issue](https://github.com/LooseLab/readfish/issues/221#issuecomment-1381529409)     |
+| <h2>‼️ Important !! </h2>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
+|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| MinKNOW is transitioning from Guppy to Dorado. Until MinKNOW version 5.9 both Guppy and Dorado used ont-pyguppy-client-lib.<br/>As of MinKNOW version 5.9 and Dorado server version 7.3.9 and greater Dorado requires an alternate library, `ont-pybasecall-client-lib`.<br/>The listed `ont-pyguppy-client-lib` or `ont-pybasecaller-client-lib` version may not match the version installed on your system. To fix this, Please see this [issue](https://github.com/LooseLab/readfish/issues/221#issuecomment-1381529409), using the appropriate library. |
 
 
 [ONT's Guppy GPU](https://community.nanoporetech.com/downloads) should be installed and running as a server.
@@ -333,8 +335,8 @@ Note: The plots here are generated from running readfish unblock-all on an Apple
 <details style="margin-top: 10px">
 <summary id="testing-basecalling-and-mapping"><h3 style="display: inline;">Testing base-calling and mapping</h3></summary>
 
-To test selective sequencing you must have access to a
-[guppy basecall server](https://community.nanoporetech.com/downloads/guppy/release_notes) (>=6.0.0)
+To test selective sequencing you must have access to either a
+[guppy basecall server](https://community.nanoporetech.com/downloads/guppy/release_notes) (>=6.0.0) or a [dorado basecall server](https://community.nanoporetech.com/downloads/dorado/release_notes). 
 
 and a readfish TOML configuration file.
 
@@ -348,6 +350,10 @@ NOTE: guppy and dorado are used here interchangeably as the basecall server. Dor
     ```toml
     [mapper_settings.mappy-rs]
     ```
+1. If on MinKNOW core>=5.9.0 and Dorado server version >=7.3.9, edit the `basecaller` section to read:
+    ```toml
+    [caller_settings.dorado]
+    ```
 1. Modify the `fn_idx_in` field in the file to be the full path to a [minimap2](https://github.com/lh3/minimap2) index of the human genome.
 
 1. Modify the `targets` fields for each condition to reflect the naming convention used in your index. This is the sequence name only, up to but not including any whitespace.
@@ -553,13 +559,19 @@ And for our Awesome Logo please checkout out [@tim_bassford](https://twitter.com
 
 <!-- start-changelog -->
 # Changelog
+## 2024.2.0
+1. Add a dorado base-caller which addressed issue [#347](https://github.com/LooseLab/readfish/issues/347) - chiefly in Dorado 7.3.9 ONT have moved to `ont-pybasecall-client-lib`, 
+  and connections from `ont_pyguppy_client_lib` raise `Connection error. ...  LOAD_CONFIG. Reply: INVALID_PROTOCOL` [(#344)](https://github.com/LooseLab/readfish/pull/344)
+1. Adds version checking for MinKNOW and Guppy/Dorado, logs if not compatibile [(#351)](https://github.com/LooseLab/readfish/pull/351)
+
 ## 2024.1.0
 1. bug fix type for `--wait-on-ready` type and actual function [(#327)](https://github.com/LooseLab/readfish/pull/327), [(#323)](https://github.com/LooseLab/readfish/pull/323)
 1. mutiple suffix `.mmi` support [(#330)](https://github.com/LooseLab/readfish/pull/330)
 1. Change the default `unblock_duration` on the `Analysis` class to use `DEFAULT_UNBLOCK` value defined in `_cli_args.py`. Change type on the Argparser for `--unblock-duration` to float. [(#313)](https://github.com/LooseLab/readfish/pull/313)
 1. Big dog Duplex feature - adds ability to select duplex reads that cover a target region. See pull request for details [(#324)](https://github.com/LooseLab/readfish/pull/324)
+
 ## 2023.1.1
 1. Fix Readme Logo link 🥳 (#296)
-1. Fix bug where we had accidentally started requiring barcoded TOMLs to specify a region. Thanks to @jamesemery for catching this. (#299)
-1. Correctly handle overriding a decision in internal statistics tracking. (#299)
+2. Fix bug where we had accidentally started requiring barcoded TOMLs to specify a region. Thanks to @jamesemery for catching this. (#299)
+3. Correctly handle overriding a decision in internal statistics tracking. (#299)
 <!-- end-changelog -->
diff --git a/docs/_static/example_tomls/barcoded_human.toml b/docs/_static/example_tomls/barcoded_human.toml
index 014baee0..20c5d568 100644
--- a/docs/_static/example_tomls/barcoded_human.toml
+++ b/docs/_static/example_tomls/barcoded_human.toml
@@ -22,9 +22,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r10.4.1_e8.2_400bps_5khz_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_bed_file_selection.toml b/docs/_static/example_tomls/human_bed_file_selection.toml
index 282af9ad..ebeb3263 100644
--- a/docs/_static/example_tomls/human_bed_file_selection.toml
+++ b/docs/_static/example_tomls/human_bed_file_selection.toml
@@ -14,9 +14,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r9.4.1_450bps_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_chr_depletion.toml b/docs/_static/example_tomls/human_chr_depletion.toml
index a241e827..48d78342 100644
--- a/docs/_static/example_tomls/human_chr_depletion.toml
+++ b/docs/_static/example_tomls/human_chr_depletion.toml
@@ -23,9 +23,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r9.4.1_450bps_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_chr_selection.toml b/docs/_static/example_tomls/human_chr_selection.toml
index f522b57d..96bc2dab 100644
--- a/docs/_static/example_tomls/human_chr_selection.toml
+++ b/docs/_static/example_tomls/human_chr_selection.toml
@@ -18,9 +18,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r9.4.1_450bps_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_chr_selection_two_regions.toml b/docs/_static/example_tomls/human_chr_selection_two_regions.toml
index 09ebd6b9..78a6c1cb 100644
--- a/docs/_static/example_tomls/human_chr_selection_two_regions.toml
+++ b/docs/_static/example_tomls/human_chr_selection_two_regions.toml
@@ -19,9 +19,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r9.4.1_450bps_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_chr_selection_with_control.toml b/docs/_static/example_tomls/human_chr_selection_with_control.toml
index ad797fcd..40fd8353 100644
--- a/docs/_static/example_tomls/human_chr_selection_with_control.toml
+++ b/docs/_static/example_tomls/human_chr_selection_with_control.toml
@@ -21,9 +21,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r9.4.1_450bps_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_csv_file_selection.toml b/docs/_static/example_tomls/human_csv_file_selection.toml
index 2484d407..11da24fb 100644
--- a/docs/_static/example_tomls/human_csv_file_selection.toml
+++ b/docs/_static/example_tomls/human_csv_file_selection.toml
@@ -17,9 +17,13 @@
 # - https://looselab.github.io/readfish/toml.html.
 
 [caller_settings.guppy]
-# Caller Configuration for Guppy Basecaller
-config = "dna_r9.4.1_450bps_fast"  # Specify the basecaller configuration
-address = "ipc:///tmp/.guppy/5555"  # Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+#               ^^^^^^ - ".guppy" specifies our chosen basecaller
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
+config = "dna_r9.4.1_450bps_fast"
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+address = "ipc:///tmp/.guppy/5555"
 debug_log = "live_reads.fq"  # Fastq output for individual reads (Optional, delete line to disable)
 
 [mapper_settings.mappy]
diff --git a/docs/_static/example_tomls/human_minimap2_extra_params.toml b/docs/_static/example_tomls/human_minimap2_extra_params.toml
index b495cbef..83ab44bc 100644
--- a/docs/_static/example_tomls/human_minimap2_extra_params.toml
+++ b/docs/_static/example_tomls/human_minimap2_extra_params.toml
@@ -23,9 +23,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r10.4.1_e8.2_400bps_5khz_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/_static/example_tomls/human_regions_barcoded.toml b/docs/_static/example_tomls/human_regions_barcoded.toml
index 7a0e7556..11d65b43 100644
--- a/docs/_static/example_tomls/human_regions_barcoded.toml
+++ b/docs/_static/example_tomls/human_regions_barcoded.toml
@@ -22,9 +22,11 @@
 # Basecaller configuration
 [caller_settings.guppy]
 #               ^^^^^^ - ".guppy" specifies our chosen basecaller
-# Guppy base-calling configuration file name
+#               If using dorado >7.3.9, this should be ".dorado".
+#               All other parameters are shared between the two basecallers.
+# Guppy/Dorado base-calling configuration file name
 config = "dna_r10.4.1_e8.2_400bps_5khz_fast"
-# Address of the guppy basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
+# Address of the guppy/dorado basecaller - The default address for guppy is ipc:///tmp/.guppy/5555.
 address = "ipc:///tmp/.guppy/5555"
 # Fastq output for individual reads. This is OPTIONAL - as these files can become quite large.
 # Remove line to disable.
diff --git a/docs/developers-guide.md b/docs/developers-guide.md
index 22c9f43f..a32c64ad 100644
--- a/docs/developers-guide.md
+++ b/docs/developers-guide.md
@@ -67,7 +67,7 @@ conda env create -f docs/development.yml
 
 ## Readfish versioning
 Readfish uses [calver](https://calver.org/) for versioning. Specifically the format should be
-`YYYY.MINOR.MICRO.Modifier`, where `MINOR` is the feature addiiton, `MICRO` is any hotfix/bugfix, and `Modifier` is the modifier (e.g. `rc` for release candidate, `dev` for development, empty for stable).
+`YYYY.MINOR.MICRO.Modifier`, where `MINOR` is the feature addition, `MICRO` is any hotfix/bugfix, and `Modifier` is the modifier (e.g. `rc` for release candidate, `dev` for development, empty for stable).
 
 ## Changelog
 
diff --git a/pyproject.toml b/pyproject.toml
index 6ce56149..cfa247fa 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -54,7 +54,8 @@ dev = ["readfish[all,docs,tests]", "pre-commit"]
 mappy = ["mappy"]
 mappy-rs = ["mappy-rs >= 0.0.6"]
 guppy = ["ont_pyguppy_client_lib"]
-all = ["readfish[mappy,mappy-rs,guppy]"]
+dorado = ["ont-pybasecall-client-lib"]
+all = ["readfish[mappy,mappy-rs,guppy,dorado]"]
 
 [project.urls]
 Documentation = "https://looselab.github.io/readfish"
@@ -83,3 +84,10 @@ markers = [
     "alignment: marks tests which rely on loading or using Mappy or Mappy-rs aligners, used to test with both. (deselect with '-m \"not slow\", select with '-k alignment')",
 ]
 addopts = ["-ra", "--doctest-modules", "--ignore=src/readfish/read_until/base.py"]
+
+[tool.coverage.report]
+omit = [
+    "src/readfish/plugins/dorado.py",
+    "src/readfish/_read_until_client.py",
+    "src/readfish/plugins/guppy.py",
+]
diff --git a/src/readfish/__about__.py b/src/readfish/__about__.py
index ed4e6b85..a1763d2b 100644
--- a/src/readfish/__about__.py
+++ b/src/readfish/__about__.py
@@ -1,4 +1,4 @@
 """__about__.py
 Version of the read until software
 """
-__version__ = "2024.1.0"
+__version__ = "2024.2.0"
diff --git a/src/readfish/_compatibility.py b/src/readfish/_compatibility.py
new file mode 100644
index 00000000..8a44a47f
--- /dev/null
+++ b/src/readfish/_compatibility.py
@@ -0,0 +1,103 @@
+"""_compatibility.py
+
+Contains utilities for checking readfish compatibility with various versions of MinKNOW.
+
+Checks ranges of `readfish` against the `MinKNOW` version
+
+Attributes:
+    LATEST_TESTED (str): The latest tested version of MinKNOW.
+    MINKNOW_COMPATIBILITY_RANGE (tuple): The compatibility range of MinKNOW versions for this version of readfish.
+    DIRECTION (Enum): An enumeration representing upgrade, downgrade, or no change directions.
+
+"""
+
+from __future__ import annotations
+
+from enum import Enum
+
+from minknow_api.manager import Manager
+from packaging.version import parse as parse_version
+from packaging.version import Version
+
+LATEST_TESTED = "5.9.7"
+
+# The versions of MinKNOW which this version of readfish can connect to
+# Format - (lowest minknow version, highest version of minknow supported as an upper bound)
+MINKNOW_COMPATIBILITY_RANGE = (
+    Version("5.0.0"),
+    Version(LATEST_TESTED),
+)
+
+
+class DIRECTION(Enum):
+    """
+    Represents the direction in which the version of the readfish software should be changed
+    to be compatible with the tested version of an external tool (likely MinKNOW).
+
+    Attributes:
+        UPGRADE: Indicates that the readfish software version should be upgraded.
+        DOWNGRADE: Indicates that the readfish software version should be downgraded.
+        JUST_RIGHT: Indicates that the readfish software version is already compatible
+                     with the tested version of the external tool.
+    """
+
+    UPGRADE = "upgrade"
+    DOWNGRADE = "downgrade"
+    JUST_RIGHT = "do nothing"
+
+
+def _get_minknow_version(host: str = "127.0.0.1", port: int = None) -> Version:
+    """
+    Get the version of MinKNOW
+
+    :param host: The host the RPC is listening on, defaults to "127.0.0.1"
+    :param port: The port the RPC is listening on, defaults to None
+
+    :return: The version of MinKNOW readfish is connected to
+    """
+    manager = Manager(host=host, port=port)
+    minknow_version = parse_version(manager.core_version)
+    return minknow_version
+
+
+def check_compatibility(
+    comparator: Version,
+    version_range: tuple[Version, Version] = MINKNOW_COMPATIBILITY_RANGE,
+) -> DIRECTION:
+    """
+    Check the compatibility of a given software version, between a given range,
+    inclusive of the right edge.
+
+    :param comparator: Version of the provided software, for example MinKNOW 5.9.7
+    :param version_ranges: A tuple of lowest supported version, highest supported version
+
+    :return: A direction variant indicating if this version of readfish needs to be changed.
+
+    Examples:
+    >>> from packaging.version import Version
+    >>> check_compatibility(Version("5.9.5"), (Version("5.0.0"), Version("5.9.7")))
+    <DIRECTION.JUST_RIGHT: 'do nothing'>
+    >>> check_compatibility(Version("5.9.7"), (Version("5.0.0"), Version("5.9.7")))
+    <DIRECTION.JUST_RIGHT: 'do nothing'>
+    >>> check_compatibility(Version("5.9.8"), (Version("5.0.0"), Version("5.9.7")))
+    <DIRECTION.UPGRADE: 'upgrade'>
+    >>> check_compatibility(Version("4.9.0"), (Version("5.0.0"), Version("5.9.7")))
+    <DIRECTION.DOWNGRADE: 'downgrade'>
+    >>> if (action := check_compatibility(Version("6.0.0"), MINKNOW_COMPATIBILITY_RANGE)) in (
+    ...     DIRECTION.UPGRADE,
+    ...     DIRECTION.DOWNGRADE,
+    ... ):
+    ...     action
+    <DIRECTION.UPGRADE: 'upgrade'>
+    """
+    (
+        lowest_supported_version,
+        highest_supported_version,
+    ) = version_range
+    if comparator < lowest_supported_version:
+        return DIRECTION.DOWNGRADE
+    return (
+        DIRECTION.JUST_RIGHT
+        if comparator <= highest_supported_version
+        else DIRECTION.UPGRADE
+    )
diff --git a/src/readfish/_config.py b/src/readfish/_config.py
index 343eaf56..227daeec 100644
--- a/src/readfish/_config.py
+++ b/src/readfish/_config.py
@@ -171,6 +171,7 @@ def load_module(self, override=False):
         """
         builtins = {
             "guppy": "guppy",
+            "dorado": "dorado",
             "mappy": "mappy",
             "mappy_rs": "mappy_rs",
             "no_op": "_no_op",
diff --git a/src/readfish/_utils.py b/src/readfish/_utils.py
index 991ac160..458584e9 100644
--- a/src/readfish/_utils.py
+++ b/src/readfish/_utils.py
@@ -18,6 +18,7 @@
 from minknow_api.manager import Manager, FlowCellPosition
 from minknow_api import Connection
 
+
 if sys.version_info < (3, 11):
     from exceptiongroup import BaseExceptionGroup
 
diff --git a/src/readfish/entry_points/stats.py b/src/readfish/entry_points/stats.py
index f670c65a..bdbd26df 100644
--- a/src/readfish/entry_points/stats.py
+++ b/src/readfish/entry_points/stats.py
@@ -73,6 +73,7 @@
     readfish stats --toml tests/static/stats_test/yeast_summary_test.toml --fastq-directory tests/static/stats_test/ --html summary_adaptive
 
 """
+
 from __future__ import annotations
 import argparse
 from pathlib import Path
diff --git a/src/readfish/entry_points/targets.py b/src/readfish/entry_points/targets.py
index a8ba1ea8..418ace6e 100644
--- a/src/readfish/entry_points/targets.py
+++ b/src/readfish/entry_points/targets.py
@@ -99,6 +99,13 @@
 from readfish._read_until_client import RUClient
 from readfish._config import Action, Conf, make_decision, _Condition
 from readfish._statistics import ReadfishStatistics
+from readfish.__about__ import __version__
+from readfish._compatibility import (
+    _get_minknow_version,
+    check_compatibility,
+    MINKNOW_COMPATIBILITY_RANGE,
+    DIRECTION,
+)
 from readfish._utils import (
     get_device,
     send_message,
@@ -197,16 +204,18 @@ def __init__(
         self.break_reads_after_seconds = (
             self.client.connection.analysis_configuration.get_analysis_configuration().read_detection.break_reads_after_seconds.value
         )
+        self.sample_rate = self.client.connection.device.get_sample_rate().sample_rate
         self.logger.info("Run Configuration Received")
         self.logger.info(f"run_id={self.run_information.run_id}")
         self.logger.info(f"break_reads_after_seconds={self.break_reads_after_seconds}")
+        self.logger.info(f"sample_rate={self.sample_rate}")
         # Create our statistics tracker
         self.loop_statistics = ReadfishStatistics(
             read_log_name, self.break_reads_after_seconds
         )
         logger.info("Initialising Caller")
         self.caller: CallerABC = self.conf.caller_settings.load_object(
-            "Caller", run_information=self.run_information
+            "Caller", run_information=self.run_information, sample_rate=self.sample_rate
         )
         logger.info("Caller initialised")
         caller_description = self.caller.describe()
@@ -573,6 +582,24 @@ def run(
     # Setup logger used in this entry point, this one should be passed through
     logger = logging.getLogger(f"readfish.{args.command}")
 
+    # Check MinKNOW version
+
+    minknow_version = _get_minknow_version(host=args.host, port=args.port)
+    if (
+        action := check_compatibility(minknow_version, MINKNOW_COMPATIBILITY_RANGE)
+    ) in (
+        DIRECTION.UPGRADE,
+        DIRECTION.DOWNGRADE,
+    ):
+        lower_bound, upper_bound = MINKNOW_COMPATIBILITY_RANGE
+        logger.warning(
+            f"""This readfish version ({__version__}) is tested for compatibility with MinKNOW v{lower_bound} to v{upper_bound}.
+This version of minknow is {minknow_version}.
+If readfish fails please try to {action.value} readfish.
+If there isn't a newer version of readfish and readfish is failing, please open an issue:
+    https://github.com/LooseLab/readfish/issues"""
+        )
+
     # Fetch sequencing device
     position = get_device(args.device, host=args.host, port=args.port)
 
@@ -604,9 +631,6 @@ def run(
 
     # start the client running
     read_until_client.run(
-        # TODO: Set correct channel range
-        # first_channel=186,
-        # last_channel=187,
         first_channel=1,
         last_channel=read_until_client.channel_count,
         max_unblock_read_length_seconds=args.max_unblock_read_length_seconds,
diff --git a/src/readfish/entry_points/unblock_all.py b/src/readfish/entry_points/unblock_all.py
index 8fe1eb74..e40e6292 100644
--- a/src/readfish/entry_points/unblock_all.py
+++ b/src/readfish/entry_points/unblock_all.py
@@ -12,6 +12,7 @@
 
    readfish unblock-all --device X3 --experiment-name "test unblock all"
 """
+
 from tempfile import NamedTemporaryFile
 
 from readfish._cli_args import DEVICE_BASE_ARGS
diff --git a/src/readfish/entry_points/validate.py b/src/readfish/entry_points/validate.py
index f187703e..f98cc0ea 100644
--- a/src/readfish/entry_points/validate.py
+++ b/src/readfish/entry_points/validate.py
@@ -81,7 +81,14 @@ def run(parser, args, extras) -> int:
         try:
             _ = conf.caller_settings.load_object("Caller")
         except Exception as exc:
-            logger.error("Caller could not be initialised, see below for details")
+            logger.error("Caller could not be initialised.")
+            logger.error(
+                "Possible reasons for this include a mismatch between the ont basecaller client and the versions of guppy or dorado you are connecting to."
+            )
+            logger.error(
+                "Additional information is available here: https://looselab.github.io/readfish/FAQ.html#connection-error-bad-reply-could-not-interpret-message-from-server-for-request-load-config-reply-invalid-protocol"
+            )
+            logger.error("See below for further details on this specific error.")
             logger.error(str(exc))
             errors += 1
         else:
diff --git a/src/readfish/plugins/dorado.py b/src/readfish/plugins/dorado.py
new file mode 100644
index 00000000..b07e0f3f
--- /dev/null
+++ b/src/readfish/plugins/dorado.py
@@ -0,0 +1,313 @@
+"""Dorado plugin module
+
+Extension of pyBaseCaller that maintains a connection to the basecaller
+"""
+
+from __future__ import annotations
+import logging
+import os
+import time
+from collections import namedtuple
+from pathlib import Path
+from typing import Iterable, TYPE_CHECKING
+from packaging.version import parse as parse_version
+
+import numpy as np
+import numpy.typing as npt
+from minknow_api.protocol_pb2 import ProtocolRunInfo
+from minknow_api.device_pb2 import GetSampleRateResponse
+
+try:
+    from pybasecall_client_lib.helper_functions import package_read
+    from pybasecall_client_lib.pyclient import PyBasecallClient
+except ImportError:
+    pass
+
+from readfish._loggers import setup_logger
+from readfish.plugins.abc import CallerABC
+from readfish.plugins.utils import Result
+from readfish._utils import nice_join
+
+
+if TYPE_CHECKING:
+    import minknow_api
+
+__all__ = ["Caller"]
+
+logger = logging.getLogger("RU_basecaller")
+CALIBRATION = namedtuple("calibration", "scaling offset")
+
+
+class DefaultDAQValues:
+    """Provides default calibration values
+
+    Mimics the read_until_api calibration dict value from
+    https://github.com/nanoporetech/read_until_api/blob/2319bbe/read_until/base.py#L34
+    all keys return scaling=1.0 and offset=0.0
+    """
+
+    calibration = CALIBRATION(1.0, 0.0)
+
+    def __getitem__(self, _):
+        return self.calibration
+
+
+_DefaultDAQValues = DefaultDAQValues()
+
+
+class Caller(CallerABC):
+    def __init__(
+        self,
+        run_information: ProtocolRunInfo = None,
+        sample_rate: GetSampleRateResponse = None,
+        debug_log=None,
+        **kwargs,
+    ):
+        self.logger = setup_logger("readfish_dorado_logger", log_file=debug_log)
+        self.supported_barcode_kits = None
+        self.supported_basecall_models = None
+        self.run_information = run_information
+        if self.run_information:
+            self.guppy_version = (
+                self.run_information.software_versions.guppy_connected_version
+            )
+
+            if parse_version(self.guppy_version) >= parse_version("7.3.9"):
+                logging.info(f"Connected to caller version {self.guppy_version}.")
+            else:
+                logging.info(
+                    f"Trying to use minKNOW with a caller version {self.guppy_version}. If this is causing readfish to crash, try using a version of Dorado >= 7.3.9. You should also check for any updates available to readfish."
+                )
+
+        # Set our own priority
+        self.dorado_params = kwargs
+        self.dorado_params["priority"] = PyBasecallClient.high_priority
+        # Set our own client name to appear in the dorado server logs
+        self.dorado_params["client_name"] = "Readfish_connection"
+
+        if sample_rate:
+            self.sample_rate = float(sample_rate)
+        else:
+            self.sample_rate = float(5000)
+
+        self.validate()
+        self.caller = PyBasecallClient(**self.dorado_params)
+        self.caller.connect()
+
+    def validate(self) -> None:
+        """Validate the parameters passed to Dorado to ensure they will initialise py Basecall Client correctly
+
+        Currently checks:
+            1. That the socket file exists
+            2. That the Socket file has the correct permissions
+            3. That the version of py basecall client lib installed matches the system version
+
+        :return: None, if the parameters pass all the checks
+
+        """
+        for key in ("address", "config"):
+            if key not in self.dorado_params:
+                raise KeyError(
+                    f"Required `caller_settings.dorado` {key} was not found in provided TOML. Please add."
+                )
+        if self.dorado_params["address"].startswith("ipc://"):
+            # User is attempting to connect to an IPC socket
+            socket_path = Path(self.dorado_params["address"][6:])
+            if not socket_path.exists():
+                raise FileNotFoundError(
+                    f"The provided dorado base-caller socket address doesn't appear to exist. Please check your dorado Settings. {self.dorado_params['address']}"
+                )
+
+            # check user permissions:
+            if not os.access(socket_path, os.R_OK):
+                raise RuntimeError(
+                    f"The user account running readfish doesn't appear to have permissions to read the dorado base-caller socket. Please check permissions on {self.dorado_params['address']}. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information."
+                )
+            if not os.access(socket_path, os.W_OK):
+                raise RuntimeError(
+                    f"The user account running readfish doesn't appear to have permissions to write to the dorado base-caller socket. Please check permissions on {self.dorado_params['address']}. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information."
+                )
+        # If we are connected to a live run, test if the base-caller model is acceptable.
+        # Connected to a live run via the minknow_api - get supported basecall and barcoding kits from the run info.
+        #  Check them against provided values
+        if self.run_information is not None:
+            tags = self.run_information.meta_info.tags
+
+            self.supported_basecall_models = tags[
+                "available basecall models"
+            ].array_value
+            # Make a CSV str a list of strings, removing quotes and square brackets
+            if self.supported_basecall_models and isinstance(
+                self.supported_basecall_models, str
+            ):
+                self.supported_basecall_models = (
+                    tags["available basecall models"]
+                    .array_value[1:-1]
+                    .replace('"', "")
+                    .split(",")
+                )
+            # Faff on with sorting out available barcoding kits
+            # See https://github.com/nanoporetech/minknow_api/blob/829dbe8ac8e49efdf268d385b50440c52473188b/python/minknow_api/tools/protocols.py#L97C1-L97C7
+            self.supported_barcode_kits = tags["barcoding kits"].array_value
+            # workaround for the set of barcoding kits being returned as a string rather
+            # that array of strings
+            if self.supported_barcode_kits and isinstance(
+                self.supported_barcode_kits, str
+            ):
+                self.supported_barcode_kits = (
+                    tags["barcoding kits"].array_value[1:-1].replace('"', "").split(",")
+                )
+
+            if tags["barcoding"].bool_value:
+                self.supported_barcode_kits.append(tags["kit"].string_value)
+            # If we are connected to a live run, and have suitable base calling models check the base-caller model is suitable for the flowcell and kit
+            if (
+                self.supported_basecall_models
+                and f"{self.dorado_params['config'].replace('.cfg', '')}.cfg"
+                not in self.supported_basecall_models
+            ):
+                raise RuntimeError(
+                    """The {} base-calling config listed in the readfish config TOML is not suitable for this flowcell and kit combination.
+    Please check the dorado value in the caller_settings.dorado section of your TOML file.
+    The following models are are given by ONT as suitable for this flow cell/kit combo:\n\t{}""".format(
+                        self.dorado_params["config"],
+                        nice_join(
+                            self.supported_basecall_models,
+                            sep="\n\t",
+                            conjunction="and",
+                        ),
+                    )
+                )
+
+            # If we are barcoding and have connected to a live run - try checking the listed barcode kit works with the flowcell and kit
+            if (
+                barcoding_kits := self.dorado_params.get("barcode_kits", None)
+            ) is not None:
+                barcoding_kits = barcoding_kits.split()
+            if barcoding_kits and not set(barcoding_kits).issubset(
+                self.supported_barcode_kits
+            ):
+                raise RuntimeError(
+                    "Barcoding kits specified in TOML {} not amongst those supported by the selected kit and protocol.\nSupported kits are:\n\t{}".format(
+                        nice_join(barcoding_kits, conjunction="and"),
+                        nice_join(
+                            self.supported_barcode_kits, sep="\n\t", conjunction="and"
+                        ),
+                    ),
+                )
+        return None
+
+    def disconnect(self) -> None:
+        """Call the disconnect method on the PyBasecallClient"""
+        return self.caller.disconnect()
+
+    def basecall(
+        self,
+        reads: Iterable[tuple[int, minknow_api.data_pb2.GetLiveReadsResponse.ReadData]],
+        signal_dtype: npt.DTypeLike,
+        daq_values: dict[int, namedtuple] = None,
+    ):
+        """Basecall live data from minknow RPC
+
+        :param reads: List or generator of tuples containing (channel, MinKNOW.rpc.Read)
+        :param signal_dtype: Numpy dtype of the raw data
+        :param daq_values: Dictionary mapping channel to offset and scaling values.
+                           If not provided default values of 1.0 and 0.0 are used.
+        :yield:
+        :rtype: readfish.plugins.utils.Result
+        """
+        # FIXME: Occasionally dorado can report a read as not sent when it is
+        #        successfully sent. Therefore we capture not sent reads
+        cache, skipped = {}, {}
+        reads_received, reads_sent = 0, 0
+        daq_values = _DefaultDAQValues if daq_values is None else daq_values
+        for channel, read in reads:
+            # Attach the "RF-" prefix
+            read_id = f"RF-{read.id}"
+            t0 = time.time()
+            cache[read_id] = (channel, read.number, t0)
+            success = self.caller.pass_read(
+                package_read(
+                    read_id=read_id,
+                    raw_data=np.frombuffer(read.raw_data, signal_dtype),
+                    daq_offset=daq_values[channel].offset,
+                    daq_scaling=daq_values[channel].scaling,
+                    sampling_rate=self.sample_rate,
+                    start_time=int(read.start_sample),
+                )
+            )
+            if not success:
+                logging.warning(f"Could not send read {read_id!r} to Dorado")
+                # FIXME: This is resolved in later versions of dorado.
+                skipped[read_id] = cache.pop(read_id)
+                continue
+            else:
+                reads_sent += 1
+
+            sleep_time = self.caller.throttle - t0
+            if sleep_time > 0:
+                time.sleep(sleep_time)
+
+        while reads_received < reads_sent:
+            results = self.caller.get_completed_reads()
+            # TODO: incorporate time_received into logging?
+            # time_received = time.time()
+
+            if not results:
+                time.sleep(self.caller.throttle)
+                continue
+
+            for res_batch in results:
+                for res in res_batch:
+                    read_id = res["metadata"]["read_id"]
+                    '''
+                    Dorado sometimes returns two sub_tags for a read.
+
+                    An example result:
+                    RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c
+                    {'read_tag': 3605, 'sub_tag': 0, 'priority': <read_priority.high_priority: 0>, 'metadata': {'adapter_front_begin_index': -1, 'adapter_front_foundseq': 'NA', 'adapter_front_foundseq_length': 2, 'adapter_front_id': 'NA', 'adapter_front_refseq': 'NA', 'adapter_front_score': 0.0, 'adapter_mid_end_index': -1, 'adapter_mid_id': 'NA', 'adapter_mid_score': 0.0, 'adapter_rear_end_index': -1, 'adapter_rear_foundseq': 'NA', 'adapter_rear_foundseq_length': 2, 'adapter_rear_id': 'NA', 'adapter_rear_refseq': 'NA', 'adapter_rear_score': 0.0, 'barcode_arrangement': '', 'barcode_front_begin_index': 0, 'barcode_front_foundseq': 'NA', 'barcode_front_foundseq_length': 2, 'barcode_front_id': 'NA', 'barcode_front_id_inner': 'NA', 'barcode_front_refseq': 'NA', 'barcode_front_score': 0.0, 'barcode_front_score_inner': 0.0, 'barcode_full_arrangement': '', 'barcode_kit': '', 'barcode_mid_front_end_index': 0, 'barcode_mid_front_id': 'NA', 'barcode_mid_front_score': 0.0, 'barcode_mid_rear_end_index': 0, 'barcode_mid_rear_id': 'NA', 'barcode_mid_rear_score': 0.0, 'barcode_rear_end_index': 0, 'barcode_rear_foundseq': 'NA', 'barcode_rear_foundseq_length': 2, 'barcode_rear_id': 'NA', 'barcode_rear_id_inner': 'NA', 'barcode_rear_refseq': 'NA', 'barcode_rear_score': 0.0, 'barcode_rear_score_inner': 0.0, 'barcode_score': 0.0, 'barcode_variant': '', 'basecall_type': 'beam search', 'daq_offset': 0.0, 'daq_scaling': 0.25, 'duration': 8592, 'lamp_barcode_id': 'NA', 'lamp_barcode_score': 0.0, 'lamp_target_id': 'NA', 'lamp_target_score': 0.0, 'mean_qscore': 10.297822952270508, 'med_abs_dev': 0.01067463681101799, 'median': -373.5199890136719, 'model_stride': 6, 'model_version_id': 'dna_r10.4.1_e8.2_400bps_fast@v4.3.0', 'num_events': 1432, 'num_minknow_events': 0, 'primer_front_begin_index': -1, 'primer_front_foundseq': 'NA', 'primer_front_foundseq_length': 2, 'primer_front_id': 'NA', 'primer_front_refseq': 'NA', 'primer_front_score': 0.0, 'primer_rear_end_index': -1, 'primer_rear_foundseq': 'NA', 'primer_rear_foundseq_length': 2, 'primer_rear_id': 'NA', 'primer_rear_refseq': 'NA', 'primer_rear_score': 0.0, 'read_id': 'RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c', 'sampling_rate': 5000.0, 'scaling_med_abs_dev': 0.01067463681101799, 'scaling_median': -373.5199890136719, 'scaling_version': '', 'sequence_length': 340, 'start_time': 12462912, 'state_size': 0, 'strand_id': '441174ae-e18f-4612-bc46-0c86d301cb4d', 'trim_front': 0, 'trim_rear': 0, 'trimmed_duration': 8592, 'trimmed_events': 1432, 'trimmed_samples': 0}, 'datasets': {'raw_data': array([306, 289, 300, ..., 526, 537, 540], dtype=int16), 'sequence': 'CTACAGTGGTCGTCAATACTATTGCAACTCCAGCCTGGGCAACAGAGTGAGACCCTGTCTCAAAAAAAAACAGAAGGAAGCCAAAGCCCACAAAGACGCTGAGTATTTTACATTCCTTTTTTGTACGAATGCTTCAAAATCTGGTGTGTATCTTACAGTTATAAAATCTCTCAATTTAGCCACCAAATTTTCACCAGAAATGCATGAACTGTGTTCAGATTTCATAAACTTTCAGTTGATAAAGTAGATTCACATACTGAAGGTGTTCCAAACGTACTGGAAGACTTTCTAAAATGGATTTGAACACCAGTTTCCAGGTTTACATTTAAGTTAATTCAAA', 'qstring': '#(&&%(\'\'%&(#"""$\'%%$%$%*,)+()\'(\'\'*+AEHHH.-0410)200BGC4HKJJGGB77<DC3-\'.,,+\'&&%%+*(*1-778:C76+,=A.,-./*)+##9:JSGGGHD6432,5>H(\'(+,1-(,//:3640==6504C><357>4448FAFCIGI64-/9660=12HISOBGKLA@?1/59EGM>:::DEJSOM1D?>=GI11775:930,;;>H9/7122)*0:**-===>B55878&#+"#&\',,?@EIJBCLSM964\'(376528:5/-*)21\'##+-&$"#%+&#&%\'-./49?B=A960@7;ABB@6CIEFDD>H7)&45:DC5158B'}}
+                    RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c
+                    {'read_tag': 3605, 'sub_tag': 1, 'priority': <read_priority.high_priority: 0>, 'metadata': {'adapter_front_begin_index': -1, 'adapter_front_foundseq': 'NA', 'adapter_front_foundseq_length': 2, 'adapter_front_id': 'NA', 'adapter_front_refseq': 'NA', 'adapter_front_score': 0.0, 'adapter_mid_end_index': -1, 'adapter_mid_id': 'NA', 'adapter_mid_score': 0.0, 'adapter_rear_end_index': -1, 'adapter_rear_foundseq': 'NA', 'adapter_rear_foundseq_length': 2, 'adapter_rear_id': 'NA', 'adapter_rear_refseq': 'NA', 'adapter_rear_score': 0.0, 'barcode_arrangement': '', 'barcode_front_begin_index': 0, 'barcode_front_foundseq': 'NA', 'barcode_front_foundseq_length': 2, 'barcode_front_id': 'NA', 'barcode_front_id_inner': 'NA', 'barcode_front_refseq': 'NA', 'barcode_front_score': 0.0, 'barcode_front_score_inner': 0.0, 'barcode_full_arrangement': '', 'barcode_kit': '', 'barcode_mid_front_end_index': 0, 'barcode_mid_front_id': 'NA', 'barcode_mid_front_score': 0.0, 'barcode_mid_rear_end_index': 0, 'barcode_mid_rear_id': 'NA', 'barcode_mid_rear_score': 0.0, 'barcode_rear_end_index': 0, 'barcode_rear_foundseq': 'NA', 'barcode_rear_foundseq_length': 2, 'barcode_rear_id': 'NA', 'barcode_rear_id_inner': 'NA', 'barcode_rear_refseq': 'NA', 'barcode_rear_score': 0.0, 'barcode_rear_score_inner': 0.0, 'barcode_score': 0.0, 'barcode_variant': '', 'basecall_type': 'beam search', 'daq_offset': 0.0, 'daq_scaling': 0.25, 'duration': 321, 'lamp_barcode_id': 'NA', 'lamp_barcode_score': 0.0, 'lamp_target_id': 'NA', 'lamp_target_score': 0.0, 'mean_qscore': 12.145367622375488, 'med_abs_dev': 0.01067463681101799, 'median': -373.5199890136719, 'model_stride': 6, 'model_version_id': 'dna_r10.4.1_e8.2_400bps_fast@v4.3.0', 'num_events': 53, 'num_minknow_events': 0, 'primer_front_begin_index': -1, 'primer_front_foundseq': 'NA', 'primer_front_foundseq_length': 2, 'primer_front_id': 'NA', 'primer_front_refseq': 'NA', 'primer_front_score': 0.0, 'primer_rear_end_index': -1, 'primer_rear_foundseq': 'NA', 'primer_rear_foundseq_length': 2, 'primer_rear_id': 'NA', 'primer_rear_refseq': 'NA', 'primer_rear_score': 0.0, 'read_id': 'RF-17774e44-8d3c-4bdd-8730-aaf8addd3e6c', 'sampling_rate': 5000.0, 'scaling_med_abs_dev': 0.01067463681101799, 'scaling_median': -373.5199890136719, 'scaling_version': '', 'sequence_length': 16, 'start_time': 12477610, 'state_size': 0, 'strand_id': '3b536c09-3f73-4c59-a332-2a0f6cad4ed9', 'trim_front': 0, 'trim_rear': 0, 'trimmed_duration': 321, 'trimmed_events': 53, 'trimmed_samples': 0}, 'datasets': {'raw_data': array([306, 289, 300, ..., 526, 537, 540], dtype=int16), 'sequence': 'TTTTTGTGGGCTTTTA', 'qstring': "21;;B98'-213,*2&"}}
+
+                    The second sub_tag will cause the code to gail as it is not expected.
+
+                    Therefore we need to check for the sub_tag and if it is not 0, we need to skip the read.
+                    '''
+                    if res["sub_tag"] > 0:
+                        continue
+
+                    try:
+                        channel, read_number, time_sent = cache.pop(read_id)
+                    except KeyError:
+                        channel, read_number, time_sent = skipped.pop(read_id)
+                        reads_sent += 1
+                    res["metadata"]["read_id"] = read_id[3:]
+                    self.logger.debug(
+                        "@%s ch=%s\n%s\n+\n%s",
+                        res["metadata"]["read_id"],
+                        channel,
+                        res["datasets"]["sequence"],
+                        res["datasets"]["qstring"],
+                    )
+                    barcode = res["metadata"].get("barcode_arrangement", None)
+                    # TODO: Add Filter here
+                    yield Result(
+                        channel=channel,
+                        read_number=read_number,
+                        read_id=res["metadata"]["read_id"],
+                        seq=res["datasets"]["sequence"],
+                        barcode=barcode if barcode else None,
+                        basecall_data=res,
+                    )
+                    reads_received += 1
+
+    def describe(self) -> str:
+        """
+        Describe the Dorado Caller
+
+        :return: Description of parameters passed to this Dorado Caller plugin
+        """
+        description = ["Utilising the Dorado base-caller plugin:"]
+        for param in self.dorado_params.keys():
+            description.append(f"\t- {param}: {self.dorado_params[param]}")
+        return "\n".join(description)
diff --git a/src/readfish/plugins/guppy.py b/src/readfish/plugins/guppy.py
index a2b7d9ec..4432cc0d 100644
--- a/src/readfish/plugins/guppy.py
+++ b/src/readfish/plugins/guppy.py
@@ -2,6 +2,7 @@
 
 Extension of pyguppy Caller that maintains a connection to the basecaller
 """
+
 from __future__ import annotations
 import logging
 import os
@@ -9,12 +10,17 @@
 from collections import namedtuple
 from pathlib import Path
 from typing import Iterable, TYPE_CHECKING
+from packaging.version import parse as parse_version
 
 import numpy as np
 import numpy.typing as npt
 from minknow_api.protocol_pb2 import ProtocolRunInfo
-from pyguppy_client_lib.helper_functions import package_read
-from pyguppy_client_lib.pyclient import PyGuppyClient
+
+try:
+    from pyguppy_client_lib.helper_functions import package_read
+    from pyguppy_client_lib.pyclient import PyGuppyClient
+except ImportError:
+    pass
 
 from readfish._loggers import setup_logger
 from readfish.plugins.abc import CallerABC
@@ -56,9 +62,26 @@ def __init__(
         self.supported_barcode_kits = None
         self.supported_basecall_models = None
         self.run_information = run_information
+        logging.warn(
+            "Deprecation warning - As ONT has moved fully to dorado, this plugin is no longer maintained, and will be deprecated in a future release of readfish."
+        )
+        if self.run_information:
+            self.guppy_version = (
+                self.run_information.software_versions.guppy_connected_version
+            )
+
+            if parse_version(self.guppy_version) < parse_version("7.3.9"):
+                logging.info(f"Connected to caller version {self.guppy_version}.")
+            else:
+                logging.info(
+                    f"Trying to connect to minKNOW with caller version {self.guppy_version}. This plugin requires a version of Dorado or Guppy < 7.3.9. If this is stopping readfish from running try changing [caller_settings.guppy] to [caller_settings.dorado]. You should also check for any updates available to readfish."
+                )
 
         # Set our own priority
         self.guppy_params = kwargs
+
+        # Remove the sample rate from the guppy params as it isn't required for the PyGuppyClient
+        self.guppy_params.pop("sample_rate", None)
         self.guppy_params["priority"] = PyGuppyClient.high_priority
         # Set our own client name to appear in the guppy server logs
         self.guppy_params["client_name"] = "Readfish_connection"
diff --git a/tests/static/guppy_validation_test/fail/001_no_write_socket.toml b/tests/static/guppy_validation_test/fail/001_no_write_socket.toml
index b33b165c..4cf888dd 100644
--- a/tests/static/guppy_validation_test/fail/001_no_write_socket.toml
+++ b/tests/static/guppy_validation_test/fail/001_no_write_socket.toml
@@ -1,4 +1,4 @@
-[caller_settings.guppy]
+[caller_settings.dorado]
 address = "ipc://tests/static/guppy_validation_test/fail/5555_fail_nw"
 config = "dna_r10.4.1_e8.2_400bps_hac"
 
diff --git a/tests/static/guppy_validation_test/fail/001_no_write_socket.txt b/tests/static/guppy_validation_test/fail/001_no_write_socket.txt
index 2f5da30b..64365174 100644
--- a/tests/static/guppy_validation_test/fail/001_no_write_socket.txt
+++ b/tests/static/guppy_validation_test/fail/001_no_write_socket.txt
@@ -1 +1 @@
-The user account running readfish doesn't appear to have permissions to write to the guppy base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nw. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information.
+The user account running readfish doesn't appear to have permissions to write to the dorado base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nw. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information.
diff --git a/tests/static/guppy_validation_test/fail/002_missing_socket.toml b/tests/static/guppy_validation_test/fail/002_missing_socket.toml
index 82dedf57..e21c05f1 100644
--- a/tests/static/guppy_validation_test/fail/002_missing_socket.toml
+++ b/tests/static/guppy_validation_test/fail/002_missing_socket.toml
@@ -1,4 +1,4 @@
-[caller_settings.guppy]
+[caller_settings.dorado]
 address = "ipc://tests/static/guppy_validation_test/fail/5555_not_there"
 config = "dna_r10.4.1_e8.2_400bps_hac"
 
diff --git a/tests/static/guppy_validation_test/fail/002_missing_socket.txt b/tests/static/guppy_validation_test/fail/002_missing_socket.txt
index 96da59b3..81f5fd7c 100644
--- a/tests/static/guppy_validation_test/fail/002_missing_socket.txt
+++ b/tests/static/guppy_validation_test/fail/002_missing_socket.txt
@@ -1 +1 @@
-The provided guppy base-caller socket address doesn't appear to exist. Please check your Guppy Settings. ipc://tests/static/guppy_validation_test/fail/5555_not_there
+The provided dorado base-caller socket address doesn't appear to exist. Please check your dorado Settings. ipc://tests/static/guppy_validation_test/fail/5555_not_there
diff --git a/tests/static/guppy_validation_test/fail/003_no_read_socket.toml b/tests/static/guppy_validation_test/fail/003_no_read_socket.toml
index 8670a5cd..c7eaf018 100644
--- a/tests/static/guppy_validation_test/fail/003_no_read_socket.toml
+++ b/tests/static/guppy_validation_test/fail/003_no_read_socket.toml
@@ -1,4 +1,4 @@
-[caller_settings.guppy]
+[caller_settings.dorado]
 address = "ipc://tests/static/guppy_validation_test/fail/5555_fail_nr"
 config = "dna_r10.4.1_e8.2_400bps_hac"
 
diff --git a/tests/static/guppy_validation_test/fail/003_no_read_socket.txt b/tests/static/guppy_validation_test/fail/003_no_read_socket.txt
index 46973458..5456737d 100644
--- a/tests/static/guppy_validation_test/fail/003_no_read_socket.txt
+++ b/tests/static/guppy_validation_test/fail/003_no_read_socket.txt
@@ -1 +1 @@
-The user account running readfish doesn't appear to have permissions to read the guppy base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nr. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information.
+The user account running readfish doesn't appear to have permissions to read the dorado base-caller socket. Please check permissions on ipc://tests/static/guppy_validation_test/fail/5555_fail_nr. See https://github.com/LooseLab/readfish/issues/221#issuecomment-1375673490 for more information.
diff --git a/tests/static/toml_validation_test/fail/001_missing_keys.toml b/tests/static/toml_validation_test/fail/001_missing_keys.toml
index 7e17a32e..8a5bde1f 100644
--- a/tests/static/toml_validation_test/fail/001_missing_keys.toml
+++ b/tests/static/toml_validation_test/fail/001_missing_keys.toml
@@ -1,4 +1,4 @@
-[caller_settings.guppy]
+[caller_settings.dorado]
 host = "127.0.0.1"
 
 [mapper_settings.mappy]
