diff --git a/render_povray/__init__.py b/render_povray/__init__.py
index 4dcbd76f4efd5dd8e12871b8ec6f0e4938f53dae..1d042749081257588bd5bab11ecfef5aa7028f70 100644
--- a/render_povray/__init__.py
+++ b/render_povray/__init__.py
@@ -54,6 +54,10 @@ def register():
             name="Advanced Options",
             description="Show advanced options",
             default=False)
+    Scene.pov_baking_enable = BoolProperty(
+            name="Enable Baking",
+            description="Enable povrays texture baking",
+            default=False)
 
     # Real pov options
     Scene.pov_radio_adc_bailout = FloatProperty(
@@ -186,7 +190,7 @@ def register():
 def unregister():
     import bpy
     Scene = bpy.types.Scene
-    Mat = bpy.types.Material#MR
+    Mat = bpy.types.Material # MR
     del Scene.pov_radio_enable
     del Scene.pov_radio_display_advanced
     del Scene.pov_radio_adc_bailout
@@ -201,20 +205,21 @@ def unregister():
     del Scene.pov_radio_nearest_count
     del Scene.pov_radio_normal
     del Scene.pov_radio_recursion_limit
-    del Mat.pov_irid_enable#MR
-    del Mat.pov_mirror_use_IOR#MR
-    del Mat.pov_mirror_metallic#MR    
-    del Mat.pov_conserve_energy#MR
-    del Mat.pov_irid_amount#MR
-    del Mat.pov_irid_thickness#MR  
-    del Mat.pov_irid_turbulence#MR
-    del Mat.pov_caustics_enable#MR
-    del Mat.pov_fake_caustics#MR    
-    del Mat.pov_fake_caustics_power#MR
-    del Mat.pov_photons_refraction#MR
-    del Mat.pov_photons_dispersion#MR  
-    del Mat.pov_photons_reflection#MR 
-    del Mat.pov_refraction_type#MR
+    del Scene.pov_baking_enable # MR
+    del Mat.pov_irid_enable # MR
+    del Mat.pov_mirror_use_IOR # MR
+    del Mat.pov_mirror_metallic # MR    
+    del Mat.pov_conserve_energy # MR
+    del Mat.pov_irid_amount # MR
+    del Mat.pov_irid_thickness # MR  
+    del Mat.pov_irid_turbulence # MR
+    del Mat.pov_caustics_enable # MR
+    del Mat.pov_fake_caustics # MR    
+    del Mat.pov_fake_caustics_power # MR
+    del Mat.pov_photons_refraction # MR
+    del Mat.pov_photons_dispersion # MR  
+    del Mat.pov_photons_reflection # MR 
+    del Mat.pov_refraction_type # MR
 
 if __name__ == "__main__":
     register()
diff --git a/render_povray/render.py b/render_povray/render.py
index f04723c6226b3331add960ecc962fc7b0a188fc5..28a09a1586622a7c3a28c6a166ba3a6ce687832c 100644
--- a/render_povray/render.py
+++ b/render_povray/render.py
@@ -377,6 +377,7 @@ def write_pov(filename, scene=None, info_callback=None):
 
     def exportCamera():
         camera = scene.camera
+        active_object = bpy.context.active_object # MR
         matrix = camera.matrix_world
         focal_point = camera.data.dof_distance
 
@@ -386,19 +387,27 @@ def write_pov(filename, scene=None, info_callback=None):
         file.write('#declare camLookAt = <%.6f, %.6f, %.6f>;\n' % tuple([degrees(e) for e in matrix.rotation_part().to_euler()]))
 
         file.write('camera {\n')
-        file.write('\tlocation  <0, 0, 0>\n')
-        file.write('\tlook_at  <0, 0, -1>\n')
-        file.write('\tright <%s, 0, 0>\n' % - Qsize)
-        file.write('\tup <0, 1, 0>\n')
-        file.write('\tangle  %f \n' % (360.0 * atan(16.0 / camera.data.lens) / pi))
-
-        file.write('\trotate  <%.6f, %.6f, %.6f>\n' % tuple([degrees(e) for e in matrix.rotation_part().to_euler()]))
-        file.write('\ttranslate <%.6f, %.6f, %.6f>\n' % (matrix[3][0], matrix[3][1], matrix[3][2]))
-        if focal_point != 0:
-            file.write('\taperture 0.25\n') # fixed blur amount for now to do, add slider a button? 
-            file.write('\tblur_samples 96 128\n')
-            file.write('\tvariance 1/10000\n')
-            file.write('\tfocal_point <0, 0, %f>\n' % focal_point)
+        if scene.pov_baking_enable and active_object.type=='MESH':
+            file.write('\tmesh_camera{ 1 3\n') # distribution 3 is what we want here
+            file.write('\t\tmesh{%s}\n' % active_object.name)
+            file.write('\t}\n')
+            file.write('location <0,0,.01>')
+            file.write('direction <0,0,-1>')
+        # Using standard camera otherwise
+        else:
+            file.write('\tlocation  <0, 0, 0>\n')
+            file.write('\tlook_at  <0, 0, -1>\n')
+            file.write('\tright <%s, 0, 0>\n' % - Qsize)
+            file.write('\tup <0, 1, 0>\n')
+            file.write('\tangle  %f \n' % (360.0 * atan(16.0 / camera.data.lens) / pi))
+
+            file.write('\trotate  <%.6f, %.6f, %.6f>\n' % tuple([degrees(e) for e in matrix.rotation_part().to_euler()]))
+            file.write('\ttranslate <%.6f, %.6f, %.6f>\n' % (matrix[3][0], matrix[3][1], matrix[3][2]))
+            if focal_point != 0:
+                file.write('\taperture 0.25\n') # fixed blur amount for now to do, add slider a button? 
+                file.write('\tblur_samples 96 128\n')
+                file.write('\tvariance 1/10000\n')
+                file.write('\tfocal_point <0, 0, %f>\n' % focal_point)
         file.write('}\n')
 
     def exportLamps(lamps):
@@ -608,6 +617,8 @@ def write_pov(filename, scene=None, info_callback=None):
             # quads incur an extra face
             quadCount = sum(1 for f in faces_verts if len(f) == 4)
 
+            # Use named declaration to allow reference e.g. for baking. MR
+            file.write('#declare %s=\n' % ob.name) 
             file.write('mesh2 {\n')
             file.write('\tvertex_vectors {\n')
             file.write('\t\t%s' % (len(me.vertices))) # vert count
@@ -1027,6 +1038,7 @@ def write_pov(filename, scene=None, info_callback=None):
 
             writeMatrix(matrix)
             file.write('}\n')
+            file.write('%s\n' % ob.name) # Use named declaration to allow reference e.g. for baking. MR
 
             bpy.data.meshes.remove(me)
 
@@ -1165,12 +1177,13 @@ def write_pov(filename, scene=None, info_callback=None):
     for material in bpy.data.materials:
         writeMaterial(material)
 
-    exportCamera()
+    
     #exportMaterials()
     sel = scene.objects
     exportLamps([l for l in sel if l.type == 'LAMP'])
     exportMeta([l for l in sel if l.type == 'META'])
     exportMeshs(scene, sel)
+    exportCamera()
     exportWorld(scene.world)
     exportGlobalSettings(scene)
 
diff --git a/render_povray/ui.py b/render_povray/ui.py
index dbd57bc9c557a8ef9289d0dc3d8427c9ac4133a7..e156c5e72b81b9f9eaaada3b010d4a963f4718d7 100644
--- a/render_povray/ui.py
+++ b/render_povray/ui.py
@@ -288,3 +288,20 @@ class RENDER_PT_povray_radiosity(RenderButtonsPanel, bpy.types.Panel):
 
             col = split.column()
             col.prop(scene, "pov_radio_always_sample")
+
+class RENDER_PT_povray_baking(RenderButtonsPanel, bpy.types.Panel):
+    bl_label = "Baking"
+    COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+    def draw_header(self, context):
+        scene = context.scene
+
+        self.layout.prop(scene, "pov_baking_enable", text="")
+
+    def draw(self, context):
+        layout = self.layout
+
+        scene = context.scene
+        rd = scene.render
+
+        layout.active = scene.pov_baking_enable