diff --git a/components/codecs/include/ftl/codecs/bitrates.hpp b/components/codecs/include/ftl/codecs/bitrates.hpp
index 8e41b13f7e4d9b77ad38cf23fdb2622d2107a537..976e039fc07b3dd15e7f4ede219ed06c27cff0fe 100644
--- a/components/codecs/include/ftl/codecs/bitrates.hpp
+++ b/components/codecs/include/ftl/codecs/bitrates.hpp
@@ -36,7 +36,9 @@ enum struct definition_t : uint8_t {
 	SD576 = 4,
 	SD480 = 5,
 	LD360 = 6,
-	Any = 7
+	Any = 7,
+
+	HTC_VIVE = 8
 
 	// TODO: Add audio definitions
 };
@@ -66,7 +68,7 @@ enum struct bitrate_t {
  * the best quality and kPreset9 is the worst. The use of presets is useful for
  * adaptive bitrate scenarios where the numbers are increased or decreased.
  */
-typedef uint8_t preset_t;
+typedef int8_t preset_t;
 static const preset_t kPreset0 = 0;
 static const preset_t kPreset1 = 1;
 static const preset_t kPreset2 = 2;
@@ -81,6 +83,8 @@ static const preset_t kPresetBest = 0;
 static const preset_t kPresetWorst = 9;
 static const preset_t kPresetLQThreshold = 4;
 
+static const preset_t kPresetHTCVive = -1;
+
 /**
  * Represents the details of each preset codec configuration.
  */
diff --git a/components/codecs/src/bitrates.cpp b/components/codecs/src/bitrates.cpp
index 519c86712487a8be9285f28392342e6ca6c16713..035e850d1ff20f5e113db2f7004b85c8bbea3040 100644
--- a/components/codecs/src/bitrates.cpp
+++ b/components/codecs/src/bitrates.cpp
@@ -8,6 +8,10 @@ using ftl::codecs::preset_t;
 using ftl::codecs::definition_t;
 using ftl::codecs::codec_t;
 
+static const CodecPreset special_presets[] = {
+	definition_t::HTC_VIVE, definition_t::HTC_VIVE, bitrate_t::High, bitrate_t::High
+};
+
 static const CodecPreset presets[] = {
 	definition_t::HD1080, definition_t::HD1080, bitrate_t::High, bitrate_t::High,
 	definition_t::HD1080, definition_t::HD720, bitrate_t::Standard, bitrate_t::Standard,
@@ -35,7 +39,9 @@ static const Resolution resolutions[] = {
 	1280, 720,		// HD720
 	1024, 576,		// SD576
 	854, 480,		// SD480
-	640, 360		// LD360
+	640, 360,		// LD360
+	0, 0,			// ANY
+	1852, 2056		// HTC_VIVE
 };
 
 int ftl::codecs::getWidth(definition_t d) {
@@ -47,6 +53,7 @@ int ftl::codecs::getHeight(definition_t d) {
 }
 
 const CodecPreset &ftl::codecs::getPreset(preset_t p) {
+	if (p < 0 && p >= -1) return special_presets[std::abs(p+1)];
     if (p > kPresetWorst) return presets[kPresetWorst];
     if (p < kPresetBest) return presets[kPresetBest];
     return presets[p];
diff --git a/components/codecs/src/encoder.cpp b/components/codecs/src/encoder.cpp
index 3ebe40cf91ad75cec92937b013d3215de4104004..fdacc89596668937f8f465995f52f0955bbded01 100644
--- a/components/codecs/src/encoder.cpp
+++ b/components/codecs/src/encoder.cpp
@@ -73,5 +73,6 @@ bool Encoder::encode(const cv::Mat &in, preset_t preset,
 	const auto &settings = ftl::codecs::getPreset(preset);
 	const definition_t definition = (in.type() == CV_32F) ? settings.depth_res : settings.colour_res;
 	const bitrate_t bitrate = (in.type() == CV_32F) ? settings.depth_qual : settings.colour_qual;
+	LOG(INFO) << "Encode definition: " << (int)definition;
 	return encode(in, definition, bitrate, cb);
 }
diff --git a/components/codecs/src/nvpipe_decoder.cpp b/components/codecs/src/nvpipe_decoder.cpp
index bd0273a2747ecd4501a8c755c4cccf1423ba7440..74519a8f2f3b1b5c8e4eb13ea23ff89778402825 100644
--- a/components/codecs/src/nvpipe_decoder.cpp
+++ b/components/codecs/src/nvpipe_decoder.cpp
@@ -62,6 +62,8 @@ bool NvPipeDecoder::decode(const ftl::codecs::Packet &pkt, cv::Mat &out) {
 	is_float_channel_ = is_float_frame;
 	last_definition_ = pkt.definition;
 
+	//LOG(INFO) << "DECODE RESOLUTION: (" << (int)pkt.definition << ") " << ftl::codecs::getWidth(pkt.definition) << "x" << ftl::codecs::getHeight(pkt.definition);
+
 	// Build a decoder instance of the correct kind
 	if (nv_decoder_ == nullptr) {
 		nv_decoder_ = NvPipe_CreateDecoder(
diff --git a/components/codecs/src/nvpipe_encoder.cpp b/components/codecs/src/nvpipe_encoder.cpp
index 1b91c13d083c2bb48a14805d480793a2b3215580..80bde1f9fac0dc63fc68db845b7e53084f6c59ec 100644
--- a/components/codecs/src/nvpipe_encoder.cpp
+++ b/components/codecs/src/nvpipe_encoder.cpp
@@ -72,7 +72,22 @@ void scaleDownAndPad(cv::Mat &in, cv::Mat &out) {
 
 bool NvPipeEncoder::encode(const cv::Mat &in, definition_t odefinition, bitrate_t bitrate, const std::function<void(const ftl::codecs::Packet&)> &cb) {
 	cudaSetDevice(0);
-	auto definition = _verifiedDefinition(odefinition, in);
+	auto definition = odefinition; //_verifiedDefinition(odefinition, in);
+
+	auto width = ftl::codecs::getWidth(definition);
+	auto height = ftl::codecs::getHeight(definition);
+
+	cv::Mat tmp;
+	if (width != in.cols || height != in.rows) {
+		LOG(WARNING) << "Mismatch resolution with encoding resolution";
+		if (in.type() == CV_32F) {
+			cv::resize(in, tmp, cv::Size(width,height), 0.0, 0.0, cv::INTER_NEAREST);
+		} else {
+			cv::resize(in, tmp, cv::Size(width,height));
+		}
+	} else {
+		tmp = in;
+	}
 
 	//LOG(INFO) << "Definition: " << ftl::codecs::getWidth(definition) << "x" << ftl::codecs::getHeight(definition);
 
@@ -80,17 +95,17 @@ bool NvPipeEncoder::encode(const cv::Mat &in, definition_t odefinition, bitrate_
 		LOG(ERROR) << "Missing data for Nvidia encoder";
 		return false;
 	}
-	if (!_createEncoder(in, definition, bitrate)) return false;
+	if (!_createEncoder(tmp, definition, bitrate)) return false;
 
 	//LOG(INFO) << "NvPipe Encode: " << int(definition) << " " << in.cols;
 
-	cv::Mat tmp;
-	if (in.type() == CV_32F) {
-		in.convertTo(tmp, CV_16UC1, 1000);
-	} else if (in.type() == CV_8UC3) {
-		cv::cvtColor(in, tmp, cv::COLOR_BGR2BGRA);
+	//cv::Mat tmp;
+	if (tmp.type() == CV_32F) {
+		tmp.convertTo(tmp, CV_16UC1, 1000);
+	} else if (tmp.type() == CV_8UC3) {
+		cv::cvtColor(tmp, tmp, cv::COLOR_BGR2BGRA);
 	} else {
-		in.copyTo(tmp);
+		//in.copyTo(tmp);
 	}
 
 	// scale/pad to fit output format
diff --git a/components/rgbd-sources/src/streamer.cpp b/components/rgbd-sources/src/streamer.cpp
index c446445c9566f8b3560fc9b8f0b4123eaa427fa2..939252d77a6704bf7c9c5a2202ec72a6c45562a8 100644
--- a/components/rgbd-sources/src/streamer.cpp
+++ b/components/rgbd-sources/src/streamer.cpp
@@ -127,6 +127,20 @@ Streamer::Streamer(nlohmann::json &config, Universe *net)
 	//net->bind("ping_streamer", [this](unsigned long long time) -> unsigned long long {
 	//	return time;
 	//});
+
+	on("hq_bitrate", [this](const ftl::config::Event &e) {
+		UNIQUE_LOCK(mutex_,ulk);
+		for (auto &s : sources_) {
+			s.second->hq_bitrate = value("hq_bitrate", ftl::codecs::kPresetBest);
+		}
+	});
+
+	on("lq_bitrate", [this](const ftl::config::Event &e) {
+		UNIQUE_LOCK(mutex_,ulk);
+		for (auto &s : sources_) {
+			s.second->lq_bitrate = value("lq_bitrate", ftl::codecs::kPresetWorst);
+		}
+	});
 }
 
 Streamer::~Streamer() {
@@ -166,6 +180,10 @@ void Streamer::add(Source *src) {
 		s->clientCount = 0;
 		s->hq_count = 0;
 		s->lq_count = 0;
+
+		s->hq_bitrate = value("hq_bitrate", ftl::codecs::kPresetBest);
+		s->lq_bitrate = value("lq_bitrate", ftl::codecs::kPresetWorst);
+
 		sources_[src->getID()] = s;
 
 		group_.addSource(src);