Sliding Blocks Puzzle - Optimal solution

This solution was generated using the following Java (a simple breadth-first search program):
puzzle.java
situation.java
piece.java

Click here to see a demonstration of the solution.

Hover over a block to see it's ID (e.g. to distinguish Blue1 from Blue2)
1: Green West
2: Blue4 North
3: Yellow3 East
4: Yellow4 South
5: Blue4 West
6: Yellow3 North
7: Yellow4 East
8: Blue4 South
9: Green East
10: Green East
11: Yellow2 North
12: Yellow1 North
13: Yellow2 West
14: Yellow1 North
15: Blue4 West
16: Yellow4 West
17: Yellow3 South
18: Green South
19: Yellow1 East
20: Yellow1 East
21: Yellow2 East
22: Blue2 North
23: Yellow2 East
24: Blue4 North
25: Yellow4 West
26: Yellow3 West
27: Yellow4 West
28: Yellow3 West
29: Green South
30: Yellow1 South
31: Yellow2 East
32: Blue4 East
33: Blue2 East
34: Blue1 South
35: Blue1 South
36: Red West
37: Blue3 West
38: Yellow2 North
39: Yellow1 North
40: Yellow2 North
41: Yellow1 North
42: Blue4 East
43: Blue3 South
44: Blue3 South
45: Red East
46: Blue1 North
47: Blue1 North
48: Blue2 West
49: Yellow3 North
50: Yellow3 North
51: Yellow4 East
52: Yellow4 North
53: Green West
54: Green West
55: Blue3 South
56: Blue4 South
57: Yellow3 East
58: Yellow3 East
59: Red South
60: Yellow2 West
61: Yellow1 North
62: Yellow2 West
63: Yellow3 North
64: Blue4 North
65: Yellow1 West
66: Yellow3 North
67: Blue4 North
68: Blue3 East
69: Yellow4 East
70: Yellow4 South
71: Red South
72: Yellow1 South
73: Yellow2 East
74: Blue1 East
75: Blue2 North
76: Blue2 North
77: Red West
78: Yellow1 South
79: Yellow2 South
80: Yellow3 West
81: Blue4 North
82: Blue3 North
83: Yellow4 North
84: Green East
85: Green East
86: Red South