diff --git a/.gitattributes b/.gitattributes
index 2d3086a3a4706663ec7cdf6d5020561240159ea1..ad8885e11a5a0b48a0be0c590105daf50ab719cd 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -257,8 +257,11 @@ libIRDB/test/read_variantir.cpp -text
 libIRDB/test/rename_function.cpp -text
 libIRDB/test/tests/switchtable/Makefile -text
 libIRDB/test/tests/switchtable/README -text
+libIRDB/test/tests/switchtable/jmp.main.cpp -text
+libIRDB/test/tests/switchtable/jmp.shared.cpp -text
 libIRDB/test/tests/switchtable/jmp1.cpp -text
 libIRDB/test/tests/switchtable/jmp2.cpp -text
+libIRDB/test/tests/switchtable/jmp2.shared.cpp -text
 libIRDB/test/unfix_calls.cpp -text
 libIRDB/test/unwind-pe.h -text
 libMEDSannotation/LICENSE.txt -text
diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp
index 80fb91897aff567d7551b74cab357590a09db96f..a6eb6bd313ff8115e690d74786f716751b51997a 100644
--- a/libIRDB/test/fill_in_indtargs.cpp
+++ b/libIRDB/test/fill_in_indtargs.cpp
@@ -1142,6 +1142,8 @@ main(int argc, char* argv[])
 		        pqxx::largeobject lo(elfoid);
         		lo.to_file(pqxx_interface.GetTransaction(),"readeh_tmp_file.exe");
 
+			jmptables.clear();
+
         		ELFIO::elfio*    elfiop=new ELFIO::elfio;
         		elfiop->load("readeh_tmp_file.exe");
 		
diff --git a/libIRDB/test/tests/switchtable/Makefile b/libIRDB/test/tests/switchtable/Makefile
index 0695aea2981de1583ee8c43d893e5cfa7cd02b07..096fd1d6856e416e35a6454597d2645d1a6faf32 100644
--- a/libIRDB/test/tests/switchtable/Makefile
+++ b/libIRDB/test/tests/switchtable/Makefile
@@ -1,12 +1,11 @@
 INCLUDES= -I../../../../include -I../../../include/ -I../../../../beaengine/include 
 LIBS=-L ../../../lib/ -lIRDB-core -lIRDB-cfg -lIRDB-util -lpqxx -L ../../../../beaengine/lib/Linux.gnu.Debug -lBeaEngine_s_d 
-#OPT=-g -fPIE -fPIC -O2
-# OPT=-g -O2  oops no switch tables generated with -O2
-OPT=-g  -O
+OPT=-g -fPIE -fPIC -O2
+#OPT=-g  -O
 .SUFFIXES: .exe .cpp .peasoup
 
-PROGS=jmp1.exe jmp2.exe
-PEASOUP_PROGS=jmp1.peasoup jmp2.peasoup
+PROGS=jmp1.exe jmp2.exe jmp.shared.exe
+PEASOUP_PROGS=jmp1.peasoup jmp2.peasoup jmp.shared.peasoup
 
 all: $(PROGS)
 peasoup: $(PEASOUP_PROGS)
