diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs
index 5f61bb58939..d4244f70c53 100644
--- a/crates/ra_hir/src/code_model_api.rs
+++ b/crates/ra_hir/src/code_model_api.rs
@@ -41,12 +41,17 @@ impl Crate {
     }
 }
 
+#[derive(Debug)]
 pub enum Def {
     Module(Module),
     Struct(Struct),
     Enum(Enum),
     EnumVariant(EnumVariant),
     Function(Function),
+    Const(Const),
+    Static(Static),
+    Trait(Trait),
+    Type(Type),
     Item,
 }
 
@@ -317,17 +322,60 @@ pub struct Const {
     pub(crate) def_id: DefId,
 }
 
+impl Const {
+    pub(crate) fn new(def_id: DefId) -> Const {
+        Const { def_id }
+    }
+
+    pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc<ast::ConstDef>)> {
+        Ok(def_id_to_ast(db, self.def_id))
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct Static {
     pub(crate) def_id: DefId,
 }
 
+impl Static {
+    pub(crate) fn new(def_id: DefId) -> Static {
+        Static { def_id }
+    }
+
+    pub fn source(
+        &self,
+        db: &impl HirDatabase,
+    ) -> Cancelable<(HirFileId, TreeArc<ast::StaticDef>)> {
+        Ok(def_id_to_ast(db, self.def_id))
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct Trait {
     pub(crate) def_id: DefId,
 }
 
+impl Trait {
+    pub(crate) fn new(def_id: DefId) -> Trait {
+        Trait { def_id }
+    }
+
+    pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc<ast::TraitDef>)> {
+        Ok(def_id_to_ast(db, self.def_id))
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct Type {
     pub(crate) def_id: DefId,
 }
+
+impl Type {
+    pub(crate) fn new(def_id: DefId) -> Type {
+        Type { def_id }
+    }
+
+    pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc<ast::TypeDef>)> {
+        Ok(def_id_to_ast(db, self.def_id))
+    }
+}
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs
index 0805fd3db53..316896dce21 100644
--- a/crates/ra_hir/src/ids.rs
+++ b/crates/ra_hir/src/ids.rs
@@ -4,11 +4,10 @@ use ra_arena::{Arena, RawId, impl_arena_id};
 
 use crate::{
     HirDatabase, PerNs, Def, Function, Struct, Enum, EnumVariant, ImplBlock, Crate,
+    Module, Trait, Type, Static, Const,
     module_tree::ModuleId,
 };
 
-use crate::code_model_api::Module;
-
 /// hir makes heavy use of ids: integer (u32) handlers to various things. You
 /// can think of id as a pointer (but without a lifetime) or a file descriptor
 /// (but for hir objects).
@@ -146,6 +145,10 @@ pub(crate) enum DefKind {
     Struct,
     Enum,
     EnumVariant,
+    Const,
+    Static,
+    Trait,
+    Type,
     Item,
 
     StructCtor,
@@ -173,6 +176,23 @@ impl DefId {
             }
             DefKind::Enum => Def::Enum(Enum::new(self)),
             DefKind::EnumVariant => Def::EnumVariant(EnumVariant::new(self)),
+            DefKind::Const => {
+                let def = Const::new(self);
+                Def::Const(def)
+            }
+            DefKind::Static => {
+                let def = Static::new(self);
+                Def::Static(def)
+            }
+            DefKind::Trait => {
+                let def = Trait::new(self);
+                Def::Trait(def)
+            }
+            DefKind::Type => {
+                let def = Type::new(self);
+                Def::Type(def)
+            }
+
             DefKind::StructCtor => Def::Item,
             DefKind::Item => Def::Item,
         };
@@ -218,10 +238,10 @@ impl DefKind {
             SyntaxKind::STRUCT_DEF => PerNs::both(DefKind::Struct, DefKind::StructCtor),
             SyntaxKind::ENUM_DEF => PerNs::types(DefKind::Enum),
             // These define items, but don't have their own DefKinds yet:
-            SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Item),
-            SyntaxKind::TYPE_DEF => PerNs::types(DefKind::Item),
-            SyntaxKind::CONST_DEF => PerNs::values(DefKind::Item),
-            SyntaxKind::STATIC_DEF => PerNs::values(DefKind::Item),
+            SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Trait),
+            SyntaxKind::TYPE_DEF => PerNs::types(DefKind::Type),
+            SyntaxKind::CONST_DEF => PerNs::values(DefKind::Const),
+            SyntaxKind::STATIC_DEF => PerNs::values(DefKind::Static),
             _ => PerNs::none(),
         }
     }
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs
index fe8be570072..45dda4f7fb3 100644
--- a/crates/ra_hir/src/lib.rs
+++ b/crates/ra_hir/src/lib.rs
@@ -60,4 +60,6 @@ pub use self::code_model_api::{
     Module, ModuleSource, Problem,
     Struct, Enum, EnumVariant,
     Function, FnSignature, ScopeEntryWithSyntax,
+    Static, Const,
+    Trait, Type,
 };
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index 18c41a01557..0c24a065270 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -470,8 +470,12 @@ pub(super) fn type_for_def(db: &impl HirDatabase, def_id: DefId) -> Cancelable<T
         Def::Struct(s) => type_for_struct(db, s),
         Def::Enum(e) => type_for_enum(db, e),
         Def::EnumVariant(ev) => type_for_enum_variant(db, ev),
