diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 541638c86e1527712860e255fb07a4071355fa44..53bceb23cd8d96c2eb0f4801f865f19ce2e0f458 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -685,12 +685,12 @@ static PyObject *NMVert_getattr( PyObject * self, char *name )
 	BPy_NMVert *mv = ( BPy_NMVert * ) self;
 
 	if( !strcmp( name, "co" ) || !strcmp( name, "loc" ) )
-		return newVectorObject( mv->co, 3 );
+		return newVectorProxy( mv->co, 3 );
 
 	else if( strcmp( name, "no" ) == 0 )
-		return newVectorObject( mv->no, 3 );
+		return newVectorProxy( mv->no, 3 );
 	else if( strcmp( name, "uvco" ) == 0 )
-		return newVectorObject( mv->uvco, 3 );
+		return newVectorProxy( mv->uvco, 3 );
 	else if( strcmp( name, "index" ) == 0 )
 		return PyInt_FromLong( mv->index );
 	else if( strcmp( name, "sel" ) == 0 )
diff --git a/source/blender/python/api2_2x/NMesh.h b/source/blender/python/api2_2x/NMesh.h
index a9c21ac23b27a1af854f12d10d6930f1d7934dd4..3742ef72e077f454a3cfa40262882ec595796edb 100644
--- a/source/blender/python/api2_2x/NMesh.h
+++ b/source/blender/python/api2_2x/NMesh.h
@@ -75,12 +75,14 @@ void remove_vert_def_nr( Object * ob, int def_nr, int vertnum );
 /* Typedefs for the new types */
 
 typedef struct {
-	PyObject_HEAD unsigned char r, g, b, a;
+	PyObject_HEAD		/* required python macro   */
+	unsigned char r, g, b, a;
 
 } BPy_NMCol;			/* an NMesh color: [r,g,b,a] */
 
 typedef struct {
-	PyObject_VAR_HEAD float co[3];
+	PyObject_VAR_HEAD	/* required python macro   */
+	float co[3];
 	float no[3];
 	float uvco[3];
 	int index;
@@ -89,7 +91,8 @@ typedef struct {
 } BPy_NMVert;			/* an NMesh vertex */
 
 typedef struct {
-	PyObject_HEAD PyObject * v;
+	PyObject_HEAD		/* required python macro   */
+	PyObject * v;
 	PyObject *uv;
 	PyObject *col;
 	short mode;
@@ -101,7 +104,8 @@ typedef struct {
 } BPy_NMFace;			/* an NMesh face */
 
 typedef struct {
-	PyObject_HEAD Mesh * mesh;
+	PyObject_HEAD		/* required python macro   */
+	Mesh * mesh;
 	Object *object;		/* for vertex grouping info, since it's stored on the object */
 	PyObject *name;
 	PyObject *materials;
diff --git a/source/blender/python/api2_2x/matrix.c b/source/blender/python/api2_2x/matrix.c
index efefa337d8ad8353c10ddbd996d8308d1bf1a82e..d515e06c672d648d6daba44fd5ee426687489179 100644
--- a/source/blender/python/api2_2x/matrix.c
+++ b/source/blender/python/api2_2x/matrix.c
@@ -262,7 +262,8 @@ PyObject *Matrix_Resize4x4( MatrixObject * self )
 
 PyObject *Matrix_TranslationPart( MatrixObject * self )
 {
-	float *vec;
+	float *vec = NULL;
+	PyObject *retval;
 
 	if( self->colSize < 3 ) {
 		return EXPP_ReturnPyObjError( PyExc_AttributeError,
@@ -282,7 +283,9 @@ PyObject *Matrix_TranslationPart( MatrixObject * self )
 		vec[2] = self->matrix[3][2];
 	}
 
-	return ( PyObject * ) newVectorObject( vec, 3 );
+	retval =  ( PyObject * ) newVectorObject( vec, 3 );
+	PyMem_Free( vec );
+	return retval;
 }
 
 PyObject *Matrix_RotationPart( MatrixObject * self )
@@ -556,7 +559,8 @@ static PyObject *Matrix_repr( MatrixObject * self )
 //compatability
 static PyObject *Matrix_item( MatrixObject * self, int i )
 {
-	float *vec;
+	float *vec = NULL;
+	PyObject *retval;
 	int x;
 
 	if( i < 0 || i >= self->rowSize )
@@ -572,7 +576,9 @@ static PyObject *Matrix_item( MatrixObject * self, int i )
 		vec[x] = self->matrix[i][x];
 	}
 
-	return ( PyObject * ) newVectorObject( vec, self->colSize );
+	retval =( PyObject * ) newVectorObject( vec, self->colSize );
+	PyMem_Free( vec );
+	return retval;
 }
 
 static PyObject *Matrix_slice( MatrixObject * self, int begin, int end )
diff --git a/source/blender/python/api2_2x/vector.c b/source/blender/python/api2_2x/vector.c
index 83da130b8fd882c76ff025931ce4e4ece135874e..ba5273527864b0a08a5b17569d6c69cca85dee23 100644
--- a/source/blender/python/api2_2x/vector.c
+++ b/source/blender/python/api2_2x/vector.c
@@ -222,8 +222,8 @@ static PyObject *Vector_getattr( VectorObject * self, char *name )
 						     self->vec[1] *
 						     self->vec[1] ) );
 		} else
-			EXPP_ReturnPyObjError( PyExc_AttributeError,
-					       "can only return the length of a 2D ,3D or 4D vector\n" );
+			return EXPP_ReturnPyObjError( PyExc_AttributeError,
+						      "can only return the length of a 2D ,3D or 4D vector\n" );
 	}
 
 	return Py_FindMethod( Vector_methods, ( PyObject * ) self, name );
@@ -696,3 +696,32 @@ PyObject *newVectorObject( float *vec, int size )
 
 	return ( PyObject * ) self;
 }
+
+
+/*
+  create a Vector that is a proxy for blender data.
+  we do not own this data, we NEVER free it.
+  Note: users must deal with bad pointer issue
+*/
+
+PyObject *newVectorProxy( float *vec, int size)
+{
+	VectorObject *proxy;
+	int x;
+
+	proxy = PyObject_NEW( VectorObject, &vector_Type );
+
+	proxy->delete_pymem = 0;	/* must NOT free this alloc later */
+
+	if( !vec || size < 1 ) {
+		return EXPP_ReturnPyObjError( PyExc_AttributeError,
+				       "cannot creat zero length vector proxy" );
+	}
+		
+	proxy->vec = vec;
+	proxy->size = size;
+	proxy->flag = 0;
+
+	return ( PyObject * ) proxy;
+}
+	
diff --git a/source/blender/python/api2_2x/vector.h b/source/blender/python/api2_2x/vector.h
index cf07b5ce78e3bd3ca0d2d671382b16762860fc2b..40e5851359ae763efc99e39e84c2d9565b59e775 100644
--- a/source/blender/python/api2_2x/vector.h
+++ b/source/blender/python/api2_2x/vector.h
@@ -61,6 +61,7 @@ typedef struct {
 
 //prototypes
 PyObject *newVectorObject( float *vec, int size );
+PyObject *newVectorProxy( float *vec, int size );
 PyObject *Vector_Zero( VectorObject * self );
 PyObject *Vector_Normalize( VectorObject * self );
 PyObject *Vector_Negate( VectorObject * self );