diff --git a/Source/Processors/HDF5Recording.cpp b/Source/Processors/HDF5Recording.cpp
index b262b4a02838cde7c6d042178793fe45500639bc..1514f4ace96550e5430fd26c4cc95d4d02c5340b 100644
--- a/Source/Processors/HDF5Recording.cpp
+++ b/Source/Processors/HDF5Recording.cpp
@@ -29,7 +29,6 @@ HDF5Recording::HDF5Recording() : processorIndex(-1)
 	timestamp = 0;
 	scaledBuffer = new float[MAX_BUFFER_SIZE];
 	intBuffer = new int16[MAX_BUFFER_SIZE];
-	mainFile = new KWIKFile();
 }
 
 HDF5Recording::~HDF5Recording()
@@ -68,9 +67,9 @@ void HDF5Recording::addChannel(int index, Channel* chan)
 	processorMap.add(processorIndex);
 }
 
-void HDF5Recording::openFiles(File rootFolder, int recordingNumber)
+void HDF5Recording::openFiles(File rootFolder,  int experimentNumber, int recordingNumber)
 {
-	String basepath = rootFolder.getFullPathName() + rootFolder.separatorString;
+	String basepath = rootFolder.getFullPathName() + rootFolder.separatorString + "experiment" + String(experimentNumber);
 	//KWIK file
 	mainFile->initFile(basepath);
 	mainFile->open();
@@ -151,4 +150,10 @@ void HDF5Recording::addSpikeElectrode(int index, SpikeRecordInfo* elec)
 void HDF5Recording::writeSpike(const SpikeObject& spike, int electrodeIndex)
 {
 	//TODO
-}
\ No newline at end of file
+}
+
+void HDF5Recording::startAcquisition()
+{
+	mainFile = new KWIKFile();
+}
+
diff --git a/Source/Processors/HDF5Recording.h b/Source/Processors/HDF5Recording.h
index 334a8cba3b0166ed25483ce17356a40b14b7e49f..5c6169c176b8fea61faf86df5d072508c6b154cc 100644
--- a/Source/Processors/HDF5Recording.h
+++ b/Source/Processors/HDF5Recording.h
@@ -32,7 +32,7 @@ class HDF5Recording : public RecordEngine
 public:
 	HDF5Recording();
 	~HDF5Recording();
-	void openFiles(File rootFolder, int recordingNumber);
+	void openFiles(File rootFolder, int experimentNumber, int recordingNumber);
 	void closeFiles();
 	void writeData(AudioSampleBuffer& buffer, int nSamples);
 	void writeEvent(MidiMessage& event, int samplePosition);
@@ -42,6 +42,7 @@ public:
 	void registerProcessor(GenericProcessor* processor);
 	void resetChannels();
 	void updateTimeStamp(int64 timestamp);
+	void startAcquisition();
 
 private:
 
diff --git a/Source/Processors/OriginalRecording.cpp b/Source/Processors/OriginalRecording.cpp
index fab1ddd313eae3c8b7ef409810740808506f15fa..65346e5cc3c271d5017dd165ab38d6204d18d82e 100644
--- a/Source/Processors/OriginalRecording.cpp
+++ b/Source/Processors/OriginalRecording.cpp
@@ -25,7 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "../Audio/AudioComponent.h"
 
 OriginalRecording::OriginalRecording() : separateFiles(true), eventFile(nullptr), 
-	recordingNumber(0), zeroBuffer(1, 50000), blockIndex(0)
+	recordingNumber(0), experimentNumber(0), zeroBuffer(1, 50000), blockIndex(0)
 {
 	continuousDataIntegerBuffer = new int16[10000];
 	continuousDataFloatBuffer = new float[10000];
@@ -73,9 +73,10 @@ void OriginalRecording::resetChannels()
 	spikeFileArray.clear();
 }
 
