MasterQ32, thanks to your code, as well! laugh
Will have a closer look into it sometime,
for now, it is a bit too complicating for my limited purposes.

Wjbender and who is interested, I integrated position, scale and rotation into the code.
You can download the modified demo here: http://puppenheim.org/merge_models.zip

For those who prefer a look into the code without downloading anything,
here is the current code:
Code:
#include <acknex.h>
#include <default.c>
#include <d3d9.h>


function demo_init()
{
//	vec_set(sky_color,vector(10,0,0));
 	video_switch(10,32,0);

	vec_set(camera.x,vector(0,-400, 100));
 	camera.arc=90;
 	camera.pan=90;
 	camera.clip_near=1;

   fps_min=60;
 
 	def_move();
 	def_debug();
 	def_debug();
}

VECTOR temp1;
VECTOR center;

ENTITY* merge_ent(ENTITY* source1,ENTITY* source2)
{
	int vertices1=ent_status(source1,1);
	int vertices2=ent_status(source2,1);
	
	LPD3DXMESH mesh1;
	
	short *triangle_buffer1;
	short *triangle_buffer2;
	
	D3DVERTEX* vertex_buffer1;
	D3DVERTEX* vertex_buffer2;
	
	int triangles1;
	int triangles2;

	triangles1=ent_buffers(source1,0,0,&vertex_buffer1,&triangle_buffer1,NULL);
	triangles2=ent_buffers(source2,0,0,&vertex_buffer2,&triangle_buffer2,NULL);
	
	short* merged_triangle_buffer;
	D3DVERTEX* merged_vertex_buffer;

	int merged_triangles=triangles1+triangles2;
	int merged_vertices=vertices1+vertices2;
	
	int iterate;
	int offsetv=0;
	int offsett=0;
	
	vec_lerp(center.x, source1.x, source2.x, 0.5);//set a center between the two models origins
	
	D3DXCreateMesh(merged_triangles,merged_vertices,D3DXMESH_MANAGED,pvertexdecl,pd3ddev,&mesh1);
	if(mesh1!=NULL)
	{
		mesh1->LockVertexBuffer(0, (void**)&merged_vertex_buffer);
		mesh1->LockIndexBuffer (0, (void**)&merged_triangle_buffer);
		
		for (iterate=0;iterate<vertices1;iterate++)	
		{
			temp1.x=vertex_buffer1[iterate].x;
			temp1.y=vertex_buffer1[iterate].z;
			temp1.z=vertex_buffer1[iterate].y;
			
			vec_rotate(temp1.x, source1.pan);
			vec_scale(temp1.x, source1.scale_x);
			
			temp1.x *=source1.scale_x;
			temp1.y *=source1.scale_y;
			temp1.z *=source1.scale_z;
			
			temp1.x +=source1.x - center.x;
			temp1.y +=source1.y - center.y;
			temp1.z +=source1.z - center.z;
			
			merged_vertex_buffer[iterate].x=temp1.x+center.x;
			merged_vertex_buffer[iterate].y=temp1.z+center.z;
			merged_vertex_buffer[iterate].z=temp1.y+center.y;
			
			merged_vertex_buffer[iterate].u1=vertex_buffer1[iterate].u1;
			merged_vertex_buffer[iterate].v1=vertex_buffer1[iterate].v1;
			merged_vertex_buffer[iterate].u2=vertex_buffer1[iterate].u2;
			merged_vertex_buffer[iterate].v2=vertex_buffer1[iterate].v2;
			
		}
		
		offsetv+=vertices1;
		
		for (iterate=0;iterate<vertices2;iterate++)	
		{
			temp1.x=vertex_buffer1[iterate].x;
			temp1.y=vertex_buffer1[iterate].z;
			temp1.z=vertex_buffer1[iterate].y;
			
			vec_rotate(temp1.x, source2.pan);
			vec_scale(temp1.x, source2.scale_x);
			
			temp1.x *=source2.scale_x;
			temp1.y *=source2.scale_y;
			temp1.z *=source2.scale_z;
			
			temp1.x +=source2.x - center.x;
			temp1.y +=source2.y - center.y;
			temp1.z +=source2.z - center.z;
			
			merged_vertex_buffer[iterate+offsetv].x=temp1.x+center.x;
			merged_vertex_buffer[iterate+offsetv].y=temp1.z+center.z;
			merged_vertex_buffer[iterate+offsetv].z=temp1.y+center.y;
			
			merged_vertex_buffer[iterate+offsetv].u1=vertex_buffer2[iterate].u1;
			merged_vertex_buffer[iterate+offsetv].v1=vertex_buffer2[iterate].v1;
			merged_vertex_buffer[iterate+offsetv].u2=vertex_buffer2[iterate].u2;
			merged_vertex_buffer[iterate+offsetv].v2=vertex_buffer2[iterate].v2;
			
		}
		
		for (iterate=0;iterate<triangles1;iterate++)	
		{
			merged_triangle_buffer[iterate*3]=triangle_buffer1[iterate*3];
			merged_triangle_buffer[iterate*3+1]=triangle_buffer1[iterate*3+1];
			merged_triangle_buffer[iterate*3+2]=triangle_buffer1[iterate*3+2];
		}

		offsett+=triangles1;
		
		for (iterate=0;iterate<triangles2;iterate++)	
		{
			merged_triangle_buffer[(iterate+offsett)*3]=triangle_buffer2[iterate*3]+offsetv;
			merged_triangle_buffer[(iterate+offsett)*3+1]=triangle_buffer2[iterate*3+1]+offsetv;
			merged_triangle_buffer[(iterate+offsett)*3+2]=triangle_buffer2[iterate*3+2]+offsetv;
		}
	
		mesh1->UnlockVertexBuffer();
		mesh1->UnlockIndexBuffer();
	
		ENTITY* temp=ent_create(CUBE_MDL,nullvector,0);
		BMAP* bmp_source1 = ent_getskin(source1, 1);
		BMAP* bmp_source2 = ent_getskin(source2, 1);
		ent_setmesh(temp,mesh1,0,0);
		ent_setskin(temp, bmp_source1, 1);
		ent_setskin(temp, bmp_source2, 2);
		return temp;
	}
	return NULL;
}

function main()
{
	level_load("");
	wait(4);
	demo_init();
	
	ENTITY* ent1=ent_create("p.mdl",nullvector,0);
	ENTITY* ent2=ent_create("p.mdl",vector(120,0,0),0);
	ent2.pan =45;
	ent2.roll =20;
	ent2.tilt =15;
	ent1.tilt =10;
	ent1.scale_z = 0.2;

	ENTITY* merged=merge_ent(ent1,ent2);

	merged.z+=200;//set this to zero, if you wanna see whether the result is identical in angle, scale and position
	
//	ent_remove(dozer1);
//	wait(1);
//	ent_remove(dozer2);
//	wait(1);

	while(1)
	{
//		merged.pan+=1*time_step;
		wait(1);
	}
	
}