diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 1b7998fdaf..08a365901f 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -444,6 +444,7 @@
+
diff --git a/OpenRA.Mods.RA/Render/WithVoxelWalkerBody.cs b/OpenRA.Mods.RA/Render/WithVoxelWalkerBody.cs
new file mode 100755
index 0000000000..4a2181f676
--- /dev/null
+++ b/OpenRA.Mods.RA/Render/WithVoxelWalkerBody.cs
@@ -0,0 +1,69 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using OpenRA.FileFormats;
+using OpenRA.Graphics;
+using OpenRA.Mods.RA.Move;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.RA.Render
+{
+ public class WithVoxelWalkerBodyInfo : ITraitInfo, Requires, Requires
+ {
+ public readonly int TickRate = 5;
+ public object Create(ActorInitializer init) { return new WithVoxelWalkerBody(init.self, this); }
+ }
+
+ public class WithVoxelWalkerBody : IAutoSelectionSize, ITick
+ {
+ WithVoxelWalkerBodyInfo info;
+ Mobile mobile;
+ int2 size;
+ uint tick, frame, frames;
+
+ public WithVoxelWalkerBody(Actor self, WithVoxelWalkerBodyInfo info)
+ {
+ this.info = info;
+ mobile = self.Trait();
+
+ var body = self.Trait();
+ var rv = self.Trait();
+
+ var voxel = VoxelProvider.GetVoxel(rv.Image, "idle");
+ frames = voxel.Frames;
+ rv.Add(new VoxelAnimation(voxel, () => WVec.Zero,
+ () => new[]{ body.QuantizeOrientation(self, self.Orientation) },
+ () => false, () => frame));
+
+ // Selection size
+ var rvi = self.Info.Traits.Get();
+ var s = (int)(rvi.Scale*voxel.Size.Aggregate(Math.Max));
+ size = new int2(s, s);
+ }
+
+ public int2 SelectionSize(Actor self) { return size; }
+
+ public void Tick(Actor self)
+ {
+ if (mobile.IsMoving)
+ tick++;
+
+ if (tick < info.TickRate)
+ return;
+
+ tick = 0;
+ if (++frame == frames)
+ frame = 0;
+ }
+ }
+}