diff --git a/CMakeLists.txt b/CMakeLists.txt
index d6557330f0c525d34bd7e472a848e2d434fa6c0c..47f5fe4603873dd8b3521836e2015b2708a7e35b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,16 @@ project(lrs_rviz_melodic)
 ## Find catkin macros and libraries
 ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
 ## is used, also find other catkin packages
-find_package(catkin REQUIRED)
+find_package(catkin REQUIRED COMPONENTS
+  rviz
+  roscpp
+  )
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
+
+find_package(Qt5Core REQUIRED)
+find_package(Qt5Gui REQUIRED)
 
 ## System dependencies are found with CMake's conventions
 # find_package(Boost REQUIRED COMPONENTS system)
@@ -113,7 +122,9 @@ catkin_package(
 ## Your package locations should be listed before other locations
 include_directories(
 # include
-# ${catkin_INCLUDE_DIRS}
+  ${catkin_INCLUDE_DIRS}
+  /usr/include/OGRE
+  /opt/ros/melodic/include/rviz
 )
 
 ## Declare a C++ library
@@ -121,6 +132,12 @@ include_directories(
 #   src/${PROJECT_NAME}/lrs_rviz_melodic.cpp
 # )
 
+## Declare a C++ library
+add_library(lrs_rviz_plugin
+  src/image_visual.cc
+  src/image_display.cc
+)
+
 ## Add cmake target dependencies of the library
 ## as an example, code may need to be generated before libraries
 ## either from message generation or dynamic reconfigure
@@ -146,6 +163,13 @@ include_directories(
 #   ${catkin_LIBRARIES}
 # )
 
+target_link_libraries(lrs_rviz_plugin
+  ${catkin_LIBRARIES}
+  ${QT_LIBRARIES}
+  Qt5::Gui
+  Qt5::Core
+)
+
 #############
 ## Install ##
 #############
@@ -167,6 +191,12 @@ include_directories(
 #   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 # )
 
+install(TARGETS lrs_rviz_plugin
+   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+
 ## Mark cpp header files for installation
 # install(DIRECTORY include/${PROJECT_NAME}/
 #   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
@@ -181,6 +211,11 @@ include_directories(
 #   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
 # )
 
+install(FILES
+  plugin_description.xml
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+
 #############
 ## Testing ##
 #############
diff --git a/package.xml b/package.xml
index c60e9e04ab342bb2d1131dd9a50c842add74aa7e..7326136614bd90dc9ad7babf043ee0bfc8bbd71a 100644
--- a/package.xml
+++ b/package.xml
@@ -49,11 +49,13 @@
   <!-- Use doc_depend for packages you need only for building documentation: -->
   <!--   <doc_depend>doxygen</doc_depend> -->
   <buildtool_depend>catkin</buildtool_depend>
+  <depend>roscpp</depend>
+  <depend>rviz</depend>
 
 
   <!-- The export tag contains other, unspecified, tags -->
   <export>
     <!-- Other tools can request additional information be placed here -->
-
+    <rviz plugin="${prefix}/plugin_description.xml"/>
   </export>
 </package>
diff --git a/plugin_description.xml b/plugin_description.xml
new file mode 100644
index 0000000000000000000000000000000000000000..85d68053e51b01b1283cdbe715b0ef795000dfc1
--- /dev/null
+++ b/plugin_description.xml
@@ -0,0 +1,7 @@
+<library path="lib/liblrs_rviz_plugin">
+  <class name="lrs_rviz/Image" type="lrs_rviz::ImageDisplay" base_class_type="rviz::Display">
+    <description>
+      Displays an image on the ground plane.
+    </description>
+  </class>
+</library>