diff --git a/src/action/action_hauloil.cpp b/src/action/action_hauloil.cpp
index 873fc0c1e..ea62d8ff6 100644
--- a/src/action/action_hauloil.cpp
+++ b/src/action/action_hauloil.cpp
@@ -58,6 +58,44 @@ local int MoveToOilWell(Unit* unit)
 	    return 0;
     }
 
+#ifdef NEW_ORDERS
+    unit->Orders[0].Action=UnitActionHaulOil;
+
+    well=unit->Orders[0].Goal;
+    if( well && (well->Destroyed || !well->HP) ) {
+#ifdef REFS_DEBUG
+	DebugCheck( !well->Refs );
+#endif
+	if( !--well->Refs ) {
+	    ReleaseUnit(well);
+	}
+	unit->Orders[0].Goal=NoUnitP;
+	unit->Orders[0].Action=UnitActionStill;
+	unit->SubAction=0;
+	return 0;
+    }
+    if( !well ) {			// target lost?
+	DebugLevel2Fn("OIL-WELL LOST\n");
+	return -1;
+    }
+
+    DebugCheck( MapDistanceToUnit(unit->X,unit->Y,well)!=1 );
+
+    // FIXME: the oil well didn't completed, should wait!
+    if( well->Orders[0].Action==UnitActionBuilded ) {
+        DebugLevel2Fn("Invalid Oil Well\n");
+	return -1;
+    }
+
+#ifdef REFS_DEBUG
+    DebugCheck( !well->Refs );
+#endif
+    --well->Refs;
+#ifdef REFS_DEBUG
+    DebugCheck( !well->Refs );
+#endif
+    unit->Orders[0].Goal=NoUnitP;
+#else
     unit->Command.Action=UnitActionHaulOil;
 
     well=unit->Command.Data.Move.Goal;
@@ -94,12 +132,18 @@ local int MoveToOilWell(Unit* unit)
     DebugCheck( !well->Refs );
 #endif
     unit->Command.Data.Move.Goal=NoUnitP;
+#endif
 
     //
     // Activate oil-well
     //
+#ifdef NEW_ORDERS
+    well->Data.Resource.Active++;
+    DebugLevel0Fn("+%d\n",well->Data.Resource.Active);
+#else
     well->Command.Data.OilWell.Active++;
     DebugLevel0Fn("+%d\n",well->Command.Data.OilWell.Active);
+#endif
     well->Frame=2;			// FIXME: this shouldn't be hard coded!
 
     RemoveUnit(unit);
@@ -145,10 +189,17 @@ local int HaulInOilWell(Unit* unit)
 	//	Update oil-well.
 	//
 	well->Value-=DEFAULT_INCOMES[OilCost];	// remove oil from store
+#ifdef NEW_ORDERS
+	DebugLevel0Fn("-%d\n",well->Data.Resource.Active);
+	if( !--well->Data.Resource.Active ) {
+	    well->Frame=0;
+	}
+#else
 	DebugLevel0Fn("-%d\n",well->Command.Data.OilWell.Active);
 	if( !--well->Command.Data.OilWell.Active ) {
 	    well->Frame=0;
 	}
+#endif
 	if( IsSelected(well) ) {
 	    MustRedraw|=RedrawInfoPanel;
 	}
@@ -186,6 +237,41 @@ local int HaulInOilWell(Unit* unit)
 	    } else {
 		DropOutOnSide(unit,LookingW,1,1);
 	    }
+#ifdef NEW_ORDERS
+	    unit->Orders[0].Action=UnitActionStill;
+	    unit->SubAction=0;
+	    // FIXME: should return 0? done below!
+	} else {
+	    if( well ) {
+		DropOutNearest(unit,depot->X,depot->Y
+			,well->Type->TileWidth,well->Type->TileHeight);
+	    } else {
+		DropOutNearest(unit,depot->X,depot->Y,1,1);
+	    }
+	    ResetPath(unit->Orders[0]);
+	    unit->Orders[0].Goal=depot;
+	    ++depot->Refs;
+	    unit->Orders[0].RangeX=unit->Orders[0].RangeY=1;
+#if 1
+	    // FIXME: old pathfinder didn't found the path to the nearest
+	    // FIXME: point of the unit
+	    NearestOfUnit(depot,unit->X,unit->Y
+		,&unit->Orders[0].X,&unit->Orders[0].Y);
+#else
+	    unit->Orders[0].X=depot->X;
+	    unit->Orders[0].Y=depot->Y;
+#endif
+	    unit->Orders[0].Action=UnitActionHaulOil;
+	}
+
+        CheckUnitToBeDrawn(unit);
+	if( IsSelected(unit) ) {
+	    UpdateButtonPanel();
+	    MustRedraw|=RedrawButtonPanel;
+	}
+	unit->Wait=1;
+	return unit->Orders[0].Action==UnitActionHaulOil;
+#else
 	    unit->Command.Action=UnitActionStill;
 	    unit->SubAction=0;
 	    // FIXME: should return 0? done below!
@@ -219,6 +305,7 @@ local int HaulInOilWell(Unit* unit)
 	}
 	unit->Wait=1;
 	return unit->Command.Action==UnitActionHaulOil;
+#endif
     }
 
     //
@@ -255,6 +342,30 @@ local int MoveToOilDepot(Unit* unit)
 	    return 0;
     }
 
