diff --git a/include/arch/archARM64.hpp b/include/arch/archARM64.hpp
index 33d91390ab708f0051039bbc9117522fbe9519b2..52ae2b57950c6c796159586497bd101bd7b6d31f 100644
--- a/include/arch/archARM64.hpp
+++ b/include/arch/archARM64.hpp
@@ -11,5 +11,11 @@ class ZiprArchitectureHelperARM64_t : public ZiprArchitectureHelperBase_t
 			// it includes a 26-bit immediate, which is +/- 128MB, which should be a good enough "jump anywhere"
 			// for now.
 		}
+		virtual libIRDB::Instruction_t* createNewHaltInstruction(libIRDB::FileIR_t *p_firp, libIRDB::Instruction_t* p_existing) override
+		{
+			return IRDBUtility::addNewDatabits(p_firp, p_existing, "\xd4\x40\x00\x00");
+			// A halt unconditional, in binary is: 
+			// 1101 0100  0100 0000  0000 0000  0000 0000
+		}
 };
 #endif
diff --git a/include/arch/archX86.hpp b/include/arch/archX86.hpp
index 63385e0b83a494e35a14ad75f857ba927b74f01e..0ebfb00b925d42dc913e5805ae95a0c6b57a3b28 100644
--- a/include/arch/archX86.hpp
+++ b/include/arch/archX86.hpp
@@ -9,5 +9,9 @@ class ZiprArchitectureHelperX86_t  : public ZiprArchitectureHelperBase_t
 		{
 			return IRDBUtility::addNewAssembly(p_firp, p_existing, "jmp 0");
 		}
+		virtual libIRDB::Instruction_t* createNewHaltInstruction(libIRDB::FileIR_t *p_firp, libIRDB::Instruction_t* p_existing) override
+		{
+			return IRDBUtility::addNewAssembly(p_firp, p_existing, "hlt");
+		}
 };
 #endif
diff --git a/include/arch/archbase.hpp b/include/arch/archbase.hpp
index 53a4fb7ca5f77754783820348ea444ef13d13a64..703ada9a9d3bd51cff5fa132c757c4965349a56e 100644
--- a/include/arch/archbase.hpp
+++ b/include/arch/archbase.hpp
@@ -6,6 +6,7 @@ class ZiprArchitectureHelperBase_t
 {
 	public:
 		virtual libIRDB::Instruction_t* createNewJumpInstruction(libIRDB::FileIR_t *p_firp, libIRDB::Instruction_t* p_existing)=0;
+		virtual libIRDB::Instruction_t* createNewHaltInstruction(libIRDB::FileIR_t *p_firp, libIRDB::Instruction_t* p_existing)=0;
 		static std::unique_ptr<ZiprArchitectureHelperBase_t> factory(libIRDB::FileIR_t* p_firp);
 
 };
diff --git a/include/pinner/pinnerARM64.hpp b/include/pinner/pinnerARM64.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4082beb4a3e4e23417c8ae3cf2ec58833875315c
--- /dev/null
+++ b/include/pinner/pinnerARM64.hpp
@@ -0,0 +1,11 @@
+#ifndef ZIPR_PINNER
+#define ZIPR_PINNER
+
+class ZiprPinner_t 
+{
+	public:
+		virtual void doPinning();
+};
+
+
+#endif
diff --git a/include/pinner/pinnerX86.hpp b/include/pinner/pinnerX86.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..bcefa97a5c12cb7d47d56b1c2066edb62dbcb879
--- /dev/null
+++ b/include/pinner/pinnerX86.hpp
@@ -0,0 +1,12 @@
+#ifndef ZIPR_PINNER
+#define ZIPR_PINNER
+
+class ZiprPinner_t 
+{
+	public:
+		virtual void doPinning()=0;
+		static unique_ptr<ZiprPinner_t> factory(Zipr_SDK::Zipr_t* parent);
+};
+
+
+#endif
diff --git a/include/pinner/pinner_base.hpp b/include/pinner/pinner_base.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..bcefa97a5c12cb7d47d56b1c2066edb62dbcb879
--- /dev/null
+++ b/include/pinner/pinner_base.hpp
@@ -0,0 +1,12 @@
+#ifndef ZIPR_PINNER
+#define ZIPR_PINNER
+
+class ZiprPinner_t 
+{
+	public:
+		virtual void doPinning()=0;
+		static unique_ptr<ZiprPinner_t> factory(Zipr_SDK::Zipr_t* parent);
+};
+
+
+#endif
diff --git a/include/zipr_all.h b/include/zipr_all.h
index c4c1b41463d23a9b65ab40b737a6fd7bfcb63b30..d6e169ffae80ab1a31c99f93170c082ad5b1f750 100644
--- a/include/zipr_all.h
+++ b/include/zipr_all.h
@@ -59,6 +59,7 @@ using namespace Zipr_SDK;
 #include <zipr_dollop_man.h>
 #include <zipr_utils.h>
 #include <arch/archbase.hpp>
+#include <pinner/pinner_base.h>
 #include <zipr_impl.h>
 #include <zipr_optimizations.h>
 #include <zipr_stats.h>