@@ -14,7 +13,7 @@ peasoup: $(PEASOUP_PROGS)
 $(PROGS): ../../../../lib/*
 
 .exe.peasoup: $<
-	$(PEASOUP_HOME)/tools/ps_analyze.sh $< $@ --step integertransform=off --step p1transform=off --step ilr=off
+	LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):." $(PEASOUP_HOME)/tools/ps_analyze.sh $< $@ --step integertransform=off --step p1transform=off --step ilr=off
 
 .o.exe:  $< ../lib/libIRDB-core.a ../lib/libIRDB-cfg.a
 	g++ $< $(INCLUDES) $(LIBS) $(OPT)  -o $@
@@ -22,5 +21,14 @@ $(PROGS): ../../../../lib/*
 .cpp.o:  $< 
 	g++ $< $(INCLUDES) $(LIBS) $(OPT) -o $@ -c
 
+jmp.shared.so: jmp.shared.cpp jmp2.shared.cpp
+	g++ -fPIC -c jmp.shared.cpp
+	g++ -fPIC -c jmp2.shared.cpp
+	g++ -shared -Wl,-soname,libjmp.so -o libjmp.so jmp.shared.o jmp2.shared.o
+
+jmp.shared.exe: jmp.shared.so jmp.main.cpp
+	g++ -c jmp.main.cpp
+	g++ jmp.main.o -L. -ljmp -o $@
+
 clean:
-	rm -fr $(PROGS) *.o peasoup_executable* *.peasoup
+	rm -fr $(PROGS) *.o *.so peasoup_executable* *.peasoup 
diff --git a/libIRDB/test/tests/switchtable/jmp.main.cpp b/libIRDB/test/tests/switchtable/jmp.main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..13d92e21c8c5fc863ae4fab61bf1ac5d88df8535
--- /dev/null
+++ b/libIRDB/test/tests/switchtable/jmp.main.cpp
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+extern int switch_table(int, char**);
+extern int switch_table_2(int, char**);
+
+int main(int argc, char** argv)
+{
+	printf("testing switch tables in shared library\n");
+	switch_table(argc, argv);
+	switch_table_2(argc, argv);
+}
diff --git a/libIRDB/test/tests/switchtable/jmp.shared.cpp b/libIRDB/test/tests/switchtable/jmp.shared.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f03c7085fbe3b65a333705b97d94d0e916c9e27e
--- /dev/null
+++ b/libIRDB/test/tests/switchtable/jmp.shared.cpp
@@ -0,0 +1,49 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+int add(int a, int b)
+{
+	int x = a + b;
+	printf("add(): %d + %d = %d\n", a, b, x);
+	return x;
+}
+
+int switch_table(int argc, char **argv)
+{
+	int i = atoi(argv[1]);
+
+	switch(i) 
+	{
+		case 20:
+			printf("i = 20\n");
+			break;
+		case 22:
+			printf("i = 22\n");
+			break;
+		case 23:
+			printf("hello: ");
+			printf("i = 23\n");
+			break;
+		case 24:
+			printf("i = 24\n");
+			break;
+		case 25:
+			printf("i = 25\n");
+			break;
+		case 26:
+			printf("bar: ");
+			printf("i = 26\n");
+			break;
+		case 27:
+			printf("i = 27\n");
+			break;
+		case 28:
+			printf("i = 28\n");
+			break;
+		default:
+			printf("i = %d\n", i);
+	}
+
+	int val = add(i,i);
+	printf("main(): %d + %d = %d\n", i, i, val);
+}
diff --git a/libIRDB/test/tests/switchtable/jmp2.shared.cpp b/libIRDB/test/tests/switchtable/jmp2.shared.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e4b263f445e7d13a53b349ff99e909d030de1863
--- /dev/null
+++ b/libIRDB/test/tests/switchtable/jmp2.shared.cpp
@@ -0,0 +1,92 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+extern int add(int, int);
+
+int switch_table_2(int argc, char **argv)
+{
+	int i = atoi(argv[1]);
+
+	switch(i) 
+	{
+		case 20:
+			printf("i = 20\n");
+			break;
+		case 22:
+			printf("i = 22\n");
+			break;
+		case 23:
+			printf("hello: ");
+			printf("i = 23\n");
+			break;
+		case 24:
+			printf("i = 24\n");
+			break;
+		case 25:
+			printf("i = 25\n");
+			break;
+		case 26:
+			printf("bar: ");
+			printf("i = 26\n");
+			break;
+		case 27:
+			printf("i = 27\n");
+			break;
+		case 28:
+			printf("i = 28\n");
+			break;
+		default:
+			printf("i = %d\n", i);
+	}
+
+	int val = add(i,i);
+	printf("main(): %d + %d = %d\n", i, i, val);
+
+	switch(val) 
+	{
+		case 20:
+			val = 35;
+			printf("a\n");
+			break;
+		case 22:
+			val = add(21,31);
+			printf("36\n");
+			break;
+		case 23:
+			val = add(val, val);
+			printf("37\n");
+			break;
+		case 24:
+			val = add(val, 34);
+			printf("38\n");
+			break;
+		case 25:
+			val = 38;
+			printf("39\n");
+			break;
+		case 26:
+			val = 45;
+			printf("45\n");
+			break;
+		case 27:
+			val = 55;
+			printf("55\n");
+			break;
+		case 28:
+			val = 69;
+			printf("69\n");
+			break;
+		case 29:
+			val = 72;
+			break;
+		case 31:
+			val = 82;
+			printf("82\n");
+			break;
+		default:
+			val = 99;
+	}
+
+	printf("val = %d\n", val);
+
+}