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,8 +6,8 @@
 use std::sync::Arc;
 use tokio::sync::Mutex;
 use tower_lsp_server::jsonrpc::Result;
-use tower_lsp_server::ls_types::*;
-use tower_lsp_server::{Client, LanguageServer, LspService, Server};
+use tower_lsp_server::lsp_types::*;
+use tower_lsp_server::{Client, LanguageServer, LspService, Server, UriExt};
 
 mod architecture;
 mod bugs;
@@ -32,7 +32,7 @@ mod workspace;
 
 use position::{text_range_to_lsp_range, try_lsp_range_to_text_range};
 use std::collections::HashMap;
-use tower_lsp_server::ls_types::notification::Notification;
+use tower_lsp_server::lsp_types::notification::Notification;
 use workspace::Workspace;
 
 /// Custom notification for package status, displayed in the editor status bar.
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)]
Index: debian-lsp/src/changelog/actions.rs
===================================================================
--- debian-lsp.orig/src/changelog/actions.rs
+++ debian-lsp/src/changelog/actions.rs
@@ -1,7 +1,7 @@
 use chrono::Local;
 use rowan::ast::AstNode;
 use std::env;
-use tower_lsp_server::ls_types::TextEdit;
+use tower_lsp_server::lsp_types::TextEdit;
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/changelog/folding.rs
===================================================================
--- debian-lsp.orig/src/changelog/folding.rs
+++ debian-lsp/src/changelog/folding.rs
@@ -4,7 +4,7 @@
 
 use debian_changelog::{ChangeLog, Parse};
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{FoldingRange, FoldingRangeKind};
+use tower_lsp_server::lsp_types::{FoldingRange, FoldingRangeKind};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/changelog/hover.rs
===================================================================
--- debian-lsp.orig/src/changelog/hover.rs
+++ debian-lsp/src/changelog/hover.rs
@@ -7,7 +7,7 @@
 
 use debian_changelog::bugs::Bug;
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position};
+use tower_lsp_server::lsp_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position};
 
 use crate::bugs::{DebbugsBugSummary, LaunchpadBugSummary, SharedBugCache};
 
Index: debian-lsp/src/changelog/inlay_hints.rs
===================================================================
--- debian-lsp.orig/src/changelog/inlay_hints.rs
+++ debian-lsp/src/changelog/inlay_hints.rs
@@ -9,7 +9,7 @@
 //! resolve to "buster", not the current stable release.
 
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{InlayHint, InlayHintKind, InlayHintLabel};
+use tower_lsp_server::lsp_types::{InlayHint, InlayHintKind, InlayHintLabel};
 
 use crate::position::text_range_to_lsp_range;
 
