diff --git a/include/private-include/zipr_constants.h b/include/private-include/constants.h
similarity index 100%
rename from include/private-include/zipr_constants.h
rename to include/private-include/constants.h
diff --git a/include/private-include/dollop.h b/include/private-include/dollop.h
index f6bbef6623cab1a454ae021e6098242a6cc36117..7f6ee5ef99712620b4d614cff1fc07174512cfa7 100644
--- a/include/private-include/dollop.h
+++ b/include/private-include/dollop.h
@@ -19,6 +19,7 @@ namespace Zipr_SDK
 			Placeable_t() {}
 			Placeable_t(const Placeable_t& copy) = delete;
 		public:
+			virtual ~Placeable_t() {}
 			virtual void           Place(RangeAddress_t place)        = 0;
 			virtual RangeAddress_t getPlace()                  const  = 0;
 			virtual bool           isPlaced()                  const  = 0;
@@ -33,6 +34,7 @@ namespace Zipr_SDK
 			DollopPatch_t() { } 
 			DollopPatch_t(const DollopPatch_t& copy) = delete;
 		public:
+			virtual ~DollopPatch_t() { } 
 
 			virtual Dollop_t* getTarget()                 const = 0 ;
 			virtual void      setTarget(Dollop_t *target)       = 0 ;
@@ -46,6 +48,8 @@ namespace Zipr_SDK
 			DollopEntry_t() { } 
 			DollopEntry_t(const DollopEntry_t& copy) = delete;
 		public:
+			virtual ~DollopEntry_t() { } 
+
 			virtual void           setTargetDollop(Dollop_t *target)        = 0 ; 
 			virtual void           MemberOfDollop(Dollop_t *member_of)      = 0 ; 
 
@@ -67,6 +71,7 @@ namespace Zipr_SDK
 			Dollop_t(const Dollop_t& copy) = delete;
 
 		public:
+			virtual ~Dollop_t() {}
 
 			virtual size_t    getSize()                                  const = 0;
 			virtual size_t    getDollopEntryCount()                      const = 0;
