diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9bc02a50b4372b5072e57b835c0107eeaba527d1..4192b011687df1a5952963c7079dbd0058f77c91 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@
   * Fix dependencies on libfranka
   * Fix RViz config file path in `franka_visualization`
   * Add missing `test_depend` to `franka_hw`
+  * Add missing CMake install rules
 
 ## 0.1.0 - 2017-09-15
 
diff --git a/franka_control/CMakeLists.txt b/franka_control/CMakeLists.txt
index 00952fc159b85e8a33ee43ef2bd10cc1c2c1d6d5..1619f28e5f71b03b1b1c4c9d867f59d492363a89 100644
--- a/franka_control/CMakeLists.txt
+++ b/franka_control/CMakeLists.txt
@@ -120,6 +120,27 @@ target_include_directories(franka_control_node PUBLIC
   ${catkin_INCLUDE_DIRS}
 )
 
+## Installation
+install(TARGETS franka_state_controller
+                franka_control_services
+                franka_control_node
+  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+install(DIRECTORY include/${PROJECT_NAME}/
+  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
+)
+install(DIRECTORY launch
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(DIRECTORY config
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(FILES franka_controller_plugins.xml
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+
 ## Tools
 file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
 file(GLOB_RECURSE HEADERS
diff --git a/franka_description/CMakeLists.txt b/franka_description/CMakeLists.txt
index 001965b76afc1f9901ce1b44dcd99da560ff7ebc..7282c39947f348162715e7e829a4aa5eb0f6e2b9 100644
--- a/franka_description/CMakeLists.txt
+++ b/franka_description/CMakeLists.txt
@@ -3,3 +3,10 @@ project(franka_description)
 
 find_package(catkin REQUIRED)
 catkin_package(CATKIN_DEPENDS xacro)
+
+install(DIRECTORY meshes
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(DIRECTORY robots
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
diff --git a/franka_example_controllers/CMakeLists.txt b/franka_example_controllers/CMakeLists.txt
index 68238ccc23f80fb62204d3edea147761a12394a0..31f665a58f0445503580bc3ae867e571b1446e82 100644
--- a/franka_example_controllers/CMakeLists.txt
+++ b/franka_example_controllers/CMakeLists.txt
@@ -28,7 +28,7 @@ catkin_package(
 
 include_directories(include ${catkin_INCLUDE_DIRS})
 
-add_library(franka_example_controllers 
+add_library(franka_example_controllers
   src/cartesian_pose_example_controller.cpp
   src/cartesian_velocity_example_controller.cpp
   src/joint_position_example_controller.cpp
@@ -45,6 +45,25 @@ add_dependencies(franka_example_controllers
 
 target_link_libraries(franka_example_controllers ${catkin_LIBRARIES})
 
+## Installation
+install(TARGETS franka_example_controllers
+  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+install(DIRECTORY include/${PROJECT_NAME}/
+  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
+)
+install(DIRECTORY launch
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(DIRECTORY config
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(FILES franka_example_controllers_plugin.xml
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+
 ## Tools
 file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
 file(GLOB_RECURSE HEADERS
diff --git a/franka_gripper/CMakeLists.txt b/franka_gripper/CMakeLists.txt
index 19fdf950efe5590e682b93def6f905a900b3bcaf..58e3677544bf4f1a4d244150219a594f92aeb9d1 100644
--- a/franka_gripper/CMakeLists.txt
+++ b/franka_gripper/CMakeLists.txt
@@ -81,6 +81,23 @@ target_include_directories(franka_gripper_node PUBLIC
   include
 )
 
+## Installation
+install(TARGETS franka_gripper
+                franka_gripper_node
+  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+install(DIRECTORY include/${PROJECT_NAME}/
+  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
+)
+install(DIRECTORY launch
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(DIRECTORY config
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+
 ## Tools
 file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
 file(GLOB_RECURSE HEADERS
diff --git a/franka_hw/CMakeLists.txt b/franka_hw/CMakeLists.txt
index 8774cde8cc1a895ad3c019b754ff28c15020c870..3d5c68a96f50da18f9f23626549e937292b1c8ed 100644
--- a/franka_hw/CMakeLists.txt
+++ b/franka_hw/CMakeLists.txt
@@ -45,6 +45,16 @@ target_include_directories(franka_hw PUBLIC
   include
 )
 
+## Installation
+install(TARGETS franka_hw
+  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+install(DIRECTORY include/${PROJECT_NAME}/
+  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
+)
+
 if(CATKIN_ENABLE_TESTING)
   add_subdirectory(test)
 endif()
diff --git a/franka_visualization/CMakeLists.txt b/franka_visualization/CMakeLists.txt
index 10c8c25d8b14e1a9f24472667dc08172f34ee881..5188fc6f1acba9db30bcefde78bb30e181d5d2d0 100644
--- a/franka_visualization/CMakeLists.txt
+++ b/franka_visualization/CMakeLists.txt
@@ -15,26 +15,33 @@ find_package(Franka REQUIRED)
 
 catkin_package(CATKIN_DEPENDS sensor_msgs roscpp)
 
-set(EXECUTABLES
-  franka_joint_state_publisher
-)
-
-foreach(executable ${EXECUTABLES})
-  add_executable(${executable}
-    src/${executable}.cpp
-  )
-  add_dependencies(${executable}
-    ${${PROJECT_NAME}_EXPORTED_TARGETS}
-    ${catkin_EXPORTED_TARGETS}
-  )
-  target_link_libraries(${executable}
-    ${catkin_LIBRARIES}
-    Franka::Franka
-  )
-  target_include_directories(${executable} PUBLIC
-    ${catkin_INCLUDE_DIRS}
-  )
-endforeach()
+add_executable(franka_joint_state_publisher
+  src/franka_joint_state_publisher.cpp
+)
+add_dependencies(franka_joint_state_publisher
+  ${${PROJECT_NAME}_EXPORTED_TARGETS}
+  ${catkin_EXPORTED_TARGETS}
+)
+target_link_libraries(franka_joint_state_publisher
+  ${catkin_LIBRARIES}
+  Franka::Franka
+)
+target_include_directories(franka_joint_state_publisher PUBLIC
+  ${catkin_INCLUDE_DIRS}
+)
+
+## Installation
+install(TARGETS franka_joint_state_publisher
+  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+install(DIRECTORY launch
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+install(DIRECTORY config
+  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
 
 ## Tools
 file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
@@ -46,5 +53,5 @@ include(ClangTools)
 add_format_target(franka_visualization FILES ${SOURCES} ${HEADERS})
 add_tidy_target(franka_visualization
   FILES ${SOURCES}
-  DEPENDS ${EXECUTABLES}
+  DEPENDS franka_joint_state_publisher
 )
diff --git a/franka_visualization/param/robot_read_settings.yaml b/franka_visualization/config/robot_read_settings.yaml
similarity index 99%
rename from franka_visualization/param/robot_read_settings.yaml
rename to franka_visualization/config/robot_read_settings.yaml
index 2c1154d6598b98487a3622331279a220372b8933..7bd6f1afb71bbbe7e908af6dea90ec318b7889e9 100644
--- a/franka_visualization/param/robot_read_settings.yaml
+++ b/franka_visualization/config/robot_read_settings.yaml
@@ -6,4 +6,3 @@ joint_names:
   - panda_joint5
   - panda_joint6
   - panda_joint7
-
diff --git a/franka_visualization/launch/franka_visualization.launch b/franka_visualization/launch/franka_visualization.launch
index 93ab4741931e04c1079130dd6c90e498bcdba464..6bad56141c088e6fed5b2ffb1f184c32ca602a93 100644
--- a/franka_visualization/launch/franka_visualization.launch
+++ b/franka_visualization/launch/franka_visualization.launch
@@ -8,7 +8,7 @@
   <param if="$(arg load_gripper)" name="robot_description" command="$(find xacro)/xacro --inorder $(find franka_description)/robots/panda_arm_hand.urdf.xacro" />
 
   <node name="franka_joint_state_publisher" pkg="franka_visualization" type="franka_joint_state_publisher" output="screen">
-    <rosparam command="load" file="$(find franka_visualization)/param/robot_read_settings.yaml" />
+    <rosparam command="load" file="$(find franka_visualization)/config/robot_read_settings.yaml" />
     <param name="robot_ip" value="$(arg robot_ip)" />
   </node>