diff --git a/src/isolator/hei_isolator.cpp b/src/isolator/hei_isolator.cpp
index aea45df..b09f16a 100644
--- a/src/isolator/hei_isolator.cpp
+++ b/src/isolator/hei_isolator.cpp
@@ -1,6 +1,7 @@
 
 #include <isolator/hei_isolator.hpp>
 #include <register/hei_hardware_register.hpp>
+#include <util/hei_flyweight.hpp>
 
 namespace libhei
 {
@@ -27,6 +28,9 @@
     // BEGIN temporary code
     HEI_INF( "Isolator::uninitialize()" );
     // END temporary code
+
+    // Remove all of the isolation objects stored in the flyweights.
+    Flyweight<HardwareRegister>::getSingleton().clear();
 }
 
 ReturnCode Isolator::isolate( const std::vector<Chip> & i_chipList,
diff --git a/src/register/prdfScanFacility.C b/src/register/prdfScanFacility.C
deleted file mode 100755
index 079efe9..0000000
--- a/src/register/prdfScanFacility.C
+++ /dev/null
@@ -1,233 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG                                                   */
-/* This is an automatically generated prolog.                             */
-/*                                                                        */
-/* $Source: src/usr/diag/prdf/common/framework/register/prdfScanFacility.C $ */
-/*                                                                        */
-/* OpenPOWER HostBoot Project                                             */
-/*                                                                        */
-/* Contributors Listed Below - COPYRIGHT 2012,2018                        */
-/* [+] International Business Machines Corp.                              */
-/*                                                                        */
-/*                                                                        */
-/* Licensed under the Apache License, Version 2.0 (the "License");        */
-/* you may not use this file except in compliance with the License.       */
-/* You may obtain a copy of the License at                                */
-/*                                                                        */
-/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-/*                                                                        */
-/* Unless required by applicable law or agreed to in writing, software    */
-/* distributed under the License is distributed on an "AS IS" BASIS,      */
-/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-/* implied. See the License for the specific language governing           */
-/* permissions and limitations under the License.                         */
-/*                                                                        */
-/* IBM_PROLOG_END_TAG                                                     */
-
-/**
-  @file prdfScanFacility.C
-  @brief PRD ScanFaclity class definition
-*/
-//----------------------------------------------------------------------
-//  Includes
-//----------------------------------------------------------------------
-
-#include <register/hei_register.hpp>
-#include <util/hei_flyweight.hpp>
-
-#include <prdfScanFacility.H>
-
-namespace libhei
-{
-
-//----------------------------------------------------------------------
-//  Constants
-//----------------------------------------------------------------------
-
-//----------------------------------------------------------------------
-//  Macros
-//----------------------------------------------------------------------
-
-//----------------------------------------------------------------------
-//  Internal Function Prototypes
-//----------------------------------------------------------------------
-
-//----------------------------------------------------------------------
-//  Global Variables
-//----------------------------------------------------------------------
-
-NullRegister AttnTypeRegister::cv_null(1024);
-
-//---------------------------------------------------------------------
-// Member Function Specifications
-//---------------------------------------------------------------------
-
-
-ScanFacility & ScanFacility::Access(void)
-{
-  static ScanFacility sf;
-  return sf;
-}
-//-----------------------------------------------------------------------------
-Register & ScanFacility::GetScanCommRegister( uint64_t address,
-                                uint32_t i_scomLength, TARGETING::TYPE i_type,
-                                Register::AccessLevel i_regOp )
-{
-    /* i_regOp is not used to determine uniqueness of the object for following
-      reason -
-      There can not be two registers in hardware with same address and target
-      type supporting different operations say one supports only write and
-      other both read and write.
-      */
-
-    HardwareRegister scrKey( address, i_scomLength, i_type, i_regOp );
-    // in case we get a object with different default operation, we shall reset
-    // it to what it should be as per rule file.
-    HardwareRegister &regCreated = iv_scomRegFw.get(scrKey);
-    regCreated.setAccessLevel( i_regOp );
-    return regCreated;
-}
-
-//------------------------------------------------------------------------------
-
-Register &  ScanFacility::GetNotRegister(
-                                        Register & i_arg )
-{
-  NotRegister r(i_arg);
-  return iv_notRegFw.get(r);
-}
-
-//-----------------------------------------------------------------------------
-
-Register &  ScanFacility::GetLeftShiftRegister(
-                                    Register & i_arg,
-                                     uint16_t i_amount )
-{
-  LeftShiftRegister r(i_arg, i_amount);
-  return iv_leftRegFw.get(r);
-}
-
-//-----------------------------------------------------------------------------
-
-Register &  ScanFacility::GetSummaryRegister(
-                                    Register & i_arg,
-                                     uint16_t i_bit )
-{
-  SummaryRegister r(i_arg, i_bit);
-  return iv_sumRegFw.get(r);
-}
-
-//------------------------------------------------------------------------------
-
-Register &  ScanFacility::GetRightShiftRegister(
-                                Register & i_arg,
-                                uint16_t i_amount )
-{
-  RightShiftRegister r(i_arg, i_amount);
-  return iv_rightRegFw.get(r);
-}
-
-
-//------------------------------------------------------------------------------
-
-Register &  ScanFacility::GetAndRegister(
-                                            Register & i_left,
-                                            Register & i_right )
-{
-  AndRegister r(i_left,i_right);
-  return iv_andRegFw.get(r);
-}
-
-//------------------------------------------------------------------------------
-
-Register &  ScanFacility::GetOrRegister(
-                                            Register & i_left,
-                                            Register & i_right )
-{
-  OrRegister r(i_left,i_right);
-  return iv_orRegFw.get(r);
-}
-
-//-----------------------------------------------------------------------------
-
-Register &  ScanFacility::GetAttnTypeRegister(
-                                        Register * i_check,
-                                        Register * i_recov,
-                                        Register * i_special,
-                                        Register * i_proccs,
-                                        Register * i_hostattn )
-{
-  AttnTypeRegister r(i_check, i_recov, i_special, i_proccs, i_hostattn);
-  return iv_attnRegFw.get(r);
-}
-
-//------------------------------------------------------------------------------
-
-Register & ScanFacility::GetConstantRegister(
-                                                const BitStringBuffer & i_val )
-{
-  ConstantRegister r(i_val);
-  return iv_constRegFw.get(r);
-}
-//------------------------------------------------------------------------------
-Register &  ScanFacility::GetPluginRegister(
-                                        Register & i_flyweight,
-                                        ExtensibleChip & i_RuleChip )
-{
-  ScomRegisterAccess l_regKey ( i_flyweight,&i_RuleChip );
-  return iv_pluginRegFw.get(l_regKey);
-
-}
-//-----------------------------------------------------------------------------
-void ScanFacility::ResetPluginRegister()
-{
-  iv_pluginRegFw.clear();
-
-
-}
-
-//-----------------------------------------------------------------------------
-
-void ScanFacility::reset()
-{
-    iv_scomRegFw.clear();
-    iv_attnRegFw.clear();
-    iv_andRegFw.clear();
-    iv_orRegFw.clear();
-    iv_notRegFw.clear();
-    iv_leftRegFw.clear();
-    iv_sumRegFw.clear();
-    iv_rightRegFw.clear();
-    iv_constRegFw.clear();
-    iv_pluginRegFw.clear();
-}
-
-//------------------------------------------------------------------------------
-#ifdef FLYWEIGHT_PROFILING
-void ScanFacility::printStats()
-{
-    PRDF_TRAC("HardwareRegister");
-    iv_scomRegFw.printStats();
-    PRDF_TRAC("Not Register");
-    iv_notRegFw.printStats();
-    PRDF_TRAC("Left Register");
-    iv_leftRegFw.printStats();
-    PRDF_TRAC("Right Register");
-    iv_rightRegFw.printStats();
-    PRDF_TRAC("And Register");
-    iv_andRegFw.printStats();
-    PRDF_TRAC("Or Register");
-    iv_orRegFw.printStats();
-    PRDF_TRAC("AttnTypeRegisters FW" );
-    iv_attnRegFw.printStats();
-    PRDF_TRAC("SummaryRegisters FW" );
-    iv_sumRegFw.printStats();
-    PRDF_TRAC("ConstantRegisters FW" );
-    iv_constRegFw.printStats();
-    PRDF_TRAC("PluginRegisters FW" );
-    iv_pluginRegFw.printStats();
-}
-
-#endif
-
-} // end namespace libhei
-
diff --git a/src/register/prdfScanFacility.H b/src/register/prdfScanFacility.H
deleted file mode 100755
index 1b22e16..0000000
--- a/src/register/prdfScanFacility.H
+++ /dev/null
@@ -1,232 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG                                                   */
-/* This is an automatically generated prolog.                             */
-/*                                                                        */
-/* $Source: src/usr/diag/prdf/common/framework/register/prdfScanFacility.H $ */
-/*                                                                        */
-/* OpenPOWER HostBoot Project                                             */
-/*                                                                        */
-/* Contributors Listed Below - COPYRIGHT 2012,2018                        */
-/* [+] International Business Machines Corp.                              */
-/*                                                                        */
-/*                                                                        */
-/* Licensed under the Apache License, Version 2.0 (the "License");        */
-/* you may not use this file except in compliance with the License.       */
-/* You may obtain a copy of the License at                                */
-/*                                                                        */
-/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-/*                                                                        */
-/* Unless required by applicable law or agreed to in writing, software    */
-/* distributed under the License is distributed on an "AS IS" BASIS,      */
-/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-/* implied. See the License for the specific language governing           */
-/* permissions and limitations under the License.                         */
-/*                                                                        */
-/* IBM_PROLOG_END_TAG                                                     */
-
-#ifndef PRDFSCANFACILITY_H
-#define PRDFSCANFACILITY_H
-/**
-   @file prdfScanFacility.H
-   @brief Description
-*/
-
-
-//--------------------------------------------------------------------
-// Includes
-//--------------------------------------------------------------------
-
-#include <register/hei_hardware_register.hpp>
-#include <register/hei_operator_register.hpp>
-#include <util/hei_flyweight.hpp>
-
-#include <vector>
-#include <prdfPlatServices.H>
-
-namespace libhei
-{
-
-
-/**
-    PRD Scan Facility
-    @author Doug Gilbert
-    @par    The Scan facility is used by PRD to access Scan and Scan Comm
-    @       functions.It attempts to reduce duplicate objects and their
-    @       aggragates as must as possible.
-*/
-class ScanFacility
-{
-public:
-  /**
-   The Scan Facility is a singleton - this function provides access to it.
-   */
-  static ScanFacility & Access(void);
-
-    /**
-    * @brief     Returns reference to flyweight object of type HardwareRegister.
-    *            An object of given address is first searched in flyweight.
-    *            If object exist, reference to existing object is returned
-    *            else a new one is created.
-    * @param     i_address        address of the register
-    * @param     i_scomLength     length of the bit string
-    * @param     i_type           type of target associated with register
-    * @param     i_regOp          operations supported for given register
-    * @return   returns reference to flyweight object from factory
-    */
-   Register & GetScanCommRegister( uint64_t address,
-                                uint32_t i_scomLength, TARGETING::TYPE i_type,
-                                Register::AccessLevel i_regOp );
-
-  /**
-   * @brief  Get a register that bitwise inverts the bitstring of a register
-   *         when read or written to
-   * @param  Register source
-   * @post   Only one instance of the register with this SCR parameter will
-   *         exist
-   */
-  Register & GetNotRegister(Register & i_arg);
-
-  /**
-   * @brief  Get a register that bitwise left shift the bitstring of a register
-   *         when read or written to
-   * @param  Register source
-   * @post   Only one instance of the register with this SCR parameter and
-   *         amount will exist
-   */
-  Register & GetLeftShiftRegister(
-                        Register & i_arg, uint16_t i_amount);
-
-  /**
-   * @brief Get a register that bitwise right shift the bitstring of a register
-   *        when read or written to
-   * @param Register source
-   * @post  Only one instance of the register with this SCR parameter and amount
-   * @      will exist
-   */
-  Register & GetRightShiftRegister(
-                        Register & i_arg, uint16_t i_amount);
-
-  /**
-   * @brief  Get a register for the summary construct
-   * @param  Register source
-   * @param  uint16_t i_bit  bit to set if any attentions found in i_arg
-   * @post   Only one instance of the register with this SCR parameter and
-   *         amount will exist
-   */
-  Register & GetSummaryRegister(
-                        Register & i_arg, uint16_t i_bit);
-
-  /**
-   * @brief  Get a register that bit-wise ANDs the bitstring of two register
-   *         when read or written to
-   * @param  The 2 SCR 's to AND
-   * @posrt  Only one instance of the register with these SCRs will exist
-   */
-  Register & GetAndRegister(Register & i_left,
-                                            Register & i_right);
-
-  /**
-   * @brief  Get a register that bitwise ORs the bitstrings of two register when
-   *         read or written
-   * @param  the 2 SCR's to OR
-   * @post   Only one instance of the register with these SCR's will exist
-   */
-  Register & GetOrRegister(Register & i_left,
-                                           Register & i_right);
-
-  /**
-   * @brief  Get a AttnTypeRegister
-   * @params 5 pointers to scr Registers
-   * @post only one instance of the register with these SCR's will exist
-   */
-  Register & GetAttnTypeRegister(
-                                    Register * i_check,
-                                    Register * i_recov,
-                                    Register * i_special,
-                                    Register * i_proccs,
-                                    Register * i_hostattn );
-
-  /**
-   * @brief Get a PrdfConstantRegister
-   * @param BitString - the bit string constant to use.
-   * @post only one instance of the register with this BIT_STRING value will
-   * exist.
-   */
-  Register & GetConstantRegister(const BitStringBuffer & i_val);
-  /**
-   * @brief Get a plugin  register
-   * @param Reference to target less flyweight object
-   * @param RuleChip  associatd with register
-   * @post only one instance of the register with this BIT_STRING value will
-   * exist.
-   */
-  Register & GetPluginRegister(
-                                Register & i_flyweight,
-                                ExtensibleChip & i_RuleChip );
-  /**
-   * @brief Delete all the plugin  register
-   * @param None
-   * @post  all the ScomRegisterAccess register flyweight object created for
-   *        plugin shall be deleted
-   * exist.
-   */
-  void ResetPluginRegister();
-
-  /**
-   * @brief Intended to reset all the flyweights if PRD is uninitialized due to
-   *        a reIPL, reset/reload, or failover. This free up the memory and
-   *        avoids memory leaks in the flyweights.
-   */
-  void reset();
-
-#ifdef FLYWEIGHT_PROFILING
-/**
- * @brief       prints memory allocated for object residing on flyweight
- */
-  void printStats();
-#endif
-
-  /**
-   Destructor
-   */
-//  ~ScanFacility();
-private:  // functions
-  /**
-   Constructor
-   * @param
-   * @returns
-   * @pre
-   * @post
-   * @see
-   * @note
-   */
-  ScanFacility() {}
-
-
-private:  // Data
-  typedef Flyweight<HardwareRegister>           ScanCommRegisters;
-  typedef Flyweight<AttnTypeRegister>        AttnTypeRegisters;
-  typedef Flyweight<AndRegister>            AndRegisters;
-  typedef Flyweight<OrRegister>             OrRegisters;
-  typedef Flyweight<NotRegister>            NotRegisters;
-  typedef Flyweight<LeftShiftRegister>      LeftShiftRegisters;
-  typedef Flyweight<RightShiftRegister>    RightShiftRegisters;
-  typedef Flyweight<SummaryRegister>        SummaryRegisters;
-  typedef Flyweight<ConstantRegister>       ConstantRegisters;
-  typedef Flyweight<ScomRegisterAccess>    PluginRegisters;
-
-  ScanCommRegisters     iv_scomRegFw;
-  AttnTypeRegisters     iv_attnRegFw;
-  AndRegisters          iv_andRegFw;
-  OrRegisters           iv_orRegFw;
-  NotRegisters          iv_notRegFw;
-  LeftShiftRegisters    iv_leftRegFw;
-  SummaryRegisters      iv_sumRegFw;
-  RightShiftRegisters   iv_rightRegFw;
-  ConstantRegisters     iv_constRegFw;
-  PluginRegisters       iv_pluginRegFw;
-
-};
-
-} // end namespace libhei
-
-#endif /* PRDFSCANFACILITY_H */
diff --git a/src/util/hei_flyweight.hpp b/src/util/hei_flyweight.hpp
index 45d6727..f308e3c 100644
--- a/src/util/hei_flyweight.hpp
+++ b/src/util/hei_flyweight.hpp
@@ -11,7 +11,7 @@
 template <class T>
 class Flyweight
 {
-  public:
+  private: // This class cannot be instantiated. Use getSingleton() instead.
 
     /** @brief Default constructor. */
     Flyweight() = default;
@@ -25,6 +25,15 @@
     /** @brief Default assignment operator. */
     Flyweight & operator=( const Flyweight & ) = delete;
 
+  public:
+
+    /** @brief Provides access to a singleton instance of this object. */
+    static Flyweight & getSingleton()
+    {
+        static Flyweight theFlyweight;
+        return theFlyweight;
+    }
+
     /**
      * @brief  Adds the given entry to the factory, if it does not already
      *         exist. Then returns a reference to that entry in the factory.