diff --git a/include/private-include/dollop_man.h b/include/private-include/dollop_man.h
index a15c6d73dd701f69ea0f59d536c01e4af5c89fed..6d2ecf96de0cd5e892e201e4a1e52686507bbb6f 100644
--- a/include/private-include/dollop_man.h
+++ b/include/private-include/dollop_man.h
@@ -17,9 +17,12 @@ namespace Zipr_SDK
 
 	class DollopManager_t 
 	{
-		public:
+		protected:
 			DollopManager_t() {};
+			DollopManager_t(const DollopManager_t& copy) = delete;
+		public:
 
+			virtual ~DollopManager_t() {};
 
 			/*
 			 * Add a dollop and all its fallthrough dollops
diff --git a/include/private-include/memory_space.h b/include/private-include/memory_space.h
index 2cba832c8b15c3ef3ba5f15b01080cb536e91bf0..481d0310defc574cf9280f7ff8c066d9ce490ad4 100644
--- a/include/private-include/memory_space.h
+++ b/include/private-include/memory_space.h
@@ -7,9 +7,14 @@ namespace Zipr_SDK
 	using RangeSetBounds_t = pair<RangeSet_t::const_iterator,RangeSet_t::const_iterator>;
 
 	// a memory space _is_ a map of range addres to char, with additional functionality.
-	class MemorySpace_t : public map<RangeAddress_t,char>
+	class MemorySpace_t : virtual public map<RangeAddress_t,char>
 	{
+		protected:
+			MemorySpace_t(){}
+			MemorySpace_t(const MemorySpace_t& copy) = delete;
+
 		public:
+			virtual ~MemorySpace_t(){}
 
 			// range operatations
 			virtual void             splitFreeRange(RangeAddress_t addr)                              = 0;
diff --git a/include/private-include/options.h b/include/private-include/options.h
new file mode 100644
index 0000000000000000000000000000000000000000..4ccbf3aebb0aa0c4faee197ea6ac90971fafe981
--- /dev/null
+++ b/include/private-include/options.h
@@ -0,0 +1,119 @@
+
+#include <string>
+#include <unistd.h>
+#include <iostream>
+#include <sstream>
+#include <set>
+
+namespace Zipr_SDK
+{
+	using namespace std;
+
+	class ZiprOption_t 
+	{
+		protected:
+			ZiprOption_t() { } 
+			ZiprOption_t(const ZiprOption_t& copy) = delete;
+		public:
+			virtual ~ZiprOption_t() { } 
+ 
+			virtual string getValueString()  const = 0; 
+			virtual string getNamespace()    const = 0;
+			virtual string getKey()          const = 0;
+			virtual string getDescription()  const = 0;
+			virtual bool areRequirementMet() const = 0;
+
+			virtual void setRequired(bool req=true) = 0;
+
+	};
+
+	template <class T>
+	class ZiprTypedOption_t : virtual public ZiprOption_t 
+	{
+		protected:
+			ZiprTypedOption_t() { } 
+			ZiprTypedOption_t(const ZiprTypedOption_t& copy) = delete;
+		public:
+			virtual ~ZiprTypedOption_t() { } 
+
+                        virtual T getValue() const  = 0;
+                        virtual operator T() const  = 0;
+
+	};
+
+
+	class ZiprStringOption_t : virtual public ZiprTypedOption_t<string>
+	{
+		protected:
+			ZiprStringOption_t() { } 
+			ZiprStringOption_t(const ZiprStringOption_t& copy) = delete;
+		public:
+			virtual ~ZiprStringOption_t() { } 
+			virtual void setValue(const string& ) = 0; 
+                        
+	};
+
+	class ZiprBooleanOption_t : virtual public ZiprTypedOption_t<bool>
+	{
+		protected:
+			ZiprBooleanOption_t() { } 
+			ZiprBooleanOption_t(const ZiprBooleanOption_t& copy) = delete;
+		public:
+			virtual ~ZiprBooleanOption_t() { } 
+			virtual void setValue(const bool& ) = 0; 
+                        
+	};
+
+	class ZiprIntegerOption_t : virtual public ZiprTypedOption_t<size_t>
+	{
+		protected:
+			ZiprIntegerOption_t() { } 
+			ZiprIntegerOption_t(const ZiprIntegerOption_t& copy) = delete;
+		public:
+			virtual ~ZiprIntegerOption_t() { } 
+			virtual void setValue(const size_t& ) = 0; 
+                        
+	};
+
+
+	class ZiprDoubleOption_t : public ZiprTypedOption_t<double>
+	{
+		protected:
+			ZiprDoubleOption_t() { } 
+			ZiprDoubleOption_t(const ZiprDoubleOption_t& copy) = delete;
+		public:
+			virtual ~ZiprDoubleOption_t() { } 
+			virtual void setValue(const double& ) = 0; 
+                        
+	};
+
+	class ZiprOptionsNamespace_t 
+	{
+		protected:
+			ZiprOptionsNamespace_t() { } 
+			ZiprOptionsNamespace_t(const ZiprOptionsNamespace_t& copy) = delete;
+		public:
+			virtual ~ZiprOptionsNamespace_t() { } 
+			virtual string getNamespaceString() const = 0 ;
+			virtual ZiprStringOption_t*  getStringOption (const string& name, const string &description="", const string& default_value="")    = 0; 
+			virtual ZiprIntegerOption_t* getIntegerOption(const string& name, const string &description="", const size_t& default_value=0)     = 0; 
+			virtual ZiprBooleanOption_t* getBooleanOption(const string& name, const string &description="", const bool  & default_value=false) = 0; 
+			virtual ZiprDoubleOption_t*  getDoubleOption (const string& name, const string &description="", const double& default_value=0.0)   = 0; 
+	};
+
+	class ZiprOptionsManager_t 
+	{
+		protected:
+			ZiprOptionsManager_t() { } 
+			ZiprOptionsManager_t(const ZiprOptionsManager_t& copy) = delete;
+
+		public:
+			virtual ~ZiprOptionsManager_t() { } 
+
+                        virtual bool areRequirementsMet()                          const = 0;
+			virtual ZiprOptionsNamespace_t* getNamespace(const string& name) = 0;
+
+
+	};
+
+}
diff --git a/include/private-include/zipr_plugin.h b/include/private-include/plugin.h
similarity index 96%
rename from include/private-include/zipr_plugin.h
rename to include/private-include/plugin.h
index 77e5db03bcac1cbf5c6c64cd0eb7d3d7f4561a7c..f7bf1434b5d2833a9375a44e299b752b782fbcad 100644
--- a/include/private-include/zipr_plugin.h
+++ b/include/private-include/plugin.h
@@ -85,9 +85,6 @@ namespace Zipr_SDK
 			virtual string toString() 
 				{ return "NamelessPlugin"; }
 
-			virtual ZiprOptionsNamespace_t *registerOptions(ZiprOptionsNamespace_t *)
-				{ return new ZiprOptionsNamespace_t(""); }
-
 			virtual ZiprPreference_t retargetPin(const RangeAddress_t &, const Dollop_t *, RangeAddress_t &)
 				{ return None; }
 
diff --git a/include/private-include/range.h b/include/private-include/range.h
index 95d8712b4fece838b673dcb13ea4f6849ab381ee..6c0e6a7bff3a0f83e9af8e699b4d993fdf45c9d9 100644
--- a/include/private-include/range.h
+++ b/include/private-include/range.h
@@ -10,6 +10,7 @@ namespace Zipr_SDK
 		public:
 			Range_t(RangeAddress_t p_s, RangeAddress_t p_e) : m_start(p_s), m_end(p_e) { }
 			Range_t() : m_start(0), m_end(0) { }
+			virtual ~Range_t() {} 
 
 			virtual RangeAddress_t getStart() const { return m_start; }
 			virtual RangeAddress_t getEnd() const { return m_end; }
diff --git a/include/private-include/zipr.h b/include/private-include/zipr.h
index 95fc13c1c5addb6fb52de4144357c512d4254149..38608e83db5dd283e382186bf403be106bc959ea 100644
--- a/include/private-include/zipr.h
+++ b/include/private-include/zipr.h
@@ -9,12 +9,16 @@ namespace Zipr_SDK
 
 	using PlacementQueue_t = set< pair<Dollop_t*,RangeAddress_t> > ;
 
+	class ZiprOptionsManager_t;
+
 	class Zipr_t
 	{
 		protected:
 			Zipr_t() { } 
 			Zipr_t(const Zipr_t& copy) = delete;
+
 		public:
+			virtual ~Zipr_t() { } 
 			/*
 			 * These are public functions that the SDK user way want to use.
 			 */
@@ -44,6 +48,7 @@ namespace Zipr_SDK
 			virtual InstructionLocationMap_t* getLocationMap()    = 0; 
 			virtual DollopManager_t*          getDollopManager()  = 0;
 			virtual PlacementQueue_t*         getPlacementQueue() = 0;
+			virtual ZiprOptionsManager_t*     getOptionsManager() = 0;
 
 	};
 