+#ifdef NEW_ORDERS
+    unit->Orders[0].Action=UnitActionHaulOil;
+
+    depot=unit->Orders[0].Goal;
+    if( depot && (depot->Destroyed || !depot->HP) ) {
+#ifdef REFS_DEBUG
+	DebugCheck( !depot->Refs );
+#endif
+	if( !--depot->Refs ) {
+	    ReleaseUnit(depot);
+	}
+	unit->Orders[0].Goal=NoUnitP;
+	unit->Orders[0].Action=UnitActionStill;
+	unit->SubAction=0;
+	return 0;
+    }
+    if( !depot ) {			// target lost?
+	DebugLevel2Fn("OIL-DEPOT LOST\n");
+	return -1;
+    }
+
+    x=unit->Orders[0].X;
+    y=unit->Orders[0].Y;
+#else
     unit->Command.Action=UnitActionHaulOil;
 
     depot=unit->Command.Data.Move.Goal;
@@ -277,6 +388,7 @@ local int MoveToOilDepot(Unit* unit)
 
     x=unit->Command.Data.Move.DX;
     y=unit->Command.Data.Move.DY;
+#endif
     DebugCheck( depot!=OilDepositOnMap(x,y) );
 
     DebugCheck( MapDistanceToUnit(unit->X,unit->Y,depot)!=1 );
@@ -332,6 +444,34 @@ local int WaitForOilDeliver(Unit* unit)
 
     DebugLevel3Fn("Waiting\n");
     if( !unit->Value ) {
+#ifdef NEW_ORDERS
+	depot=unit->Orders[0].Goal;
+	// Could be destroyed, but than we couldn't be in?
+
+	// FIXME: return to last position!
+	if( !(platform=FindOilPlatform(unit->Player,unit->X,unit->Y)) ) {
+	    DropOutOnSide(unit,LookingW
+		    ,depot->Type->TileWidth,depot->Type->TileHeight);
+	    unit->Orders[0].Action=UnitActionStill;
+	    unit->SubAction=0;
+	} else {
+	    DropOutNearest(unit,platform->X,platform->Y
+		    ,depot->Type->TileWidth,depot->Type->TileHeight);
+	    ResetPath(unit->Orders[0]);
+	    unit->Orders[0].Goal=platform;
+	    ++platform->Refs;
+	    unit->Orders[0].RangeX=unit->Orders[0].RangeY=1;
+#if 1
+	    // FIXME: old pathfinder didn't found the path to the nearest
+	    // FIXME: point of the unit
+	    NearestOfUnit(platform,unit->X,unit->Y
+		,&unit->Orders[0].X,&unit->Orders[0].Y);
+#else
+	    unit->Orders[0].X=platform->X;
+	    unit->Orders[0].Y=platform->Y;
+#endif
+	    unit->Orders[0].Action=UnitActionHaulOil;
+#else
 	depot=unit->Command.Data.Move.Goal;
 	// Could be destroyed, but than we couldn't be in?
 
@@ -358,6 +498,7 @@ local int WaitForOilDeliver(Unit* unit)
 	    unit->Command.Data.Move.DY=platform->Y;
 #endif
 	    unit->Command.Action=UnitActionHaulOil;
+#endif
 	}
 
         CheckUnitToBeDrawn(unit);
@@ -394,6 +535,19 @@ global void HandleActionHaulOil(Unit* unit)
 	    if( (ret=MoveToOilWell(unit)) ) {
 		if( ret==-1 ) {
 		    if( ++unit->SubAction==1 ) {
+#ifdef NEW_ORDERS
+			unit->Orders[0].Action=UnitActionStill;
+			unit->SubAction=0;
+			if( unit->Orders[0].Goal ) {
+#ifdef REFS_DEBUG
+			    DebugCheck( !unit->Orders[0].Goal->Refs );
+#endif
+			    --unit->Orders[0].Goal->Refs;
+#ifdef REFS_DEBUG
+			    DebugCheck( !unit->Orders[0].Goal->Refs );
+#endif
+			    unit->Orders[0].Goal=NoUnitP;
+#else
 			unit->Command.Action=UnitActionStill;
 			unit->SubAction=0;
 			if( unit->Command.Data.Move.Goal ) {
@@ -405,6 +559,7 @@ global void HandleActionHaulOil(Unit* unit)
 			    DebugCheck( !unit->Command.Data.Move.Goal->Refs );
 #endif
 			    unit->Command.Data.Move.Goal=NoUnitP;
+#endif
 			}
 		    }
 		} else {
@@ -427,6 +582,19 @@ global void HandleActionHaulOil(Unit* unit)
 	    if( (ret=MoveToOilDepot(unit)) ) {
 		if( ret==-1 ) {
 		    if( ++unit->SubAction==3 ) {
+#ifdef NEW_ORDERS
+			unit->Orders[0].Action=UnitActionStill;
+			unit->SubAction=0;
+			if( unit->Orders[0].Goal ) {
+#ifdef REFS_DEBUG
+			    DebugCheck( !unit->Orders[0].Goal->Refs );
+#endif
+			    --unit->Orders[0].Goal->Refs;
+#ifdef REFS_DEBUG
+			    DebugCheck( !unit->Orders[0].Goal->Refs );
+#endif
+			    unit->Orders[0].Goal=NoUnitP;
+#else
 			unit->Command.Action=UnitActionStill;
 			unit->SubAction=0;
 			if( unit->Command.Data.Move.Goal ) {
@@ -438,6 +606,7 @@ global void HandleActionHaulOil(Unit* unit)
 			    DebugCheck( !unit->Command.Data.Move.Goal->Refs );
 #endif
 			    unit->Command.Data.Move.Goal=NoUnitP;
+#endif
 			}
 		    }
 		} else {