diff --git a/pytmc/record.py b/pytmc/record.py
index 5451552..0f04c67 100644
--- a/pytmc/record.py
+++ b/pytmc/record.py
@@ -214,7 +214,7 @@ class RecordPackage:
         return config
 
     def _configure_link(self):
-        'Link this record to a pre-existing EPICS record via a CA (CPP) link'
+        'Link this record to a pre-existing EPICS record via a CA (CP) link'
         self.linked_to_pv = self.config.get('link') or None
 
     def _configure_pvname(self):
@@ -493,7 +493,7 @@ class TwincatTypeRecordPackage(RecordPackage):
         linked_to_pv = linked_to_pv.replace(self.macro_character, '$')
         return {
             'OMSL': 'closed_loop',
-            'DOL': linked_to_pv + ' CPP MS',
+            'DOL': linked_to_pv + ' CP MS',
             'SCAN': self.config.get('link_scan', '.5 second'),
         }
 

diff --git a/pytmc/tests/test_xml_collector.py b/pytmc/tests/test_xml_collector.py
index c709c10..1051146 100644
--- a/pytmc/tests/test_xml_collector.py
+++ b/pytmc/tests/test_xml_collector.py
@@ -517,7 +517,7 @@ def test_pv_linking():
     assert isinstance(pkg, IntegerRecordPackage)
     rec = pkg.generate_output_record()
     assert rec.fields['OMSL'] == 'closed_loop'
-    assert rec.fields['DOL'] == 'OTHER:RECORD CPP MS'
+    assert rec.fields['DOL'] == 'OTHER:RECORD CP MS'
     assert rec.fields['SCAN'] == '.5 second'
 
 
@@ -539,7 +539,7 @@ def test_pv_linking_string():
     assert lso_rec.pvname == lso_pvname
     assert lso_rec.record_type == "lso"
     assert lso_rec.fields["OMSL"] == "closed_loop"
-    assert lso_rec.fields["DOL"] == "OTHER:RECORD.VAL$ CPP MS"
+    assert lso_rec.fields["DOL"] == "OTHER:RECORD.VAL$ CP MS"
     assert lso_rec.fields["SCAN"] == ".5 second"
     assert lso_rec.fields["SIZV"] == 70
 
@@ -571,10 +571,10 @@ def test_pv_linking_struct():
 
     pkg1, pkg2 = list(pragmas.record_packages_from_symbol(struct))
     rec = pkg1.generate_output_record()
-    assert rec.fields['DOL'] == 'PREFIX:ABCD.STAT CPP MS'
+    assert rec.fields['DOL'] == 'PREFIX:ABCD.STAT CP MS'
 
     rec = pkg2.generate_output_record()
-    assert rec.fields['DOL'] == 'LINK:OTHER_PV CPP MS'
+    assert rec.fields['DOL'] == 'LINK:OTHER_PV CP MS'
 
 
 def test_pv_linking_special():
@@ -594,7 +594,7 @@ def test_pv_linking_special():
 
     pkg, = list(pragmas.record_packages_from_symbol(struct))
     rec = pkg.generate_output_record()