-        Def::Item => {
-            log::debug!("trying to get type for item of unknown type {:?}", def_id);
+        _ => {
+            log::debug!(
+                "trying to get type for item of unknown type {:?} {:?}",
+                def_id,
+                def
+            );
             Ok(Ty::Unknown)
         }
     }
diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs
index 6a97704299e..e7fa967a03d 100644
--- a/crates/ra_ide_api/src/completion/completion_item.rs
+++ b/crates/ra_ide_api/src/completion/completion_item.rs
@@ -33,6 +33,10 @@ pub enum CompletionItemKind {
     EnumVariant,
     Binding,
     Field,
+    Static,
+    Const,
+    Trait,
+    TypeAlias,
 }
 
 #[derive(Debug, PartialEq, Eq)]
@@ -153,6 +157,22 @@ impl Builder {
                 types: Some(hir::Def::Enum(..)),
                 ..
             } => CompletionItemKind::Enum,
+            PerNs {
+                types: Some(hir::Def::Trait(..)),
+                ..
+            } => CompletionItemKind::Trait,
+            PerNs {
+                types: Some(hir::Def::Type(..)),
+                ..
+            } => CompletionItemKind::TypeAlias,
+            PerNs {
+                values: Some(hir::Def::Const(..)),
+                ..
+            } => CompletionItemKind::Const,
+            PerNs {
+                values: Some(hir::Def::Static(..)),
+                ..
+            } => CompletionItemKind::Static,
             PerNs {
                 values: Some(hir::Def::Function(function)),
                 ..
diff --git a/crates/ra_ide_api/src/navigation_target.rs b/crates/ra_ide_api/src/navigation_target.rs
index b955bbe42b0..b0d0a3e8bb2 100644
--- a/crates/ra_ide_api/src/navigation_target.rs
+++ b/crates/ra_ide_api/src/navigation_target.rs
@@ -108,6 +108,22 @@ impl NavigationTarget {
                 let (file_id, node) = f.source(db)?;
                 NavigationTarget::from_named(file_id.original_file(db), &*node)
             }
+            Def::Trait(f) => {
+                let (file_id, node) = f.source(db)?;
+                NavigationTarget::from_named(file_id.original_file(db), &*node)
+            }
+            Def::Type(f) => {
+                let (file_id, node) = f.source(db)?;
+                NavigationTarget::from_named(file_id.original_file(db), &*node)
+            }
+            Def::Static(f) => {
+                let (file_id, node) = f.source(db)?;
+                NavigationTarget::from_named(file_id.original_file(db), &*node)
+            }
+            Def::Const(f) => {
+                let (file_id, node) = f.source(db)?;
+                NavigationTarget::from_named(file_id.original_file(db), &*node)
+            }
             Def::Module(m) => NavigationTarget::from_module(db, m)?,
             Def::Item => return Ok(None),
         };
diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs
index 76fa98cbeb9..7ca2f437dd9 100644
--- a/crates/ra_lsp_server/src/conv.rs
+++ b/crates/ra_lsp_server/src/conv.rs
@@ -65,6 +65,10 @@ impl Conv for CompletionItemKind {
             CompletionItemKind::EnumVariant => EnumMember,
             CompletionItemKind::Binding => Variable,
             CompletionItemKind::Field => Field,
+            CompletionItemKind::Trait => Interface,
+            CompletionItemKind::TypeAlias => Struct,
+            CompletionItemKind::Const => Constant,
+            CompletionItemKind::Static => Value,
         }
     }
 }