diff --git a/Configuration.cpp b/Configuration.cpp
index a52b56b0c9d5d8f82546544e812c12b3a3da88cb..2ed7f53aab9bea28d382e4e740815979184e1f38 100644
--- a/Configuration.cpp
+++ b/Configuration.cpp
@@ -113,28 +113,24 @@ Configuration::Configuration(const char* config_file, int simNum, bool debug) :
 	if (readExcludesFromFile) readExcludes();
 	if (readAnglesFromFile) readAngles();
 	if (readDihedralsFromFile) readDihedrals();
-	/*
-	if (kTGridFile.length() != 0) {
-		printf("\nFound kT grid file: %s\n", kTGridFile.val());
-		kTGrid = new BaseGrid(kTGridFile.val());
-		printf("Loaded `%s'.\n", kTGridFile.val());
-		printf("System size %s.\n", kTGrid->getExtent().toString().val());
-	}
-	*/
-	if (temperatureGrid.length() != 0) {
-		printf("\nFound temperature grid file: %s\n", temperatureGrid.val());
-		tGrid = new BaseGrid(temperatureGrid.val());
-		printf("Loaded `%s'.\n", temperatureGrid.val());
+
+	kT = temperature * 0.0019872065f; // `units "k K" "kcal_mol"`
+	if (temperatureGridFile.length() != 0) {
+		printf("\nFound temperature grid file: %s\n", temperatureGridFile.val());
+		tGrid = new BaseGrid(temperatureGridFile.val());
+		printf("Loaded `%s'.\n", temperatureGridFile.val());
 		printf("System size %s.\n", tGrid->getExtent().toString().val());
 
+		// TODO: ask Max Belkin what this is about and how to remove hard-coded temps
 		float ToSo = 1.0f / (295.0f * 4.634248239f); // 1 / (To * sigma(To))
-		sigmaT = new BaseGrid(temperatureGrid.val());
+		sigmaT = new BaseGrid(*tGrid);
 		sigmaT->shift(-122.8305f);
 		sigmaT->scale(0.0269167f);
 		sigmaT->mult(*tGrid);
 		sigmaT->scale(ToSo);
-		kTGrid = new BaseGrid(temperatureGrid.val());
-		float factor = kT/295.0f;
+
+		kTGrid = new BaseGrid(*tGrid);
+		float factor = 0.0019872065f; // `units "k K" "kcal_mol"`
 		kTGrid->scale(factor);
 		// char outFile[256];
 		// char comment[256]; sprintf(comment,"KTGrid");
@@ -195,7 +191,7 @@ Configuration::Configuration(const char* config_file, int simNum, bool debug) :
 			printf("System size %s.\n", part[i].diffusionGrid->getExtent().toString().val());
 		}
 
-		if (temperatureGrid.length() != 0) {
+		if (temperatureGridFile.length() != 0) {
 			if (partDiffusionGridFile[i].length() != 0) {
 				part[i].diffusionGrid->mult(*sigmaT);
 			} else {
@@ -479,7 +475,7 @@ void Configuration::copyToCUDA() {
 
 	// kTGrid_d
 	kTGrid_d = NULL;
-	if (temperatureGrid.length() > 0) {
+	if (temperatureGridFile.length() > 0) {
 		gpuErrchk(cudaMalloc(&kTGrid_d, sizeof(BaseGrid)));
 		gpuErrchk(cudaMemcpyAsync(kTGrid_d, kTGrid, sizeof(BaseGrid), cudaMemcpyHostToDevice));
 	}
@@ -530,7 +526,7 @@ void Configuration::copyToCUDA() {
 }
 
 void Configuration::setDefaults() {
-	// System parameters
+    // System parameters
 	outputName = "out";
 	timestep = 1e-5f;
 	steps = 100;
@@ -542,9 +538,9 @@ void Configuration::setDefaults() {
 	interparticleForce = 1;
 	tabulatedPotential = 0;
 	fullLongRange = 1;
-	kT = 1.0f;
 	//	kTGridFile = ""; // Commented out for an unknown reason
-	temperatureGrid = "";
+	temperature = 295.0f;
+	temperatureGridFile = "";
 	coulombConst = 566.440698f/92.0f;
 	electricField = 0.0f;
 	cutoff = 10.0f;
@@ -646,15 +642,10 @@ int Configuration::readParameters(const char * config_file) {
 			inputCoordinates = value;
 		else if (param == String("restartCoordinates"))
 			restartCoordinates = value;
-		else if (param == String("kT"))
-			kT = (float) strtod(value.val(), NULL);
-		// else if (param == String("kTGridFile")) kTGridFile = value;
-		else if (param == String("temperature")) {
+		else if (param == String("temperature"))
 			temperature =  (float) strtod(value.val(),NULL);
-			kT = 0.58622522f * temperature / 295.0f; // kcal/mol (units "295 k K" "kcal_mol")
-		}
 		else if (param == String("temperatureGrid"))
-			temperatureGrid = value;
+			temperatureGridFile = value;
 		else if (param == String("numberFluct"))
 			numberFluct = atoi(value.val());
 		else if (param == String("numberFluctPeriod"))
diff --git a/Configuration.h b/Configuration.h
index 7fc75f180a618353d39d45ca7c25381ab9cc2fe5..450cc8b9a52cb9645f3a51febd8376bc2a8760b6 100644
--- a/Configuration.h
+++ b/Configuration.h
@@ -33,6 +33,13 @@
 #include <cuda.h> 
 #include <cuda_runtime.h>
 
+// Units:
+//    Energy: kcal/mol (6.947694e-24 kJ)
+//    Temperature: Kelvin
+//    Time: nanoseconds
+//    Length: nanometers
+
+
 class Configuration {
 	struct compare {
 		bool operator()(const String& lhs, const String& rhs);
@@ -120,7 +127,7 @@ public:
 	long int steps;
 	long int seed;
 	// String kTGridFile;
-	String temperatureGrid;
+	String temperatureGridFile;
 	String inputCoordinates;
 	String restartCoordinates;
 	int numberFluct;
diff --git a/GrandBrownTown.cu b/GrandBrownTown.cu
index bc4788cd471cd789ca3e5b420c3152013b89635f..ba82eddecb4b99d6c048e1e31ecae00f51f7b773 100644
--- a/GrandBrownTown.cu
+++ b/GrandBrownTown.cu
@@ -77,7 +77,7 @@ GrandBrownTown::GrandBrownTown(const Configuration& c, const char* outArg,
 	timestep = c.timestep;
 	steps = c.steps;
 	seed = c.seed;
-	temperatureGrid = c.temperatureGrid;
+	temperatureGridFile = c.temperatureGridFile;
 	inputCoordinates = c.inputCoordinates;
 	restartCoordinates = c.restartCoordinates;
 	numberFluct = c.numberFluct;
@@ -86,6 +86,7 @@ GrandBrownTown::GrandBrownTown(const Configuration& c, const char* outArg,
 	readBondsFromFile = c.readBondsFromFile;
 	fullLongRange = c.fullLongRange;
 	kT = c.kT;
+	temperature = c.temperature;
 	coulombConst = c.coulombConst;
 	electricField = c.electricField;
 	cutoff = c.cutoff;
@@ -449,7 +450,7 @@ void GrandBrownTown::run() {
 
 		// int numBlocks = (num * numReplicas) / NUM_THREADS + 1;
 		int numBlocks = (num * numReplicas) / NUM_THREADS + (num * numReplicas % NUM_THREADS == 0 ? 0 : 1);
-		int tl = temperatureGrid.length();
+		int tl = temperatureGridFile.length();
 
 		RBC.updateForces(internal->getPos_d(), internal->getForceInternal_d(), s);					/* update RB forces before update particle positions... */
 
diff --git a/GrandBrownTown.cuh b/GrandBrownTown.cuh
index 157978d62bdc0e9f9e1f2c4bd7b669c0a472a997..9ceb183132ed8cf686d770959439c31a99bf0722 100644
--- a/GrandBrownTown.cuh
+++ b/GrandBrownTown.cuh
@@ -32,7 +32,6 @@ void updateKernel(Vector3* pos, Vector3* __restrict__ forceInternal,
 	// Calculate this thread's ID
 	const int idx = blockIdx.x * blockDim.x + threadIdx.x;
 
-
 	// TODO: Make this a grid-stride loop to make efficient reuse of RNG states 
 	// Loop over ALL particles in ALL replicas
 	if (idx < num * numReplicas) {
@@ -53,7 +52,7 @@ void updateKernel(Vector3* pos, Vector3* __restrict__ forceInternal,
 		// Add a force defined via 3D FORCE maps (not 3D potential maps)
 		if (pt.forceXGrid != NULL) fe.f.x += pt.forceXGrid->interpolatePotentialLinearly(p);
 		if (pt.forceYGrid != NULL) fe.f.y += pt.forceYGrid->interpolatePotentialLinearly(p);
-		if (pt.forceZGrid != NULL) fe.f.z += pt.forceZGrid->interpolatePotentialLinearly(p);		
+		if (pt.forceZGrid != NULL) fe.f.z += pt.forceZGrid->interpolatePotentialLinearly(p);
 #endif
 
 		// Compute total force:
@@ -76,18 +75,16 @@ void updateKernel(Vector3* pos, Vector3* __restrict__ forceInternal,
 			// printf("atom %d: pos: %f %f %f\n", idx, p.x, p.y, p.z);
 			// p = pt.diffusionGrid->wrap(p); // illegal mem access; no origin/basis?
 
-		Vector3 gridCenter = pt.diffusionGrid->origin +
-			pt.diffusionGrid->basis.transform( Vector3(0.5*pt.diffusionGrid->nx,
-																								 0.5*pt.diffusionGrid->ny,
-																								 0.5*pt.diffusionGrid->nz)); 
-		Vector3 p2 = p - gridCenter;
-		p2 = sys->wrapDiff( p2 ) + gridCenter;
-			
-		/* p2 = sys->wrap( p2 ); */
-		/* p2 = p2 - gridCenter; */
-		/* printf("atom %d: ps2: %f %f %f\n", idx, p2.x, p2.y, p2.z); */
-		
-		ForceEnergy diff = pt.diffusionGrid->interpolateForceDLinearlyPeriodic(p2);
+			Vector3 gridCenter = pt.diffusionGrid->origin +
+				pt.diffusionGrid->basis.transform( Vector3(0.5*pt.diffusionGrid->nx,
+												0.5*pt.diffusionGrid->ny,
+												0.5*pt.diffusionGrid->nz)); 
+			Vector3 p2 = p - gridCenter;
+			p2 = sys->wrapDiff( p2 ) + gridCenter;			
+			/* p2 = sys->wrap( p2 ); */
+			/* p2 = p2 - gridCenter; */
+			/* printf("atom %d: ps2: %f %f %f\n", idx, p2.x, p2.y, p2.z); */		
+			ForceEnergy diff = pt.diffusionGrid->interpolateForceDLinearlyPeriodic(p2);
 			diffusion = diff.e;
 			diffGrad = diff.f;
 		}
diff --git a/GrandBrownTown.h b/GrandBrownTown.h
index 44a783ee5b1d3782f1828d2af9a841e571d78e0b..006ae8ad1dfde892ec3c1580ff0c5a555a8ab993 100644
--- a/GrandBrownTown.h
+++ b/GrandBrownTown.h
@@ -171,8 +171,7 @@ private:
 	float timestep;
 	long int steps;
 	long int seed;
-	// String kTGridFile;
-	String temperatureGrid;
+	String temperatureGridFile;
 	String inputCoordinates;
 	String restartCoordinates;
 	int numberFluct;
@@ -180,6 +179,7 @@ private:
 	int tabulatedPotential;
 	int fullLongRange;
 	float kT;
+	float temperature;
 	float coulombConst;
 	float electricField;
 	float cutoff;
diff --git a/RigidBody.cu b/RigidBody.cu
index bd614d16fb1c6c05f253232e46039682e570e11c..67cea83a5f50ca0074957106d3e244bc7f1f7828 100644
--- a/RigidBody.cu
+++ b/RigidBody.cu
@@ -5,14 +5,13 @@
 
 #include "Debug.h"
 
-// RBTODO: make units same as those in atomic simulation
 RigidBody::RigidBody(String name, const Configuration& cref, RigidBodyType& tref)
 	: name(name), c(&cref), t(&tref), impulse_to_momentum(4.184e8f) {
 	// units "(kcal_mol/AA) * ns" "dalton AA/ns" * 4.184e+08
 	
 	timestep = c->timestep;
-	// RBTODO: fix this
-	Temp = 295;
+	Temp = c->temperature;
+	// RBTODO: use temperature grids
 	// tempgrid = c->temperatureGrid;
 
 	position = t->initPos;