@@ -17,7 +17,7 @@ use crate::position::text_range_to_lsp_r
 pub fn generate_inlay_hints(
     parsed: &debian_changelog::Parse<debian_changelog::ChangeLog>,
     source_text: &str,
-    range: &tower_lsp_server::ls_types::Range,
+    range: &tower_lsp_server::lsp_types::Range,
 ) -> Vec<InlayHint> {
     let changelog = parsed.tree();
     let mut hints = Vec::new();
@@ -106,9 +106,9 @@ foo (1.0-1) unstable; urgency=medium
 "#;
 
         let parsed = debian_changelog::ChangeLog::parse(changelog_text);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(11, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(11, 0),
         };
 
         let hints = generate_inlay_hints(&parsed, changelog_text, &range);
@@ -137,9 +137,9 @@ foo (1.0-1) unstable; urgency=medium
 "#;
 
         let parsed = debian_changelog::ChangeLog::parse(changelog_text);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(4, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(4, 0),
         };
 
         let hints = generate_inlay_hints(&parsed, changelog_text, &range);
@@ -162,9 +162,9 @@ foo (1.0-1) unstable; urgency=medium
 "#;
 
         let parsed = debian_changelog::ChangeLog::parse(changelog_text);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(4, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(4, 0),
         };
 
         let hints = generate_inlay_hints(&parsed, changelog_text, &range);
@@ -186,9 +186,9 @@ foo (1.0-1) unstable; urgency=medium
 "#;
 
         let parsed = debian_changelog::ChangeLog::parse(changelog_text);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(4, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(4, 0),
         };
 
         let hints = generate_inlay_hints(&parsed, changelog_text, &range);
Index: debian-lsp/src/changelog/on_type_formatting.rs
===================================================================
--- debian-lsp.orig/src/changelog/on_type_formatting.rs
+++ debian-lsp/src/changelog/on_type_formatting.rs
@@ -1,6 +1,6 @@
 use debian_changelog::{ChangeLog, SyntaxKind};
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{Position, TextEdit};
+use tower_lsp_server::lsp_types::{Position, TextEdit};
 
 /// Generate on-type formatting edits for debian/changelog files.
 ///
@@ -61,7 +61,7 @@ fn on_type_dash(
 
     // Insert a space after the "--"
     Some(vec![TextEdit {
-        range: tower_lsp_server::ls_types::Range {
+        range: tower_lsp_server::lsp_types::Range {
             start: position,
             end: position,
         },
@@ -152,7 +152,7 @@ fn on_type_newline(
     };
 
     Some(vec![TextEdit {
-        range: tower_lsp_server::ls_types::Range {
+        range: tower_lsp_server::lsp_types::Range {
             start: line_start,
             end: line_end,
         },
Index: debian-lsp/src/changelog/selection_range.rs
===================================================================
--- debian-lsp.orig/src/changelog/selection_range.rs
+++ debian-lsp/src/changelog/selection_range.rs
@@ -8,7 +8,7 @@
 use debian_changelog::{ChangeLog, Parse};
 use rowan::ast::AstNode;
 use text_size::TextSize;
-use tower_lsp_server::ls_types::{Position, Range, SelectionRange};
+use tower_lsp_server::lsp_types::{Position, Range, SelectionRange};
 
 use crate::position::{offset_to_position, text_range_to_lsp_range, try_position_to_offset};
 
Index: debian-lsp/src/changelog/symbols.rs
===================================================================
--- debian-lsp.orig/src/changelog/symbols.rs
+++ debian-lsp/src/changelog/symbols.rs
@@ -2,7 +2,7 @@
 
 use debian_changelog::{ChangeLog, Parse};
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{DocumentSymbol, SymbolKind};
+use tower_lsp_server::lsp_types::{DocumentSymbol, SymbolKind};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/control/code_lens.rs
===================================================================
--- debian-lsp.orig/src/control/code_lens.rs
+++ debian-lsp/src/control/code_lens.rs
@@ -5,7 +5,7 @@
 //! - Vcs-Git: shows packaged version from UDD vcswatch
 
 use debian_control::relations::VersionConstraint;
-use tower_lsp_server::ls_types::{CodeLens, Command, Range};
+use tower_lsp_server::lsp_types::{CodeLens, Command, Range};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/control/definition.rs
===================================================================
--- debian-lsp.orig/src/control/definition.rs
+++ debian-lsp/src/control/definition.rs
@@ -4,7 +4,8 @@ use debian_control::lossless::relations:
 use debian_control::lossless::{Control, Parse};
 use debian_control::relations::SyntaxKind as RelSyntaxKind;
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{Location, Position, Uri};
+use tower_lsp_server::lsp_types::{Location, Position, Uri};
+use tower_lsp_server::UriExt;
 
 use super::relation_completion::is_relationship_field;
 use crate::deb822::completion::{get_cursor_context, CursorContext};
Index: debian-lsp/src/control/hover.rs
===================================================================
--- debian-lsp.orig/src/control/hover.rs
+++ debian-lsp/src/control/hover.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{Hover, Position};
+use tower_lsp_server::lsp_types::{Hover, Position};
 
 use super::fields::CONTROL_FIELDS;
 
Index: debian-lsp/src/control/inlay_hints.rs
===================================================================
--- debian-lsp.orig/src/control/inlay_hints.rs
+++ debian-lsp/src/control/inlay_hints.rs
@@ -8,7 +8,7 @@ use std::collections::HashMap;
 
 use debian_control::lossless::relations::Relations;
 use text_size::TextSize;
-use tower_lsp_server::ls_types::{InlayHint, InlayHintKind, InlayHintLabel};
+use tower_lsp_server::lsp_types::{InlayHint, InlayHintKind, InlayHintLabel};
 
 use crate::position::text_range_to_lsp_range;
 
@@ -88,7 +88,7 @@ pub(super) fn joined_offset_to_source_of
 fn extract_hint_data(
     parsed: &debian_control::lossless::Parse<debian_control::lossless::Control>,
     source_text: &str,
-    range: &tower_lsp_server::ls_types::Range,
+    range: &tower_lsp_server::lsp_types::Range,
 ) -> HintData {
     let control = parsed.tree();
 
@@ -292,7 +292,7 @@ pub struct HintContext<'a> {
 pub async fn generate_inlay_hints(
     parsed: &debian_control::lossless::Parse<debian_control::lossless::Control>,
     source_text: &str,
-    range: &tower_lsp_server::ls_types::Range,
+    range: &tower_lsp_server::lsp_types::Range,
     ctx: &HintContext<'_>,
 ) -> (Vec<InlayHint>, Vec<String>) {
     // Extract info synchronously (CST types are not Send)
@@ -395,9 +395,9 @@ Build-Depends: debhelper (>= 13.5),
 Maintainer: Test <test@example.com>
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -445,9 +445,9 @@ Depends: default-mta, libc6
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -498,9 +498,9 @@ Depends: libc6
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -549,9 +549,9 @@ Depends: mail-transport-agent
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -601,9 +601,9 @@ Depends: python3-all
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -642,9 +642,9 @@ Depends: python3-all
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -692,9 +692,9 @@ Depends: debhelper
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
@@ -737,9 +737,9 @@ Depends: ${shlibs:Depends}, ${misc:Depen
 Description: A test
 ";
         let parsed = debian_control::lossless::Control::parse(content);
-        let range = tower_lsp_server::ls_types::Range {
-            start: tower_lsp_server::ls_types::Position::new(0, 0),
-            end: tower_lsp_server::ls_types::Position::new(5, 0),
+        let range = tower_lsp_server::lsp_types::Range {
+            start: tower_lsp_server::lsp_types::Position::new(0, 0),
+            end: tower_lsp_server::lsp_types::Position::new(5, 0),
         };
 
         let (hints, _uncached) = generate_inlay_hints(
Index: debian-lsp/src/control/rename.rs
===================================================================
--- debian-lsp.orig/src/control/rename.rs
+++ debian-lsp/src/control/rename.rs
@@ -7,7 +7,8 @@
 
 use debian_control::lossless::{Control, Parse};
 use std::path::Path;
-use tower_lsp_server::ls_types::*;
+use tower_lsp_server::lsp_types::*;
+use tower_lsp_server::UriExt;
 
 use crate::position::{text_range_to_lsp_range, try_position_to_offset};
 
Index: debian-lsp/src/control/symbols.rs
===================================================================
--- debian-lsp.orig/src/control/symbols.rs
+++ debian-lsp/src/control/symbols.rs
@@ -2,7 +2,7 @@
 
 use debian_control::lossless::{Control, Parse};
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{DocumentSymbol, SymbolKind};
+use tower_lsp_server::lsp_types::{DocumentSymbol, SymbolKind};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/copyright/code_lens.rs
===================================================================
--- debian-lsp.orig/src/copyright/code_lens.rs
+++ debian-lsp/src/copyright/code_lens.rs
@@ -17,7 +17,7 @@ use std::time::{Duration, Instant};
 use debian_copyright::GlobPattern;
 use rowan::ast::AstNode;
 use tokio::sync::Mutex;
-use tower_lsp_server::ls_types::{CodeLens, Command};
+use tower_lsp_server::lsp_types::{CodeLens, Command};
 
 use crate::position::text_range_to_lsp_range;
 
@@ -255,7 +255,7 @@ pub async fn generate_code_lenses(
 struct FilesParagraphData {
     patterns_raw: Vec<String>,
     patterns: Vec<GlobPattern>,
-    range: tower_lsp_server::ls_types::Range,
+    range: tower_lsp_server::lsp_types::Range,
 }
 
 /// Pre-extracted data needed for file-count lenses.
Index: debian-lsp/src/copyright/hover.rs
===================================================================
--- debian-lsp.orig/src/copyright/hover.rs
+++ debian-lsp/src/copyright/hover.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{Hover, Position};
+use tower_lsp_server::lsp_types::{Hover, Position};
 
 use super::fields::COPYRIGHT_FIELDS;
 
Index: debian-lsp/src/copyright/symbols.rs
===================================================================
--- debian-lsp.orig/src/copyright/symbols.rs
+++ debian-lsp/src/copyright/symbols.rs
@@ -2,7 +2,7 @@
 
 use debian_copyright::lossless::Parse;
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::{DocumentSymbol, SymbolKind};
+use tower_lsp_server::lsp_types::{DocumentSymbol, SymbolKind};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/deb822/folding.rs
===================================================================
--- debian-lsp.orig/src/deb822/folding.rs
+++ debian-lsp/src/deb822/folding.rs
@@ -3,7 +3,7 @@
 //! Each paragraph in a deb822 file becomes a foldable region.
 
 use deb822_lossless::Deb822;
-use tower_lsp_server::ls_types::{FoldingRange, FoldingRangeKind};
+use tower_lsp_server::lsp_types::{FoldingRange, FoldingRangeKind};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/deb822/hover.rs
===================================================================
--- debian-lsp.orig/src/deb822/hover.rs
+++ debian-lsp/src/deb822/hover.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position};
+use tower_lsp_server::lsp_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position};
 
 use super::completion::{get_cursor_context, CursorContext, FieldInfo};
 
Index: debian-lsp/src/deb822/on_type_formatting.rs
===================================================================
--- debian-lsp.orig/src/deb822/on_type_formatting.rs
+++ debian-lsp/src/deb822/on_type_formatting.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{Position, TextEdit};
+use tower_lsp_server::lsp_types::{Position, TextEdit};
 
 /// Generate on-type formatting edits for deb822 files.
 ///
@@ -47,7 +47,7 @@ fn on_type_colon(
     }
 
     Some(vec![TextEdit {
-        range: tower_lsp_server::ls_types::Range {
+        range: tower_lsp_server::lsp_types::Range {
             start: position,
             end: position,
         },
@@ -97,7 +97,7 @@ fn on_type_newline(
     }
 
     Some(vec![TextEdit {
-        range: tower_lsp_server::ls_types::Range {
+        range: tower_lsp_server::lsp_types::Range {
             start: position,
             end: position,
         },
Index: debian-lsp/src/deb822/selection_range.rs
===================================================================
--- debian-lsp.orig/src/deb822/selection_range.rs
+++ debian-lsp/src/deb822/selection_range.rs
@@ -8,7 +8,7 @@
 
 use deb822_lossless::Deb822;
 use text_size::TextSize;
-use tower_lsp_server::ls_types::{Position, Range, SelectionRange};
+use tower_lsp_server::lsp_types::{Position, Range, SelectionRange};
 
 use crate::position::{offset_to_position, text_range_to_lsp_range, try_position_to_offset};
 
Index: debian-lsp/src/rules/completion.rs
===================================================================
--- debian-lsp.orig/src/rules/completion.rs
+++ debian-lsp/src/rules/completion.rs
@@ -1,5 +1,5 @@
 use makefile_lossless::Makefile;
-use tower_lsp_server::ls_types::{CompletionItem, CompletionItemKind, Position};
+use tower_lsp_server::lsp_types::{CompletionItem, CompletionItemKind, Position};
 
 use super::fields::{RULES_TARGETS, RULES_VARIABLES};
 
Index: debian-lsp/src/rules/detection.rs
===================================================================
--- debian-lsp.orig/src/rules/detection.rs
+++ debian-lsp/src/rules/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/rules file.
 pub fn is_rules_file(uri: &Uri) -> bool {
Index: debian-lsp/src/rules/semantic.rs
===================================================================
--- debian-lsp.orig/src/rules/semantic.rs
+++ debian-lsp/src/rules/semantic.rs
@@ -2,7 +2,7 @@
 
 use makefile_lossless::{Makefile, SyntaxKind};
 use rowan::ast::AstNode;
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use super::fields::is_known_target;
 use crate::deb822::semantic::{SemanticTokensBuilder, TokenType};
Index: debian-lsp/src/source_options/completion.rs
===================================================================
--- debian-lsp.orig/src/source_options/completion.rs
+++ debian-lsp/src/source_options/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_local_options_file, is_source_options_or_local_options_file};
 use super::fields::{COMPRESSION_LEVEL_VALUES, COMPRESSION_VALUES, SOURCE_OPTIONS};
Index: debian-lsp/src/source_options/detection.rs
===================================================================
--- debian-lsp.orig/src/source_options/detection.rs
+++ debian-lsp/src/source_options/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/options file
 pub fn is_source_options_file(uri: &Uri) -> bool {
Index: debian-lsp/src/source_options/selection_range.rs
===================================================================
--- debian-lsp.orig/src/source_options/selection_range.rs
+++ debian-lsp/src/source_options/selection_range.rs
@@ -3,7 +3,7 @@
 //! Hierarchy: current line → file.
 
 use text_size::TextSize;
-use tower_lsp_server::ls_types::{Position, Range, SelectionRange};
+use tower_lsp_server::lsp_types::{Position, Range, SelectionRange};
 
 use crate::position::offset_to_position;
 
Index: debian-lsp/src/source_options/semantic.rs
===================================================================
--- debian-lsp.orig/src/source_options/semantic.rs
+++ debian-lsp/src/source_options/semantic.rs
@@ -3,7 +3,7 @@
 //! The file format is simple: one option per line, comments start with '#',
 //! options can have values separated by '='.
 
-use tower_lsp_server::ls_types::SemanticToken;
+use tower_lsp_server::lsp_types::SemanticToken;
 
 use crate::deb822::semantic::{SemanticTokensBuilder, TokenType};
 
Index: debian-lsp/src/watch/folding.rs
===================================================================
--- debian-lsp.orig/src/watch/folding.rs
+++ debian-lsp/src/watch/folding.rs
@@ -2,7 +2,7 @@
 //!
 //! Supports both deb822 (v5) and line-based (v1-4) watch file formats.
 
-use tower_lsp_server::ls_types::{FoldingRange, FoldingRangeKind};
+use tower_lsp_server::lsp_types::{FoldingRange, FoldingRangeKind};
 
 use crate::position::text_range_to_lsp_range;
 
Index: debian-lsp/src/watch/hover.rs
===================================================================
--- debian-lsp.orig/src/watch/hover.rs
+++ debian-lsp/src/watch/hover.rs
@@ -1,4 +1,4 @@
-use tower_lsp_server::ls_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position};
+use tower_lsp_server::lsp_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position};
 
 use crate::deb822::completion::{get_cursor_context, CursorContext};
 
Index: debian-lsp/src/watch/selection_range.rs
===================================================================
--- debian-lsp.orig/src/watch/selection_range.rs
+++ debian-lsp/src/watch/selection_range.rs
@@ -5,7 +5,7 @@
 //! For line-based: entry → file.
 
 use text_size::TextSize;
-use tower_lsp_server::ls_types::{Position, Range, SelectionRange};
+use tower_lsp_server::lsp_types::{Position, Range, SelectionRange};
 
 use crate::position::{offset_to_position, text_range_to_lsp_range, try_position_to_offset};
 
