Index: debian-lsp/Cargo.toml
===================================================================
--- debian-lsp.orig/Cargo.toml
+++ debian-lsp/Cargo.toml
@@ -118,7 +118,7 @@ version = "1"
 features = ["full"]
 
 [dependencies.tower-lsp-server]
-version = "0.23"
+version = "0.22"
 
 [dependencies.tracing]
 version = "0.1"
Index: debian-lsp/src/changelog/completion.rs
===================================================================
--- debian-lsp.orig/src/changelog/completion.rs
+++ debian-lsp/src/changelog/completion.rs
@@ -3,7 +3,7 @@ use std::collections::BTreeSet;
 use debian_changelog::bugs::BugTracker;
 use rowan::ast::AstNode;
 use text_size::{TextRange, TextSize};
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, Documentation, Position};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, Documentation, Position};
 
 use super::fields::{get_debian_distributions, URGENCY_LEVELS};
 use crate::bugs::{DebbugsBugSummary, LaunchpadBugSummary, SharedBugCache};
Index: debian-lsp/src/changelog/detection.rs
===================================================================
--- debian-lsp.orig/src/changelog/detection.rs
+++ debian-lsp/src/changelog/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if a given URL represents a Debian changelog file
 pub fn is_changelog_file(uri: &Uri) -> bool {
Index: debian-lsp/src/changelog/semantic.rs
===================================================================
--- debian-lsp.orig/src/changelog/semantic.rs
+++ debian-lsp/src/changelog/semantic.rs
@@ -1,7 +1,7 @@
 //! Semantic token generation for Debian changelog files.
 
 use debian_changelog::SyntaxKind;
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use crate::deb822::semantic::{SemanticTokensBuilder, TokenType};
 use crate::position::offset_to_position;
Index: debian-lsp/src/control/actions.rs
===================================================================
--- debian-lsp.orig/src/control/actions.rs
+++ debian-lsp/src/control/actions.rs
@@ -1,7 +1,7 @@
 use crate::position::text_range_to_lsp_range;
 use crate::workspace::FieldCasingIssue;
 use text_size::TextRange;
-use tower_lsp_server::ls_types::*;
+use tower_lsp_server::lsp_types::*;
 
 /// Format an entire control file using wrap-and-sort
 ///
Index: debian-lsp/src/control/completion.rs
===================================================================
--- debian-lsp.orig/src/control/completion.rs
+++ debian-lsp/src/control/completion.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, InsertTextFormat};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, InsertTextFormat};
 
 use super::fields::{
     CONTROL_FIELDS, CONTROL_PRIORITY_VALUES, CONTROL_SECTION_AREAS, CONTROL_SECTION_VALUES,
@@ -20,7 +20,7 @@ use crate::package_cache::SharedPackageC
 pub fn get_completions(
     deb822: &deb822_lossless::Deb822,
     source_text: &str,
-    position: tower_lsp_server::ls_types::Position,
+    position: tower_lsp_server::lsp_types::Position,
 ) -> Vec<CompletionItem> {
     let mut completions = crate::deb822::completion::get_completions(
         deb822,
@@ -129,7 +129,7 @@ pub fn get_field_value_completions(field
 pub async fn get_async_field_value_completions(
     field_name: &str,
     prefix: &str,
-    position: tower_lsp_server::ls_types::Position,
+    position: tower_lsp_server::lsp_types::Position,
     package_cache: &SharedPackageCache,
     architecture_list: &SharedArchitectureList,
 ) -> Option<Vec<CompletionItem>> {
@@ -356,7 +356,7 @@ mod tests {
     use crate::architecture::SharedArchitectureList;
     use crate::package_cache::TestPackageCache;
     use std::sync::Arc;
-    use tower_lsp_server::ls_types::Position;
+    use tower_lsp_server::lsp_types::Position;
 
     fn test_cache() -> SharedPackageCache {
         TestPackageCache::new_shared(&[
@@ -683,7 +683,7 @@ mod tests {
         let ctx = crate::deb822::completion::get_cursor_context(
             &deb822,
             text,
-            tower_lsp_server::ls_types::Position::new(0, 15),
+            tower_lsp_server::lsp_types::Position::new(0, 15),
         )
         .expect("Should have context");
 
@@ -698,7 +698,7 @@ mod tests {
                 let completions = get_async_field_value_completions(
                     &field_name,
                     &value_prefix,
-                    tower_lsp_server::ls_types::Position::new(0, 15),
+                    tower_lsp_server::lsp_types::Position::new(0, 15),
                     &cache,
                     &test_arch_list(),
                 )
@@ -718,7 +718,7 @@ mod tests {
         let ctx = crate::deb822::completion::get_cursor_context(
             &deb822,
             text,
-            tower_lsp_server::ls_types::Position::new(0, 17),
+            tower_lsp_server::lsp_types::Position::new(0, 17),
         )
         .expect("Should have context");
 
@@ -733,7 +733,7 @@ mod tests {
                 let completions = get_async_field_value_completions(
                     &field_name,
                     &value_prefix,
-                    tower_lsp_server::ls_types::Position::new(0, 17),
+                    tower_lsp_server::lsp_types::Position::new(0, 17),
                     &cache,
                     &test_arch_list(),
                 )
@@ -778,7 +778,7 @@ mod tests {
                     .expect("Should have ${misc:Depends} completion");
                 // The text_edit range must start at the "$" (col 13), NOT at the comma (col 12)
                 let edit = match &misc_depends.text_edit {
-                    Some(tower_lsp_server::ls_types::CompletionTextEdit::Edit(e)) => e,
+                    Some(tower_lsp_server::lsp_types::CompletionTextEdit::Edit(e)) => e,
                     _ => panic!("Expected TextEdit"),
                 };
                 assert_eq!(edit.range.start, Position::new(0, 13));
Index: debian-lsp/src/control/detection.rs
===================================================================
--- debian-lsp.orig/src/control/detection.rs
+++ debian-lsp/src/control/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if a given URL represents a Debian control file
 pub fn is_control_file(uri: &Uri) -> bool {
Index: debian-lsp/src/control/diagnostics.rs
===================================================================
--- debian-lsp.orig/src/control/diagnostics.rs
+++ debian-lsp/src/control/diagnostics.rs
@@ -1,5 +1,5 @@
 use text_size::TextRange;
-use tower_lsp_server::ls_types::{Diagnostic, DiagnosticSeverity, NumberOrString, Position, Range};
+use tower_lsp_server::lsp_types::{Diagnostic, DiagnosticSeverity, NumberOrString, Position, Range};
 
 use crate::workspace::FieldCasingIssue;
 
Index: debian-lsp/src/control/relation_completion.rs
===================================================================
--- debian-lsp.orig/src/control/relation_completion.rs
+++ debian-lsp/src/control/relation_completion.rs
@@ -1,7 +1,7 @@
 use debian_control::lossless::relations::Relations;
 use debian_control::relations::SyntaxKind as RelSyntaxKind;
 use rowan::NodeOrToken;
-use tower_lsp_server::ls_types::{
+use tower_lsp_server::lsp_types::{
     CompletionItem, CompletionItemKind, CompletionTextEdit, Documentation, Position, Range,
     TextEdit,
 };
Index: debian-lsp/src/control/semantic.rs
===================================================================
--- debian-lsp.orig/src/control/semantic.rs
+++ debian-lsp/src/control/semantic.rs
@@ -1,6 +1,6 @@
 //! Semantic token generation for Debian control files.
 
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use super::get_standard_field_name;
 use crate::deb822::semantic::{generate_tokens, FieldValidator};
Index: debian-lsp/src/copyright/actions.rs
===================================================================
--- debian-lsp.orig/src/copyright/actions.rs
+++ debian-lsp/src/copyright/actions.rs
@@ -1,7 +1,7 @@
 use crate::position::text_range_to_lsp_range;
 use crate::workspace::FieldCasingIssue;
 use text_size::TextRange;
-use tower_lsp_server::ls_types::*;
+use tower_lsp_server::lsp_types::*;
 
 /// Format an entire copyright file using wrap-and-sort
 ///
Index: debian-lsp/src/copyright/completion.rs
===================================================================
--- debian-lsp.orig/src/copyright/completion.rs
+++ debian-lsp/src/copyright/completion.rs
@@ -1,7 +1,7 @@
 use std::collections::HashSet;
 
 use debian_copyright::LicenseExpr;
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, InsertTextFormat, Position};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, InsertTextFormat, Position};
 
 use super::fields::{get_common_licenses, COPYRIGHT_FIELDS};
 
Index: debian-lsp/src/copyright/detection.rs
===================================================================
--- debian-lsp.orig/src/copyright/detection.rs
+++ debian-lsp/src/copyright/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if a given URL represents a Debian copyright file
 pub fn is_copyright_file(uri: &Uri) -> bool {
Index: debian-lsp/src/copyright/semantic.rs
===================================================================
--- debian-lsp.orig/src/copyright/semantic.rs
+++ debian-lsp/src/copyright/semantic.rs
@@ -1,6 +1,6 @@
 //! Semantic token generation for Debian copyright files.
 
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use super::get_standard_field_name;
 use crate::deb822::semantic::{generate_tokens, FieldValidator};
Index: debian-lsp/src/deb822/completion.rs
===================================================================
--- debian-lsp.orig/src/deb822/completion.rs
+++ debian-lsp/src/deb822/completion.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, Documentation, Position};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, Documentation, Position};
 
 /// A field definition for a deb822-based file format.
 pub struct FieldInfo {
Index: debian-lsp/src/deb822/semantic.rs
===================================================================
--- debian-lsp.orig/src/deb822/semantic.rs
+++ debian-lsp/src/deb822/semantic.rs
@@ -6,7 +6,7 @@
 
 use deb822_lossless::{Deb822, SyntaxKind};
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use crate::position::offset_to_position;
 
Index: debian-lsp/src/main.rs
===================================================================
--- debian-lsp.orig/src/main.rs
+++ debian-lsp/src/main.rs
@@ -6,7 +6,7 @@
 use std::sync::Arc;
 use tokio::sync::Mutex;
 use tower_lsp_server::jsonrpc::Result;
-use tower_lsp_server::ls_types::*;
+use tower_lsp_server::lsp_types::*;
 use tower_lsp_server::{Client, LanguageServer, LspService, Server};
 
 mod architecture;
Index: debian-lsp/src/position.rs
===================================================================
--- debian-lsp.orig/src/position.rs
+++ debian-lsp/src/position.rs
@@ -1,5 +1,5 @@
 use text_size::{TextRange, TextSize};
-use tower_lsp_server::ls_types::{Position, Range};
+use tower_lsp_server::lsp_types::{Position, Range};
 
 /// Return the UTF-16 code unit length of a string.
 pub fn utf16_len(s: &str) -> u32 {
Index: debian-lsp/src/source_format/completion.rs
===================================================================
--- debian-lsp.orig/src/source_format/completion.rs
+++ debian-lsp/src/source_format/completion.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, Position, Uri};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, Position, Uri};
 
 use super::detection::is_source_format_file;
 use super::fields::SOURCE_FORMATS;
Index: debian-lsp/src/source_format/detection.rs
===================================================================
--- debian-lsp.orig/src/source_format/detection.rs
+++ debian-lsp/src/source_format/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if the given URI points to a debian/source/format file
 pub fn is_source_format_file(uri: &Uri) -> bool {
Index: debian-lsp/src/tests/completion.rs
===================================================================
--- debian-lsp.orig/src/tests/completion.rs
+++ debian-lsp/src/tests/completion.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{CompletionItem, Position, Uri};
+use tower_lsp_server::lsp_types::{CompletionItem, Position, Uri};
 
 /// Get completion items for a debian/tests/control file
 pub fn get_completions(_uri: &Uri, _position: Position) -> Vec<CompletionItem> {
Index: debian-lsp/src/tests/detection.rs
===================================================================
--- debian-lsp.orig/src/tests/detection.rs
+++ debian-lsp/src/tests/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if a given URL represents a Debian tests/control file
 pub fn is_tests_control_file(uri: &Uri) -> bool {
Index: debian-lsp/src/tests/semantic.rs
===================================================================
--- debian-lsp.orig/src/tests/semantic.rs
+++ debian-lsp/src/tests/semantic.rs
@@ -1,6 +1,6 @@
 //! Semantic token generation for debian/tests/control files.
 
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use crate::deb822::semantic::{generate_tokens, FieldValidator};
 
Index: debian-lsp/src/upstream_metadata/completion.rs
===================================================================
--- debian-lsp.orig/src/upstream_metadata/completion.rs
+++ debian-lsp/src/upstream_metadata/completion.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, Position};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, Position};
 
 use super::fields::UPSTREAM_FIELDS;
 
Index: debian-lsp/src/upstream_metadata/detection.rs
===================================================================
--- debian-lsp.orig/src/upstream_metadata/detection.rs
+++ debian-lsp/src/upstream_metadata/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if a given URL represents a debian/upstream/metadata file.
 pub fn is_upstream_metadata_file(uri: &Uri) -> bool {
Index: debian-lsp/src/upstream_metadata/semantic.rs
===================================================================
--- debian-lsp.orig/src/upstream_metadata/semantic.rs
+++ debian-lsp/src/upstream_metadata/semantic.rs
@@ -1,6 +1,6 @@
 //! Semantic token generation for debian/upstream/metadata files.
 
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 use yaml_edit::{Document, YamlNode};
 
 use super::fields::get_standard_field_name;
Index: debian-lsp/src/watch/completion.rs
===================================================================
--- debian-lsp.orig/src/watch/completion.rs
+++ debian-lsp/src/watch/completion.rs
@@ -1,6 +1,6 @@
 use crate::deb822::completion::FieldInfo;
 use crate::position::try_position_to_offset;
-use tower_lsp_server::ls_types::{
+use tower_lsp_server::lsp_types::{
     CompletionItem, CompletionItemKind, Documentation, Position, Uri,
 };
 
Index: debian-lsp/src/watch/detection.rs
===================================================================
--- debian-lsp.orig/src/watch/detection.rs
+++ debian-lsp/src/watch/detection.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::Uri;
+use tower_lsp_server::lsp_types::Uri;
 
 /// Check if a given URL represents a Debian watch file
 pub fn is_watch_file(uri: &Uri) -> bool {
Index: debian-lsp/src/watch/fields.rs
===================================================================
--- debian-lsp.orig/src/watch/fields.rs
+++ debian-lsp/src/watch/fields.rs
@@ -9,7 +9,7 @@ pub enum OptionValueType {
     Enum(&'static [&'static str]),
 }
 
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind};
 
 /// A watch file field definition, used for both v1-4 line-based options and v5 deb822 fields.
 pub struct WatchField {
Index: debian-lsp/src/watch/semantic.rs
===================================================================
--- debian-lsp.orig/src/watch/semantic.rs
+++ debian-lsp/src/watch/semantic.rs
@@ -2,7 +2,7 @@
 //!
 //! Supports both deb822 (v5) and line-based (v1-4) watch file formats.
 
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use crate::deb822::semantic::{SemanticTokensBuilder, TokenType};
 use crate::position::offset_to_position;
Index: debian-lsp/src/workspace.rs
===================================================================
--- debian-lsp.orig/src/workspace.rs
+++ debian-lsp/src/workspace.rs
@@ -3,7 +3,7 @@ use std::collections::HashMap;
 use rowan::ast::AstNode;
 use salsa::Setter;
 use text_size::TextRange;
-use tower_lsp_server::ls_types::{Diagnostic, DiagnosticSeverity, NumberOrString, Uri};
+use tower_lsp_server::lsp_types::{Diagnostic, DiagnosticSeverity, NumberOrString, Uri};
 
 /// Information about a field casing issue
 #[derive(Debug, Clone)]
