diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1381bab..e184423 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -104,20 +104,54 @@ include_directories(./cpp/tests/libs/src)
 # ---- openpal library ----
 file(GLOB_RECURSE openpal_SRC ./cpp/libs/src/openpal/*.cpp ./cpp/libs/src/openpal/*.h ./cpp/libs/include/openpal/*.h)
 add_library(openpal ${LIB_TYPE} ${openpal_SRC})
-install(TARGETS openpal DESTINATION lib)
 set_target_properties(openpal PROPERTIES FOLDER cpp/libs VERSION ${OPENDNP3_VERSION} SOVERSION ${OPENDNP3_MAJOR_VERSION})
 clang_format(openpal)
 clang_tidy(openpal)
 
+include(CMakePackageConfigHelpers)
+write_basic_package_version_file(openpal-version.cmake VERSION ${OPENDNP3_VERSION} COMPATIBILITY ExactVersion)
+
+install(
+    TARGETS openpal
+    EXPORT openpal-config
+    DESTINATION lib
+)
+
+install(
+    EXPORT openpal-config
+    DESTINATION share/openpal
+)
+
 # ---- opendnp3 library ----
 file(GLOB_RECURSE opendnp3_SRC ./cpp/libs/src/opendnp3/*.cpp ./cpp/libs/src/opendnp3/*.h ./cpp/libs/include/opendnp3/*.h)
 add_library(opendnp3 ${LIB_TYPE} ${opendnp3_SRC})
 target_link_libraries(opendnp3 openpal)
-install(TARGETS opendnp3 DESTINATION lib)
+
 set_target_properties(opendnp3 PROPERTIES FOLDER cpp/libs VERSION ${OPENDNP3_VERSION} SOVERSION ${OPENDNP3_MAJOR_VERSION})
 clang_format(opendnp3 EXCLUDES ".*/gen/.*" ".*/objects/.*")
 clang_tidy(opendnp3)
 
+write_basic_package_version_file(opendnp3-version.cmake VERSION ${OPENDNP3_VERSION} COMPATIBILITY ExactVersion)
+
+set(PROJECT_NAME opendnp3)
+set(FIND_DEPENDS "find_dependency(openpal)")
+configure_package_config_file(opendnp3-config.cmake.in opendnp3-config.cmake
+    INSTALL_DESTINATION share/opendnp3
+    PATH_VARS PROJECT_NAME FIND_DEPENDS
+)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opendnp3-config.cmake DESTINATION share/opendnp3)
+
+install(
+    TARGETS opendnp3
+    EXPORT opendnp3-targets
+    DESTINATION lib
+)
+install(
+    EXPORT opendnp3-targets
+    DESTINATION share/opendnp3
+)
+
 if(DNP3_DECODER)
   file(GLOB_RECURSE dnp3decode_SRC ./cpp/libs/src/dnp3decode/*.cpp ./cpp/libs/src/dnp3decode/*.h ./cpp/libs/include/dnp3decode/*.h)
   add_library(dnp3decode ${LIB_TYPE} ${dnp3decode_SRC})
@@ -144,8 +178,7 @@ if(DNP3_TLS)
     set(asiopal_link_libraries "${asiopal_link_libraries};${OPENSSL_LIBRARIES}")
 endif()
 
-target_link_libraries(asiopal ${asiopal_link_libraries})
-install(TARGETS asiopal DESTINATION lib)
+target_link_libraries(asiopal PUBLIC ${asiopal_link_libraries})
 set_target_properties(asiopal PROPERTIES FOLDER cpp/libs VERSION ${OPENDNP3_VERSION} SOVERSION ${OPENDNP3_MAJOR_VERSION})
 if(FLOCK)
   add_definitions(-DUSE_FLOCK)
@@ -153,6 +186,32 @@ endif()
 clang_format(asiopal)
 clang_tidy(asiopal)
 
+install(
+    TARGETS asiopal
+    EXPORT asiopal-targets
+    DESTINATION lib
+)
+  
+write_basic_package_version_file(asiopal-version.cmake VERSION ${OPENDNP3_VERSION} COMPATIBILITY ExactVersion)
+
+set(PROJECT_NAME asiopal)
+if (DNP3_TLS)
+    set(FIND_DEPENDS "find_dependency(openpal)\nfind_dependency(OpenSSL)")
+else()
+    set(FIND_DEPENDS "find_dependency(openpal)")
+endif()
+configure_package_config_file(opendnp3-config.cmake.in asiopal-config.cmake
+    INSTALL_DESTINATION share/asiopal
+    PATH_VARS PROJECT_NAME FIND_DEPENDS
+)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/asiopal-config.cmake DESTINATION share/asiopal)
+
+install(
+    EXPORT asiopal-targets
+    DESTINATION share/asiopal
+)
+
 # ---- asiodnp3 library ----
 file(GLOB_RECURSE asiodnp3_HPP ./cpp/libs/src/asiodnp3/*.h ./cpp/libs/include/asiodnp3/*.h)
 if(DNP3_TLS)
@@ -161,12 +220,33 @@ else()
   file(GLOB asiodnp3_CPP ./cpp/libs/src/asiodnp3/*.cpp)
 endif()
 add_library(asiodnp3 ${LIB_TYPE} ${asiodnp3_HPP} ${asiodnp3_CPP})
-target_link_libraries(asiodnp3 asiopal opendnp3)
-install(TARGETS asiodnp3 DESTINATION lib)
+target_link_libraries(asiodnp3 PUBLIC asiopal opendnp3)
 set_target_properties(asiodnp3 PROPERTIES FOLDER cpp/libs VERSION ${OPENDNP3_VERSION} SOVERSION ${OPENDNP3_MAJOR_VERSION})
 clang_format(asiodnp3)
 clang_tidy(asiodnp3)
 
+install(
+    TARGETS asiodnp3    
+    EXPORT asiodnp3-targets
+    DESTINATION lib
+)
+  
+write_basic_package_version_file(asiopal-version.cmake VERSION ${OPENDNP3_VERSION} COMPATIBILITY ExactVersion)
+
+set(PROJECT_NAME asiodnp3)
+set(FIND_DEPENDS "find_dependency(asiopal)\nfind_dependency(opendnp3)")
+configure_package_config_file(opendnp3-config.cmake.in asiodnp3-config.cmake
+    INSTALL_DESTINATION share/asiopal
+    PATH_VARS PROJECT_NAME FIND_DEPENDS
+)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/asiodnp3-config.cmake DESTINATION share/asiodnp3)
+
+install(
+    EXPORT asiodnp3-targets
+    DESTINATION share/asiodnp3
+)
+
 if(DNP3_JAVA)
   file(GLOB_RECURSE opendnp3java_SRC ./java/cpp/*.h ./java/cpp/*.cpp)
   add_library(opendnp3java SHARED ${opendnp3java_SRC})
