diff --git a/targeting.hpp b/targeting.hpp
index 0a946f6..6d86b50 100644
--- a/targeting.hpp
+++ b/targeting.hpp
@@ -1,8 +1,9 @@
 #pragma once
 
+#include "filedescriptor.hpp"
+
 #include <memory>
 #include <vector>
-#include "filedescriptor.hpp"
 
 namespace openpower
 {
@@ -27,152 +28,149 @@
  */
 class Target
 {
-    public:
+  public:
+    /**
+     * Constructor
+     *
+     * @param[in] - The logical position of the target
+     * @param[in] - The sysfs device path
+     * @param[in] - The function pointer for swapping endianness
+     */
+    Target(size_t position, const std::string& devPath,
+           const swap_endian_t swapper) :
+        pos(position),
+        cfamPath(devPath), doSwapEndian(swapper)
+    {
+    }
 
-        /**
-         * Constructor
-         *
-         * @param[in] - The logical position of the target
-         * @param[in] - The sysfs device path
-         * @param[in] - The function pointer for swapping endianness
-         */
-        Target(size_t position, const std::string& devPath,
-               const swap_endian_t swapper) :
-            pos(position), cfamPath(devPath), doSwapEndian(swapper)
-        {
-        }
+    Target() = delete;
+    ~Target() = default;
+    Target(const Target&) = default;
+    Target(Target&&) = default;
+    Target& operator=(Target&&) = default;
 
-        Target() = delete;
-        ~Target() = default;
-        Target(const Target&) = default;
-        Target(Target&&) = default;
-        Target& operator=(Target&&) = default;
+    /**
+     * Returns the position
+     */
+    inline auto getPos() const
+    {
+        return pos;
+    }
 
-        /**
-         * Returns the position
-         */
-        inline auto getPos() const
-        {
-            return pos;
-        }
+    /**
+     * Returns the CFAM sysfs path
+     */
+    inline auto getCFAMPath() const
+    {
+        return cfamPath;
+    }
 
-        /**
-         * Returns the CFAM sysfs path
-         */
-        inline auto getCFAMPath() const
-        {
-            return cfamPath;
-        }
+    /**
+     * Returns the file descriptor to use
+     * for read/writeCFAM operations.
+     */
+    int getCFAMFD();
 
-        /**
-         * Returns the file descriptor to use
-         * for read/writeCFAM operations.
-         */
-        int getCFAMFD();
+    /**
+     * Returns correct byte-order data. (May or may not swap it depending
+     * on the function received during construction from Targeting and the
+     * host endianness).
+     */
+    inline uint32_t swapEndian(uint32_t data) const
+    {
+        return doSwapEndian(data);
+    }
 
-        /**
-         * Returns correct byte-order data. (May or may not swap it depending
-         * on the function received during construction from Targeting and the
-         * host endianness).
-         */
-        inline uint32_t swapEndian(uint32_t data) const
-        {
-            return doSwapEndian(data);
-        }
+  private:
+    /**
+     * The logical position of this target
+     */
+    size_t pos;
 
-    private:
+    /**
+     * The sysfs device path for the CFAM
+     */
+    const std::string cfamPath;
 
-        /**
-         * The logical position of this target
-         */
-        size_t pos;
+    /**
+     * The file descriptor to use for read/writeCFAMReg
+     */
+    std::unique_ptr<openpower::util::FileDescriptor> cfamFD;
 
-        /**
-         * The sysfs device path for the CFAM
-         */
-        const std::string cfamPath;
-
-        /**
-         * The file descriptor to use for read/writeCFAMReg
-         */
-        std::unique_ptr<openpower::util::FileDescriptor> cfamFD;
-
-        /**
-         * The function pointer for swapping endianness
-         */
-        const swap_endian_t doSwapEndian;
+    /**
+     * The function pointer for swapping endianness
+     */
+    const swap_endian_t doSwapEndian;
 };
 
-
 /**
  * Class that manages processor targeting for FSI operations.
  */
 class Targeting
 {
-    public:
+  public:
+    /**
+     * Scans sysfs to find all processors and creates Target objects
+     * for them.
+     * @param[in] fsiMasterDev - the sysfs device for the master
+     * @param[in] fsiSlaveDirectory - the base sysfs dir for slaves
+     */
+    Targeting(const std::string& fsiMasterDev, const std::string& fsiSlaveDir);
 
-        /**
-         * Scans sysfs to find all processors and creates Target objects
-         * for them.
-         * @param[in] fsiMasterDev - the sysfs device for the master
-         * @param[in] fsiSlaveDirectory - the base sysfs dir for slaves
-         */
-        Targeting(const std::string& fsiMasterDev,
-                  const std::string& fsiSlaveDir);
+    Targeting() : Targeting(fsiMasterDevPath, fsiSlaveBaseDir)
+    {
+    }
 
-        Targeting() : Targeting(fsiMasterDevPath, fsiSlaveBaseDir) {}
+    ~Targeting() = default;
+    Targeting(const Targeting&) = default;
+    Targeting(Targeting&&) = default;
+    Targeting& operator=(Targeting&&) = default;
 
-        ~Targeting() = default;
-        Targeting(const Targeting&) = default;
-        Targeting(Targeting&&) = default;
-        Targeting& operator=(Targeting&&) = default;
+    /**
+     * Returns a const iterator to the first target
+     */
+    inline auto begin()
+    {
+        return targets.cbegin();
+    }
 
-        /**
-         * Returns a const iterator to the first target
-         */
-        inline auto begin()
-        {
-            return targets.cbegin();
-        }
+    /**
+     * Returns a const iterator to the last (highest position) target.
+     */
+    inline auto end()
+    {
+        return targets.cend();
+    }
 
-        /**
-         * Returns a const iterator to the last (highest position) target.
-         */
-        inline auto end()
-        {
-            return targets.cend();
-        }
+    /**
+     * Returns the number of targets
+     */
+    inline auto size()
+    {
+        return targets.size();
+    }
 
-        /**
-         * Returns the number of targets
-         */
-        inline auto size()
-        {
-            return targets.size();
-        }
+    /**
+     * Returns a target by position.
+     */
+    std::unique_ptr<Target>& getTarget(size_t pos);
 
-        /**
-         * Returns a target by position.
-         */
-        std::unique_ptr<Target>& getTarget(size_t pos);
+  private:
+    /**
+     * The path to the fsi-master sysfs device to access
+     */
+    std::string fsiMasterPath;
 
-    private:
+    /**
+     * The path to the fsi slave sysfs base directory
+     */
+    std::string fsiSlaveBasePath;
 
-        /**
-         * The path to the fsi-master sysfs device to access
-         */
-        std::string fsiMasterPath;
-
-        /**
-         * The path to the fsi slave sysfs base directory
-         */
-        std::string fsiSlaveBasePath;
-
-        /**
-         * A container of Targets in the system
-         */
-        std::vector<std::unique_ptr<Target>> targets;
+    /**
+     * A container of Targets in the system
+     */
+    std::vector<std::unique_ptr<Target>> targets;
 };
 
-}
-}
+} // namespace targeting
+} // namespace openpower
