diff --git a/.gitignore b/.gitignore
index a9611540538f8861d95dd3f9809b75181f8d948e..978a324145b5e9a2b5f02322b5bf6e005eeb00fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ haDict.h
 haDict.C
 hcana
 src/HallC_LinkDef.h
+src/hc_compiledata.h
 
 # scons stuff
 config.log
diff --git a/Makefile b/Makefile
index a14dc6f8b92b1a8b10efd6eca14b47e98f7c17f1..56e45dfc6ad59be555c2e95669a81b660191224c 100644
--- a/Makefile
+++ b/Makefile
@@ -7,9 +7,16 @@
 # List only the implementation files (*.cxx). For every implementation file
 # there must be a corresponding header file (*.h).
 
+SOVERSION := 0.90
+PATCH     := 0
+VERSION   := $(SOVERSION).$(PATCH)
+EXTVERS   :=
+VERCODE := $(shell echo $(subst ., ,$(SOVERSION)) $(PATCH) | \
+   awk '{ print $$1*65536 + $$2*256 + $$3 }')
+
 USEWILDCARD = 1
 ifdef USEWILDCARD
-SRC = $(wildcard src/*.cxx)
+SRC = $(sort $(wildcard src/*.cxx))
 else
 SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
 	src/THcHallCSpectrometer.cxx \
@@ -183,9 +190,31 @@ HDR           = $(SRC:.cxx=.h)
 DEP           = $(SRC:.cxx=.d) src/main.d
 OBJS          = $(OBJ) $(USERDICT).o
 HDR_COMPILEDATA = $(ANALYZER)/src/ha_compiledata.h
+HCHDR_COMPILEDATA = src/hc_compiledata.h
 
 all:		$(USERLIB) hcana
 
+src/hc_compiledata.h: Makefile
+		@echo "#ifndef HCANA_COMPILEDATA_H" > $@
+		@echo "#define HCANA_COMPILEDATA_H" >> $@
+		@echo "" >> $@
+		@echo "#define HC_INCLUDEPATH \"$(shell pwd)/src\"" >> $@
+		@echo "#define HC_VERSION \"$(VERSION)$(EXTVERS)\"" >> $@
+		@echo "#define HC_DATE \"$(shell date '+%b %d %Y')\"" >> $@
+#		@echo "#define HC_DATETIME \"$(shell date '+%a %b %d %H:%M:%S %Z %Y')\"" >> $@
+		@echo "#define HC_DATETIME \"$(shell date '+%a %b %d %Y')\"" >> $@
+		@echo "#define HC_PLATFORM \"$(shell uname -s)-$(shell uname -r)-$(shell uname -m)\"" >> $@
+		@echo "#define HC_BUILDNODE \"$(shell uname -n)\"" >> $@
+		@echo "#define HC_BUILDDIR \"$(shell pwd)\"" >> $@
+		@echo "#define HC_BUILDUSER \"$(shell whoami)\"" >> $@
+		@echo "#define HC_GITVERS \"$(shell git rev-parse HEAD 2>/dev/null | cut -c1-7)\"" >> $@
+		@echo "#define HC_CXXVERS \"$(shell $(CXX) --version 2>/dev/null | head -1)\"" >> $@
+		@echo "#define HC_ROOTVERS \"$(shell root-config --version)\"" >> $@
+		@echo "#define HCANA_VERSION_CODE $(VERCODE)" >> $@
+		@echo "#define HCANA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))" >> $@
+		@echo "" >> $@
+		@echo "#endif" >> $@
+
 LIBDIR:=$(ANALYZER)
 LIBHALLA     := $(LIBDIR)/libHallA.so
 LIBDC        := $(LIBDIR)/libdc.so
@@ -199,21 +228,25 @@ else
   EVIOLIB    := -levio
 endif
 
-src/THcInterface.d:  $(HDR_COMPILEDATA)
+src/THcInterface.d:  $(HDR_COMPILEDATA) $(HCHDR_COMPILEDATA)
 
 hcana:		src/main.o $(LIBDC) $(LIBHALLA) $(USERLIB)
 		$(LD) $(LDFLAGS) $< -lHallC $(HALLALIBS) $(EVIOLIB) -L. $(CCDBLIBS) \
 		$(GLIBS) -o $@
 
-$(USERLIB):	$(HDR) $(OBJS)
+$(USERLIB).$(VERSION):	$(HDR) $(OBJS)
 		$(LD) $(LDFLAGS) $(SOFLAGS) -o $@ $(OBJS)
 		@echo "$@ done"
 
+$(USERLIB): $(USERLIB).$(VERSION)
+	rm -f $@
+	ln -s $(notdir $<) $@
+
 $(HDR_COMPILEDATA) $(LIBHALLA) $(LIBDC): $(ANALYZER)/Makefile
 		@echo "Building Podd"
 		@cd $(ANALYZER) ; export PODD_EXTRA_DEFINES=-DHALLC_MODS ; make
 
-$(USERDICT).cxx: $(RCHDR) $(HDR) $(LINKDEF)
+$(USERDICT).C: $(RCHDR) $(HDR) $(LINKDEF)
 	@echo "Generating dictionary $(USERDICT)..."
 	$(ROOTBIN)/rootcint -f $@ -c $(INCLUDES) $(CCDBFLAGS) $^
 
@@ -228,7 +261,7 @@ install:	all
 	cp -p $(USERLIB) $(HOME)/cue/SRC/ana
 
 clean:
-		rm -f src/*.o *~ $(USERLIB) $(USERDICT).*
+		rm -f src/*.o *~ $(USERLIB) $(USERLIB).$(VERSION) $(USERDICT).*
 
 realclean:	clean
 		rm -f *.d NormAnaDict.* THaDecDict.* THaScallDict.* bin/hcana
diff --git a/SConscript.py b/SConscript.py
index 46600761952cdd3652f32cb80baa8c1a4bc77eab..a849b4d4b45160b96cfd1d7153c5fec619f4be8f 100644
--- a/SConscript.py
+++ b/SConscript.py
@@ -3,6 +3,10 @@
 
 import os
 import re
+import sys
+import subprocess
+import platform
+import time
 import SCons.Util
 Import ('pbaseenv')
 
@@ -36,6 +40,66 @@ pbaseenv.RootCint(roothcdict,hcheaders)
 pbaseenv.Clean(roothcdict,re.sub(r'\.C\Z','_rdict.pcm',roothcdict))
 pbaseenv.SharedObject(target = roothcobj, source = roothcdict)
 
+#######  write src/ha_compiledata.h header file ######
+
+if sys.version_info >= (2, 7):
+    try:
+        cmd = "git rev-parse HEAD 2>/dev/null"
+        gitrev = subprocess.check_output(cmd, shell=True).rstrip()
+    except:
+        gitrev = ''
+    try:
+        cmd = pbaseenv.subst('$CXX') + " --version 2>/dev/null | head -1"
+        cxxver = subprocess.check_output(cmd, shell=True).rstrip()
+    except:
+        cxxver = ''
+    # subprocess gives us byte string literals in Python 3, but we'd like
+    # Unicode strings
+    if sys.version_info >= (3, 0):
+        gitrev = gitrev.decode()
+        cxxver = cxxver.decode()
+else:
+    FNULL = open(os.devnull, 'w')
+    try:
+        gitrev = subprocess.Popen(['git', 'rev-parse', 'HEAD', '2>dev/null'],\
+                    stdout=subprocess.PIPE, stderr=FNULL).communicate()[0].rstrip()
+    except:
+        gitrev =''
+    try:
+        outp = subprocess.Popen([pbaseenv.subst('$CXX'), '--version'],\
+                                stdout=subprocess.PIPE, stderr=FNULL).communicate()[0]
+        lines = outp.splitlines()
+        cxxver = lines[0]
+    except:
+        cxxver = ''
+
+compiledata = 'src/hc_compiledata.h'
+f=open(compiledata,'w')
+f.write('#ifndef HCANA_COMPILEDATA_H\n')
+f.write('#define HCANA_COMPILEDATA_H\n')
+f.write('\n')
+f.write('#define HC_INCLUDEPATH "%s"\n' % (pbaseenv.subst('$HC_SRC')))
+f.write('#define HC_VERSION "%s"\n' % pbaseenv.subst('$HC_VERSION'))
+f.write('#define HC_DATE "%s"\n' % time.strftime("%b %d %Y"))
+f.write('#define HC_DATETIME "%s"\n' % time.strftime("%a %b %d %Y"))
+#f.write('#define HC_DATETIME "%s"\n' % time.strftime("%a %b %d %H:%M:%S %Z %Y"))
+f.write('#define HC_PLATFORM "%s"\n' % platform.platform())
+f.write('#define HC_BUILDNODE "%s"\n' % platform.node())
+f.write('#define HC_BUILDDIR "%s"\n' % os.getcwd())
+try:
+    builduser = pbaseenv['ENV']['LOGNAME']
+except:
+    builduser = ''
+f.write('#define HC_BUILDUSER "%s"\n' % builduser)
+f.write('#define HC_GITVERS "%s"\n' % gitrev[:7])
+f.write('#define HC_CXXVERS "%s"\n' % cxxver)
+f.write('#define HC_ROOTVERS "%s"\n' % pbaseenv.subst('$ROOTVERS'))
+f.write('#define HCANA_VERSION_CODE %s\n' % pbaseenv.subst('$VERCODE'))
+f.write('#define HCANA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))\n')
+f.write('\n')
+f.write('#endif\n')
+f.close()
+
 #######  Start of main SConscript ###########
 
 print ('LIBS = %s\n' % pbaseenv.subst('$LIBS'))
diff --git a/SConstruct b/SConstruct
index 16ca2794239806b2127a64461bf15b2a075f1e9f..9ea5ad97da95b7f895fee08cd9d017cef30d5af8 100644
--- a/SConstruct
+++ b/SConstruct
@@ -25,13 +25,13 @@ baseenv.Append(HA_DIR= baseenv.subst('$HC_DIR')+'/podd')
 baseenv.Append(MAIN_DIR= baseenv.subst('$HEAD_DIR'))
 baseenv.Append(HA_SRC= baseenv.subst('$HA_DIR')+'/src')
 baseenv.Append(HA_DC= baseenv.subst('$HA_DIR')+'/hana_decode')
-baseenv.Append(MAJORVERSION = '1')
-baseenv.Append(MINORVERSION = '6')
+baseenv.Append(MAJORVERSION = '0')
+baseenv.Append(MINORVERSION = '90')
 baseenv.Append(PATCH = '0')
 baseenv.Append(SOVERSION = baseenv.subst('$MAJORVERSION')+'.'+baseenv.subst('$MINORVERSION'))
 baseenv.Append(VERSION = baseenv.subst('$SOVERSION')+'.'+baseenv.subst('$PATCH'))
 baseenv.Append(EXTVERS = '')
-baseenv.Append(HA_VERSION = baseenv.subst('$VERSION')+baseenv.subst('$EXTVERS'))
+baseenv.Append(HC_VERSION = baseenv.subst('$VERSION')+baseenv.subst('$EXTVERS'))
 print ("Hall C Main Directory = %s" % baseenv.subst('$HC_DIR'))
 print ("Hall C Source Directory = %s" % baseenv.subst('$HC_SRC'))
 print ("Hall A Main Directory = %s" % baseenv.subst('$HA_DIR'))
diff --git a/src/THcInterface.cxx b/src/THcInterface.cxx
index a74e5fd45e8311ff260cae3373536849f192fcba..0fe8526faa8ec17f54622086a956c536b891a88c 100644
--- a/src/THcInterface.cxx
+++ b/src/THcInterface.cxx
@@ -15,6 +15,8 @@ for the Hall C style parameter database.
 #include "THcDetectorMap.h"
 #include "THcGlobals.h"
 #include "ha_compiledata.h"
+#include "hc_compiledata.h"
+#include <sstream>
 
 #include "TTree.h"
 
@@ -90,7 +92,7 @@ void THcInterface::PrintLogo( Bool_t lite )
      mille = iyear;
    char* root_date = Form("%s %d %4d",months[imonth-1],iday,mille);
 
-   const char* halla_version = HA_VERSION;
+   //   const char* halla_version = HA_VERSION;
    //   const char* halla_date = Form("%d %s %4d",24,months[2-1],2003);
 
 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,18,0)
@@ -101,9 +103,9 @@ void THcInterface::PrintLogo( Bool_t lite )
      Printf("  *            W E L C O M E  to  the            *");
      Printf("  *          H A L L C ++  A N A L Y Z E R       *");
      Printf("  *                                              *");
-     Printf("  *            Based on                          *");
-     Printf("  *  PODD Release  %10s %18s *",halla_version,__DATE__);
-     Printf("  *  Based on ROOT %8s %20s *",root_version,root_date);
+     Printf("  *  hcana release %10s %18s *",HC_VERSION,HC_DATE);
+     Printf("  *  PODD release  %10s %18s *",HA_VERSION,HA_DATE);
+     Printf("  *  ROOT            %8s %18s *",root_version,root_date);
      Printf("  *                                              *");
      Printf("  *            For information visit             *");
      Printf("  *      http://hallcweb.jlab.org/hcana/docs/    *");
@@ -122,6 +124,24 @@ void THcInterface::PrintLogo( Bool_t lite )
 
 }
 
+//_____________________________________________________________________________
+const char* THcInterface::GetVersionString()
+{
+  // Get software version string (printed by analyzer -v)
+
+  static TString version_string;
+
+  if( version_string.IsNull() ) {
+    ostringstream ostr;
+    ostr << "hcana " << HC_VERSION << " ";
+    if( strlen(HC_GITVERS) > 0 )
+      ostr << "git @" << HC_GITVERS << " ";
+    ostr << THaInterface::GetVersionString();
+    version_string = ostr.str().c_str();
+  }
+  return version_string.Data();
+}
+
 //_____________________________________________________________________________
 ClassImp(THcInterface)
 
diff --git a/src/THcInterface.h b/src/THcInterface.h
index 57863e0d74e7370e7ee6c615fc4cd1fd24d58a93..39bee3438d6735147b1b16a736d0373833c4c7cd 100644
--- a/src/THcInterface.h
+++ b/src/THcInterface.h
@@ -24,6 +24,7 @@ public:
 #else
   virtual void PrintLogo(Bool_t lite = kFALSE);
 #endif
+  static const char* GetVersionString();
 
 protected:
 
diff --git a/src/main.C b/src/main.C
index 6f57832c41db275587514ba8beb7ab80552979e1..2c82d911beeacdeb1b5fd4043ed36b9679d8082d 100644
--- a/src/main.C
+++ b/src/main.C
@@ -26,7 +26,7 @@ int main(int argc, char **argv)
   }
 
   if( print_version ) {
-    cout << "hcana using " << THcInterface::GetVersionString() << endl;
+    cout << THcInterface::GetVersionString() << endl;
     return 0;
   }