diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt
index ac500c2b22..cf36bf6a83 100644
--- a/pcbnew/CMakeLists.txt
+++ b/pcbnew/CMakeLists.txt
@@ -1,7 +1,9 @@
 add_definitions(-DPCBNEW)
 
 if (KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES)
-   
+  EXECUTE_PROCESS(COMMAND python -c "import sys;print\"%s.%s\"%sys.version_info[0:2]" OUTPUT_VARIABLE PYTHON_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+  
+  SET(PYTHON_DEST "lib/python${PYTHON_VERSION}/dist-packages" )
   file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripting)
 
 	FIND_PACKAGE(SWIG REQUIRED)
@@ -275,8 +277,10 @@ if (KICAD_SCRIPTING)
 	add_custom_command(
 	               OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcbnew_wrap.cxx
 	               COMMAND ${SWIG_EXECUTABLE} ${SWIG_OPTS} -o ${CMAKE_CURRENT_BINARY_DIR}/pcbnew_wrap.cxx  scripting/pcbnew.i
+	               COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../scripting/fixswigimports.py ${CMAKE_CURRENT_BINARY_DIR}/pcbnew.py
 	               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 	)
+
 	
 endif(KICAD_SCRIPTING)
 
@@ -397,12 +401,31 @@ install(TARGETS pcbnew
     DESTINATION ${KICAD_BIN}
     COMPONENT binary)
 
-if (KICAD_SCRIPTING_MODULES)
+if(KICAD_SCRIPTING)
+	add_custom_target(FixSwigImportsScripting ALL
+                     ${CMAKE_CURRENT_SOURCE_DIR}/../scripting/fixswigimports.py ${CMAKE_CURRENT_BINARY_DIR}/pcbnew.py
+                     DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/pcbnew
+                     COMMENT "Fixing swig_import_helper"                     
+                     )                                                                                               
+                                                                                                              
+
   install(FILES ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py
-          DESTINATION share/python)
+          DESTINATION ${PYTHON_DEST})
+endif(KICAD_SCRIPTING)
+
+if (KICAD_SCRIPTING_MODULES)
+	add_custom_target(FixSwigImportsModuleScripting ALL
+                     ${CMAKE_CURRENT_SOURCE_DIR}/../scripting/fixswigimports.py ${CMAKE_CURRENT_BINARY_DIR}/pcbnew.py
+                     DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/_pcbnew
+                     COMMENT "Fixing swig_import_helper"                     
+                     )                                                                                               
+                                                        
+
+  install(FILES ${CMAKE_BINARY_DIR}/pcbnew/pcbnew.py
+          DESTINATION ${PYTHON_DEST})
         
   install(FILES ${CMAKE_BINARY_DIR}/pcbnew/_pcbnew.so
-          DESTINATION share/python)
+          DESTINATION ${PYTHON_DEST})
 endif(KICAD_SCRIPTING_MODULES)
 
 
@@ -418,3 +441,4 @@ add_executable(layer_widget_test WIN32 EXCLUDE_FROM_ALL
     layer_widget.cpp
     )
 target_link_libraries(layer_widget_test common ${wxWidgets_LIBRARIES})
+
diff --git a/pcbnew/scripting/examples/createPcb.py b/pcbnew/scripting/examples/createPcb.py
index 2af4a58bbd..5b8bee9882 100755
--- a/pcbnew/scripting/examples/createPcb.py
+++ b/pcbnew/scripting/examples/createPcb.py
@@ -1,17 +1,44 @@
-#!/usr/bin/env python
-
+#!/usr/bin/env python2.7
 from pcbnew import *
 
+size_0_6mm = wxSize(FromMM(0.6),FromMM(0.6))
+
+
+# create a blank board
 pcb = BOARD()
+
+# create a new module, it's parent is our previously created pcb
 module = MODULE(pcb)
-module.SetReference("M1")
+module.SetReference("M1")   # give it a reference name
+pcb.Add(module)             # add it to our pcb
+m_pos = wxPoint(FromMM(50),FromMM(50))
+module.SetPosition(m_pos)
+print "module position:",m_pos
 
-pad = D_PAD(module)
-module.Add(pad)
+# create a pad and add it to the module
+n = 1
+for y in range (0,10):
+    for x in range (0,10):
+        pad = D_PAD(module)
+        pad.SetDrillSize(size_0_6mm)
+        pt = wxPoint(FromMM(x*2),FromMM(y*2))
+        pad.SetPos0(pt);
+        pad.SetPosition(pt)
+        pad.SetPadName(str(n))
+        module.Add(pad)
+        n+=1
+        
 
-pcb.Add(module)
+# save the PCB to disk
 pcb.Save("/tmp/my2.brd")
 
+pcb = LoadBoard("/tmp/my2.brd")
+#pcb = LoadBoard("/home/ajo/work/xpress-hardware/boards/hexa-xpress/esp.brd");
+
+
 print map( lambda x: x.GetReference() , list(pcb.GetModules()))
 