-void OriginalRecording::openFiles(File rootFolder, int recordingNumber)
+void OriginalRecording::openFiles(File rootFolder, int experimentNumber, int recordingNumber)
 {
 	this->recordingNumber = recordingNumber;
+	this->experimentNumber = experimentNumber;
 	openFile(rootFolder,nullptr);
 	for (int i = 0; i < fileArray.size(); i++)
 	{
@@ -101,7 +102,7 @@ void OriginalRecording::openFile(File rootFolder, Channel* ch)
 
 	isEvent = (ch == nullptr) ? true : false;
 	if (isEvent)
-		fullPath += "all_channels.events";
+		fullPath += "experiment" + String(experimentNumber) + "_all_channels.events";
 	else
 		fullPath += getFileName(ch);
 
@@ -148,6 +149,7 @@ void OriginalRecording::openSpikeFile(File rootFolder, SpikeRecordInfo* elec)
 
 	FILE* spFile;
 	String fullPath(rootFolder.getFullPathName() + rootFolder.separatorString);
+	fullPath += "experiment" + String(experimentNumber) + "_";
 	fullPath += elec->name.removeCharacters(" ");
 	fullPath += ".spikes";
 
@@ -175,6 +177,7 @@ String OriginalRecording::getFileName(Channel* ch)
 {
 	String filename;
 
+	filename += "experiment" + String(experimentNumber) + "_";
 	filename += ch->nodeId;
 	filename += "_";
 	filename += ch->name;
diff --git a/Source/Processors/OriginalRecording.h b/Source/Processors/OriginalRecording.h
index 876278316d60a209c1493dbe9ec7df632bb497ed..5ed20aefb2a9c717af47e818c860537c0a4508d1 100644
--- a/Source/Processors/OriginalRecording.h
+++ b/Source/Processors/OriginalRecording.h
@@ -38,7 +38,7 @@ public:
 	OriginalRecording();
 	~OriginalRecording();
 
-	void openFiles(File rootFolder, int recordingNumber);
+	void openFiles(File rootFolder, int experimentNumber, int recordingNumber);
 	void closeFiles();
 	void writeData(AudioSampleBuffer& buffer, int nSamples);
 	void writeEvent(MidiMessage& event, int samplePosition);
@@ -62,6 +62,7 @@ private:
 	bool separateFiles;
 	int blockIndex;
 	int recordingNumber;
+	int experimentNumber;
 
 	/** Holds data that has been converted from float to int16 before
         saving.
diff --git a/Source/Processors/RecordEngine.cpp b/Source/Processors/RecordEngine.cpp
index 6450fb14aa6e6475e876fcc3f0ba3f63a51dcff1..9d5bc2abcc8a63be916658c7896fcc3aaf77cba2 100644
--- a/Source/Processors/RecordEngine.cpp
+++ b/Source/Processors/RecordEngine.cpp
@@ -50,4 +50,8 @@ SpikeRecordInfo* RecordEngine::getSpikeElectrode(int index)
 
 void RecordEngine::updateTimeStamp(int64 timestamp) {}
 
-void RecordEngine::registerSpikeSource(GenericProcessor* processor) {}
\ No newline at end of file
+void RecordEngine::registerSpikeSource(GenericProcessor* processor) {}
+
+void RecordEngine::startAcquisition() {}
+
+void RecordEngine::directoryChanged() {}
\ No newline at end of file
diff --git a/Source/Processors/RecordEngine.h b/Source/Processors/RecordEngine.h
index da5afdf15e4093550967f2e80ea3d41f7a5ee342..f76f15f1d35073035deb36f2aa54e14f39857bb5 100644
--- a/Source/Processors/RecordEngine.h
+++ b/Source/Processors/RecordEngine.h
@@ -46,7 +46,7 @@ public:
 	RecordEngine();
 	~RecordEngine();
 
-	virtual void openFiles(File rootFolder, int recordingNumber) =0;
+	virtual void openFiles(File rootFolder, int experimentNumber, int recordingNumber) =0;
 	virtual void closeFiles() =0;
 	virtual void writeData(AudioSampleBuffer& buffer, int nSamples) =0;
 	virtual void writeEvent(MidiMessage& event, int samplePosition) =0;
@@ -57,6 +57,8 @@ public:
 	virtual void registerSpikeSource(GenericProcessor* processor);
 	virtual void resetChannels();
 	virtual void updateTimeStamp(int64 timestamp);
+	virtual void startAcquisition();
+	virtual void directoryChanged();
 
 protected:
 	Channel* getChannel(int index);
diff --git a/Source/Processors/RecordNode.cpp b/Source/Processors/RecordNode.cpp
index 20e49cbe42c8edc29493a2221848ae54c283896f..483483cdaee68050a3277e44cd312ccec677d783 100755
--- a/Source/Processors/RecordNode.cpp
+++ b/Source/Processors/RecordNode.cpp
@@ -51,6 +51,9 @@ RecordNode::RecordNode()
 
 	spikeElectrodeIndex = 0;
 
+	experimentNumber = 0;
+	hasRecorded = false;
+
 	// 128 inputs, 0 outputs
 	setPlayConfigDetails(getNumInputs(),getNumOutputs(),44100.0,128);
 
@@ -262,12 +265,15 @@ void RecordNode::setParameter(int parameterIndex, float newValue)
 	{
 
 		isRecording = true;
+		hasRecorded = true;
 		// std::cout << "START RECORDING." << std::endl;
 
 		if (newDirectoryNeeded)
 		{
 			createNewDirectory();
 			recordingNumber = 0;
+			experimentNumber = 1;
+			EVERY_ENGINE->directoryChanged();
 		}
 		else
 		{
@@ -281,7 +287,7 @@ void RecordNode::setParameter(int parameterIndex, float newValue)
 			getEditorViewport()->saveState(File(settingsFileName));
 		}
 
-		EVERY_ENGINE->openFiles(rootFolder, recordingNumber);
+		EVERY_ENGINE->openFiles(rootFolder, experimentNumber, recordingNumber);
 
 		allFilesOpened = true;
 
@@ -344,7 +350,15 @@ void RecordNode::closeAllFiles()
 
 bool RecordNode::enable()
 {
+	if (hasRecorded)
+	{
+		hasRecorded = false;
+		experimentNumber++;
+	}
 
+	//When starting a recording, if a new directory is needed it gets rewritten. Else is incremented by one.
+	recordingNumber = -1;
+	EVERY_ENGINE->startAcquisition();
 	isProcessing = true;
 	return true;
 }
diff --git a/Source/Processors/RecordNode.h b/Source/Processors/RecordNode.h
index 2291db99ac016509610d71e7f3cbeef899290240..05124510dec0ae797ba171a583b7dc5036308cf5 100755
--- a/Source/Processors/RecordNode.h
+++ b/Source/Processors/RecordNode.h
@@ -170,7 +170,10 @@ private:
 
 	OwnedArray<SpikeRecordInfo> spikeElectrodePointers;
 
-	int spikeElectrodeIndex;;
+	int spikeElectrodeIndex;
+
+	int experimentNumber;
+	bool hasRecorded;
 
     /** Generates a default directory name, based on the current date and time */
     String generateDirectoryName();