-    assert rec.fields['DOL'] == 'PREFIX:ABCD.STAT CPP MS'
+    assert rec.fields['DOL'] == 'PREFIX:ABCD.STAT CP MS'
 
 
 @pytest.mark.parametrize(

pytmc link settings should be "CP" instead of "CPP"
Code:
https://github.com/pcdshub/pytmc/blob/bd2529195298e5b1dbfd96772a7702b2199f4f4b/pytmc/record.py#L496

Otherwise, we will be stuck at the 2Hz updates in the record:

> If the input link specifies CA, CP, or CPP, regardless of the location of the process variable being referenced, it will be forced to be a Channel Access link. This is helpful for separating process chains that are not tightly related. If the input link specifies CP, it also causes the record containing the input link to process whenever a monitor is posted, no matter what the record’s SCAN field specifies. If the input link specifies CPP, it causes the record to be processed if and only if the record with the CPP link has a SCAN field set to Passive. In other words, CP and CPP cause the record containing the link to be processed with the process variable that they reference changes.
pytmc/tests/test_xml_collector.py::test_pv_linking pytmc/tests/test_xml_collector.py::test_pv_linking_string pytmc/tests/test_xml_collector.py::test_pv_linking_struct pytmc/tests/test_xml_collector.py::test_pv_linking_special
pytmc/tests/test_xml_collector.py::test_record_package_from_chain[BOOL-False-BinaryRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[BOOL-True-WaveformRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[INT-False-IntegerRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[INT-True-WaveformRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[DINT-False-IntegerRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[DINT-True-WaveformRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[ENUM-False-EnumRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[ENUM-True-WaveformRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[REAL-False-FloatRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[REAL-True-WaveformRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[LREAL-False-FloatRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[LREAL-True-WaveformRecordPackage] pytmc/tests/test_xml_collector.py::test_record_package_from_chain[STRING-False-StringRecordPackage] pytmc/tests/test_xml_collector.py::test_dtype[BOOL-i-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[BOOL-io-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[BOOL-i-True-asynInt8ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[BOOL-io-True-asynInt8ArrayOut] pytmc/tests/test_xml_collector.py::test_dtype[INT-i-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[INT-io-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[INT-i-True-asynInt16ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[INT-io-True-asynInt16ArrayOut] pytmc/tests/test_xml_collector.py::test_dtype[DINT-i-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[DINT-io-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[DINT-i-True-asynInt32ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[DINT-io-True-asynInt32ArrayOut] pytmc/tests/test_xml_collector.py::test_dtype[REAL-i-False-asynFloat64] pytmc/tests/test_xml_collector.py::test_dtype[REAL-io-False-asynFloat64] pytmc/tests/test_xml_collector.py::test_dtype[REAL-i-True-asynFloat32ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[REAL-io-True-asynFloat32ArrayOut] pytmc/tests/test_xml_collector.py::test_dtype[LREAL-i-False-asynFloat64] pytmc/tests/test_xml_collector.py::test_dtype[LREAL-io-False-asynFloat64] pytmc/tests/test_xml_collector.py::test_dtype[LREAL-i-True-asynFloat64ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[LREAL-io-True-asynFloat64ArrayOut] pytmc/tests/test_xml_collector.py::test_dtype[ENUM-i-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[ENUM-io-False-asynInt32] pytmc/tests/test_xml_collector.py::test_dtype[ENUM-i-True-asynInt16ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[ENUM-io-True-asynInt16ArrayOut] pytmc/tests/test_xml_collector.py::test_dtype[STRING-i-False-asynInt8ArrayIn] pytmc/tests/test_xml_collector.py::test_dtype[STRING-io-False-asynInt8ArrayOut] pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[BYTE-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[BYTE-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[SINT-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[SINT-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[USINT-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[USINT-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[WORD-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[WORD-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[INT-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[INT-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[UINT-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[UINT-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[DWORD-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[DWORD-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[DINT-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[DINT-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[UDINT-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[UDINT-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[LREAL-0--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[LREAL-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[STRING-2--INP-@asyn($(PORT),0,1)ADSPORT=851/POLL_RATE=1/a.b.c?] pytmc/tests/test_xml_collector.py::test_input_output_scan[STRING-6--OUT-@asyn($(PORT),0,1)ADSPORT=851/a.b.c=] pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-1hz pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-2hz pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-0.5hz pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-0.02hz pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-0.1hz pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-50s pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-10s pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-2s pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-1s pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-0.5s pytmc/tests/test_xml_collector.py::test_input_output_scan[BOOL-2-0.1s pytmc/tests/test_xml_collector.py::test_bool_naming[BOOL-0-FALSE-TRUE-True] pytmc/tests/test_xml_collector.py::test_bool_naming[STRING-0-None-None-False] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_PREC[LREAL-0-3-True] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_PREC[STRING-0-None-False] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[INT-o-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[BOOL-i-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[BOOL-i-False-True-CHAR] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[BOOL-o-False-True-CHAR] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[BOOL-io-False-True-CHAR] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[INT-i-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[INT-i-False-True-SHORT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[INT-o-False-True-SHORT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[INT-io-False-True-SHORT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[DINT-i-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[DINT-i-False-True-LONG] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[DINT-o-False-True-LONG] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[DINT-io-False-True-LONG] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[ENUM-i-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[ENUM-i-False-True-SHORT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[ENUM-o-False-True-SHORT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[ENUM-io-False-True-SHORT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[REAL-i-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[REAL-i-False-True-FLOAT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[REAL-o-False-True-FLOAT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[REAL-io-False-True-FLOAT] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[LREAL-i-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[LREAL-i-False-True-DOUBLE] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[LREAL-o-False-True-DOUBLE] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[LREAL-io-False-True-DOUBLE] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[STRING-i-True-False-CHAR] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[STRING-o-True-False-CHAR] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_FTVL[STRING-io-True-False-CHAR] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_NELM[INT-0-False-False-None] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_NELM[INT-0-False-True-3] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_NELM[LREAL-0-False-True-9] pytmc/tests/test_xml_collector.py::test_BaseRecordPackage_guess_NELM[STRING-0-True-False-81] pytmc/tests/test_xml_collector.py::test_scalar pytmc/tests/test_xml_collector.py::test_complex_array pytmc/tests/test_xml_collector.py::test_complex_array_partial[no-pragma] pytmc/tests/test_xml_collector.py::test_complex_array_partial[0..1] pytmc/tests/test_xml_collector.py::test_complex_array_partial[0..1,3] pytmc/tests/test_xml_collector.py::test_complex_array_partial[..1] pytmc/tests/test_xml_collector.py::test_complex_array_partial[1..] pytmc/tests/test_xml_collector.py::test_complex_array_partial[0..1,99..] pytmc/tests/test_xml_collector.py::test_complex_array_partial[separate_prefixes] pytmc/tests/test_xml_collector.py::test_enum_array pytmc/tests/test_xml_collector.py::test_unroll_formatting pytmc/tests/test_xml_collector.py::test_waveform_archive[over_threshold] pytmc/tests/test_xml_collector.py::test_waveform_archive[under_threshold] pytmc/tests/test_xml_collector.py::test_complex_sub_array_partial[no-pragma] pytmc/tests/test_xml_collector.py::test_complex_sub_array_partial[0..1] pytmc/tests/test_xml_collector.py::test_complex_sub_array_partial[1..3,5,7,9] pytmc/tests/test_xml_collector.py::test_sub_io_change[no-pragma] pytmc/tests/test_xml_collector.py::test_sub_io_change[change_to_io] pytmc/tests/test_xml_collector.py::test_scale_and_offset[float-scale-and-offset] pytmc/tests/test_xml_collector.py::test_scale_and_offset[int-scale-and-offset] pytmc/tests/test_xml_collector.py::test_scale_and_offset[int-no-offset] pytmc/tests/test_xml_collector.py::test_scale_and_offset[int-no-scale]