-print "Saved?"
+for m in pcb.GetModules():
+    for p in m.GetPads():
+        print p.GetPadName(),p.GetPosition(), p.GetOffset()
+
diff --git a/pcbnew/scripting/pcbnew.i b/pcbnew/scripting/pcbnew.i
index 0f3659bd30..cbabab029d 100644
--- a/pcbnew/scripting/pcbnew.i
+++ b/pcbnew/scripting/pcbnew.i
@@ -29,6 +29,9 @@
 
 
 %module pcbnew
+
+%feature("autodoc", "1");
+
 %include "kicad.i"
 
 // ignore a couple of items that generate warnings from swig built code
diff --git a/pcbnew/scripting/pcbnew_scripting_helpers.h b/pcbnew/scripting/pcbnew_scripting_helpers.h
index eca5f62aba..d015d929fa 100644
--- a/pcbnew/scripting/pcbnew_scripting_helpers.h
+++ b/pcbnew/scripting/pcbnew_scripting_helpers.h
@@ -8,9 +8,9 @@
 
 #ifndef SWIG
 void ScriptingSetPcbEditFrame(PCB_EDIT_FRAME *aPCBEdaFrame);
-BOARD *GetBoard();
 #endif 
 
+BOARD *GetBoard();
 BOARD* LoadBoard(wxString aFileName);
 bool SaveBoard(wxString aFileName, BOARD* aBoard);
 
diff --git a/pcbnew/scripting/units.i b/pcbnew/scripting/units.i
index 87b784f5d9..adbd3a7ae8 100644
--- a/pcbnew/scripting/units.i
+++ b/pcbnew/scripting/units.i
@@ -33,26 +33,26 @@
 %pythoncode 
 {
    def ToMM(iu): 
-      if type(iu) is int:
+      if type(iu) in [int,float]:
          return iu * 0.00254 
-      elif type(iu) is wxPoint:
+      elif type(iu) in [wxPoint,wxSize]:
          return tuple(map(ToMM,iu))
       
-   def FromMM(mm): 
-      if type(iu) is int:
+   def FromMM(iu): 
+      if type(iu) in [int,float]:
          return iu / 0.00254 
-      elif type(iu) is wxPoint:
+      elif type(iu) in [wxPoint,wxSize]:
         return tuple(map(FromMM,iu))
     
    def ToMils(iu): 
-      if type(iu) is int:
+      if type(iu) in [int,float]:
       	return iu / 10.0
-      elif type(iu) is wxPoint:
+      elif type(iu) in [wxPoint,wxSize]:
       	return tuple(map(ToMils,iu))
       	
    def FromMils(mils): 
-      if type(iu) is int:
+      if type(iu) in [int,float]:
          return mils*10.0
-      elif type(iu) is wxPoint:
+      elif type(iu) in [wxPoint,wxSize]:
       	return tuple(map(FromMils,iu))
 }
\ No newline at end of file
diff --git a/scripting/wx.i b/scripting/wx.i
index 21b13a8b1a..002a01142d 100644
--- a/scripting/wx.i
+++ b/scripting/wx.i
@@ -108,7 +108,7 @@ class wxSize
 public:
     int x,y;
     wxSize(int xx, int yy) : x(xx), y(yy) { }
-
+    wxSize(double xx, double yy) : x(xx), y(yy) {}
     %extend 
     {    
        PyObject* Get() 
@@ -130,20 +130,20 @@ public:
  
     %pythoncode 
     {
-    def Scale(self,xscale,yscale):
-    	return wxSize(self.x*xscale,self.y*yscale)
-    def __eq__(self,other):	
-    	return self.GetWidth()==other.GetWidth() and self.GetHeight()==other.GetHeight()
-    def __str__(self):                   return str(self.Get())
-    def __repr__(self):                  return 'wxSize'+str(self.Get())
-    def __len__(self):                   return len(self.Get())
-    def __getitem__(self, index):        return self.Get()[index]
-    def __setitem__(self, index, val):
-        if 	index == 0: 	self.SetWidth(val)
-        elif 	index == 1: 	self.SetHeight(val)
-        else: 			raise IndexError
-    def __nonzero__(self):               return self.Get() != (0,0)
-    __safe_for_unpickling__ = True
+	    def Scale(self,xscale,yscale):
+	    	return wxSize(self.x*xscale,self.y*yscale)
+	    def __eq__(self,other):	
+	    	return self.GetWidth()==other.GetWidth() and self.GetHeight()==other.GetHeight()
+	    def __str__(self):                   return str(self.Get())
+	    def __repr__(self):                  return 'wxSize'+str(self.Get())
+	    def __len__(self):                   return len(self.Get())
+	    def __getitem__(self, index):        return self.Get()[index]
+	    def __setitem__(self, index, val):
+	        if 	index == 0: 	self.SetWidth(val)
+	        elif 	index == 1: 	self.SetHeight(val)
+	        else: 			raise IndexError
+	    def __nonzero__(self):               return self.Get() != (0,0)
+	    __safe_for_unpickling__ = True
     
     }
 };
@@ -155,6 +155,7 @@ class wxPoint
 public:
     int x, y;
     wxPoint(int xx, int yy);
+    wxPoint(double xx, double yy) : x(xx), y(yy) {}
     ~wxPoint();
     %extend {
         wxPoint __add__(const wxPoint& pt) {   return *self + pt;  }