diff --git a/athenasub/include/athenasub/interfaces.h b/athenasub/include/athenasub/interfaces.h
index 801b1e970ec719a71f536b63e847d720842488ee..1c9945075501852235d7c6b28b4e3b0bd949be74 100644
--- a/athenasub/include/athenasub/interfaces.h
+++ b/athenasub/include/athenasub/interfaces.h
@@ -363,11 +363,19 @@ namespace Athenasub {
 
 	// Action list
 	class IActionList {
+		friend class CModel;
+
+	protected:
+		virtual std::list<Action> GetActions() = 0;
+		virtual void AddActionStart(Action action) = 0;
+
 	public:
 		virtual ~IActionList() {}
 
 		virtual String GetName() const = 0;
 		virtual String GetOwner() const = 0;
+		virtual Model GetModel() const = 0;
+		virtual bool CanUndo() const = 0;
 
 		virtual void AddAction(Action action) = 0;
 		virtual void Finish() = 0;
diff --git a/athenasub/src/actionlist.cpp b/athenasub/src/actionlist.cpp
index 8345c3236204b36dc92c246fa3f010011d74cc6c..c199a974e6eb6765fcdd561493a401e09fbbd16c 100644
--- a/athenasub/src/actionlist.cpp
+++ b/athenasub/src/actionlist.cpp
@@ -57,7 +57,7 @@ CActionList::~CActionList()
 
 //////////////////////////////
 // Add an action to the queue
-void CActionList::AddAction(const Action action)
+void CActionList::AddAction(Action action)
 {
 	if (!valid) THROW_ATHENA_EXCEPTION(Exception::Invalid_ActionList);
 	actions.push_back(action);
diff --git a/athenasub/src/actionlist.h b/athenasub/src/actionlist.h
index bb9436254883223dcd08fbad56110552ba219f4d..f19e5dfcb06fe18b2d2ed0233c8308be3526adc7 100644
--- a/athenasub/src/actionlist.h
+++ b/athenasub/src/actionlist.h
@@ -50,8 +50,8 @@ namespace Athenasub {
 
 	// ActionList class
 	class CActionList : public IActionList {
-		friend class CModel;
 		friend class CController;
+		friend class CModel;
 
 	private:
 		String actionName;
@@ -63,13 +63,17 @@ namespace Athenasub {
 
 		CActionList(weak_ptr<IModel>,const String actionName,const String owner,bool undoAble);
 		void Start(const String actionName);
-		void AddActionStart(const Action action);
+		
+		virtual void AddActionStart(Action action);
+		virtual std::list<Action> GetActions() { return actions; }
 
 	public:
 		virtual ~CActionList();
 
 		virtual String GetName() const { return actionName; }
 		virtual String GetOwner() const { return owner; }
+		virtual Model GetModel() const { return Model(model); }
+		virtual bool CanUndo() const { return undoAble; }
 
 		virtual void AddAction(Action action);
 		virtual void Finish();
diff --git a/athenasub/src/model.cpp b/athenasub/src/model.cpp
index 0bdf5493dc8002f6ff6e33944a6a9958e6d9e312..c46842c4cf2f58d0251183ba7c5a8a27183f8564 100644
--- a/athenasub/src/model.cpp
+++ b/athenasub/src/model.cpp
@@ -33,7 +33,7 @@
 // Contact: mailto:amz@aegisub.net
 //
 
-#include "Athenasub.h"
+#include "athenasub.h"
 #include "model.h"
 #include "controller.h"
 using namespace Athenasub;
@@ -74,27 +74,29 @@ void CModel::DispatchNotifications(Notification notification) const
 void CModel::ProcessActionList(CActionList &_actionList,int type)
 {
 	// Copy the list
-	//shared_ptr<CActionList> actions = shared_ptr<CActionList>(new CActionList(*static_pointer_cast<CActionList>(_actionList)));
-	shared_ptr<CActionList> actions = shared_ptr<CActionList>(new CActionList(_actionList));
+	//shared_ptr<CActionList> actions = shared_ptr<CActionList>(new CActionList(_actionList));
+	ActionList actions = ActionList(new CActionList(_actionList));
+	bool canUndo = actions->CanUndo();
 
 	// Setup undo
-	shared_ptr<CActionList> undo = shared_ptr<CActionList>(new CActionList(Model(actions->model),actions->actionName,actions->owner,actions->undoAble));
+	ActionList undo = ActionList(new CActionList(actions->GetModel(),actions->GetName(),actions->GetOwner(),canUndo));
 	ActionStack *stack;
 	if (type == 1) stack = &redoStack;
 	else stack = &undoStack;
 
 	// Execute actions
 	std::list<Action>::const_iterator cur;
-	for (cur=actions->actions.begin();cur!=actions->actions.end();cur++) {
+	std::list<Action> acts = actions->GetActions();
+	for (cur=acts.begin();cur!=acts.end();cur++) {
 		// Inserts the opposite into the undo action first
-		if (actions->undoAble) undo->AddActionStart((*cur)->GetAntiAction());
+		if (canUndo) undo->AddActionStart((*cur)->GetAntiAction());
 		
 		// Execute the action itself
 		(*cur)->Execute();
 	}
 
 	// Insert into undo stack
-	if (actions->undoAble) {
+	if (canUndo) {
 		stack->push_back(undo);
 		if (stack->size() > undoLimit) stack->pop_front();
 		if (type == 0) redoStack.clear();