diff --git a/.gitignore b/.gitignore
index 06edde60b07e819b2d877afe567cf4256cc235a6..08ecc3688a6ee92e92c47442fe06d32aa5fa904c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,3 +60,4 @@ examples/cache
 # Working directories
 work
 build*
+build/
diff --git a/README.md b/README.md
index 48d0a947ff761d7a8f94d82ce840aff88e62911f..b557e9fb942a37c9b8c5f15cb2c8a33f4f2b0e75 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,80 @@ Instructions for downloading hcana can be found in the
 
 Compiling
 ---------
+
+CMake is the preferred build tool. See below for builds with scons/make which 
+are slightly different.
+
+### Compiling with CMAKE
+
+CMake build will do a **proper** build and install.
+Here we are using the install prefix `$HOME/my_exp_soft` which is like the 
+standard `/usr/local`. To use it make sure you your environment is setup (e.g., 
+towards the end of your `.bashrc`):
+```
+export PATH=$HOME/my_exp_soft/bin:$PATH
+export LD_LIBRARY_PATH=$HOME/my_exp_soft/lib:$HOME/my_exp_soft/lib64:$LD_LIBRARY_PATH
+```
+ (ノಠ益ಠ)ノ彡┻━┻ **Do not install into the source directories**.
+
+(ノ^_^)ノ┻━┻ ┬─┬ ノ( ^_^ノ)
+First you should build evio followed by podd. Here are all the steps:
+
+
+#### Build EVIO with cmake
+
+```
+git clone https://github.com/whit2333/hallac_evio.git
+cd hallac_evio
+mkdir build && cd build
+cmake ../. -DCMAKE_INSTALL_PREFIX=$HOME/my_exp_soft
+make -j4 install
+```
+
+#### Build analyzer (PODD)
+
+```
+git clone https://github.com/whit2333/analyzer.git
+cd analyzer
+mkdir build && cd build
+cmake ../. -DCMAKE_INSTALL_PREFIX=$HOME/my_exp_soft
+make -j4 install
+```
+
+#### Build hcana
+
+```
+git clone https://github.com/whit2333/hcana.git
+cd hcana
+mkdir build && cd build
+cmake ../. -DCMAKE_INSTALL_PREFIX=$HOME/my_exp_soft
+make -j4 install
+```
+
+All done.  Now you can run `hcana` and you're off to analyze.
+
+#### Loading the libraries into ROOT 
+
+```
+// .rootlogon.C
+{
+  gSystem->AddIncludePath(" -Iinclude/podd" );
+  gSystem->AddIncludePath(" -Iinclude/hcana");
+  gSystem->AddIncludePath(" -Iinclude/evio" );
+  gInterpreter->AddIncludePath("include/podd" );
+  gInterpreter->AddIncludePath("include/hcana");
+  gInterpreter->AddIncludePath("include/evio" );
+  
+  gSystem->Load("libevioxx.so");
+  gSystem->Load("libHallA.so");
+  gSystem->Load("libdc.so");
+  gSystem->Load("libHallC.so");
+}
+```
+![libHallC in ROOT](/docs/libHallC_in_root.png)
+
+### Other builds
+
 hcana may be compiled with either make or scons.  Switching between these
 two build systems make require some cleanup of dependency files, binary files
 and other autogenerated files.
