diff --git a/pycgtool.py b/pycgtool.py
index a33e6b04f4cc7e47fce41b9935e4d840df89a15a..c30d7150ff40327cfd2beda3e22a2fa349e67a4f 100755
--- a/pycgtool.py
+++ b/pycgtool.py
@@ -2,6 +2,7 @@
 
 import argparse
 import sys
+import logging
 
 from pycgtool.frame import Frame
 from pycgtool.mapping import Mapping
@@ -9,6 +10,8 @@ from pycgtool.bondset import BondSet
 from pycgtool.forcefield import ForceField
 from pycgtool.interface import Progress, Options
 
+logger = logging.getLogger(__name__)
+
 
 def main(args, config):
     """
@@ -23,11 +26,17 @@ def main(args, config):
 
     if args.bnd:
         bonds = BondSet(args.bnd, config)
+        logger.info("Bond measurements will be made")
+    else:
+        logger.info("Bond measurements will not be made")
 
     if args.map:
         mapping = Mapping(args.map, config, itp=args.itp)
         cgframe = mapping.apply(frame, exclude={"SOL"})
         cgframe.output(config.output_name + ".gro", format=config.output)
+        logger.info("Mapping will be performed")
+    else:
+        logger.info("Mapping will not be performed")
 
     # Main loop - perform mapping and measurement on every frame in XTC
     def main_loop():
@@ -43,18 +52,23 @@ def main(args, config):
             bonds.apply(cgframe)
 
     numframes = frame.numframes - args.begin if args.end == -1 else args.end - args.begin
+    logger.info("Beginning analysis of {0} frames".format(numframes))
     Progress(numframes, postwhile=main_loop).run()
 
     if args.bnd:
         if args.map:
+            logger.info("Beginning Boltzmann inversion")
             bonds.boltzmann_invert()
             if config.output_forcefield:
+                logger.info("Creating GROMACS forcefield directory")
                 ff = ForceField("ff" + config.output_name + ".ff")
                 ff.write_rtp(config.output_name + ".rtp", mapping, bonds)
+                logger.info("GROMACS forcefield directory created")
             else:
                 bonds.write_itp(config.output_name + ".itp", mapping=mapping)
 
         if config.dump_measurements:
+            logger.info("Dumping bond measurements to file")
             bonds.dump_values(config.dump_n_values)
 
 
@@ -71,8 +85,6 @@ def map_only(args, config):
     cgframe.output(config.output_name + ".gro", format=config.output)
 
     if args.xtc and (config.output_xtc or args.outputxtc):
-        numframes = frame.numframes - args.begin if args.end == -1 else args.end - args.begin
-
         # Main loop - perform mapping and measurement on every frame in XTC
         def main_loop():
             nonlocal cgframe
@@ -80,6 +92,8 @@ def map_only(args, config):
             cgframe = mapping.apply(frame, cgframe=cgframe, exclude={"SOL"})
             cgframe.write_xtc(config.output_name + ".xtc")
 
+        numframes = frame.numframes - args.begin if args.end == -1 else args.end - args.begin
+        logger.info("Beginning analysis of {0} frames".format(numframes))
         Progress(numframes, postwhile=main_loop).run()
 
 
@@ -126,6 +140,10 @@ if __name__ == "__main__":
         print("Using XTC: {0}".format(args.xtc))
 
     if config.map_only:
+        logger.info("Starting: mapping only")
         map_only(args, config)
     else:
+        logger.info("Starting: parameter measurement")
         main(args, config)
+
+    logger.info("Analysis complete")
diff --git a/pycgtool/interface.py b/pycgtool/interface.py
index 02c80a6d83cb7180bf5c5c2f84b57f66cd4d8e03..d22d3ed2d8b6cf88446870cb41d2fb1d68fecce5 100644
--- a/pycgtool/interface.py
+++ b/pycgtool/interface.py
@@ -264,6 +264,7 @@ class Progress:
         Iterate through self until stopped by maximum iterations or False condition.
         """
         collections.deque(self, maxlen=0)
+        return self._its
 
     @property
     def _bar(self):