diff --git a/include/private-include/zipr_options.h b/include/private-include/zipr_options.h
deleted file mode 100644
index 8bb2833fd8ee6638aaf7e2b06912c4ad8fb3b76d..0000000000000000000000000000000000000000
--- a/include/private-include/zipr_options.h
+++ /dev/null
@@ -1,368 +0,0 @@
-
-#include <string>
-#include <unistd.h>
-#include <iostream>
-#include <sstream>
-#include <set>
-
-namespace Zipr_SDK
-{
-	using namespace std;
-
-	using ZiprOptionType_t = enum ZiprOptionType 
-		{
-			zotZiprUntypedOptionType,
-			zotZiprIntegerOptionType,
-			zotZiprDoubleOptionType,
-			zotZiprBooleanOptionType,
-			zotZiprStringOptionType,
-		};
-
-	class ZiprOption_t 
-	{
-		public:
-			ZiprOption_t(ZiprOptionType_t type, const string& key, const string& value)
-				: m_key(key),
-				  m_untyped_value(value),
-					m_observee(nullptr),
-					m_takes_value(true),
-					m_needs_value(true),
-					m_required(false),
-					m_set(false),
-					m_option_type(type) {};
-
-			virtual void setValue(const string &value) = 0;
-			virtual void setOption() = 0;
-
-			string getStringValue() 
-			{
-				return m_untyped_value;
-			}
-			string getNamespace() 
-			{
-				return m_namespace;
-			}
-			string getKey() 
-			{
-				return m_key;
-			}
-			void setNeedsValue(bool needs_value) 
-			{
-				m_needs_value = needs_value;
-			}
-			bool getNeedsValue() 
-			{
-				return m_needs_value;
-			}
-			void setTakesValue(bool takes_value) 
-			{
-				m_takes_value = takes_value;
-			}
-			bool getTakesValue() 
-			{
-				return m_takes_value;
-			}
-			
-			bool isRequired() 
-			{
-				return m_required;
-			}
-			void setRequired(bool required) 
-			{
-				m_required = required;
-			}
-			bool areRequirementMet() 
-			{
-				return (!m_required) || (m_set);
-			}
-
-			virtual string getDescription() 
-			{
-				return m_description;
-			}
-			
-
-			void setDescription(string description) 
-			{
-				m_description = description;
-			}
-
-			void addObserver(ZiprOption_t *observer) 
-			{
-				assert(observer->m_option_type == m_option_type);
-				//observer->setValue(m_untyped_value);
-				observer->m_observee = this;
-				m_observers.insert(observer);
-			}
-		protected:
-			string m_namespace, m_key, m_untyped_value, m_description;
-			set<ZiprOption_t*> m_observers;
-			ZiprOption_t *m_observee;
-			bool m_takes_value, m_needs_value;
-			bool m_required;
-			bool m_set;
-			void SetObserverValues(string value) 
-			{
-				set<ZiprOption_t*>::const_iterator it = m_observers.begin();
-				set<ZiprOption_t*>::const_iterator it_end = m_observers.end();
-				for (; it!=it_end; it++)
-					(*it)->setValue(value);
-			}
-			ZiprOptionType_t m_option_type;
-	};
-
-	template <typename T>
-	class ZiprTypedOption_t : public ZiprOption_t
-	{
-		public:
-			ZiprTypedOption_t(ZiprOptionType_t type,
-				const string& key,
-				const string& value)
-				: ZiprOption_t(type, key, value) {}
-
-			void setValue(const string &value) 
-			{
-				m_set = true;
-				m_untyped_value = value;
-				m_value = convertToTyped(value);
-			}
-			virtual void setOption() 
-			{
-			}
-
-			T getValue() const 
-			{
-				if (m_observee!=nullptr)
-				
-				{
-					ZiprTypedOption_t<T> *typed_observee =
-						static_cast<ZiprTypedOption_t<T>*>(m_observee);
-					return typed_observee->getValue();
-				}
-				return m_value;
-			}
-			operator T() const 
-			{
-				return getValue();
-			};
-			virtual string getDescription() 
-			{
-				return string(m_key + ": " 
-					+ ((!m_needs_value)?"[":"")
-					+ "<" + getTypeName() + ">"
-					+ ((!m_needs_value)?"]":"")
-					+ ((m_description.length())?":\t":"") + m_description 
-					);
-			}
-		protected:
-			T m_value;
-			virtual T convertToTyped(const string& ) = 0;
-			virtual string convertToUntyped(const T&) = 0;
-			virtual string getTypeName() = 0;
-	};
-
-	template <class T>
-	class ZiprCompositeOption_t : public ZiprTypedOption_t<T>, public T
-	{
-		public:
-			ZiprCompositeOption_t(ZiprOptionType_t type,
-				string key,
-				string value)
-				: ZiprTypedOption_t<T>(type, key, value) {}
-			using ZiprTypedOption_t<T>::convertToTyped;
-			void setValue(const string &value) 
-			{
-				ZiprTypedOption_t<T>::setValue(value);
-				T::operator=(convertToTyped(value));
-			}
-	};
-
-	class ZiprStringOption_t : public ZiprCompositeOption_t<string>
-	{
-		public:
-			ZiprStringOption_t(string key, string value = "")
-				: ZiprCompositeOption_t(zotZiprStringOptionType, key, value) 
-			{
-				setValue(value);
-			}
-		protected:
-			string convertToTyped(const string& value_to_convert) 
-			{
-				return string(value_to_convert);
-			}
-			string convertToUntyped(const string& value_to_convert) 
-			{
-				return string(value_to_convert);
-			}
-			string getTypeName() 
-			{
-				return "string";
-			}
-	};
-
-	class ZiprBooleanOption_t : public ZiprTypedOption_t<bool>
-	{
-		public:
-			ZiprBooleanOption_t(const string& key, const string& value = "")
-				: ZiprTypedOption_t(zotZiprBooleanOptionType, key, value) 
-			{
-				m_untyped_value = value;
-				m_needs_value = false;
-			}
-			ZiprBooleanOption_t(const string& key, bool value)
-				: ZiprTypedOption_t(zotZiprBooleanOptionType, key, "") 
-			{
-				m_value = value;
-				m_needs_value = false;
-				m_untyped_value = convertToUntyped(value);
-			}
-			void setOption() 
-			{
-				m_untyped_value = "true";
-				m_value = true;
-				m_set = true;
-			}
-
-		private:
-			bool convertToTyped(const string& value_to_convert) 
-			{
-				if (value_to_convert == "true")
-					return true;
-				else
-					return false;
-			}
-			string convertToUntyped(const bool& value_to_convert) 
-			{
-				return (value_to_convert ? string("true") : string("false"));
-			}
-			string getTypeName() 
-			{
-				return "bool";
-			}
-	};
-
-	class ZiprIntegerOption_t : public ZiprTypedOption_t<int>
-	{
-		public:
-			ZiprIntegerOption_t(const string& key, const string& value = "")
-				: ZiprTypedOption_t(zotZiprIntegerOptionType, key, value) 
-			{
-				m_value = convertToTyped(value);
-			}
-			ZiprIntegerOption_t(const string& key, int value)
-				: ZiprTypedOption_t(zotZiprIntegerOptionType, key, "") 
-			{
-				m_value = value;
-				m_untyped_value = convertToUntyped(value);
-			}
-			void setValue(int value) 
-			{
-				m_value = value;
-				m_untyped_value = convertToUntyped(value);
-			}
-		private:
-			int convertToTyped(const string& value_to_convert) 
-			{
-				int converted = 0;
-				char *endptr = nullptr;
-				converted = strtol(value_to_convert.c_str(),
-						   &endptr, 10);
-				if (*endptr != '\0')
-				{
-					m_set = false;
-					m_untyped_value = "";
-					return 0;
-				}
-				return converted;
-			}
-			string convertToUntyped(const int& value_to_convert) 
-			{
-				stringstream ss;
-				ss << value_to_convert;
-				return ss.str();
-			}
-			string getTypeName() 
-			{
-				return "integer";
-			}
-	};
-
-	class ZiprDoubleOption_t : public ZiprTypedOption_t<double>
-	{
-		public:
-			ZiprDoubleOption_t(const string& key, const string& value = "")
-				: ZiprTypedOption_t(zotZiprDoubleOptionType, key, value) 
-				{
-				m_value = convertToTyped(value);
-			}
-			ZiprDoubleOption_t(const string& key, double value)
-				: ZiprTypedOption_t(zotZiprDoubleOptionType, key, "") 
-			{
-				m_value = value;
-				m_untyped_value = convertToUntyped(value);
-			}
-			void setValue(double value) 
-			{
-				m_value = value;
-				m_untyped_value = convertToUntyped(value);
-			}
-		private:
-			double convertToTyped(const string& value_to_convert) 
-			{
-				double converted = 0.;
-				char *endptr = nullptr;
-				converted = strtof(value_to_convert.c_str(),
-						   &endptr);
-				if (*endptr != '\0')
-				{
-					m_set = false;
-					m_untyped_value = "";
-					return 0;
-				}
-				return converted;
-			}
-			string convertToUntyped(const double& value_to_convert) 
-			{
-				stringstream ss;
-				ss << value_to_convert;
-				return ss.str();
-			}
-			string getTypeName() {
-				return "double";
-			}
-	};
-
-	class ZiprOptionsNamespace_t : public set<ZiprOption_t*>
-	{
-		public:
-			ZiprOptionsNamespace_t(const string& ns) : m_namespace(ns) {}
-			string getNamespace() 
-			{
-				return m_namespace;
-			};
-			void printNamespace();
-			ZiprOption_t *optionByKey(const string& key);
-			void addOption(ZiprOption_t *option);
-			void printUsage(int tabs, ostream &out);
-			bool areRequirementsMet();
-			void mergeNamespace(ZiprOptionsNamespace_t*);
-		private:
-			string m_namespace;
-	};
-
-	class ZiprOptions_t 
-	{
-		public:
-			ZiprOptions_t(int argc, char **argv);
-			void addNamespace(ZiprOptionsNamespace_t *);
-			void printNamespaces();
-			bool parse(ostream *error=&cout, ostream *warn=&cerr);
-			ZiprOptionsNamespace_t *getNamespace(const string& );
-			void printUsage(ostream &out);
-			bool areRequirementsMet();
-		private:
-			vector<string> m_arguments;
-			set<ZiprOptionsNamespace_t*> m_namespaces;
-	};
-
-}
diff --git a/include/zipr-sdk b/include/zipr-sdk
index b1176fc5d4d1223c5073ef83922b9d527e570e49..d10f786415afa1653f12670b5bf6d86f62849fe0 100644
--- a/include/zipr-sdk
+++ b/include/zipr-sdk
@@ -17,8 +17,8 @@
 #include <private-include/dollop.h>
 #include <private-include/memory_space.h>
 #include <private-include/dollop_man.h>
-#include <private-include/zipr_options.h>
-#include <private-include/zipr_plugin.h>
+#include <private-include/options.h>
+#include <private-include/plugin.h>
 #include <private-include/zipr.h>
 
 //