diff --git a/cmake/HCANAConfig.cmake.in b/cmake/HCANAConfig.cmake.in
new file mode 100644
index 0000000000000000000000000000000000000000..57b242a892bb56cb74876ab27c928a6054f5427a
--- /dev/null
+++ b/cmake/HCANAConfig.cmake.in
@@ -0,0 +1,27 @@
+@PACKAGE_INIT@
+
+include("@PACKAGE_TARGETS_INSTALL_PATH@")
+
+check_required_components(HCANA)
+
+find_package(PODD REQUIRED)
+message(STATUS "Found HCANA")
+
+#get_filename_component(HCANA_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+#include(CMakeFindDependencyMacro)
+#
+#list(APPEND CMAKE_MODULE_PATH ${HCANA_CMAKE_DIR})
+#
+## NOTE Had to use find_package because find_dependency does not support COMPONENTS or MODULE until 3.8.0
+#
+##find_dependency(Boost 1.55 REQUIRED COMPONENTS regex)
+##find_dependency(RapidJSON 1.0 REQUIRED MODULE)
+##find_package(Boost 1.55 REQUIRED COMPONENTS regex)
+##find_package(RapidJSON 1.0 REQUIRED MODULE)
+#list(REMOVE_AT CMAKE_MODULE_PATH -1)
+#
+#if(NOT TARGET HCANA::PODD)
+#    include("${HCANA_CMAKE_DIR}/PODDTargets.cmake")
+#endif()
+#
+#set(HCANA_LIBRARIES PODD::PODD)
diff --git a/cmake/modules/CompileTimeInfo.cmake b/cmake/modules/CompileTimeInfo.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3b181c05fc5b3d2b69df6ba5f8a14d7b324c912f
--- /dev/null
+++ b/cmake/modules/CompileTimeInfo.cmake
@@ -0,0 +1,67 @@
+cmake_minimum_required(VERSION 2.8)
+
+# Return the date (yyyy-mm-dd)
+macro(DATE RESULT)
+	if(WIN32)
+		execute_process(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE ${RESULT})
+		string(REGEX REPLACE "(..)/(..)/(....).*" "\\3-\\2-\\1" ${RESULT} ${${RESULT}})
+	elseif(UNIX)
+		execute_process(COMMAND "date" "+%Y-%m-%d" OUTPUT_VARIABLE ${RESULT})
+	else()
+		message(SEND_ERROR "Unable to detect date")
+		set(${RESULT} UNKNOWN)
+	endif()
+endmacro()
+
+# Return the time (hh:mm:ss)
+macro(TIME RESULT)
+	if(WIN32)
+		execute_process(COMMAND "cmd" " /C echo %TIME%" OUTPUT_VARIABLE ${RESULT})
+		string(REGEX REPLACE "(..:..:..),(..)" "\\1" ${RESULT} ${${RESULT}})
+	elseif(UNIX)
+		execute_process(COMMAND "date" "+%H:%M:%S" OUTPUT_VARIABLE ${RESULT})
+	else()
+		message(SEND_ERROR "Unable to detect time")
+		set(${RESULT} UNKNOWN)
+	endif()
+endmacro()
+
+
+execute_process(COMMAND "date" "+%b:%d:%Y" 
+  OUTPUT_VARIABLE HCANA_BUILD_DATE 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "date" "+%a %b %d %H:%M:%S %Z %Y" 
+  OUTPUT_VARIABLE HCANA_BUILD_DATETIME 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "bash" "-c" "echo $(uname -s)-$(uname -r)-$(uname -m)" 
+  OUTPUT_VARIABLE HCANA_PLATFORM 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "uname" "-n" 
+  OUTPUT_VARIABLE HCANA_NODE 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+execute_process(COMMAND "pwd" 
+  OUTPUT_VARIABLE HCANA_BUILD_DIR 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+execute_process(COMMAND "whoami" 
+  OUTPUT_VARIABLE HCANA_BUILD_USER 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "bash" "-c" "echo $(git rev-parse HEAD 2>/dev/null | cut -c1-7)" 
+  OUTPUT_VARIABLE HCANA_GIT_VERSION 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "bash" "-c" "echo $(${CMAKE_CXX_COMPILER} --version 2>/dev/null | head -1)" 
+  OUTPUT_VARIABLE HCANA_CXX_VERSION 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "bash" "-c" "echo $(root-config --version)" 
+  OUTPUT_VARIABLE HCANA_ROOT_VERSION 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+execute_process(COMMAND "bash" "-c" "printf '%02d%02d%02d' ${PROJECT_VERSION_MAJOR} ${PROJECT_VERSION_MINOR} ${PROJECT_VERSION_PATCH}" 
+  OUTPUT_VARIABLE HCANA_VERCODE 
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
diff --git a/cmake/modules/FindLZ4.cmake b/cmake/modules/FindLZ4.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..4658a35bfa1af203da324982aa78eb53c411e409
--- /dev/null
+++ b/cmake/modules/FindLZ4.cmake
@@ -0,0 +1,39 @@
+# Finds liblz4.
+#
+# This module defines:
+# LZ4_FOUND
+# LZ4_INCLUDE_DIR
+# LZ4_LIBRARY
+#
+
+find_path(LZ4_INCLUDE_DIR NAMES lz4.h)
+find_library(LZ4_LIBRARY NAMES lz4)
+
+# We require LZ4_compress_default() which was added in v1.7.0
+if (LZ4_LIBRARY)
+  include(CheckCSourceRuns)
+  set(CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIR})
+  set(CMAKE_REQUIRED_LIBRARIES ${LZ4_LIBRARY})
+  check_c_source_runs("
+#include <lz4.h>
+int main() {
+  int good = (LZ4_VERSION_MAJOR > 1) ||
+    ((LZ4_VERSION_MAJOR == 1) && (LZ4_VERSION_MINOR >= 7));
+return !good;
+}" LZ4_GOOD_VERSION)
+  set(CMAKE_REQUIRED_INCLUDES)
+  set(CMAKE_REQUIRED_LIBRARIES)
+endif()
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(
+    LZ4 DEFAULT_MSG
+    LZ4_LIBRARY LZ4_INCLUDE_DIR LZ4_GOOD_VERSION)
+
+if (NOT LZ4_FOUND)
+  message(STATUS "Using third-party bundled LZ4")
+else()
+  message(STATUS "Found LZ4: ${LZ4_LIBRARY}")
+endif (NOT LZ4_FOUND)
+
+mark_as_advanced(LZ4_INCLUDE_DIR LZ4_LIBRARY)
diff --git a/cmake/os.cmake b/cmake/os.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..14fc6762b7e6c94d656edc079d4b733399d9e8d5
--- /dev/null
+++ b/cmake/os.cmake
@@ -0,0 +1,10 @@
+## OSX/homebrew version of root6 installs its cmake macros in a non-standard
+## location. This might be an issue on other systems as well.
+if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/root/cmake)
+endif()
+
+## Get rid of rpath warning on OSX
+if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+  set(CMAKE_MACOSX_RPATH 1)
+endif()
diff --git a/cmake/root.cmake b/cmake/root.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..e64cbaa8cba8af5cc1f53f7420db21bf0b2304e2
--- /dev/null
+++ b/cmake/root.cmake
@@ -0,0 +1,20 @@
+## Override root's ROOT_GENERATE_DICTIONARY macro to be less error-prone. This
+## is done by only allowing for explicitly speficied header locations/include
+## directories, instead of using the full search path for this module.
+function(ROOT_GENERATE_DICTIONARY dictionary)
+  CMAKE_PARSE_ARGUMENTS(ARG "" "" "INCLUDEDIRS;LINKDEF;OPTIONS" "" ${ARGN})
+  ## Get all include directories
+  get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
+  set(dirs ${dirs} ${ARG_INCLUDEDIRS})
+  set(extra_includes "")
+  foreach(dir ${dirs})
+    set(extra_includes ${extra_includes} "-I${dir}")
+  endforeach()
+  ## find and call ROOTCLING
+  find_program(ROOTCLING rootcling)
+  add_custom_command(
+    OUTPUT ${dictionary}.cxx ${dictionary}_rdict.pcm 
+    COMMAND ${ROOTCLING} -f ${dictionary}.cxx -s ${dictionary}.pcm 
+    ${ARG_OPTIONS} ${extra_includes}  ${ARG_UNPARSED_ARGUMENTS} ${ARG_LINKDEF}
+    DEPENDS ${includes} ${linkdefs})
+endfunction()
diff --git a/docs/libHallC_in_root.png b/docs/libHallC_in_root.png
new file mode 100644
index 0000000000000000000000000000000000000000..0956db8783434e6faef684fe9aaa1cd33211bb1b
Binary files /dev/null and b/docs/libHallC_in_root.png differ
diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8e22c5bae4ac780d66a9957a61e66ec24f0b9bfa
--- /dev/null
+++ b/external/CMakeLists.txt
@@ -0,0 +1,31 @@
+cmake_minimum_required(VERSION 3.1)
+
+#message(STATUS "Subproject: PODD...")
+# Download and unpack gflags at configure time
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/PODD.CMakeLists.txt
+  ${CMAKE_BINARY_DIR}/PODD-download/CMakeLists.txt)
+
+execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
+  RESULT_VARIABLE result
+  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/PODD-download)
+if(result)
+  message(FATAL_ERROR "CMake step for PODD failed: ${result}")
+endif()
+execute_process(COMMAND ${CMAKE_COMMAND} --build .
+  RESULT_VARIABLE result
+  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/PODD-download)
+if(result)
+  message(FATAL_ERROR "Download step for exteranl PODD build failed: ${result}")
+endif()
+
+add_subdirectory(
+  ${CMAKE_BINARY_DIR}/hallac_PODD-src
+  ${CMAKE_BINARY_DIR}/hallac_PODD-build)
+
+#execute_process(COMMAND "rm -r *"
+#  RESULT_VARIABLE result
+#  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/PODD-download)
+
+message(STATUS "Subproject: PODD...DONE")
+
diff --git a/external/PODD.CMakeLists.txt b/external/PODD.CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..990247c5df8b8a9a7bb5a22690737ff370820b8d
--- /dev/null
+++ b/external/PODD.CMakeLists.txt
@@ -0,0 +1,23 @@
+cmake_minimum_required(VERSION 3.5)
+
+# simplify variable expansion
+#cmake_policy(SET CMP0053 NEW)
+#cmake_policy(SET CMP0010 NEW)
+
+project(PODD-download NONE)
+
+include(ExternalProject)
+
+ExternalProject_Add(PODD_project 
+      GIT_REPOSITORY    https://github.com/whit2333/analyzer.git
+      GIT_TAG           origin/master
+      SOURCE_DIR "${CMAKE_BINARY_DIR}/hallac_PODD-src"
+      BINARY_DIR "${CMAKE_BINARY_DIR}/hallac_PODD-build"
+      CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=@CMAKE_INSTALL_PREFIX@" "-DCMAKE_PREFIX_PATH=@CMAKE_INSTALL_PREFIX@"
+      BUILD_COMMAND ${CMAKE_COMMAND}   --build . -- -j4
+      USES_TERMINAL_BUILD ON
+      TEST_COMMAND ""
+      LOG_DOWNLOAD ON
+      )
+ExternalProject_Add_StepTargets(PODD_project install)
+
diff --git a/hc_compiledata.h.in b/hc_compiledata.h.in
new file mode 100644
index 0000000000000000000000000000000000000000..b11ee5958e9ad9cdfb3c0d7d02c3e8152cc96fb9
--- /dev/null
+++ b/hc_compiledata.h.in
@@ -0,0 +1,39 @@
+#ifndef HCANA_COMPILEDATA_H
+#define HCANA_COMPILEDATA_H
+
+#define HC_INCLUDEPATH "@CMAKE_INSTALL_PREFIX@/include"
+#define HC_VERSION     "@PROJECT_VERSION@"
+#define HC_DATE        "@HCANA_BUILD_DATE@"
+#define HC_DATETIME    "@HCANA_BUILD_DATETIME@"
+#define HC_PLATFORM    "@HCANA_PLATFORM@"
+#define HC_BUILDNODE   "@HCANA_NODE@"
+#define HC_BUILDDIR    "@HCANA_BUILD_DIR@"
+#define HC_BUILDUSER   "@HCANA_BUILD_USER@"
+#define HC_GITVERS     "@HCANA_GIT_VERSION@"
+#define HC_CXXVERS     "@HCANA_CXX_VERSION@"
+#define HC_ROOTVERS    "@HCANA_ROOT_VERSION@"
+
+#define HCANA_VERSION_CODE  @HCANA_VERCODE@
+#define HCANA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+#endif
+
+
+// Example:
+//#ifndef ANALYZER_COMPILEDATA_H
+//#define ANALYZER_COMPILEDATA_H
+//
+//#define HA_INCLUDEPATH "/mnt/old_home/whit/projects/hall_AC_projects/hcana/HCANA/src /mnt/old_home/whit/projects/hall_AC_projects/hcana/HCANA/hana_decode"
+//#define HA_VERSION "1.6.0"
+//#define HA_DATE "Jun 26 2018"
+//#define HA_DATETIME "Tue Jun 26 2018"
+//#define HA_PLATFORM "Linux-4.13.0-45-generic-x86_64-with-Ubuntu-17.10-artful"
+//#define HA_BUILDNODE "wpad"
+//#define HA_BUILDDIR "/mnt/old_home/whit/projects/hall_AC_projects/hcana/HCANA"
+//#define HA_BUILDUSER "whit"
+//#define HA_GITVERS "5b48832"
+//#define HA_CXXVERS "c++ (GCC) 8.1.0"
+//#define HA_ROOTVERS "6.15/01"
+//#define ANALYZER_VERSION_CODE 67072
+//#define ANALYZER_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+//
+//#endif
diff --git a/src/include/HallC_LinkDef.h b/src/include/HallC_LinkDef.h
index 245129dc6cbef21424b5a2508a348975b3096ac2..7f17257d4ba14f5862896564be5bfaf89faf6a2f 100644
--- a/src/include/HallC_LinkDef.h
+++ b/src/include/HallC_LinkDef.h
@@ -6,7 +6,6 @@
 #pragma link off all classes;
 #pragma link off all functions;
  
-
 #pragma link C++ nestedclass;
 #pragma link C++ nestedtypedef;
 
@@ -56,7 +55,6 @@
 #pragma link C++ class THcRawHit+;
 #pragma link C++ class THcRawHodoHit+;
 #pragma link C++ class THcRawShowerHit+;
-#pragma link C++ class THcRawShowerHit+;
 #pragma link C++ class THcRawTdcHit+;
 #pragma link C++ class THcReactionPoint+;
 #pragma link C++ class THcRun+;