diff --git a/.gitattributes b/.gitattributes
index 70c1e045b83b0e8a32d1a72223690622cbe32db6..17e4c6b79bf51b81589338f151a7ef1f7f4026ad 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -323,6 +323,18 @@ libMEDSannotation/src/MEDS_Register.cpp -text
 libMEDSannotation/src/MEDS_SafeFuncAnnotation.cpp -text
 libMEDSannotation/src/Makefile.in -text
 libMEDSannotation/src/VirtualOffset.cpp -text
+libStructDiv/SConscript -text
+libStructDiv/SConstruct -text
+libStructDiv/include/filebased.h -text
+libStructDiv/include/libStructDiv.h -text
+libStructDiv/include/structured_diversity.h -text
+libStructDiv/src/SConscript -text
+libStructDiv/src/SConstruct -text
+libStructDiv/src/filebased.cpp -text
+libStructDiv/src/structured_diversity.cpp -text
+libStructDiv/test/SConscript -text
+libStructDiv/test/SConstruct -text
+libStructDiv/test/simple_sd_driver.cpp -text
 libtransform/Makefile -text
 libtransform/SConscript -text
 libtransform/SConstruct -text
diff --git a/SConscript b/SConscript
index 4c3b86e710caa7eba39ffc7a7b425640a81f1aea..072cdd25ed10c62b0482cffdd1547a049f563734 100644
--- a/SConscript
+++ b/SConscript
@@ -79,6 +79,7 @@ libMEDSannotation=SConscript("libMEDSannotation/SConscript", variant_dir='scons_
 libxform=SConscript("xform/SConscript", variant_dir='scons_build/libxform')
 libtransform=SConscript("libtransform/SConscript", variant_dir='scons_build/libtransform')
 libIRDB=SConscript("libIRDB/SConscript", variant_dir='scons_build/libIRDB')
+libStructDiv=SConscript("libStructDiv/SConscript", variant_dir='scons_build/libStructDiv')
 
 if 'build_tools' not in env or env['build_tools'] is None or int(env['build_tools']) == 1:
 	SConscript("tools/SConscript", variant_dir='scons_build/tools')
diff --git a/libStructDiv/SConscript b/libStructDiv/SConscript
new file mode 100644
index 0000000000000000000000000000000000000000..9a892bbbe37ce72b3e30aa45009940def655d08a
--- /dev/null
+++ b/libStructDiv/SConscript
@@ -0,0 +1,7 @@
+import os
+
+Import('env')
+
+
+SConscript("src/SConscript")
+SConscript("test/SConscript")
diff --git a/libStructDiv/SConstruct b/libStructDiv/SConstruct
new file mode 100644
index 0000000000000000000000000000000000000000..c0dd68a00d406b0148a93709cf916ad6d05f282c
--- /dev/null
+++ b/libStructDiv/SConstruct
@@ -0,0 +1,6 @@
+
+
+
+env=Environment()
+Export('env')
+SConscript("SConscript")
diff --git a/libStructDiv/include/filebased.h b/libStructDiv/include/filebased.h
new file mode 100644
index 0000000000000000000000000000000000000000..0c6cbd0bae792fd090cd4c72c49d9793169853c9
--- /dev/null
+++ b/libStructDiv/include/filebased.h
@@ -0,0 +1,30 @@
+#ifndef sd_filebased_h
+#define sd_filebased_h
+
+#include <string>
+#include <structured_diversity.h>
+
+namespace libStructDiv
+{
+
+using namespace std;
+
+
+class FileBased_StructuredDiversity_t : public StructuredDiversity_t
+{
+	public:
+
+		FileBased_StructuredDiversity_t(string key, int varid, int total_variants, string p_config);
+
+
+	protected:
+		virtual vector<string> DoBarrier(string value);	
+
+		string m_shared_dir;
+		int m_barrier_count;
+	
+};
+
+}
+
+#endif
diff --git a/libStructDiv/include/libStructDiv.h b/libStructDiv/include/libStructDiv.h
new file mode 100644
index 0000000000000000000000000000000000000000..d643a2a135634806cc4e050736d26f9ecbb0dd03
--- /dev/null
+++ b/libStructDiv/include/libStructDiv.h
@@ -0,0 +1,6 @@
+#ifndef SD_STRUCTDIV_H
+#define SD_STRUCTDIV_H
+
+#include <structured_diversity.h>
+
+#endif
diff --git a/libStructDiv/include/structured_diversity.h b/libStructDiv/include/structured_diversity.h
new file mode 100644
index 0000000000000000000000000000000000000000..121a14a7fc2571c7e50a2586040055f94d23be16
--- /dev/null
+++ b/libStructDiv/include/structured_diversity.h
@@ -0,0 +1,80 @@
+#ifndef SD_SDBASE_H
+#define SD_SDBASE_H
+
+#include <string>
+#include <vector>
+#include <assert.h>
+#include <sstream>
+
+namespace libStructDiv
+{
+
+using namespace std;
+
+
+class StructuredDiversity_t
+{
+	public:
+
+		// STatic factory
+		static StructuredDiversity_t* factory(string key, string p_ipc_config);
+
+	
+		// cannot use directly since there are abstract methods.
+		// use from children classes.
+		StructuredDiversity_t(string p_key, int p_variant_num, int p_total_variants) : 
+			m_variant_num(p_variant_num), m_total_variants(p_total_variants), m_key(p_key)
+		{
+			// nothing else to do.
+		}
+
+
+		// Perform a barrier of type T.  T should be marshable
+		// via the << and >> operators.  To avoid this, the caller can self-marshal 
+		// (Will recommends a protocol buffer package for self-marshalling)
+		// and invoke Barrier with a string.
+		template<class T> vector<T> Barrier(T value)
+		{
+        		/* marshal value into stream s */
+        		stringstream s;
+        		s<<value;
+		
+        		// pass marshalled value to DoBarrier
+        		const vector<string> &string_res=DoBarrier(s.str());
+		
+        		assert(string_res.size()==m_total_variants);
+		
+        		/* declare a result */
+        		vector<T> t_res;
+		
+        		// for each item 
+        		for(int i=0;i<m_total_variants;i++)
+        		{
+                		stringstream t;
+                		T res;
+                		t.str(string_res[i]);
+                		t>>res;
+                		t_res.push_back(res);
+        		}
+		
+        		return t_res;
+		}
+
+
+
+		// Getters that most cfar things will need.
+		int GetVariantID() const { return m_variant_num; }
+		int GetNumberOfVariants() const { return m_total_variants; }
+		string GetKey() const { return m_key; }
+
+	protected:
+		virtual vector<string> DoBarrier(string value)=0;
+
+		int m_variant_num;
+		int m_total_variants;
+		string m_key;
+	
+};
+
+}
+#endif
diff --git a/libStructDiv/src/SConscript b/libStructDiv/src/SConscript
new file mode 100644
index 0000000000000000000000000000000000000000..8b2ecd47a9fbaaa02583a43d8926fe258e8b2fad
--- /dev/null
+++ b/libStructDiv/src/SConscript
@@ -0,0 +1,22 @@
+import os
+
+
+
+Import('env')
+myenv=env.Clone()
+myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME'])
+
+files="filebased.cpp  structured_diversity.cpp"
+
+cpppath='''
+         $SECURITY_TRANSFORMS_HOME/libStructDiv/include/
+        '''
+
+
+LIBPATH="$SECURITY_TRANSFORMS_HOME/lib"
+
+myenv=myenv.Clone(CPPPATH=Split(cpppath))
+lib=myenv.Library("StructDiv",  Split(files))
+install=myenv.Install("$SECURITY_TRANSFORMS_HOME/lib/", lib)
+Default(install)
+
diff --git a/libStructDiv/src/SConstruct b/libStructDiv/src/SConstruct
new file mode 100644
index 0000000000000000000000000000000000000000..c96332f0422ad5df0853931209219d9a2e20bc17
--- /dev/null
+++ b/libStructDiv/src/SConstruct
@@ -0,0 +1,6 @@
+
+
+
+env=Environment()
+Export('env')
+lib=SConscript("SConscript")
diff --git a/libStructDiv/src/filebased.cpp b/libStructDiv/src/filebased.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0c397b58d314950402396cbf94bd7e975a1c24e9
--- /dev/null
+++ b/libStructDiv/src/filebased.cpp
@@ -0,0 +1,117 @@
+
+#include <string>
+#include <structured_diversity.h>
+#include <filebased.h>
+#include <fstream>
+#include <iostream>
+#include <stdlib.h>
+
+
+
+#if defined(__linux__)
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+
+using namespace std;
+using namespace libStructDiv;
+
+template<typename T> std::string toString(const T& value)
+{
+    std::ostringstream oss;
+    oss << value;
+    return oss.str();
+}
+
+
+FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t(string key, int varid, int total_variants, string p_config)
+		: StructuredDiversity_t(key, varid, total_variants), m_barrier_count(0)
+{
+
+	assert(varid>=0 && varid<total_variants);
+
+#if defined(__linux__)
+	// assume p_config, which previously started with "dir://" already has the protocol stripped.
+	m_shared_dir=p_config;
+
+	// check path exists.
+	struct stat info;
+	if( stat(m_shared_dir.c_str(), &info ) != 0 )
+	{
+		// dir doesn't exist, make it.
+		if(mkdir(m_shared_dir.c_str(),0755)!=0)
+		{
+			perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t");
+			cerr<<"Cannot create dir:"<<endl;
+			exit(1);
+		}	
+	}
+	else
+	{
+		// dir exists,
+		// remove any old Barriers file for my variant..
+		string base_filespec=m_shared_dir+"/Barriers_"+GetKey()+"_*_"+toString(GetVariantID())+".*";
+		string rm_cmd="/bin/rm -f "+base_filespec;
+		int res=system(rm_cmd.c_str());
+		if(res!=0)
+		{
+			perror("FileBased_StructuredDiversity_t::FileBased_StructuredDiversity_t");
+			cerr<<"Cannot remove files, cmd="<<rm_cmd<<endl;
+			exit(1);
+		}
+		
+		
+	}
+#else
+	assert(0); // filesystem sharing not implement on non-linux platforms yet
+#endif
+
+}
+
+
+bool fexists(const char *filename) {
+  ifstream ifile(filename);
+  return ifile;
+}
+
+vector<string> FileBased_StructuredDiversity_t::DoBarrier(string value)
+{
+	string base_filename=m_shared_dir+"/Barriers_"+GetKey()+"_"+toString(m_barrier_count)+"_"+toString(GetVariantID());
+	string data_filename=base_filename+".data";
+	string done_filename=base_filename+".done";
+
+	vector<string> vres;
+
+
+	ofstream data_file(data_filename.c_str());
+	data_file<<value;
+	data_file.close();
+
+	ofstream done_file(done_filename.c_str());
+	done_file<<1;
+	done_file.close();
+
+	for(int i=0;i<GetNumberOfVariants();i++)
+	{
+		string var_base_filename=m_shared_dir+"/Barriers_"+GetKey()+"_"+toString(m_barrier_count)+"_"+toString(i);
+		string var_data_filename=var_base_filename+".data";
+		string var_done_filename=var_base_filename+".done";
+
+		while(!fexists(var_done_filename.c_str()))
+			sleep(1);
+
+		ifstream infile(var_data_filename.c_str());
+		string res;
+		infile>>res;
+		infile.close();
+		vres.push_back(res);
+	}
+
+	// next time, we'll use different file names.
+	m_barrier_count++;
+
+	return vres;
+}
+
+
diff --git a/libStructDiv/src/structured_diversity.cpp b/libStructDiv/src/structured_diversity.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d5b41905b1b11c7eed40751d752002ca30943e4c
--- /dev/null
+++ b/libStructDiv/src/structured_diversity.cpp
@@ -0,0 +1,67 @@
+
+
+#include <string>
+#include <sstream>
+#include <iostream>
+#include <stdlib.h>
+#include <assert.h>
+
+#include <libStructDiv.h>
+#include <filebased.h>
+
+
+using namespace std;
+using namespace libStructDiv;
+
+static string get_next_field(string& input, string delim, bool& success)
+{
+	success=false;
+
+	size_t pos=input.find(delim, 0);
+
+	if(pos==string::npos)
+		return string();	// report failure.
+
+	string rest=input.substr(pos+delim.length());
+	string beginning=input.substr(0,pos);
+
+
+	input=rest;     // set output parameter.
+	success=true;	// report success.
+	return beginning; 	// return the field we parsed out.
+}
+
+
+StructuredDiversity_t* StructuredDiversity_t::factory(string key, string p_ipc_config)
+{
+	string parse_string=p_ipc_config;
+	bool success=true;
+	string var_id=get_next_field(parse_string,":", success);
+	if(!success) { cout<<"cannot parse variant id from "<<p_ipc_config<<".  Expected format: var_id:tot_vars:url"<<endl;exit(1);}
+	string tot_vars=get_next_field(parse_string,":", success);
+	if(!success) { cout<<"cannot parse total # of variants from "<<p_ipc_config<<".  Expected format: var_id:tot_vars:url"<<endl;exit(1);}
+	string protocol_type=get_next_field(parse_string,"://", success);
+	if(!success) { cout<<"cannot protocol from "<<p_ipc_config<<".  Expected format: var_id:tot_vars:protocol://path"<<endl;exit(1);}
+	string config=parse_string;
+
+
+	cout<<"Varid: "<<var_id<<endl;
+	cout<<"Total Variants: "<<tot_vars<<endl;
+	cout<<"Protocol Type: '"<<protocol_type<<"'"<<endl;
+	cout<<"config: "<<config<<endl;
+
+	if(protocol_type=="dir")
+	{
+		return new FileBased_StructuredDiversity_t(key, strtoul(var_id.c_str(),0,0), strtoul(tot_vars.c_str(),0,0), config);
+	}
+	else
+	{
+		cerr<<"Cannot parse '"<<protocol_type<<"' k into a protocol name."<<endl;
+		exit(1);
+	}
+
+	
+
+
+}
+
diff --git a/libStructDiv/test/SConscript b/libStructDiv/test/SConscript
new file mode 100644
index 0000000000000000000000000000000000000000..bf25fe263c0fd005b85c2274fed5e08a09f5519c
--- /dev/null
+++ b/libStructDiv/test/SConscript
@@ -0,0 +1,27 @@
+import os
+
+
+Import('env')
+myenv=env.Clone()
+myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME'])
+
+cpppath=''' 
+	 $SECURITY_TRANSFORMS_HOME/libStructDiv/include 
+	'''
+
+LIBPATH="$SECURITY_TRANSFORMS_HOME/lib"
+LIBS=Split( "StructDiv" )
+
+# add cpp path
+myenv=myenv.Clone(CPPPATH=Split(cpppath))
+
+
+pgms="simple_sd_driver"
+for i in Split(pgms):
+	pgm=myenv.Program(target=i+".exe",  source=Split(i+".cpp"), LIBPATH=LIBPATH, LIBS=LIBS)
+	install=myenv.Install("$SECURITY_TRANSFORMS_HOME/libStructDiv/test/", pgm)
+	Default(install)
+
+
+	
+	
diff --git a/libStructDiv/test/SConstruct b/libStructDiv/test/SConstruct
new file mode 100644
index 0000000000000000000000000000000000000000..c96332f0422ad5df0853931209219d9a2e20bc17
--- /dev/null
+++ b/libStructDiv/test/SConstruct
@@ -0,0 +1,6 @@
+
+
+
+env=Environment()
+Export('env')
+lib=SConscript("SConscript")
diff --git a/libStructDiv/test/simple_sd_driver.cpp b/libStructDiv/test/simple_sd_driver.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2b9f3f4f8bed365b0fda70f53b80a9aeb54c211e
--- /dev/null
+++ b/libStructDiv/test/simple_sd_driver.cpp
@@ -0,0 +1,54 @@
+
+#include <libStructDiv.h>
+
+#include <iostream>
+#include <stdlib.h>
+#include <libgen.h>
+
+
+using namespace std;
+using namespace libStructDiv;
+
+
+
+template<class t> void print_res(int round, StructuredDiversity_t* p, const vector<t> &res)
+{
+	for(int i=0;i<res.size();i++)
+		cout<<"round="<<round<<" myid="<<p->GetVariantID()<<":res["<<i<<"]="<<res[i]<<endl;
+}
+
+int main(int argc, char* argv[])
+{
+	if(argc!=2)
+	{
+		cerr<<"Usage: "<<argv[0]<<" varId:totVars:url"<<endl;
+		exit(1);
+	}
+
+	StructuredDiversity_t* p=StructuredDiversity_t::factory(basename(argv[0]), argv[1]);
+
+	int sign=1;
+	if(p->GetVariantID()==1)
+		sign=-sign;
+
+	for(int i=1;i<10;i++)
+	{
+
+		if( i&1 ) 
+		{
+			const vector<double> &res=p->Barrier<double>((3.14+i)*sign);
+			print_res(i,p,res);
+		}
+		else
+		{
+			const vector<int> &res=p->Barrier<int>(i *sign );	
+			print_res(i,p,res);
+		}
+
+	}
+
+
+	delete p;
+
+	return 0;
+}